This commit is contained in:
olevole
2018-01-17 23:29:05 +03:00
parent 6b514cc0e3
commit b84141e436
21 changed files with 610 additions and 273 deletions

View File

@@ -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);
}
}

View File

@@ -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=' <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);
}
}

View File

@@ -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;
}

View File

@@ -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">

View File

@@ -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">

View 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>

View File

@@ -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);

View File

@@ -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)

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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',

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View 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',
));

View 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>

View 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>

View 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>

View File

@@ -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#";