From b84141e436a00c098924c9725f5aea9da3ccdc7a Mon Sep 17 00:00:00 2001 From: olevole Date: Wed, 17 Jan 2018 23:29:05 +0300 Subject: [PATCH] sync --- php/clonos.php | 160 ++++++++- php/config.php | 97 ++++-- public/css/styles.css | 25 +- public/dialogs/bhyve-new.php | 19 +- public/dialogs/bhyve-obtain.php | 27 +- public/dialogs/vm_packages-new.php | 46 +++ public/js/clonos.js | 341 +++++++------------ public/pages/bhyvevms/a.json.php | 20 +- public/pages/bhyvevms/bhyveslist.table | 1 + public/pages/bhyvevms/en.index.php | 1 + public/pages/bhyvevms/ru.index.php | 1 + public/pages/jailscontainers/a.json.php | 13 +- public/pages/jailscontainers/en.index.php | 1 + public/pages/jailscontainers/jailslist.table | 1 + public/pages/jailscontainers/ru.index.php | 1 + public/pages/users/en.index.php | 23 ++ public/pages/vm_packages/a.json.php | 41 +++ public/pages/vm_packages/en.index.php | 23 ++ public/pages/vm_packages/packages.table | 14 + public/pages/vm_packages/ru.index.php | 23 ++ public/templates/vm.tpl | 5 +- 21 files changed, 610 insertions(+), 273 deletions(-) create mode 100644 public/dialogs/vm_packages-new.php create mode 100644 public/pages/vm_packages/a.json.php create mode 100644 public/pages/vm_packages/en.index.php create mode 100644 public/pages/vm_packages/packages.table create mode 100644 public/pages/vm_packages/ru.index.php diff --git a/php/clonos.php b/php/clonos.php index b6868e76..cec36436 100644 --- a/php/clonos.php +++ b/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); + } } \ No newline at end of file diff --git a/php/config.php b/php/config.php index 50ae803f..b57519b7 100644 --- a/php/config.php +++ b/php/config.php @@ -167,50 +167,69 @@ 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); - if(!empty($res))foreach($res as $item) - { - $os_name=$this->os_types_names[$item['type']]; - if(isset($array[$os_name])) - { - $array[$os_name]['items'][]=$item; - }else{ - $array[$os_name]=array('os'=>$os_name,'items'=>array($item)); - } - } - if(!empty($array))foreach($array as $item) $array1[]=$item; - unset($array); - $this->os_types=$array1; + $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']]; + if(isset($array[$os_name])) + { + $array[$os_name]['items'][]=$item; + }else{ + $array[$os_name]=array('os'=>$os_name,'items'=>array($item)); + } + } + if(!empty($array))foreach($array as $item) $array1[]=$item; + unset($array); + 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=' '.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.=' '.PHP_EOL; - if($item['obtain']) $obtain_count++; + //if($item['obtain']) $obtain_count++; } $html_tmp.=' '.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=''; + $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=''.$item['name'].' (cpu: '.$cpu.'; ram: '.$ram.'; hdd: '.$item['pkg_vm_disk'].')'; + $html.=' '.PHP_EOL; + } + return array('html'=>$html,'min_id'=>$min_id); + } } \ No newline at end of file diff --git a/public/css/styles.css b/public/css/styles.css index fd426d0b..b83364a8 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -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; } diff --git a/public/dialogs/bhyve-new.php b/public/dialogs/bhyve-new.php index b66a3aa7..459bd8e3 100644 --- a/public/dialogs/bhyve-new.php +++ b/public/dialogs/bhyve-new.php @@ -24,20 +24,27 @@ err_messages.add({

- translate('VM Image size');?>: - + translate('VM template (cpu, ram, hdd)');?>: + +

translate('VM CPUs');?>: - +

translate('VM RAM');?>: - + +

+

+ translate('VM Image size');?>: +

translate('Attached boot ISO image');?>: @@ -56,6 +63,10 @@ err_messages.add({ translate('VNC PORT');?>:

+

+ translate('VNC Password');?>: + translate('use to log in VNC console');?> +

translate('VM RAM');?>: - + +

+

+ translate('VM Image size');?>: +

translate('IP address');?>: @@ -56,6 +57,10 @@ config->authkeys_list(); ?>

+

+ translate('VNC Password');?>: + translate('use to log in VNC. Default is');?>: cbsd +

diff --git a/public/dialogs/vm_packages-new.php b/public/dialogs/vm_packages-new.php new file mode 100644 index 00000000..42628cc5 --- /dev/null +++ b/public/dialogs/vm_packages-new.php @@ -0,0 +1,46 @@ + + +

+ translate('Add new template');?> + translate('Edit template');?> +

+

translate('Template Settings');?>

+
+
+

+ translate('Name');?>: + +

+

+ translate('Description');?>: + +

+

+ translate('RAM Size');?>: + +

+

+ translate('HDD Size');?>: + +

+

+ translate('CPUs Count');?>: + + + + +

+
+
+
+ + + +
+
\ No newline at end of file diff --git a/public/js/clonos.js b/public/js/clonos.js index 18619f90..f082ae68 100644 --- a/public/js/clonos.js +++ b/public/js/clonos.js @@ -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) { @@ -872,7 +850,7 @@ var clonos={ this.loginFadeIn(); return; } - + if(typeof data.error!='undefined') { if(data.error && typeof(data.error_message)!='undefined') @@ -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(); - } + $('#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(); - } + $('#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(); - } + $('#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;} - */ - - if(typeof data.error!='undefined') - { - if(data.error) - { - this.notify(data.error_message,'error'); - return; - } - } - + this.wssReload(); + this.dataReload(); + }, + + vmTemplateRemove:function(id) + { + 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.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; } - this.jailRemove(trid,opt); + 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); diff --git a/public/pages/bhyvevms/a.json.php b/public/pages/bhyvevms/a.json.php index 754fa421..8681717e 100644 --- a/public/pages/bhyvevms/a.json.php +++ b/public/pages/bhyvevms/a.json.php @@ -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) diff --git a/public/pages/bhyvevms/bhyveslist.table b/public/pages/bhyvevms/bhyveslist.table index 2b45ef63..45bab2e5 100644 --- a/public/pages/bhyvevms/bhyveslist.table +++ b/public/pages/bhyvevms/bhyveslist.table @@ -11,5 +11,6 @@ + #vnc_port# \ No newline at end of file diff --git a/public/pages/bhyvevms/en.index.php b/public/pages/bhyvevms/en.index.php index 569b1aee..0b7fa677 100644 --- a/public/pages/bhyvevms/en.index.php +++ b/public/pages/bhyvevms/en.index.php @@ -24,6 +24,7 @@ $clonos->useDialogs(array( Status Action VNC + VNC port \ No newline at end of file diff --git a/public/pages/bhyvevms/ru.index.php b/public/pages/bhyvevms/ru.index.php index 90e4847b..d7ad615a 100644 --- a/public/pages/bhyvevms/ru.index.php +++ b/public/pages/bhyvevms/ru.index.php @@ -25,6 +25,7 @@ $clonos->useDialogs(array( Статус Действия VNC + VNC порт \ No newline at end of file diff --git a/public/pages/jailscontainers/a.json.php b/public/pages/jailscontainers/a.json.php index 075cfe41..6b1e91d7 100644 --- a/public/pages/jailscontainers/a.json.php +++ b/public/pages/jailscontainers/a.json.php @@ -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(',',',',$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', diff --git a/public/pages/jailscontainers/en.index.php b/public/pages/jailscontainers/en.index.php index 4a25b60c..23e91062 100644 --- a/public/pages/jailscontainers/en.index.php +++ b/public/pages/jailscontainers/en.index.php @@ -19,6 +19,7 @@ $clonos->useDialogs(array( Status Action VNC + VNC port diff --git a/public/pages/jailscontainers/jailslist.table b/public/pages/jailscontainers/jailslist.table index d08ed7e0..4108a4b4 100644 --- a/public/pages/jailscontainers/jailslist.table +++ b/public/pages/jailscontainers/jailslist.table @@ -9,5 +9,6 @@ + #vnc_port# \ No newline at end of file diff --git a/public/pages/jailscontainers/ru.index.php b/public/pages/jailscontainers/ru.index.php index a8e3f62c..3be714f6 100644 --- a/public/pages/jailscontainers/ru.index.php +++ b/public/pages/jailscontainers/ru.index.php @@ -28,6 +28,7 @@ $clonos->useDialogs(array( Статус Действия VNC + VNC порт diff --git a/public/pages/users/en.index.php b/public/pages/users/en.index.php index e69de29b..3d40d19a 100644 --- a/public/pages/users/en.index.php +++ b/public/pages/users/en.index.php @@ -0,0 +1,23 @@ +useDialogs(array( + 'users-new', +)); +?> + +

User management

+

Add users

+ + + + + + + + + + + + + + +
LoginFirst NameLast NameRegistrationLast loginActiveAction
\ No newline at end of file diff --git a/public/pages/vm_packages/a.json.php b/public/pages/vm_packages/a.json.php new file mode 100644 index 00000000..f4678aba --- /dev/null +++ b/public/pages/vm_packages/a.json.php @@ -0,0 +1,41 @@ +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', +)); diff --git a/public/pages/vm_packages/en.index.php b/public/pages/vm_packages/en.index.php new file mode 100644 index 00000000..d2ac5641 --- /dev/null +++ b/public/pages/vm_packages/en.index.php @@ -0,0 +1,23 @@ +useDialogs(array( + 'vm_packages-new', +)); +?> + +

VM Packages

+

Add package

+ + + + + + + + + + + + + + +
Package nameDescriptionRAMDisk sizevCPUModified byAction
diff --git a/public/pages/vm_packages/packages.table b/public/pages/vm_packages/packages.table new file mode 100644 index 00000000..730772e5 --- /dev/null +++ b/public/pages/vm_packages/packages.table @@ -0,0 +1,14 @@ + + + #name# + #description# + #pkg_vm_ram# + #pkg_vm_disk# + #pkg_vm_cpus# + #owner# + + + + + + \ No newline at end of file diff --git a/public/pages/vm_packages/ru.index.php b/public/pages/vm_packages/ru.index.php new file mode 100644 index 00000000..4f7dfc37 --- /dev/null +++ b/public/pages/vm_packages/ru.index.php @@ -0,0 +1,23 @@ +useDialogs(array( + 'vm_packages-new', +)); +?> + +

Шаблоны виртуальных машин

+

Добавить шаблон

+ + + + + + + + + + + + + + +
НазваниеОписаниеОбъём RAMРазмер дискаКоличество ядерДобавилДействия
diff --git a/public/templates/vm.tpl b/public/templates/vm.tpl index ad8b55e2..14133de6 100644 --- a/public/templates/vm.tpl +++ b/public/templates/vm.tpl @@ -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#";