mirror of
				https://github.com/retspen/webvirtcloud
				synced 2025-07-31 12:41:08 +00:00 
			
		
		
		
	
						commit
						ad373cff7b
					
				
					 7 changed files with 32 additions and 181 deletions
				
			
		
							
								
								
									
										12
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
					@ -267,14 +267,14 @@ python manage.py migrate
 | 
				
			||||||
sudo service supervisor restart
 | 
					sudo service supervisor restart
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
### Screenshots
 | 
					### Screenshots
 | 
				
			||||||
Instance Detail:</br>
 | 
					Instance Detail:
 | 
				
			||||||
<img src="doc/images/instance.PNG" width="95%" align="center"></img>
 | 
					<img src="doc/images/instance.PNG" width="95%" align="center"/>
 | 
				
			||||||
Instance List:</br>
 | 
					Instance List:</br>
 | 
				
			||||||
<img src="doc/images/grouped.PNG" width="47%"></img>
 | 
					<img src="doc/images/grouped.PNG" width="47%"/>
 | 
				
			||||||
<img src="doc/images/nongrouped.PNG" width="51%"></img>
 | 
					<img src="doc/images/nongrouped.PNG" width="51%"/>
 | 
				
			||||||
Other: </br>
 | 
					Other: </br>
 | 
				
			||||||
<img src="doc/images/hosts.PNG" width="52%"></img>
 | 
					<img src="doc/images/hosts.PNG" width="52%"/>
 | 
				
			||||||
<img src="doc/images/log.PNG" width="47%"></img>
 | 
					<img src="doc/images/log.PNG" width="47%"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### License
 | 
					### License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1404,7 +1404,9 @@
 | 
				
			||||||
            if (disk_name.startsWith(vname)) {
 | 
					            if (disk_name.startsWith(vname)) {
 | 
				
			||||||
                image = disk_name.replace(vname, new_vname);
 | 
					                image = disk_name.replace(vname, new_vname);
 | 
				
			||||||
            } else if (disk_name.lastIndexOf('.') > -1 && disk_dot_suffix.length <= 7) {
 | 
					            } else if (disk_name.lastIndexOf('.') > -1 && disk_dot_suffix.length <= 7) {
 | 
				
			||||||
            image = new_vname + "." + disk_dot_suffix
 | 
					                disk_dot.pop();
 | 
				
			||||||
 | 
					                disk_name_only = disk_dot.join('-')
 | 
				
			||||||
 | 
					                image = new_vname + "-" + disk_name_only + "." + disk_dot_suffix
 | 
				
			||||||
            } else if (new_vname != disk_name) {
 | 
					            } else if (new_vname != disk_name) {
 | 
				
			||||||
                image = new_vname
 | 
					                image = new_vname
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -469,7 +469,7 @@ def instance(request, compute_id, vname):
 | 
				
			||||||
                name = request.POST.get('name', '')
 | 
					                name = request.POST.get('name', '')
 | 
				
			||||||
                format = request.POST.get('format', default_format)
 | 
					                format = request.POST.get('format', default_format)
 | 
				
			||||||
                size = request.POST.get('size', 0)
 | 
					                size = request.POST.get('size', 0)
 | 
				
			||||||
                meta_prealloc = request.POST.get('meta_prealloc', False)
 | 
					                meta_prealloc = True if request.POST.get('meta_prealloc', False) else False
 | 
				
			||||||
                bus = request.POST.get('bus', default_bus)
 | 
					                bus = request.POST.get('bus', default_bus)
 | 
				
			||||||
                cache = request.POST.get('cache', default_cache)
 | 
					                cache = request.POST.get('cache', default_cache)
 | 
				
			||||||
                target = get_new_disk_dev(media, disks, bus)
 | 
					                target = get_new_disk_dev(media, disks, bus)
 | 
				
			||||||
| 
						 | 
					@ -774,7 +774,7 @@ def instance(request, compute_id, vname):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if request.user.is_superuser or request.user.userattributes.can_clone_instances:
 | 
					            if request.user.is_superuser or request.user.userattributes.can_clone_instances:
 | 
				
			||||||
                if 'clone' in request.POST:
 | 
					                if 'clone' in request.POST:
 | 
				
			||||||
                    clone_data = {}
 | 
					                    clone_data = dict()
 | 
				
			||||||
                    clone_data['name'] = request.POST.get('name', '')
 | 
					                    clone_data['name'] = request.POST.get('name', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    disk_sum = sum([disk['size'] >> 30 for disk in disks])
 | 
					                    disk_sum = sum([disk['size'] >> 30 for disk in disks])
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								static/css/bootstrap.min.css
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								static/css/bootstrap.min.css
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								static/js/bootstrap.min.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								static/js/bootstrap.min.js
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7
									
								
								static/js/jquery.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								static/js/jquery.js
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
					@ -1,151 +1,3 @@
 | 
				
			||||||
/*!
 | 
					/*! js-cookie v2.2.0 | MIT */
 | 
				
			||||||
 * JavaScript Cookie v2.1.1
 | 
					 | 
				
			||||||
 * https://github.com/js-cookie/js-cookie
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
 | 
					 | 
				
			||||||
 * Released under the MIT license
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
;(function (factory) {
 | 
					 | 
				
			||||||
	if (typeof define === 'function' && define.amd) {
 | 
					 | 
				
			||||||
		define(factory);
 | 
					 | 
				
			||||||
	} else if (typeof exports === 'object') {
 | 
					 | 
				
			||||||
		module.exports = factory();
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		var OldCookies = window.Cookies;
 | 
					 | 
				
			||||||
		var api = window.Cookies = factory();
 | 
					 | 
				
			||||||
		api.noConflict = function () {
 | 
					 | 
				
			||||||
			window.Cookies = OldCookies;
 | 
					 | 
				
			||||||
			return api;
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}(function () {
 | 
					 | 
				
			||||||
	function extend () {
 | 
					 | 
				
			||||||
		var i = 0;
 | 
					 | 
				
			||||||
		var result = {};
 | 
					 | 
				
			||||||
		for (; i < arguments.length; i++) {
 | 
					 | 
				
			||||||
			var attributes = arguments[ i ];
 | 
					 | 
				
			||||||
			for (var key in attributes) {
 | 
					 | 
				
			||||||
				result[key] = attributes[key];
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return result;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function init (converter) {
 | 
					!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,r,i){var c;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(i=e({path:"/"},t.defaults,i)).expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(e){}r=o.write?o.write(r,n):encodeURIComponent(r+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=(n=(n=encodeURIComponent(n+"")).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var s="";for(var f in i)i[f]&&(s+="; "+f,!0!==i[f]&&(s+="="+i[f]));return document.cookie=n+"="+r+s}n||(c={});for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,u=0;u<p.length;u++){var l=p[u].split("="),C=l.slice(1).join("=");this.json||'"'!==C.charAt(0)||(C=C.slice(1,-1));try{var m=l[0].replace(d,decodeURIComponent);if(C=o.read?o.read(C,m):o(C,m)||C.replace(d,decodeURIComponent),this.json)try{C=JSON.parse(C)}catch(e){}if(n===m){c=C;break}n||(c[m]=C)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})});
 | 
				
			||||||
		function api (key, value, attributes) {
 | 
					 | 
				
			||||||
			var result;
 | 
					 | 
				
			||||||
			if (typeof document === 'undefined') {
 | 
					 | 
				
			||||||
				return;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Write
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (arguments.length > 1) {
 | 
					 | 
				
			||||||
				attributes = extend({
 | 
					 | 
				
			||||||
					path: '/'
 | 
					 | 
				
			||||||
				}, api.defaults, attributes);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if (typeof attributes.expires === 'number') {
 | 
					 | 
				
			||||||
					var expires = new Date();
 | 
					 | 
				
			||||||
					expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
 | 
					 | 
				
			||||||
					attributes.expires = expires;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				try {
 | 
					 | 
				
			||||||
					result = JSON.stringify(value);
 | 
					 | 
				
			||||||
					if (/^[\{\[]/.test(result)) {
 | 
					 | 
				
			||||||
						value = result;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} catch (e) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if (!converter.write) {
 | 
					 | 
				
			||||||
					value = encodeURIComponent(String(value))
 | 
					 | 
				
			||||||
						.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					value = converter.write(value, key);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				key = encodeURIComponent(String(key));
 | 
					 | 
				
			||||||
				key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
 | 
					 | 
				
			||||||
				key = key.replace(/[\(\)]/g, escape);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				return (document.cookie = [
 | 
					 | 
				
			||||||
					key, '=', value,
 | 
					 | 
				
			||||||
					attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
 | 
					 | 
				
			||||||
					attributes.path    && '; path=' + attributes.path,
 | 
					 | 
				
			||||||
					attributes.domain  && '; domain=' + attributes.domain,
 | 
					 | 
				
			||||||
					attributes.secure ? '; secure' : ''
 | 
					 | 
				
			||||||
				].join(''));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Read
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (!key) {
 | 
					 | 
				
			||||||
				result = {};
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// To prevent the for loop in the first place assign an empty array
 | 
					 | 
				
			||||||
			// in case there are no cookies at all. Also prevents odd result when
 | 
					 | 
				
			||||||
			// calling "get()"
 | 
					 | 
				
			||||||
			var cookies = document.cookie ? document.cookie.split('; ') : [];
 | 
					 | 
				
			||||||
			var rdecode = /(%[0-9A-Z]{2})+/g;
 | 
					 | 
				
			||||||
			var i = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for (; i < cookies.length; i++) {
 | 
					 | 
				
			||||||
				var parts = cookies[i].split('=');
 | 
					 | 
				
			||||||
				var name = parts[0].replace(rdecode, decodeURIComponent);
 | 
					 | 
				
			||||||
				var cookie = parts.slice(1).join('=');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if (cookie.charAt(0) === '"') {
 | 
					 | 
				
			||||||
					cookie = cookie.slice(1, -1);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				try {
 | 
					 | 
				
			||||||
					cookie = converter.read ?
 | 
					 | 
				
			||||||
						converter.read(cookie, name) : converter(cookie, name) ||
 | 
					 | 
				
			||||||
						cookie.replace(rdecode, decodeURIComponent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (this.json) {
 | 
					 | 
				
			||||||
						try {
 | 
					 | 
				
			||||||
							cookie = JSON.parse(cookie);
 | 
					 | 
				
			||||||
						} catch (e) {}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (key === name) {
 | 
					 | 
				
			||||||
						result = cookie;
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (!key) {
 | 
					 | 
				
			||||||
						result[name] = cookie;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} catch (e) {}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return result;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		api.set = api;
 | 
					 | 
				
			||||||
		api.get = function (key) {
 | 
					 | 
				
			||||||
			return api(key);
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
		api.getJSON = function () {
 | 
					 | 
				
			||||||
			return api.apply({
 | 
					 | 
				
			||||||
				json: true
 | 
					 | 
				
			||||||
			}, [].slice.call(arguments));
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
		api.defaults = {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		api.remove = function (key, attributes) {
 | 
					 | 
				
			||||||
			api(key, '', extend(attributes, {
 | 
					 | 
				
			||||||
				expires: -1
 | 
					 | 
				
			||||||
			}));
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		api.withConverter = init;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return api;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return init(function () {});
 | 
					 | 
				
			||||||
}));
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue