mirror of
				https://github.com/optim-enterprises-bv/control-pane.git
				synced 2025-10-31 18:07:46 +00:00 
			
		
		
		
	sync
This commit is contained in:
		
							
								
								
									
										160
									
								
								php/clonos.php
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								php/clonos.php
									
									
									
									
									
								
							| @@ -340,6 +340,18 @@ class ClonOS | ||||
| 				case 'userEditInfo': | ||||
| 					echo json_encode($this->userEditInfo()); | ||||
| 					return;break; | ||||
| 				case 'vmTemplateAdd': | ||||
| 					echo json_encode($this->vmTemplateAdd()); | ||||
| 					return;break; | ||||
| 				case 'vmTemplateEditInfo': | ||||
| 					echo json_encode($this->vmTemplateEditInfo()); | ||||
| 					return;break; | ||||
| 				case 'vmTemplateEdit': | ||||
| 					echo json_encode($this->vmTemplateEdit()); | ||||
| 					return;break; | ||||
| 				case 'vmTemplateRemove': | ||||
| 					echo json_encode($this->vmTemplateRemove()); | ||||
| 					return;break; | ||||
| 					 | ||||
| /*				case 'saveHelperValues': | ||||
| 					echo json_encode($this->saveHelperValues()); | ||||
| @@ -1302,6 +1314,7 @@ class ClonOS | ||||
| 			return $res; | ||||
| 		} | ||||
| 		 | ||||
| 		$res['vars']['vm_vnc_password']='-nochange-'; | ||||
| 		$res['error']=false; | ||||
| 		$res['dialog']=$form['dialog']; | ||||
| 		$res['jail_id']=$form['jail_id']; | ||||
| @@ -1379,6 +1392,7 @@ class ClonOS | ||||
| 		$form['vm_ram']=$ram; | ||||
| 		 | ||||
| 		$arr=array('vm_cpus','vm_ram','bhyve_vnc_tcp_bind','vm_vnc_port','interface'); | ||||
| 		if($form['vm_vnc_password']!='-nochange-') $arr[]='vm_vnc_password'; | ||||
| 		foreach($arr as $a) | ||||
| 		{ | ||||
| 			if(isset($form[$a])) | ||||
| @@ -1450,6 +1464,7 @@ class ClonOS | ||||
| 			'vm_guestfs'=>'', | ||||
| 			'bhyve_vnc_tcp_bind'=>$form['bhyve_vnc_tcp_bind'], | ||||
| 			'vm_vnc_port'=>$form['vm_vnc_port'], | ||||
| 			'vm_vnc_password'=>$form['vm_vnc_password'], | ||||
| 		); | ||||
| 		 | ||||
| 		$iso=true; | ||||
| @@ -1559,7 +1574,7 @@ class ClonOS | ||||
| 		{ | ||||
| 			$key_name=$nres['name']; | ||||
| 		} | ||||
| 		$cmd="task owner=${username} mode=new /usr/local/bin/cbsd vm_obtain jname={$form['vm_name']} vm_size={$form['vm_size']} vm_cpus={$form['vm_cpus']} vm_ram={$form['vm_ram']} vm_os_type={$os_type} mask={$form['mask']} ip4_addr={$form['ip4_addr']} gw={$form['gateway']} authkey={$key_name} pw={$form['vm_password']}"; | ||||
| 		$cmd="task owner=${username} mode=new /usr/local/bin/cbsd vm_obtain jname={$form['vm_name']} vm_size={$form['vm_size']} vm_cpus={$form['vm_cpus']} vm_ram={$form['vm_ram']} vm_os_type={$os_type} mask={$form['mask']} ip4_addr={$form['ip4_addr']} gw={$form['gateway']} authkey={$key_name} pw={$form['vm_password']} vnc_password={$form['vnc_password']}"; | ||||
| 		 | ||||
| 		$res=$this->cbsd_cmd($cmd); | ||||
| 		$err='Virtual Machine is not created!'; | ||||
| @@ -2185,6 +2200,14 @@ class ClonOS | ||||
| 	 | ||||
| 	function runVNC($jname) | ||||
| 	{ | ||||
| 		$query="SELECT vnc_password FROM bhyve WHERE jname='${jname}'"; | ||||
| 		$res=$this->_db_local->selectAssoc($query); | ||||
| 		$pass='cbsd'; | ||||
| 		if($res!==false) | ||||
| 		{ | ||||
| 			$pass=$res['vnc_password']; | ||||
| 		} | ||||
| 		 | ||||
| 		$res=$this->cbsd_cmd("vm_vncwss jname={$jname} permit={$this->_client_ip}"); | ||||
| 		//$res=$this->_db_local->selectAssoc('select nodeip from local'); | ||||
| 		//$nodeip=$res['nodeip']; | ||||
| @@ -2193,7 +2216,7 @@ class ClonOS | ||||
| 		//if(strlen($nodeip)<7) $nodeip=$this->server_name; | ||||
| 		$nodeip=$this->server_name; | ||||
| 		 | ||||
| 		header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080?password=cbsd'); | ||||
| 		header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080?password='.$pass); | ||||
| 		exit; | ||||
| 	} | ||||
| 	 | ||||
| @@ -2228,28 +2251,28 @@ class ClonOS | ||||
| 		$bytes = floatval($bytes); | ||||
| 		$arBytes = array( | ||||
| 			0 => array( | ||||
| 				"UNIT" => "TB", | ||||
| 				"UNIT" => "tb", | ||||
| 				"VALUE" => pow($bytes_in_mb, 4) | ||||
| 			), | ||||
| 			1 => array( | ||||
| 				"UNIT" => "GB", | ||||
| 				"UNIT" => "gb", | ||||
| 				"VALUE" => pow($bytes_in_mb, 3) | ||||
| 			), | ||||
| 			2 => array( | ||||
| 				"UNIT" => "MB", | ||||
| 				"UNIT" => "mb", | ||||
| 				"VALUE" => pow($bytes_in_mb, 2) | ||||
| 			), | ||||
| 			3 => array( | ||||
| 				"UNIT" => "KB", | ||||
| 				"UNIT" => "kb", | ||||
| 				"VALUE" => $bytes_in_mb | ||||
| 			), | ||||
| 			4 => array( | ||||
| 				"UNIT" => "B", | ||||
| 				"UNIT" => "b", | ||||
| 				"VALUE" => 1 | ||||
| 			), | ||||
| 		); | ||||
|  | ||||
| 		$result='0 MB'; | ||||
| 		$result='0 mb'; | ||||
| 		foreach($arBytes as $arItem) | ||||
| 		{ | ||||
| 			if($bytes >= $arItem["VALUE"]) | ||||
| @@ -2308,7 +2331,7 @@ class ClonOS | ||||
| 	{ | ||||
| 		$db=new Db('base','storage_media'); | ||||
| 		$res=$db->select('select * from media where type="iso"'); | ||||
| 		if($res===false || empty($res)) return; | ||||
| 		if($res===false || empty($res)) return array(); //array('error'=>true,'error_message'=>'Profile ISO is not find!'); | ||||
| 		 | ||||
| 		$sel=''; | ||||
| 		//if(empty($iso)) $sel='#sel#'; | ||||
| @@ -2577,4 +2600,123 @@ class ClonOS | ||||
| 			return array('DB connection error!'); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	function vmTemplateAdd() | ||||
| 	{ | ||||
| 		$form=$this->form; | ||||
| 		 | ||||
| 		$name=$form['name']; | ||||
| 		$description=$form['description']; | ||||
| 		$pkg_vm_ram=$form['pkg_vm_ram']; | ||||
| 		$pkg_vm_disk=$form['pkg_vm_disk']; | ||||
| 		$pkg_vm_cpus=$form['pkg_vm_cpus']; | ||||
| 		$owner=$this->_user_info['username']; | ||||
| 		$query="insert into vmpackages (name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus,owner,timestamp) | ||||
| 			values | ||||
| 			('${name}','${description}','${pkg_vm_ram}','${pkg_vm_disk}','${pkg_vm_cpus}','${owner}',datetime('now','localtime'))"; | ||||
| 		 | ||||
| 		$db=new Db('base','local'); | ||||
| 		if($db!==false) | ||||
| 		{ | ||||
| 			$res=$db->insert($query); | ||||
| 			if($res!==false) | ||||
| 			{ | ||||
| 				if(!$res['error']) | ||||
| 					return $this->messageSuccess($res); | ||||
| 				else | ||||
| 					return $this->messageError('sql error!',$res); | ||||
| 			} | ||||
| 			else | ||||
| 				return $this->messageError('sql error!'); | ||||
| 		}else{ | ||||
| 			return $this->messageError('data incorrect!'); //array('error'=>true,'error_message'=>'data incorrect!'); | ||||
| 		} | ||||
| 	} | ||||
| 	function vmTemplateEditInfo() | ||||
| 	{ | ||||
| 		$form=$this->form; | ||||
| 		 | ||||
| 		if(!isset($form['template_id'])) | ||||
| 		{ | ||||
| 			return $this->messageError('incorrect data!'); | ||||
| 		} | ||||
| 		 | ||||
| 		$tpl_id=$form['template_id']; | ||||
| 		$db=new Db('base','local'); | ||||
| 		if($db!==false) | ||||
| 		{ | ||||
| 			$res=$db->selectAssoc("select name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus from vmpackages where id=${tpl_id}"); | ||||
| 			return $this->messageSuccess(array('vars'=>$res,'template_id'=>$tpl_id)); | ||||
| 		}else{ | ||||
| 			return $this->messageError('DB connection error!'); | ||||
| 		} | ||||
| 	} | ||||
| 	function vmTemplateEdit() | ||||
| 	{ | ||||
| 		$form=$this->form; | ||||
| 		 | ||||
| 		$id=$form['template_id']; | ||||
| 		if(!isset($id) || $id<1) $this->messageError('wrong data!'); | ||||
| 		$name=$form['name']; | ||||
| 		$description=$form['description']; | ||||
| 		$pkg_vm_ram=$form['pkg_vm_ram']; | ||||
| 		$pkg_vm_disk=$form['pkg_vm_disk']; | ||||
| 		$pkg_vm_cpus=$form['pkg_vm_cpus']; | ||||
| 		$owner=$this->_user_info['username']; | ||||
| 		$query="update vmpackages set | ||||
| 			name='${name}',description='${description}', | ||||
| 			pkg_vm_ram='${pkg_vm_ram}',pkg_vm_disk='${pkg_vm_disk}', | ||||
| 			pkg_vm_cpus='${pkg_vm_cpus}',owner='${owner}',timestamp=datetime('now','localtime') where id=${id}"; | ||||
| 		 | ||||
| 		$db=new Db('base','local'); | ||||
| 		if($db!==false) | ||||
| 		{ | ||||
| 			$res=$db->update($query); | ||||
| 			if($res!==false) | ||||
| 			{ | ||||
| 				return $this->messageSuccess($res); | ||||
| 			} | ||||
| 			else | ||||
| 				return $this->messageError('sql error!'); | ||||
| 		}else{ | ||||
| 			return $this->messageError('db connection error!'); | ||||
| 		} | ||||
| 	} | ||||
| 	function vmTemplateRemove() | ||||
| 	{ | ||||
| 		$form=$this->form; | ||||
| 		 | ||||
| 		$id=$form['template_id']; | ||||
| 		if(is_numeric($id) && $id>0) | ||||
| 		{ | ||||
| 			$query="delete from vmpackages where id=${id}"; | ||||
| 			$db=new Db('base','local'); | ||||
| 			if($db!==false) | ||||
| 			{ | ||||
| 				$res=$db->select($query); | ||||
| 				return $this->messageSuccess($res); | ||||
| 			}else{ | ||||
| 				return $this->messageError('DB connection error!'); | ||||
| 			} | ||||
| 		}else{ | ||||
| 			return $this->messageError('wrong data!'); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	function messageError($message,$vars=array()) | ||||
| 	{ | ||||
| 		$rarr=array( | ||||
| 			'error'=>true, | ||||
| 			'error_message'=>$message, | ||||
| 		); | ||||
| 		return array_merge($rarr,$vars); | ||||
| 	} | ||||
| 	function messageSuccess($vars=array()) | ||||
| 	{ | ||||
| 		$rarr=array( | ||||
| 			'error'=>false, | ||||
| 		); | ||||
| 		return array_merge($rarr,$vars); | ||||
| 	} | ||||
| } | ||||
| @@ -167,14 +167,28 @@ class Config | ||||
| 		) | ||||
| 	); | ||||
| 	 | ||||
| 	public $os_types_obtain=array(); | ||||
| 	 | ||||
| 	function __construct() | ||||
| 	{ | ||||
| 		$array=array(); | ||||
| 		$array1=array(); | ||||
| 		$res=ClonOS::cbsd_cmd('get_bhyve_profiles'); | ||||
| 		// $res=ClonOS::cbsd_cmd('get_bhyve_profiles --template'); for obtain/library | ||||
| 		$res=ClonOS::cbsd_cmd('get_bhyve_profiles --vm'); | ||||
| 		if($res['retval']==0) | ||||
| 		{ | ||||
| 			$res=json_decode($res['message'],true); | ||||
| 			$this->os_types=$this->create_bhyve_profiles($res); | ||||
| 		} | ||||
| 		 | ||||
| 		$res1=ClonOS::cbsd_cmd('get_bhyve_profiles --template'); | ||||
| 		if($res1['retval']==0) | ||||
| 		{ | ||||
| 			$this->os_types_obtain=$this->create_bhyve_profiles($res1); | ||||
| 		} | ||||
| 	} | ||||
| 	function create_bhyve_profiles($info) | ||||
| 	{ | ||||
| 		$res=json_decode($info['message'],true); | ||||
| 		if(!empty($res))foreach($res as $item) | ||||
| 		{ | ||||
| 			$os_name=$this->os_types_names[$item['type']]; | ||||
| @@ -187,30 +201,35 @@ class Config | ||||
| 		} | ||||
| 		if(!empty($array))foreach($array as $item) $array1[]=$item; | ||||
| 		unset($array); | ||||
| 			$this->os_types=$array1; | ||||
| 		} | ||||
| 		return $array1; | ||||
| 		//$this->os_types=$array1; | ||||
| 	} | ||||
| 	 | ||||
| 	function os_types_create($obtain='new') | ||||
| 	{ | ||||
| 		$obtain=($obtain=='obtain'); | ||||
| 		if($obtain) | ||||
| 			$info=$this->os_types_obtain; | ||||
| 		else | ||||
| 			$info=$this->os_types; | ||||
| 		 | ||||
| 		$html=''; | ||||
| 		foreach($this->os_types as $num1=>$os) | ||||
| 		foreach($info as $num1=>$os) | ||||
| 		{ | ||||
| 			$obtain_count=0; | ||||
| 			$html_tmp='					<optgroup label="'.$os['os'].'">'.PHP_EOL; | ||||
| 			$items=$os['items']; | ||||
| 			foreach($items as $num2=>$item) | ||||
| 			{ | ||||
| 				if(!isset($item['obtain'])) $item['obtain']=false; | ||||
| 				if(!$obtain || $item['obtain']) | ||||
| 				//if(!isset($item['obtain'])) $item['obtain']=false; | ||||
| 				//if(!$obtain || $item['obtain']) | ||||
| 					$html_tmp.='						<option value="'.$num1.'.'.$num2.'">'.$item['name'].'</option>'.PHP_EOL; | ||||
| 				if($item['obtain']) $obtain_count++; | ||||
| 				//if($item['obtain']) $obtain_count++; | ||||
| 			} | ||||
| 			$html_tmp.='					</optgroup>'.PHP_EOL; | ||||
| 			 | ||||
| 			if(!$obtain || $obtain_count>0) $html.=$html_tmp; | ||||
| 			//if(!$obtain || $obtain_count>0) $html.=$html_tmp; | ||||
| 			$html.=$html_tmp; | ||||
| 		} | ||||
| 		return $html; | ||||
| 	} | ||||
| @@ -228,4 +247,42 @@ class Config | ||||
| 		} | ||||
| 		return $html; | ||||
| 	} | ||||
| 	 | ||||
| 	function vm_packages_list() | ||||
| 	{ | ||||
| 		$db=new Db('base','local'); | ||||
| 		$res=$db->select('select id,name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus,owner from vmpackages order by name asc;'); | ||||
| 		 | ||||
| 		$html='<option value="0"></option>'; | ||||
| 		$min=0; | ||||
| 		$min_id=0; | ||||
| 		if(!empty($res))foreach($res as $item) | ||||
| 		{ | ||||
| 			$cpu=$item['pkg_vm_cpus']; | ||||
| 			$ram=trim($item['pkg_vm_ram']); | ||||
| 			$ed=substr($ram,-1); | ||||
| 			if($ed=='b') | ||||
| 			{ | ||||
| 				$ed=substr($ram,-2,1).'b'; | ||||
| 				$ram=substr($ram,0,-2); | ||||
| 			} | ||||
| 			if($ed=='m' || $ed=='g') $ed.='b'; | ||||
| 			if($ed=='mb') | ||||
| 			{ | ||||
| 				$ram1=substr($ram,0,-1); | ||||
| 				$ram1=$ram1/1000000; | ||||
| 			} | ||||
| 			if($ed=='gb') | ||||
| 			{ | ||||
| 				$ram1=substr($ram,0,-1); | ||||
| 				$ram1=$ram1/1000; | ||||
| 			} | ||||
| 			$res1=$cpu+$ram1; | ||||
| 			if($min>$res1 || $min==0) {$min=$res1;$min_id=$item['id'];} | ||||
| 			 | ||||
| 			$name='<strong>'.$item['name'].'</strong> (cpu: '.$cpu.'; ram: '.$ram.'; hdd: '.$item['pkg_vm_disk'].')'; | ||||
| 			$html.='					<option value="'.$item['id'].'" title="'.$item['description'].'">'.$name.'</option>'.PHP_EOL; | ||||
| 		} | ||||
| 		return array('html'=>$html,'min_id'=>$min_id); | ||||
| 	} | ||||
| } | ||||
| @@ -393,11 +393,15 @@ thead td, thead th { | ||||
| } | ||||
| .tfill thead td, td { | ||||
| 	border-style: solid; | ||||
| 	border-width: 0 1px 1px 0; | ||||
| 	border-width: 0;	/* 0 1px 1px 0; */ | ||||
| 	border-color: white; | ||||
| } | ||||
| .tfill thead td { | ||||
| 	border-bottom: 1px solid #f0f0f0; | ||||
| } | ||||
| .tfill td { | ||||
| 	background: #D8E6F3; | ||||
| 	border-bottom: 1px solid #f0f0f0; | ||||
| } | ||||
| thead td:first-child, td:first-child { | ||||
| 	text-align: left; | ||||
| @@ -423,6 +427,18 @@ thead td:first-child, td:first-child { | ||||
| .tsimple tbody tr:nth-child(2n){ | ||||
| 	background-color: #fafafa; | ||||
| } | ||||
| .tsimple tbody tr:nth-child(2n):hover { | ||||
| 	background-color:#fbfbe3;	/*#fdfded;*/ | ||||
| } | ||||
| .tsimple tbody tr:hover { | ||||
| 	background-color:#fcfccc	/*#ffffef;*/ | ||||
| } | ||||
| .tsimple tbody tr.del { | ||||
| 	background-color: #ffe6e6;	/* #ffcccc; */ | ||||
| } | ||||
| .tsimple tbody tr.del:nth-child(2n) { | ||||
| 	background-color:#fde3e3; | ||||
| } | ||||
| .tsimple .txtleft { | ||||
| 	text-align:left; | ||||
| } | ||||
| @@ -544,6 +560,9 @@ td.jstatus, | ||||
| td.small { | ||||
| 	font-size:small; | ||||
| } | ||||
| td.x-small { | ||||
| 	font-size:x-small; | ||||
| } | ||||
| tr.busy .jstatus, | ||||
| tr.busy.s-on .jstatus, | ||||
| tr.busy.s-off .jstatus { | ||||
| @@ -589,6 +608,10 @@ tr.busy.maintenance .ops span { | ||||
| 	white-space:nowrap; | ||||
| } | ||||
|  | ||||
| .vnc-grey { | ||||
| 	color:gray; | ||||
| } | ||||
|  | ||||
| /* td.ops span.icon-play:before { | ||||
| 	margin-left:.2em; | ||||
| } | ||||
|   | ||||
| @@ -24,20 +24,27 @@ err_messages.add({ | ||||
| 				<input type="text" name="vm_name" value="" pattern="[^0-9]{1}[a-zA-Z0-9]{1,}" required="required" class="edit-disable" /> | ||||
| 			</p> | ||||
| 			<p class="new"> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM Image size');?>:</span> | ||||
| 				<input type="text" name="vm_size" value="" pattern="^[0-9]+g$" placeholder="10g" required="required" class="edit-disable" /> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM template (cpu, ram, hdd)');?>:</span> | ||||
| 				<select name="vm_packages" onchange="clonos.onChangePkgTemplate(this,event);"> | ||||
| <?php $vm_res=$this->config->vm_packages_list(); echo $vm_res['html']; ?> | ||||
| 				</select> | ||||
| 				<script type="text/javascript">clonos.vm_packages_new_min_id=<?php echo $vm_res['min_id']; ?>;</script> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM CPUs');?>:</span> | ||||
| 				<span class="range"> | ||||
| 					<input type="range" name="vm_cpus" class="vHorizon" min="1" max="16" value="1" style="margin:6px 0;" id="rngCpus" oninput="rngCpusShow.value=rngCpus.value" /> | ||||
| 					<input type="text" disabled="disabled" id="rngCpusShow" value="1" /> | ||||
| 					<input type="text" disabled="disabled" id="rngCpusShow" value="1" name="vm_cpus_show" /> | ||||
| 					<!-- input type="text" name="vm_cpus" value="" pattern="[0-9]+" placeholder="1" required="required" / --> | ||||
| 				</span> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM RAM');?>:</span> | ||||
| 				<input type="text" name="vm_ram" value="" pattern="^[0-9]+\s*(g|G|gb|GB|mb|MB|m|M)$" placeholder="1g" required="required" /> | ||||
| 				<input type="text" name="vm_ram" value="" pattern="^[0-9]+\s*(g|gb|mb|m|t|tb)$" placeholder="1g" required="required" /> | ||||
| 			</p> | ||||
| 			<p class="new"> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM Image size');?>:</span> | ||||
| 				<input type="text" name="vm_size" value="" pattern="^[0-9]+(g|gb|t|tb)$" placeholder="10g" required="required" class="edit-disable" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('Attached boot ISO image');?>:</span> | ||||
| @@ -56,6 +63,10 @@ err_messages.add({ | ||||
| 				<span class="field-name"><?php echo $this->translate('VNC PORT');?>:</span> | ||||
| 				<input type="text" name="vm_vnc_port" value="" placeholder="0" maxlength="5" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VNC Password');?>:</span> | ||||
| 				<input type="password" name="vm_vnc_password" value="" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20"></input> <small>— <?php echo $this->translate('use to log in VNC console');?></small> | ||||
| 			</p> | ||||
| <!--			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('CD-ROM ISO');?>:</span> | ||||
| 				<select name="cd-rom"> | ||||
|   | ||||
| @@ -14,25 +14,26 @@ | ||||
| 				<input type="text" name="vm_name" value="" pattern="[^0-9]{1}[a-zA-Z0-9]{1,}" required="required" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM Image size');?>:</span> | ||||
| 				<input type="text" name="vm_size" value="" pattern="^[0-9]+g$" placeholder="10g" required="required" /> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM template (cpu, ram, hdd)');?>:</span> | ||||
| 				<select name="vm_packages" onchange="clonos.onChangePkgTemplate(this,event);"> | ||||
| <?php $vm_res=$this->config->vm_packages_list(); echo $vm_res['html']; ?> | ||||
| 				</select> | ||||
| 				<script type="text/javascript">clonos.vm_packages_obtain_min_id=<?php echo $vm_res['min_id']; ?>;</script> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM CPUs');?>:</span> | ||||
| 				<span class="range"> | ||||
| 					<input type="range" name="vm_cpus" class="vHorizon" min="1" max="16" value="1" style="margin:6px 0;" id="rngCpus" oninput="rngCpusShow.value=rngCpus.value" /> | ||||
| 					<input type="text" disabled="disabled" id="rngCpusShow" value="1" /> | ||||
| 					<input type="range" name="vm_cpus" class="vHorizon" min="1" max="16" value="1" style="margin:6px 0;" id="rngCpus1" oninput="rngCpusShow1.value=rngCpus1.value" /> | ||||
| 					<input type="text" disabled="disabled" id="rngCpusShow1" value="1" name="vm_cpus_show" /> | ||||
| 				</span> | ||||
| 			</p> | ||||
| <!-- | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM CPUs');?>:</span> | ||||
| 				<input type="text" name="vm_cpus" value="" pattern="[0-9]+" placeholder="1" required="required" /> | ||||
| 			</p> | ||||
| --> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM RAM');?>:</span> | ||||
| 				<input type="text" name="vm_ram" value="" pattern="^[0-9]+g$" placeholder="1g" required="required" /> | ||||
| 				<input type="text" name="vm_ram" value="" pattern="^[0-9]+(g|gb|mb|m)$" placeholder="1g" required="required" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VM Image size');?>:</span> | ||||
| 				<input type="text" name="vm_size" value="" pattern="^[0-9]+(g|gb|mb|m|t|tb)$" placeholder="10g" required="required" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('IP address');?>:</span> | ||||
| @@ -56,6 +57,10 @@ | ||||
| <?php echo $this->config->authkeys_list(); ?> | ||||
| 				</select> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('VNC Password');?>:</span> | ||||
| 				<input type="password" name="vnc_password" value="cbsd" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20"></input> <small>— <?php echo $this->translate('use to log in VNC. Default is');?>: cbsd</small> | ||||
| 			</p> | ||||
| 		</div> | ||||
| 	</form> | ||||
| 	<div class="buttons"> | ||||
|   | ||||
							
								
								
									
										46
									
								
								public/dialogs/vm_packages-new.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								public/dialogs/vm_packages-new.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| <script type="text/javascript"> | ||||
| err_messages.add({ | ||||
| 	'name':'<?php echo $this->translate("CHANGE THIS TEXT!!! Can not be empty. Name must begin with a letter / a-z / and not have any special symbols: -,.=%");?>', | ||||
| 	'first_name':'<?php echo $this->translate("TYPE THIS TEXT!!!");?>', | ||||
| 	'last_name':'<?php echo $this->translate("TYPE THIS TEXT!!!");?>', | ||||
| }); | ||||
| </script> | ||||
| <dialog id="vm_packages-new" class="window-box new"> | ||||
| 	<h1> | ||||
| 		<span class="new"><?php echo $this->translate('Add new template');?></span> | ||||
| 		<span class="edit"><?php echo $this->translate('Edit template');?></span> | ||||
| 	</h1> | ||||
| 	<h2><?php echo $this->translate('Template Settings');?></h2> | ||||
| 	<form class="win" method="post" id="templateSettings" onsubmit="return false;"> | ||||
| 		<div class="window-content"> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('Name');?>:</span> | ||||
| 				<input type="text" name="name" value="" pattern=".{2,}" required="required" class="edit-enable" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('Description');?>:</span> | ||||
| 				<textarea name="description" rows="3"></textarea> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('RAM Size');?>:</span> | ||||
| 				<input type="text" name="pkg_vm_ram" value="" pattern="^[0-9]+\s*(g|G|gb|GB|mb|MB|m|M)$" placeholder="1g" required="required" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('HDD Size');?>:</span> | ||||
| 				<input type="text" name="pkg_vm_disk" value="" pattern="^[0-9]+\s*(g|G|gb|GB|mb|MB|m|M)$" placeholder="10g" required="required" /> | ||||
| 			</p> | ||||
| 			<p> | ||||
| 				<span class="field-name"><?php echo $this->translate('CPUs Count');?>:</span> | ||||
| 				<span class="range"> | ||||
| 					<input type="range" name="pkg_vm_cpus" class="vHorizon" min="1" max="16" value="1" style="margin:6px 0;" id="rngCpus" oninput="rngCpusShow.value=rngCpus.value" /> | ||||
| 					<input type="text" disabled="disabled" id="rngCpusShow" value="1" /> | ||||
| 				</span> | ||||
| 			</p> | ||||
| 		</div> | ||||
| 	</form> | ||||
| 	<div class="buttons"> | ||||
| 		<input type="button" value="<?php echo $this->translate('Add');?>" class="new button ok-but" /> | ||||
| 		<input type="button" value="<?php echo $this->translate('Save');?>" class="edit button ok-but" /> | ||||
| 		<input type="button" value="<?php echo $this->translate('Cancel');?>" class="button red cancel-but" /> | ||||
| 	</div> | ||||
| </dialog> | ||||
| @@ -188,6 +188,13 @@ var clonos={ | ||||
| 				this.trids=this.getTrIdsForCheck('bhyveslist'); | ||||
| 				this.updateBhyveISO(); | ||||
| 				this.updateBhyveOSProfile(); | ||||
| 				if(typeof this.vm_packages_new_min_id!='undefined') | ||||
| 					$('#bhyveSettings select[name="vm_packages"]').val(this.vm_packages_new_min_id).change(); | ||||
| 			} | ||||
| 			if(id=='bhyve-obtain') | ||||
| 			{ | ||||
| 				if(typeof this.vm_packages_obtain_min_id!='undefined') | ||||
| 					$('#bhyveObtSettings select[name="vm_packages"]').val(this.vm_packages_obtain_min_id).change(); | ||||
| 			} | ||||
| 			this.dialogShow1(id); | ||||
| 		} | ||||
| @@ -505,6 +512,13 @@ var clonos={ | ||||
| 				if(mode=='edit') posts.push({'name':'user_id','value':this.lastEditedUser}); | ||||
| 				this.loadData(fmode,$.proxy(this.onUsersAdd,this),posts); | ||||
| 			} | ||||
| 			if(id=='vm_packages-new') | ||||
| 			{ | ||||
| 				var fmode=(mode=='edit')?'vmTemplateEdit':'vmTemplateAdd'; | ||||
| 				var posts=$('form#templateSettings').serializeArray(); | ||||
| 				if(mode=='edit') posts.push({'name':'template_id','value':this.lastEditedVmTemplate}); | ||||
| 				this.loadData(fmode,$.proxy(this.onVmTemplateAdd,this),posts); | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
| 	}, | ||||
| @@ -531,12 +545,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onJailAdd:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data!='undefined' && !data.error) | ||||
| 		{ | ||||
| 			if(typeof data.mode!='undefined') | ||||
| @@ -625,24 +633,12 @@ var clonos={ | ||||
| 	}, | ||||
| 	onHelpersAdd:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		this.dialogClose(); | ||||
| 		 | ||||
| 		this.loadData('getJsonPage',$.proxy(this.onLoadData,this)); | ||||
| 	}, | ||||
| 	onAuthkeyAdd:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data!='undefined' && !data.error) | ||||
| 		{ | ||||
| 			var injected=false; | ||||
| @@ -672,12 +668,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onVpnetAdd:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data!='undefined' && !data.error) | ||||
| 		{ | ||||
| 			var injected=false; | ||||
| @@ -781,12 +771,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onUpdateBhyveISO:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.iso_list!='undefined') | ||||
| 		{ | ||||
| 			$('dialog #bhyveSettings select[name="vm_iso_image"]').html(data.iso_list); | ||||
| @@ -798,24 +782,12 @@ var clonos={ | ||||
| 	}, | ||||
| 	onGetFreeJname:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		$('dialog#jail-settings input[name="jname"]').val(data.freejname); | ||||
| 		$('dialog#jail-settings input[name="host_hostname"]').val(data.freejname+'.my.domain'); | ||||
| 	}, | ||||
| 	 | ||||
| 	onUsersAdd:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| @@ -844,6 +816,12 @@ var clonos={ | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	onVmTemplateAdd:function(data) | ||||
| 	{ | ||||
| 		this.dialogClose(); | ||||
| 		this.wssReload(); | ||||
| 		this.dataReload(); | ||||
| 	}, | ||||
| 	 | ||||
| 	loadData:function(mode,return_func,arr,spinner) | ||||
| 	{ | ||||
| @@ -908,15 +886,6 @@ var clonos={ | ||||
| 	}, */ | ||||
| 	onLoadData:function(data) | ||||
| 	{ | ||||
| /* | ||||
| 		if(typeof data!='object') | ||||
| 		{ | ||||
| 			try{ | ||||
| 				var data=JSON.parse(data); | ||||
| 			}catch(e){this.debug(e.message,data);return;} | ||||
| 		} | ||||
| */ | ||||
| 		 | ||||
| 		if(data.error) | ||||
| 		{ | ||||
| 			var t=$('tbody.error td.error_message'); | ||||
| @@ -1093,8 +1062,10 @@ var clonos={ | ||||
| 		var op='jremove'; | ||||
| 		var txt='jail'; | ||||
| 		if(opt=='bhyve'){op='bremove';txt='virtual machine';} | ||||
| 		var c=confirm(this.translate('You want to delete selected '+txt+'! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		var name=$('#'+id+' td.jname').html(); | ||||
| 		if(this.removeConfirm(id,'You want to delete selected '+txt+': «'+name+'»! Are you sure?')===false) return; | ||||
| 		//var c=confirm(this.translate('You want to delete selected '+txt+'! Are you sure?')); | ||||
| 		//if(!c) return; | ||||
| 		this.enableWait(id); | ||||
| 		// --- | ||||
| 		var posts=[{'name':'operation','value':op},{'name':'jname','value':id}]; | ||||
| @@ -1234,12 +1205,6 @@ var clonos={ | ||||
| 		 | ||||
| 		update:function(data) | ||||
| 		{ | ||||
| 			/* | ||||
| 			try{ | ||||
| 				var data=JSON.parse(data); | ||||
| 			}catch(e){this.debug(e.message,data);return;} | ||||
| 			*/ | ||||
| 			 | ||||
| /* 			if(typeof data['mod_ops']!='undefined') | ||||
| 			{ | ||||
| 				var key='mod_ops'; | ||||
| @@ -1452,91 +1417,67 @@ var clonos={ | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	sleepFor:function(sleepDuration) | ||||
| 	{ | ||||
| 		var now=new Date().getTime(); | ||||
| 		while(new Date().getTime() < now + sleepDuration){ /* do nothing */ }  | ||||
| 	}, | ||||
| 	removeConfirm:function(id,answer) | ||||
| 	{ | ||||
| 		if(typeof id!='undefined') | ||||
| 		{ | ||||
| 			var obj=$('#'+id); | ||||
| 			if(typeof obj!='undefined') | ||||
| 			{ | ||||
| 				$(obj).addClass('del'); | ||||
| 				var c=confirm(this.translate(answer)); | ||||
| 				if(!c) | ||||
| 				{ | ||||
| 					$(obj).removeClass('del'); | ||||
| 					return false; | ||||
| 				} | ||||
| 				return true; | ||||
| 			} | ||||
| 		} | ||||
| 		return false; | ||||
| 	}, | ||||
| 	 | ||||
| 	authkeyRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected authkey! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected authkey! Are you sure?')===false) return; | ||||
| 		var posts=[{'name':'auth_id','value':id}]; | ||||
| 		this.loadData('authkeyRemove',$.proxy(this.onAuthkeyRemove,this),posts); | ||||
| 	}, | ||||
| 	onAuthkeyRemove:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 		$('#authkeyslist tr#'+data.auth_id).remove(); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	vpnetRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected network! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected network! Are you sure?')===false) return; | ||||
| 		var posts=[{'name':'vpnet_id','value':id}]; | ||||
| 		this.loadData('vpnetRemove',$.proxy(this.onVpnetRemove,this),posts); | ||||
| 	}, | ||||
| 	onVpnetRemove:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 		$('#vpnetslist tr#'+data.vpnet_id).remove(); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	mediaRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected storage media! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected storage media! Are you sure?')===false) return; | ||||
| 		var posts=[{'name':'media_id','value':id}]; | ||||
| 		this.loadData('mediaRemove',$.proxy(this.onMediaRemove,this),posts); | ||||
| 	}, | ||||
| 	onMediaRemove:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 			 | ||||
| 		$('#mediaslist tr#'+data.media_id).remove(); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	srcRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected FreeBSD sources! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected FreeBSD sources! Are you sure?')===false) return; | ||||
| 		var ver=$('#srcslist tr#'+this.dotEscape(id)+' .version').html(); | ||||
| 		var op='removesrc'; | ||||
| 		//this.enableWait(id); | ||||
| @@ -1559,8 +1500,7 @@ var clonos={ | ||||
| 	}, | ||||
| 	baseRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected FreeBSD bases! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected FreeBSD bases! Are you sure?')===false) return; | ||||
| 		var ver=$('#baseslist tr#'+this.dotEscape(id)+' .version').html(); | ||||
| 		var op='removebase'; | ||||
| 		//this.enableWait(id); | ||||
| @@ -1576,28 +1516,24 @@ var clonos={ | ||||
| 	 | ||||
| 	userRemove:function(id) | ||||
| 	{ | ||||
| 		var c=confirm(this.translate('You want to delete selected CBSD user! Are you sure?')); | ||||
| 		if(!c) return; | ||||
| 		if(this.removeConfirm(id,'You want to delete selected CBSD user! Are you sure?')===false) return; | ||||
| 		var posts=[{'name':'user_id','value':id}]; | ||||
| 		this.loadData('userRemove',$.proxy(this.onUserRemove,this),posts,false); | ||||
| 	}, | ||||
| 	onUserRemove:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		this.wssReload(); | ||||
| 		this.dataReload(); | ||||
| 	}, | ||||
| 	 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 	vmTemplateRemove:function(id) | ||||
| 	{ | ||||
| 			if(data.error) | ||||
| 		if(this.removeConfirm(id,'You want to delete selected template! Are you sure?')===false) return; | ||||
| 		var posts=[{'name':'template_id','value':id}]; | ||||
| 		this.loadData('vmTemplateRemove',$.proxy(this.onVmTemplateRemove,this),posts,false); | ||||
| 	}, | ||||
| 	onVmTemplateRemove:function(data) | ||||
| 	{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		this.wssReload(); | ||||
| 		this.dataReload(); | ||||
| 	}, | ||||
| @@ -1612,21 +1548,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onLogLoad:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		$('dialog#tasklog .window-content').html(data.html); | ||||
| 		this.dialogShow1('tasklog'); | ||||
| 	}, | ||||
| @@ -1636,21 +1557,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onLogFlush:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		$('#taskloglist tbody').html(''); | ||||
| 		this.wssend({'cmd':'reload','path':location.pathname},'system'); | ||||
| 	}, | ||||
| @@ -1776,7 +1682,17 @@ var clonos={ | ||||
| 					this.userRemove(trid); | ||||
| 					return; | ||||
| 				} | ||||
| 				if(tblid=='jailslist' || tblid=='bhyveslist') | ||||
| 				{ | ||||
| 					this.jailRemove(trid,opt); | ||||
| 					return; | ||||
| 				} | ||||
| 				if(tblid=='packageslist') | ||||
| 				{ | ||||
| 					this.vmTemplateRemove(trid); | ||||
| 					return; | ||||
| 				} | ||||
| 				alert(tblid); | ||||
| 				return;break; | ||||
| 			case 'icon-arrows-cw': | ||||
| 				if(tblid=='srcslist') | ||||
| @@ -1805,6 +1721,9 @@ var clonos={ | ||||
| 					case 'userslist': | ||||
| 						this.userEdit(trid,tblid); | ||||
| 						return; | ||||
| 					case 'packageslist': | ||||
| 						this.vmTemplateEdit(trid,tblid); | ||||
| 						return; | ||||
| 				} | ||||
| 				 | ||||
| 				return;break; | ||||
| @@ -1969,6 +1888,22 @@ var clonos={ | ||||
| 		*/ | ||||
| 	}, | ||||
| 	 | ||||
| 	onChangePkgTemplate:function(obj,event) | ||||
| 	{ | ||||
| 		var id=$(obj).val(); | ||||
| 		var index=$(obj).prop('selectedIndex'); | ||||
| 		var txt=$('option:selected',obj).text(); | ||||
| 		var res=txt.match(new RegExp(/cpu:[ ]*(\d+).*ram:[ ]*([\dmg]+).*hdd:[ ]*([\dmg]+)/)); | ||||
| 		if(res!=null) | ||||
| 		{ | ||||
| 			var par=$(obj).closest('form'); | ||||
| 			$('input[name="vm_cpus"]',par).val(res[1]); | ||||
| 			$('input[name="vm_cpus_show"]',par).val(res[1]); | ||||
| 			$('input[name="vm_ram"]',par).val(res[2]); | ||||
| 			$('input[name="vm_size"]',par).val(res[3]); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	loginAction:function(event) | ||||
| 	{ | ||||
| 		var target=event.target; | ||||
| @@ -1991,12 +1926,6 @@ var clonos={ | ||||
| 	onLogin:function(data) | ||||
| 	{ | ||||
| 		$('.login-wait').hide(); | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.errorCode!=='undefined') | ||||
| 		{ | ||||
| 			if(data.errorCode==1) | ||||
| @@ -2189,17 +2118,10 @@ var clonos={ | ||||
| 	}, | ||||
| 	onDDMenuLoad:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				if(typeof data.reload!='undefined') | ||||
| 				{ | ||||
| 					if(data.reload) this.dataReload(); | ||||
| @@ -2233,12 +2155,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onUserEdit:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		var dialog=data.dialog; | ||||
| 		$('dialog#'+dialog+' fieldset.edit input[type="password"]').prop('disabled',true); | ||||
| 		this.fillDialogVars(dialog,data.vars); | ||||
| @@ -2246,6 +2162,21 @@ var clonos={ | ||||
| 		this.dialogShow1(dialog,'edit'); | ||||
| 	}, | ||||
| 	 | ||||
| 	vmTemplateEdit:function(template_id,tblid) | ||||
| 	{ | ||||
| 		var mode='vmTemplateEditInfo'; | ||||
| 		var posts=[{'name':'template_id','value':template_id}]; | ||||
| 		this.loadData(mode,$.proxy(this.onVmTemplateEdit,this),posts); | ||||
| 		 | ||||
| 	}, | ||||
| 	onVmTemplateEdit:function(data) | ||||
| 	{ | ||||
| 		var dialog='vm_packages-new'; | ||||
| 		this.lastEditedVmTemplate=data.template_id; | ||||
| 		this.fillDialogVars(dialog,data.vars); | ||||
| 		this.dialogShow1(dialog,'edit'); | ||||
| 	}, | ||||
| 	 | ||||
| 	dataReload:function() | ||||
| 	{ | ||||
| 		this.loadData('getJsonPage',$.proxy(this.onLoadData,this)); | ||||
| @@ -2294,6 +2225,8 @@ var clonos={ | ||||
| 			switch(type) | ||||
| 			{ | ||||
| 				case 'text': | ||||
| 				case 'password': | ||||
| 				case 'textarea': | ||||
| 				case 'select': | ||||
| 					if(typeof v!='undefined') $(inp).val(v); | ||||
| 					break; | ||||
| @@ -2351,16 +2284,6 @@ var clonos={ | ||||
| 	}, | ||||
| 	onSaveHelperValues:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(typeof data.error!='undefined' && data.error) | ||||
| 		{ | ||||
| 			this.notify(data.errorMessage,'error'); | ||||
| 		} | ||||
| 		if(typeof data.redirect!='undefined') | ||||
| 		{ | ||||
| 			if(data.redirect!='') | ||||
| @@ -2392,21 +2315,7 @@ var clonos={ | ||||
| 	}, | ||||
| 	onDeleteHelperGroup:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(!data) return; | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		if(typeof data.db_path!='undefined') | ||||
| 		{ | ||||
| 			this.saveDbPath(data.db_path); | ||||
| @@ -2458,21 +2367,7 @@ var clonos={ | ||||
| 	}, | ||||
| 	onAddHelperGroup:function(data) | ||||
| 	{ | ||||
| 		/* | ||||
| 		try{ | ||||
| 			var data=JSON.parse(data); | ||||
| 		}catch(e){this.debug(e.message,data);return;} | ||||
| 		*/ | ||||
| 		 | ||||
| 		if(!data) return; | ||||
| 		if(typeof data.error!='undefined') | ||||
| 		{ | ||||
| 			if(data.error) | ||||
| 			{ | ||||
| 				this.notify(data.error_message,'error'); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		if(typeof data.db_path!='undefined') | ||||
| 		{ | ||||
| 			this.saveDbPath(data.db_path); | ||||
|   | ||||
| @@ -19,7 +19,7 @@ if(!empty($nodes))foreach($nodes as $node) | ||||
| 	$db1=new Db('base',$node); | ||||
| 	if($db1!==false) | ||||
| 	{ | ||||
| 		$bhyves=$db1->select("SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden,protected FROM bhyve where hidden!=1 order by jname asc;"); | ||||
| 		$bhyves=$db1->select("SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden,protected,bhyve_vnc_tcp_bind FROM bhyve where hidden!=1 order by jname asc;"); | ||||
| 		//$allnodes[$node]=$bhyves; | ||||
| 		 | ||||
| 		$num=$nth & 1; | ||||
| @@ -30,6 +30,22 @@ if(!empty($nodes))foreach($nodes as $node) | ||||
| 			{ | ||||
| 				$html_tpl=$hres[1]; | ||||
| 				$status=$this->check_vmonline($bhyve['jname']); | ||||
|  | ||||
| 				$jname=$bhyve['jname']; | ||||
| 				$vnc_port_status='grey'; | ||||
| 				$vnc_ip=$bhyve['bhyve_vnc_tcp_bind']; | ||||
| 				if($status==1) | ||||
| 				{ | ||||
| 					$vnc_port_file=$this->workdir.'/jails-system/'.$jname.'/vnc_port'; | ||||
| 					if(file_exists($vnc_port_file)) | ||||
| 					{ | ||||
| 						$vnc_port=trim(file_get_contents($vnc_port_file)); | ||||
| 					} | ||||
| 				}else{ | ||||
| 					$vnc_port=''; | ||||
| 				} | ||||
| 				if($vnc_ip!='127.0.0.1') $vnc_port_status='black'; | ||||
| 				 | ||||
| 				$vars=array( | ||||
| 					'jname'=>$bhyve['jname'], | ||||
| 					'nth-num'=>'nth'.$num, | ||||
| @@ -50,6 +66,8 @@ if(!empty($nodes))foreach($nodes as $node) | ||||
| //					'protitle'=>($jail['protected']==1)?' title="'.$this->translate('Protected jail').'"':' title="'.$this->translate('Delete').'"', | ||||
| 					'vnc_title'=>$this->translate('Open VNC'), | ||||
| 					'reboot_title'=>$this->translate('Restart bhyve'), | ||||
| 					'vnc_port'=>$vnc_port, | ||||
| 					'vnc_port_status'=>$vnc_port_status, | ||||
| 				); | ||||
| 				 | ||||
| 				foreach($vars as $var=>$val) | ||||
|   | ||||
| @@ -11,5 +11,6 @@ | ||||
| 			<td width="5" class="op-reboot" title="#reboot_title#"><span class="icon-arrows-cw"></span></td> | ||||
| 			<td width="5" class="op-del"#protitle#><span class="#protected#"></span></td> | ||||
| 			<td width="5" class="op-vnc"><span class="icon-desktop" title="#vnc_title#"></span></td> | ||||
| 			<td class="small vnc-#vnc_port_status#">#vnc_port#</td> | ||||
| 		</tr> | ||||
| 	</tbody> | ||||
| @@ -24,6 +24,7 @@ $clonos->useDialogs(array( | ||||
| 		<th class="wdt-120">Status</th> | ||||
| 		<th colspan="4" class="wdt-100">Action</th> | ||||
| 		<th class="wdt-30">VNC</th> | ||||
| 		<th class="txtcenter wdt-50">VNC port</th> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
| </table> | ||||
| @@ -25,6 +25,7 @@ $clonos->useDialogs(array( | ||||
| 		<th class="txtcenter wdt-120">Статус</th> | ||||
| 		<th colspan="4" class="wdt-100">Действия</th> | ||||
| 		<th class="wdt-30">VNC</th> | ||||
| 		<th class="txtcenter wdt-50">VNC порт</th> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
| </table> | ||||
| @@ -36,13 +36,24 @@ if(!empty($nodes))foreach($nodes as $node) | ||||
| 		{ | ||||
| 			if($hres!==false) | ||||
| 			{ | ||||
| 				$jname=$jail['jname']; | ||||
| 				$vnc_port_status='grey'; | ||||
| 				$vnc_port=''; | ||||
| 				$vnc_port_file=$this->workdir.'/jails-system/'.$jname.'/vnc_port'; | ||||
| 				if(file_exists($vnc_port_file)) | ||||
| 				{ | ||||
| 					$vnc_port=trim(file_get_contents($vnc_port_file)); | ||||
| 				} | ||||
| 				 | ||||
| 				$html_tpl=$hres[1]; | ||||
| 				$status=$jail['status']; | ||||
| 				$vars=array( | ||||
| 					'nth-num'=>'nth'.$num, | ||||
| 					'node'=>$node, | ||||
| 					'ip4_addr'=>str_replace(',',',<wbr />',$jail['ip4_addr']), | ||||
| 					'jname'=>$jail['jname'], | ||||
| 					'jname'=>$jname, | ||||
| 					'vnc_port'=>$vnc_port, | ||||
| 					'vnc_port_status'=>$vnc_port_status, | ||||
| 					'status'=>$status, | ||||
| 					'jstatus'=>$this->translate($statuses[$status]), | ||||
| 					'icon'=>($status==0)?'play':'stop', | ||||
|   | ||||
| @@ -19,6 +19,7 @@ $clonos->useDialogs(array( | ||||
| 			<th class="wdt-120">Status</th> | ||||
| 			<th colspan="4" class="wdt-100">Action</th> | ||||
| 			<th class="wdt-30">VNC</th> | ||||
| 			<th class="txtcenter wdt-50">VNC port</th> | ||||
| 		</tr> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
|   | ||||
| @@ -9,5 +9,6 @@ | ||||
| 			<td width="5" class="op-reboot" title="#reboot_title#"><span class="icon-arrows-cw"></span></td> | ||||
| 			<td width="5" class="op-del"#protitle#><span class="#protected#"></span></td> | ||||
| 			<td width="5" class="op-vnc"><span class="icon-desktop" title="#vnc_title#"></span></td> | ||||
| 			<td class="small vnc-#vnc_port_status#">#vnc_port#</td> | ||||
| 		</tr> | ||||
| 	</tbody> | ||||
| @@ -28,6 +28,7 @@ $clonos->useDialogs(array( | ||||
| 			<th class="txtcenter wdt-120">Статус</th> | ||||
| 			<th colspan="4" class="wdt-100">Действия</th> | ||||
| 			<th class="wdt-30">VNC</th> | ||||
| 			<th class="txtcenter wdt-50">VNC порт</th> | ||||
| 		</tr> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
|   | ||||
| @@ -0,0 +1,23 @@ | ||||
| <?php | ||||
| $clonos->useDialogs(array( | ||||
| 	'users-new', | ||||
| )); | ||||
| ?> | ||||
|  | ||||
| <h1>User management</h1> | ||||
| <p><span class="top-button icon-plus id:users-new">Add users</span></p> | ||||
|  | ||||
| <table class="tsimple" id="userslist" width="100%"> | ||||
| 	<thead> | ||||
| 		<tr> | ||||
| 			<th class="txtleft">Login</th> | ||||
| 			<th class="txtleft">First Name</th> | ||||
| 			<th class="txtleft">Last Name</th> | ||||
| 			<th class="txtleft">Registration</th> | ||||
| 			<th class="txtleft">Last login</th> | ||||
| 			<th class="txtcenter">Active</th> | ||||
| 			<th class="txtcenter wd-100">Action</th> | ||||
| 		</tr> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
| </table> | ||||
							
								
								
									
										41
									
								
								public/pages/vm_packages/a.json.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								public/pages/vm_packages/a.json.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?php | ||||
|  | ||||
| $html=''; | ||||
| $db=new Db('base','local'); | ||||
| if($db!==false) | ||||
| { | ||||
| 	$res=$db->select("select id,name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus,owner from vmpackages order by name asc"); | ||||
| } | ||||
|  | ||||
| $nth=0; | ||||
| $hres=$this->getTableChunk('packages','tbody'); | ||||
|  | ||||
| $html_tpl=$hres[1]; | ||||
| if(!empty($res))foreach($res as $r) | ||||
| { | ||||
| 	$html_tpl1=$html_tpl; | ||||
| 	$vars=array( | ||||
| 		'id'=>$r['id'], | ||||
| 		'name'=>$r['name'], | ||||
| 		'description'=>$r['description'], | ||||
| 		'pkg_vm_ram'=>$r['pkg_vm_ram'], | ||||
| 		'pkg_vm_disk'=>$r['pkg_vm_disk'], | ||||
| 		'pkg_vm_cpus'=>$r['pkg_vm_cpus'], | ||||
| 		'owner'=>$r['owner'], | ||||
| 		'edit_title'=>$this->translate('edit_title'), | ||||
| 		'delete_title'=>$this->translate('delete_title'), | ||||
| 	); | ||||
| 	foreach($vars as $var=>$val) | ||||
| 		$html_tpl1=str_replace('#'.$var.'#',$val,$html_tpl1); | ||||
| 	$html.=$html_tpl1; | ||||
| } | ||||
|  | ||||
|  | ||||
| $html=str_replace(array("\n","\r","\t"),'',$html); | ||||
|  | ||||
| echo json_encode(array( | ||||
| 	'tbody'=>$html, | ||||
| 	'error'=>false, | ||||
| 	'func'=>'fillTable', | ||||
| 	'id'=>'packageslist', | ||||
| )); | ||||
							
								
								
									
										23
									
								
								public/pages/vm_packages/en.index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								public/pages/vm_packages/en.index.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <?php | ||||
| $clonos->useDialogs(array( | ||||
| 	'vm_packages-new', | ||||
| )); | ||||
| ?> | ||||
|  | ||||
| <h1>VM Packages</h1> | ||||
| <p><span class="top-button icon-plus id:vm_packages-new">Add package</span></p> | ||||
|  | ||||
| <table class="tsimple" id="packageslist" width="100%"> | ||||
| 	<thead> | ||||
| 		<tr> | ||||
| 			<th class="txtleft">Package name</th> | ||||
| 			<th class="txtleft">Description</th> | ||||
| 			<th class="txtcenter">RAM</th> | ||||
| 			<th class="txtcenter">Disk size</th> | ||||
| 			<th class="txtcenter">vCPU</th> | ||||
| 			<th class="txtcenter">Modified by</th> | ||||
| 			<th class="txtcenter wd-100">Action</th> | ||||
| 		</tr> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
| </table> | ||||
							
								
								
									
										14
									
								
								public/pages/vm_packages/packages.table
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								public/pages/vm_packages/packages.table
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| 	<tbody> | ||||
| 		<tr class="#nth-num# helper" id="#id#"> | ||||
| 			<td class="txtleft vmiddle">#name#</td> | ||||
| 			<td class="txtleft vmiddle">#description#</td> | ||||
| 			<td class="txtcenter vmiddle">#pkg_vm_ram#</td> | ||||
| 			<td class="txtcenter vmiddle">#pkg_vm_disk#</td> | ||||
| 			<td class="txtcenter vmiddle">#pkg_vm_cpus#</td> | ||||
| 			<td class="txtcenter vmiddle">#owner#</td> | ||||
| 			<td class="ops vmiddle" width="5"> | ||||
| 				<span class="icon-edit" title="#edit_title#"></span> | ||||
| 				<span class="icon-cancel" title="#delete_title#"></span> | ||||
| 			</td> | ||||
| 		</tr> | ||||
| 	</tbody> | ||||
							
								
								
									
										23
									
								
								public/pages/vm_packages/ru.index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								public/pages/vm_packages/ru.index.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <?php | ||||
| $clonos->useDialogs(array( | ||||
| 	'vm_packages-new', | ||||
| )); | ||||
| ?> | ||||
|  | ||||
| <h1>Шаблоны виртуальных машин</h1> | ||||
| <p><span class="top-button icon-plus id:vm_packages-new">Добавить шаблон</span></p> | ||||
|  | ||||
| <table class="tsimple" id="packageslist" width="100%"> | ||||
| 	<thead> | ||||
| 		<tr> | ||||
| 			<th class="txtleft">Название</th> | ||||
| 			<th class="txtleft">Описание</th> | ||||
| 			<th class="txtcenter">Объём RAM</th> | ||||
| 			<th class="txtcenter">Размер диска</th> | ||||
| 			<th class="txtcenter">Количество ядер</th> | ||||
| 			<th class="txtcenter">Добавил</th> | ||||
| 			<th class="txtcenter wd-100">Действия</th> | ||||
| 		</tr> | ||||
| 	</thead> | ||||
| 	<tbody></tbody> | ||||
| </table> | ||||
| @@ -83,7 +83,6 @@ vm_vnc_port="#vm_vnc_port#"; | ||||
| cd_vnc_wait="1"; | ||||
| bhyve_vnc_resolution="1024x768"; | ||||
| bhyve_vnc_tcp_bind="#bhyve_vnc_tcp_bind#"; | ||||
| bhyve_vnc_vgaconf="io"; | ||||
|  | ||||
| vnc_password=""; | ||||
|  | ||||
|  | ||||
| vnc_password="#vm_vnc_password#"; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 olevole
					olevole