ClonOS Beta

This commit is contained in:
olevole
2017-04-09 23:50:37 +03:00
parent 5e86458e9d
commit d4a75b98c2
31 changed files with 879 additions and 350 deletions

View File

@@ -20,7 +20,7 @@ class ClonOS
private $_db=null; private $_db=null;
private $_client_ip=''; private $_client_ip='';
private $_dialogs=array(); private $_dialogs=array();
private $_cmd_array=array('jcreate','jstart','jstop','jrestart','jedit','jremove','jexport','jimport','jclone','jrename','madd','sstart','sstop','projremove','bcreate','bstart','bstop','brestart','bremove','bclone','brename','vm_obtain','removesrc','srcup','removebase','world','repo'); private $_cmd_array=array('jcreate','jstart','jstop','jrestart','jedit','jremove','jexport','jimport','jclone','jrename','madd','sstart','sstop','projremove','bcreate','bstart','bstop','brestart','bremove','bclone','brename','vm_obtain','removesrc','srcup','removebase','world','repo','forms');
/* /*
public $projectId=0; public $projectId=0;
@@ -90,7 +90,7 @@ class ClonOS
$this->realpath_public=$_REALPATH.'/public/'; $this->realpath_public=$_REALPATH.'/public/';
# /usr/home/web/cp/clonos/public/ # /usr/home/web/cp/clonos/public/
if(isset($_SERVER['SERVER_NAME'])) if(isset($_SERVER['SERVER_NAME']) && !empty(trim($_SERVER['SERVER_NAME'])))
$this->server_name=$_SERVER['SERVER_NAME']; $this->server_name=$_SERVER['SERVER_NAME'];
else else
$this->server_name=$_SERVER['SERVER_ADDR']; $this->server_name=$_SERVER['SERVER_ADDR'];
@@ -266,6 +266,9 @@ class ClonOS
echo json_encode($this->vpnetRemove()); echo json_encode($this->vpnetRemove());
return;break; return;break;
case 'updateBhyveISO':
echo json_encode($this->updateBhyveISO());
return;break;
case 'mediaAdd': case 'mediaAdd':
//echo json_encode($this->mediaAdd()); //echo json_encode($this->mediaAdd());
return;break; return;break;
@@ -284,6 +287,15 @@ class ClonOS
case 'repoCompile': case 'repoCompile':
echo json_encode($this->repoCompile()); echo json_encode($this->repoCompile());
return;break; return;break;
case 'srcUpdate':
echo json_encode($this->srcUpdate());
return;break;
case 'srcRemove':
echo json_encode($this->srcRemove());
return;break;
case 'baseRemove':
echo json_encode($this->baseRemove());
return;break;
/* case 'saveHelperValues': /* case 'saveHelperValues':
echo json_encode($this->saveHelperValues()); echo json_encode($this->saveHelperValues());
@@ -456,7 +468,7 @@ class ClonOS
*/ */
function _getTasksStatus($jsonObj) function _getTasksStatus($jsonObj)
{ {
return $jsonObj; //return $jsonObj;
$tasks=array(); $tasks=array();
$obj=json_decode($jsonObj,true); $obj=json_decode($jsonObj,true);
@@ -767,6 +779,7 @@ class ClonOS
$form=$this->form; $form=$this->form;
$helper=preg_replace('/^#/','',$this->_vars['hash']); $helper=preg_replace('/^#/','',$this->_vars['hash']);
$db_path='';
$with_img_helpers=''; $with_img_helpers='';
if($this->mode=='saveHelperValues') if($this->mode=='saveHelperValues')
{ {
@@ -774,6 +787,22 @@ class ClonOS
{ {
return $this->saveSettingsCBSD(); return $this->saveSettingsCBSD();
} }
if(!isset($this->_vars['db_path']))
{
$res=$this->cbsd_cmd('make_tmp_helper module='.$helper);
if($res['retval']==0)
{
$db_path=$res['message'];
}else{
echo json_encode(array('error'=>true,'errorMessage'=>'Error on open temporary form database!'));
return;
}
}else{
$db_path=$this->_vars['db_path'];
}
/*
$file_name=$this->workdir.'/formfile/'.$helper.'.sqlite'; $file_name=$this->workdir.'/formfile/'.$helper.'.sqlite';
if(file_exists($file_name)) if(file_exists($file_name))
{ {
@@ -797,6 +826,24 @@ class ClonOS
//echo $with_img_helpers; //echo $with_img_helpers;
} }
} }
*/
$db=new Db('file',$db_path);
if($db!==false)
{
foreach($form as $key=>$val)
{
if($key!='jname' && $key!='ip4_addr')
{
$query="update forms set new='{$val}' where param='{$key}'";
$db->update($query);
unset($form[$key]);
}
}
$with_img_helpers=$db_path;
}
$form['interface']='auto'; $form['interface']='auto';
$form['user_pw_root']=''; $form['user_pw_root']='';
$form['astart']=1; $form['astart']=1;
@@ -861,6 +908,7 @@ class ClonOS
$err='Jail was created!'; $err='Jail was created!';
$taskId=$res['message']; $taskId=$res['message'];
} }
// local - поменять на реальный сервер, на котором создаётся клетка! // local - поменять на реальный сервер, на котором создаётся клетка!
$jid=$arr['jname']; $jid=$arr['jname'];
@@ -901,7 +949,7 @@ class ClonOS
))); )));
*/ */
return array('errorMessage'=>$err,'jail_id'=>$jid,'taskId'=>$taskId,'mode'=>$this->mode,'redirect'=>$redirect); //,'html'=>$html return array('errorMessage'=>$err,'jail_id'=>$jid,'taskId'=>$taskId,'mode'=>$this->mode,'redirect'=>$redirect,'db_path'=>$db_path); //,'html'=>$html
} }
function jailRenameVars() function jailRenameVars()
{ {
@@ -1192,6 +1240,7 @@ class ClonOS
$res['error']=false; $res['error']=false;
$res['dialog']=$form['dialog']; $res['dialog']=$form['dialog'];
$res['jail_id']=$form['jail_id']; $res['jail_id']=$form['jail_id'];
$res['iso_list']=$this->updateBhyveISO($form['jail_id']);
return $res; return $res;
} }
function bhyveRename() function bhyveRename()
@@ -1251,7 +1300,7 @@ class ClonOS
} }
function bhyveEdit() function bhyveEdit()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$str=array(); $str=array();
$jname=$form['jname']; $jname=$form['jname'];
@@ -1278,6 +1327,26 @@ class ClonOS
$form['vm_ram']=$ram_tmp; $form['vm_ram']=$ram_tmp;
/* check mounted ISO */
$db=new Db('base','storage_media');
$res=$db->selectAssoc('select * from media where jname="'.$jname.'" and type="iso"');
if($res!==false && !empty($res))
{
$cmd1="cbsd media mode=unregister name=\"${res['name']}\" path=\"${res['path']}\" jname=${jname} type=${res['type']}";
//echo $cmd1,PHP_EOL,PHP_EOL;
$this->cbsd_cmd($cmd1);
$res=$db->selectAssoc('select * from media where idx='.$form['vm_iso_image']);
if($res!==false && !empty($res) && $form['vm_iso_image']!=-2)
{
$cmd2="cbsd media mode=register name=\"${res['name']}\" path=\"${res['path']}\" jname=${jname} type=${res['type']}";
$this->cbsd_cmd($cmd2);
//echo $cmd2;
}
}
//exit;
/* end check */
$cmd='bset jname='.$jname.' '.join(' ',$str); $cmd='bset jname='.$jname.' '.join(' ',$str);
$res=$this->cbsd_cmd($cmd); $res=$this->cbsd_cmd($cmd);
$res['mode']='bhyveEdit'; $res['mode']='bhyveEdit';
@@ -1286,7 +1355,8 @@ class ClonOS
} }
function bhyveAdd() function bhyveAdd()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$os_types=$this->config->os_types; $os_types=$this->config->os_types;
$sel_os=$form['vm_os_profile']; $sel_os=$form['vm_os_profile'];
@@ -1316,6 +1386,33 @@ class ClonOS
'vm_vnc_port'=>$form['vm_vnc_port'], 'vm_vnc_port'=>$form['vm_vnc_port'],
); );
$iso=true;
$res=array('name'=>'','path'=>'','iso_var_block'=>'');
$crlf="\r\n";
$iso_var_block='iso_extract=""'.$crlf.'iso_img_dist=""'.$crlf.'iso_img=""'.$crlf.'iso_site=""';
$iso_id=$form['vm_iso_image'];
if(!empty($iso_id))
{
if($iso_id>0)
{
$db=new Db('base','storage_media');
$res=$db->selectAssoc('select name,path from media where idx='.$iso_id);
if($res===false || empty($res)) $iso=false;
}
if($iso_id==-1)
{
$iso=false;
}
if($iso)
{
$arr['register_iso_as']='register_iso_as="'.$res['name'].'"';
$arr['register_iso_name']='register_iso_name="'.$res['path'].'"';
if($iso_id!=-2) $arr['iso_var_block']=$iso_var_block;
}
}
/* create vm */ /* create vm */
$file_name='/tmp/'.$arr['jname'].'.conf'; $file_name='/tmp/'.$arr['jname'].'.conf';
@@ -1327,6 +1424,7 @@ class ClonOS
$file=str_replace('#'.$var.'#',$val,$file); $file=str_replace('#'.$var.'#',$val,$file);
} }
} }
//echo $file;exit;
file_put_contents($file_name,$file); file_put_contents($file_name,$file);
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bcreate inter=0 jconf='.$file_name); $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bcreate inter=0 jconf='.$file_name);
@@ -1438,28 +1536,28 @@ class ClonOS
} }
function bhyveStart() function bhyveStart()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$name=$form['jname']; $name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstart inter=0 jname='.$name); // autoflush=2 $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstart inter=0 jname='.$name); // autoflush=2
return $res; return $res;
} }
function bhyveStop() function bhyveStop()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$name=$form['jname']; $name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstop inter=0 jname='.$name); // autoflush=2 $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstop inter=0 jname='.$name); // autoflush=2
return $res; return $res;
} }
function bhyveRestart() function bhyveRestart()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$name=$form['jname']; $name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd brestart inter=0 jname='.$name); // autoflush=2 $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd brestart inter=0 jname='.$name); // autoflush=2
return $res; return $res;
} }
function bhyveRemove() //$name function bhyveRemove() //$name
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$name=$form['jname']; $name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bremove inter=0 jname='.$name); // autoflush=2 $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bremove inter=0 jname='.$name); // autoflush=2
return $res; return $res;
@@ -1467,7 +1565,7 @@ class ClonOS
function authkeyAdd() function authkeyAdd()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
$query="insert into authkey (name,authkey) values ('{$form['keyname']}','{$form['keysrc']}')"; $query="insert into authkey (name,authkey) values ('{$form['keyname']}','{$form['keysrc']}')";
@@ -1558,24 +1656,49 @@ class ClonOS
function mediaRemove() function mediaRemove()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
/*
$db=new Db('base','storage_media'); $db=new Db('base','storage_media');
$res=$db->update('delete from media where idx='.$form['media_id']); //$res=$db->update('delete from media where idx='.$form['media_id']);
if($res===false) return array('error'=>true,'res'=>print_r($res,true)); $res=$db->selectAssoc('select * from media where idx='.$form['media_id']);
*/ if($res===false || empty($res)) return array('error'=>true,'res'=>print_r($res,true));
return array('error'=>false,'media_id'=>$form['media_id']);
//if($res['jname']=='-') // если медиа отвязана, то просто удаляем
//print_r($res);exit;
$cmd='media mode=remove name="'.$res['name'].'" path="'.$res['path'].'" jname="'.$res['jname'].'" type="'.$res['type'].'"'; //.$res['name']
//echo $cmd;exit;
$res=$this->cbsd_cmd($cmd);
if($res['error'])
{
$arr['error']=true;
$arr['error_message']='File image was not deleted! '.$res['error_message'];
}else{
$arr['error']=false;
}
$arr['media_id']=$form['media_id'];
$arr['cmd']=$res;
//echo json_encode($arr);
//return array('error'=>false,'media_id'=>$form['media_id']);
return $arr;
} }
function srcRemove($ver) function srcRemove()
{ {
$form=$this->form;
$ver=$form['jname'];
$ver=str_replace('src','',$ver); $ver=str_replace('src','',$ver);
if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!'); if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd removesrc inter=0 ver='.$ver.' jname=#src'.$ver); $res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd removesrc inter=0 ver='.$ver.' jname=#src'.$ver);
return $res; return $res;
} }
function srcUpdate($ver) function srcUpdate()
{ {
$form=$this->form;
$ver=$form['jname'];
//$ver=str_replace('src','',$ver);
$ver=str_replace('src','',$ver); $ver=str_replace('src','',$ver);
$stable=(preg_match('#\.\d#',$ver))?0:1; $stable=(preg_match('#\.\d#',$ver))?0:1;
if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!'); if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
@@ -1620,9 +1743,12 @@ class ClonOS
return array('html'=>$html,'arr'=>$res); return array('html'=>$html,'arr'=>$res);
} }
function baseRemove($id) function baseRemove() //$id
{ {
//$id=str_replace('base','',$id); //$id=str_replace('base','',$id);
//base10.3-amd64-0
$form=$this->form;
$id=$form['jname'];
$orig_id=$id; $orig_id=$id;
preg_match('#base([0-9\.]+)-([^-]+)-(\d+)#',$id,$res); preg_match('#base([0-9\.]+)-([^-]+)-(\d+)#',$id,$res);
$ver=$res[1]; $ver=$res[1];
@@ -1636,7 +1762,7 @@ class ClonOS
function basesCompile() function basesCompile()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
if(!isset($form['sources']) || !is_numeric($form['sources'])) return array('error'=>true,'errorMessage'=>'Wrong OS type selected!'); if(!isset($form['sources']) || !is_numeric($form['sources'])) return array('error'=>true,'errorMessage'=>'Wrong OS type selected!');
$id=$form['sources']; $id=$form['sources'];
@@ -1647,7 +1773,6 @@ class ClonOS
}else{ }else{
return array('error'=>true,'errorMessage'=>'Database connect error!'); return array('error'=>true,'errorMessage'=>'Database connect error!');
} }
$ver=$base['ver']; $ver=$base['ver'];
$stable_arr=array('release','stable'); $stable_arr=array('release','stable');
$stable_num=strlen(intval($ver))<strlen($ver)?0:1; $stable_num=strlen(intval($ver))<strlen($ver)?0:1;
@@ -1732,7 +1857,7 @@ class ClonOS
function repoCompile() function repoCompile()
{ {
$form=$this->_vars['form_data']; $form=$this->form;
if(!isset($form['version']) || !is_numeric($form['version'])) return array('error'=>true,'errorMessage'=>'Wrong OS type input!'); if(!isset($form['version']) || !is_numeric($form['version'])) return array('error'=>true,'errorMessage'=>'Wrong OS type input!');
$stable_arr=array('release','stable'); $stable_arr=array('release','stable');
@@ -1881,7 +2006,7 @@ class ClonOS
function addHelperGroup($mode) function addHelperGroup($mode)
{ {
$module=$this->url_hash; $module=$this->url_hash;
$form=$this->form; if(isset($this->form)) $form=$this->form; else $form=array();
if(isset($form['db_path']) && !empty($form['db_path'])) if(isset($form['db_path']) && !empty($form['db_path']))
{ {
$db_path=$form['db_path']; $db_path=$form['db_path'];
@@ -1904,12 +2029,14 @@ class ClonOS
function deleteHelperGroup($mode) function deleteHelperGroup($mode)
{ {
$module=$this->url_hash; $module=$this->url_hash;
$form=$this->form; if(isset($this->form)) $form=$this->form; else $form=array();
$index=$form['index'];
$index=str_replace('ind-','',$index);
if(!isset($form['db_path']) || empty($form['db_path'])) return; if(!isset($form['db_path']) || empty($form['db_path'])) return;
if(!file_exists($form['db_path'])) if(!file_exists($form['db_path']))
return array('error'=>true,'errorMessage'=>'Error on open temporary form file!'); return array('error'=>true,'errorMessage'=>'Error on open temporary form file!');
$index=$form['index'];
$index=str_replace('ind-','',$index);
$db_path=$form['db_path']; $db_path=$form['db_path'];
$res=$this->cbsd_cmd('forms inter=0 module='.$module.' formfile='.$db_path.' group=del index='.$index); $res=$this->cbsd_cmd('forms inter=0 module='.$module.' formfile='.$db_path.' group=del index='.$index);
@@ -1973,10 +2100,13 @@ class ClonOS
function runVNC($jname) function runVNC($jname)
{ {
$res=$this->cbsd_cmd("vm_vncwss jname={$jname} permit={$this->_client_ip}"); $res=$this->cbsd_cmd("vm_vncwss jname={$jname} permit={$this->_client_ip}");
$res=$this->_db_local->selectAssoc('select nodeip from local'); //$res=$this->_db_local->selectAssoc('select nodeip from local');
$nodeip=$res['nodeip']; //$nodeip=$res['nodeip'];
// need for IPv4/IPv6 regex here, instead of strlen // need for IPv4/IPv6 regex here, instead of strlen
if(strlen($nodeip)<7) $nodeip='127.0.0.1'; //if(strlen($nodeip)<7) $nodeip='127.0.0.1';
//if(strlen($nodeip)<7) $nodeip=$this->server_name;
$nodeip=$this->server_name;
header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080'); header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080');
exit; exit;
} }
@@ -2059,4 +2189,60 @@ class ClonOS
return '<span class="cbsd-str">'.$cmd_string.'</span>'; return '<span class="cbsd-str">'.$cmd_string.'</span>';
} }
function register_media($path,$file,$ext)
{
$cmd='cbsd media mode=register name='.$file.' path='.$path.$file.' type='.$ext;
$res=$this->cbsd_cmd($cmd);
if($res['error'])
{
$arr['error']=true;
$arr['error_message']='File image not registered!';
}else{
$arr['error']=false;
}
echo json_encode($arr);
}
function media_iso_list_html()
{
// $form=$this->form;
$db=new Db('base','storage_media');
$res=$db->select('select * from media where type="iso"');
if($res===false || empty($res)) return;
$html='';
foreach($res as $r)
{
$html.='<option value="'.$r['idx'].'">'.$r['name'].'.'.$r['type'].'</option>';
}
return $html;
}
function updateBhyveISO($iso='')
{
$db=new Db('base','storage_media');
$res=$db->select('select * from media where type="iso"');
if($res===false || empty($res)) return;
$sel='';
//if(empty($iso)) $sel='#sel#';
$html='<option value="-2"></option><option value="-1"#sel#>Profile default ISO</option>';
foreach($res as $r)
{
$sel1='';
if(empty($sel) && $iso==$r['jname']) $sel1='#sel1#';
$html.='<option value="'.$r['idx'].'"'.$sel1.'>'.$r['name'].'.'.$r['type'].'</option>';
}
if(strpos($html,'#sel1#')!==false)
{
$html=str_replace('#sel1#',' selected="selected"',$html);
$html=str_replace('#sel#','',$html);
}else{
$html=str_replace('#sel1#','',$html);
$html=str_replace('#sel#',' selected="selected"',$html);
}
return $html;
}
} }

View File

@@ -36,13 +36,13 @@ class Config
'title'=>'Virtual machine control panel', 'title'=>'Virtual machine control panel',
'icon'=>'icon-th-list', 'icon'=>'icon-th-list',
), ),
/*
'nodes'=>array( 'nodes'=>array(
'name'=>'Nodes', 'name'=>'Nodes',
'title'=>'Nodes control panel', 'title'=>'Nodes control panel',
'icon'=>'icon-buffer', 'icon'=>'icon-buffer',
), ),
*/
'vpnet'=>array( 'vpnet'=>array(
'name'=>'Virtual Private Network', 'name'=>'Virtual Private Network',
'title'=>'Manage for virtual private networks', 'title'=>'Manage for virtual private networks',
@@ -78,19 +78,19 @@ class Config
'title'=>'FreeBSD sources manager', 'title'=>'FreeBSD sources manager',
'icon'=>'icon-edit', 'icon'=>'icon-edit',
), ),
/*
'jail_marketplace'=>array( 'jail_marketplace'=>array(
'name'=>'Jail Marketplace', 'name'=>'Jail Marketplace',
'title'=>'Public remote containers marketplace', 'title'=>'Public remote containers marketplace',
'icon'=>'icon-flag', 'icon'=>'icon-flag',
), ),
*//*
'bhyve_marketplace'=>array( 'bhyve_marketplace'=>array(
'name'=>'Bhyve Marketplace', 'name'=>'Bhyve Marketplace',
'title'=>'Public remote virtual machine marketplace', 'title'=>'Public remote virtual machine marketplace',
'icon'=>'icon-flag-checkered', 'icon'=>'icon-flag-checkered',
), ),
*/
'tasklog'=>array( 'tasklog'=>array(
'name'=>'TaskLog', 'name'=>'TaskLog',
'title'=>'System task log', 'title'=>'System task log',
@@ -109,8 +109,8 @@ class Config
array( array(
'os'=>'DragonflyBSD', 'os'=>'DragonflyBSD',
'items'=>array( 'items'=>array(
array('name'=>'DragonflyBSD Daily SNAPSHOT','type'=>'dflybsd', array('name'=>'DragonflyBSD 4','type'=>'dflybsd',
'profile'=>'x86-LATEST','obtain'=>false), 'profile'=>'x86-4','obtain'=>false),
), ),
), ),
array( array(
@@ -131,8 +131,6 @@ class Config
'profile'=>'ArchLinux-x86-2016','obtain'=>false), 'profile'=>'ArchLinux-x86-2016','obtain'=>false),
array('name'=>'Linux CentOS 7','type'=>'linux', array('name'=>'Linux CentOS 7','type'=>'linux',
'profile'=>'CentOS-7-x86_64','obtain'=>false), 'profile'=>'CentOS-7-x86_64','obtain'=>false),
array('name'=>'Linux Debian 7','type'=>'linux',
'profile'=>'Debian-x86-7','obtain'=>false),
array('name'=>'Linux Debian 8','type'=>'linux', array('name'=>'Linux Debian 8','type'=>'linux',
'profile'=>'Debian-x86-8','obtain'=>false), 'profile'=>'Debian-x86-8','obtain'=>false),
array('name'=>'Linux Open Suse 42','type'=>'linux', array('name'=>'Linux Open Suse 42','type'=>'linux',

View File

@@ -411,7 +411,7 @@ thead td:first-child, td:first-child {
.tsimple thead th, .tsimple thead th,
.tsimple thead td { .tsimple thead td {
border-bottom:3px solid #337ab7; border-bottom:3px solid #337ab7;
padding:10px; padding:8px 8px 8px 0;
text-align:left; text-align:left;
} }
.tsimple tbody td { .tsimple tbody td {
@@ -423,12 +423,15 @@ thead td:first-child, td:first-child {
.tsimple tbody tr:nth-child(2n){ .tsimple tbody tr:nth-child(2n){
background-color: #fafafa; background-color: #fafafa;
} }
.tsimple td.txtleft { .tsimple .txtleft {
text-align:left; text-align:left;
} }
.tsimple td.txtright { .tsimple .txtright {
text-align:right; text-align:right;
} }
.tsimple .txtcenter {
text-align:center;
}
.tsimple td input[type="button"] { .tsimple td input[type="button"] {
font-size:86%; font-size:86%;
padding:2px 4px; padding:2px 4px;
@@ -959,6 +962,7 @@ http://dimox.name/custom-checkboxes-and-radio-buttons-using-css-only/
#config-menu li { #config-menu li {
padding:6px !important; padding:6px !important;
line-height:110%; line-height:110%;
white-space:nowrap;
} }
#config-menu li:hover { #config-menu li:hover {
background:#f0f0f0; background:#f0f0f0;
@@ -1207,4 +1211,87 @@ input[type=range]::-moz-range-track {
border-radius:50%; border-radius:50%;
} }
.online:before {content: '\e82c';color:green;} .online:before {content: '\e82c';color:green;}
.offline:before {content: '\e82d';color:red;} .offline:before {content: '\e82d';color:red;}
#drag-and-drop-zone {
width:400px;
border:1px dotted gray;
}
.uploader div {
padding:10px;
text-align:center;
}
.uploader .browser label {
background-color: #337ab7;
padding: 5px 15px;
color: white;
padding: 6px 0px;
font-weight: bold;
cursor: pointer;
position: relative;
overflow: hidden;
display: block;
width: 300px;
margin: 10px auto 0px auto;
box-shadow: 2px 2px 2px #888888;
}
.uploader div.browser input {
position: absolute;
top: 0;
right: 0;
margin: 0;
border: solid transparent;
border-width: 0 0 100px 200px;
opacity: .0;
filter: alpha(opacity= 0);
-o-transform: translate(250px,-50px) scale(1);
-moz-transform: translate(-300px,0) scale(4);
direction: ltr;
cursor: pointer;
}
.uploader-progress {
width:100%;
background-color:white;
}
.uploader-progress .file {
padding:4px;
border:1px solid silver;
margin-top:4px;
}
.uploader-progress .file-name {
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
width:390px;
}
.uploader-progress .line {
background-color:#337ab7;
height:10px;
opacity:.7;
margin-top:4px;
width:0;
}
#debug {
position:fixed;
top:20%;
bottom:20%;
left:30%;
right:30%;
overflow:auto;
z-index:15;
border:3px double red;
background-color:antiquewhite;
}
#debug h1 {
background:darkred;
padding:10px;
color:white;
}
#debug div {
padding:20px;
}

View File

@@ -39,6 +39,14 @@ err_messages.add({
<span class="field-name"><?php echo $this->translate('VM RAM');?>:</span> <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|G|gb|GB|mb|MB|m|M)$" placeholder="1g" required="required" />
</p> </p>
<p>
<span class="field-name"><?php echo $this->translate('Attached boot ISO image');?>:</span>
<select name="vm_iso_image">
<option value="-2"></option>
<option value="-1" selected>Profile default ISO</option>
<?php echo $this->media_iso_list_html(); ?>
</select>
</p>
<p> <p>
<span class="field-name"><?php echo $this->translate('VNC IP address');?>:</span> <span class="field-name"><?php echo $this->translate('VNC IP address');?>:</span>
<input type="radio" name="bhyve_vnc_tcp_bind" value="127.0.0.1" id="vncip0" checked="checked" class="inline"><label for="vncip0">127.0.0.1</label></radio> <input type="radio" name="bhyve_vnc_tcp_bind" value="127.0.0.1" id="vncip0" checked="checked" class="inline"><label for="vncip0">127.0.0.1</label></radio>

View File

@@ -0,0 +1,30 @@
<script type="text/javascript">
err_messages.add({});
</script>
<dialog id="media-upload" class="window-box">
<h1><?php echo $this->translate('Add Storage Media');?></h1>
<h2><?php echo $this->translate('Upload ISO');?></h2>
<form class="win" method="post" id="mediaSettings" onsubmit="return false;">
<div class="window-content">
<p>
<!-- D&D Markup -->
<div id="drag-and-drop-zone" class="uploader">
<div>Drag &amp; Drop Files Here</div>
<div class="or">-or-</div>
<div class="browser">
<label>
<span>Click to open the file Browser</span>
<input type="file" name="files[]" multiple="multiple" title='Click to add Files'>
</label>
</div>
</div>
<div class="uploader-progress"></div>
<!-- /D&D Markup -->
</p>
</div>
</form>
<div class="buttons">
<input type="button" value="<?php echo $this->translate('Close');?>" class="button red cancel-but" />
</div>
</dialog>
<script type="text/javascript">clonos.fileUploadPrepare();</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -10,6 +10,13 @@ $uri=trim($_SERVER['REQUEST_URI'],'/');
include($_REALPATH.'/php/clonos.php'); include($_REALPATH.'/php/clonos.php');
$clonos=new ClonOS($_REALPATH,$uri); $clonos=new ClonOS($_REALPATH,$uri);
if(isset($_GET['upload']))
{
include('upload.php');
$clonos->register_media($path,$file,$ext);
exit;
}
$lang=$clonos->getLang(); $lang=$clonos->getLang();
$root=trim($_SERVER['DOCUMENT_ROOT'],DIRECTORY_SEPARATOR); $root=trim($_SERVER['DOCUMENT_ROOT'],DIRECTORY_SEPARATOR);
$_ds=DIRECTORY_SEPARATOR; $_ds=DIRECTORY_SEPARATOR;
@@ -39,6 +46,7 @@ error_reporting(E_ALL);
<link href="/images/favicon.ico?" rel="shortcut icon" type="image/x-icon" /> <link href="/images/favicon.ico?" rel="shortcut icon" type="image/x-icon" />
<script src="/js/jquery.js" type="text/javascript"></script> <script src="/js/jquery.js" type="text/javascript"></script>
<script src="/js/clonos.js" type="text/javascript"></script> <script src="/js/clonos.js" type="text/javascript"></script>
<script src="/js/dmuploader.js" type="text/javascript"></script>
<script src="/js/noty/packaged/jquery.noty.packaged.min.js" type="text/javascript"></script> <script src="/js/noty/packaged/jquery.noty.packaged.min.js" type="text/javascript"></script>
<link type="text/css" href="/css/reset.css" rel="stylesheet" /> <link type="text/css" href="/css/reset.css" rel="stylesheet" />
<link type="text/css" href="/css/styles.css" rel="stylesheet" /> <link type="text/css" href="/css/styles.css" rel="stylesheet" />
@@ -97,6 +105,6 @@ if(isset($_languages))foreach($_languages as $lng=>$lngname)
</div></header> </div></header>
<div class="spinner"></div> <div class="spinner"></div>
<div class="online icon-online" id="net-stat"></div> <div class="online icon-online" id="net-stat" onclick="ws_debug();"></div>
</body> </body>
</html> </html>

View File

@@ -22,6 +22,11 @@ var clonos={
'bclone':{stat:['Clone','Cloning','Cloned'],cmd:'bhyveClone'}, 'bclone':{stat:['Clone','Cloning','Cloned'],cmd:'bhyveClone'},
'brename':{stat:['Rename','Renaming','Renamed'],cmd:'bhyveRename'}, 'brename':{stat:['Rename','Renaming','Renamed'],cmd:'bhyveRename'},
'vm_obtain':{stat:['Create','Creating','Created'],cmd:'bhyveObtain'}, 'vm_obtain':{stat:['Create','Creating','Created'],cmd:'bhyveObtain'},
'srcup':{stat:['Update','Updating','Updated'],cmd:'srcUpdate'},
'world':{stat:['Compile','Compiling','Compiled'],cmd:'basesCompile'},
'repo':{stat:['Fetch','Fetching','Fetched'],cmd:'repoCompile'},
'removesrc':{stat:['Remove','Removing','Removed'],cmd:'srcRemove'},
'removebase':{stat:['Remove','Removing','Removed'],cmd:'baseRemove'},
}, },
start:function() start:function()
@@ -66,7 +71,7 @@ var clonos={
addEvents:function() addEvents:function()
{ {
$(window).on('hashchange',$.proxy(this.onHashChange,this)); $(window).on('hashchange',$.proxy(this.onHashChange,this));
$('#lng-sel').on('change',function(){document.cookie="lang="+$(this).val()+";path=/;";location.reload();}); $('#lng-sel').on('change',$.proxy(this.setLang,this)); //function(){document.cookie="lang="+$(this).val()+";path=/;";location.reload();});
$('#content').on('click',$.proxy(this.bodyClick,this)); $('#content').on('click',$.proxy(this.bodyClick,this));
$('.closer').on('click',$.proxy(this.closerClick,this)); $('.closer').on('click',$.proxy(this.closerClick,this));
$(window).on('keypress',$.proxy(this.dialogCloseByKey,this)) $(window).on('keypress',$.proxy(this.dialogCloseByKey,this))
@@ -180,6 +185,8 @@ var clonos={
if(id=='bhyve-new') if(id=='bhyve-new')
{ {
this.trids=this.getTrIdsForCheck('bhyveslist'); this.trids=this.getTrIdsForCheck('bhyveslist');
this.updateBhyveISO();
this.updateBhyveOSProfile();
} }
this.dialogShow1(id); this.dialogShow1(id);
} }
@@ -375,6 +382,7 @@ var clonos={
} }
if(id=='bhyve-new' && $('form#bhyveSettings').length>0) if(id=='bhyve-new' && $('form#bhyveSettings').length>0)
{ {
this.storageBhyveOSProfile();
var jid=$('form#bhyveSettings input[name="vm_name"]').val(); var jid=$('form#bhyveSettings input[name="vm_name"]').val();
if(typeof this.trids!='undefined' && this.trids.length>0) if(typeof this.trids!='undefined' && this.trids.length>0)
{ {
@@ -441,7 +449,11 @@ var clonos={
} }
if(id=='srcget') if(id=='srcget')
{ {
this.srcVerAdd(); //this.srcVerAdd();
var inp=$('form#srcSettings input[name="version"]');
var id=$(inp).val();
this.dialogClose();
this.srcUpdate(id);
} }
if(id=='basescompile') if(id=='basescompile')
{ {
@@ -486,7 +498,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data!='undefined' && !data.error) if(typeof data!='undefined' && !data.error)
{ {
@@ -521,11 +533,11 @@ var clonos={
var table='bhyveslist'; var table='bhyveslist';
var operation='vm_obtain'; var operation='vm_obtain';
break; break;
case 'basesCompile': case 'basesCompile': this.dialogClose();return;
var table='baseslist'; var table='baseslist';
var operation='world'; var operation='world';
break; break;
case 'repoCompile': case 'repoCompile': this.dialogClose();return;
var table='baseslist'; var table='baseslist';
var operation='repo'; var operation='repo';
break; break;
@@ -578,7 +590,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
this.dialogClose(); this.dialogClose();
@@ -588,7 +600,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data!='undefined' && !data.error) if(typeof data!='undefined' && !data.error)
{ {
@@ -621,7 +633,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data!='undefined' && !data.error) if(typeof data!='undefined' && !data.error)
{ {
@@ -651,7 +663,7 @@ var clonos={
} }
}, },
srcVerAdd:function() srcVerAdd:function()
{ {return;
var n,nl; var n,nl;
var posts=$('form#srcSettings').serializeArray(); var posts=$('form#srcSettings').serializeArray();
var version=$('form#srcSettings input[name="version"]').val(); var version=$('form#srcSettings input[name="version"]').val();
@@ -689,13 +701,51 @@ var clonos={
} }
if(!injected) if(!injected)
{ {
$(html).insertAfter(tr); //$(html).insertAfter(tr);
if(trs.length==0)
{
$('table#srcslist tbody').append(html);
}else{
$(html).insertAfter(tr);
}
this.srcUpdate('src'+version); this.srcUpdate('src'+version);
} }
} }
}, },
updateBhyveOSProfile:function()
{
if(localStorage)
{
var pos=localStorage['vm_os_profile_pos'];
if(typeof pos!='undefined')
$('#bhyveSettings select[name="vm_os_profile"]').val(pos);
}
//if(localStorage) db_path=localStorage[var_name];
},
storageBhyveOSProfile:function()
{
if(localStorage)
{
var pos=$('#bhyveSettings select[name="vm_os_profile"]').val();
localStorage['vm_os_profile_pos']=pos;
}
},
updateBhyveISO:function()
{
this.loadData('updateBhyveISO',$.proxy(this.onUpdateBhyveISO,this));
},
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);
}
},
getFreeJname:function() getFreeJname:function()
{ {
this.loadData('freejname',$.proxy(this.onGetFreeJname,this)); this.loadData('freejname',$.proxy(this.onGetFreeJname,this));
@@ -704,7 +754,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
$('dialog#jail-settings input[name="jname"]').val(data.freejname); $('dialog#jail-settings input[name="jname"]').val(data.freejname);
$('dialog#jail-settings input[name="host_hostname"]').val(data.freejname+'.my.domain'); $('dialog#jail-settings input[name="host_hostname"]').val(data.freejname+'.my.domain');
}, },
@@ -751,7 +801,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(data.error) if(data.error)
{ {
@@ -789,7 +839,7 @@ var clonos={
{ {
var txt_status=task.txt_status; var txt_status=task.txt_status;
//this.tasks.add({'operation':task.task_cmd,'jail_id':t,'status':status,'task_id':task.task_id,'txt_status':txt_status}); //this.tasks.add({'operation':task.task_cmd,'jail_id':t,'status':status,'task_id':task.task_id,'txt_status':txt_status});
$('tr#'+t+' .jstatus').html(this.translate(txt_status)); $('tr#'+this.dotEscape(t)+' .jstatus').html(this.translate(txt_status));
this.enableWait(t); this.enableWait(t);
} }
} }
@@ -1072,7 +1122,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
/* if(typeof data['mod_ops']!='undefined') /* if(typeof data['mod_ops']!='undefined')
{ {
@@ -1297,7 +1347,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1322,7 +1372,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1347,7 +1397,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1367,18 +1417,23 @@ var clonos={
if(!c) return; if(!c) return;
var ver=$('#srcslist tr#'+this.dotEscape(id)+' .version').html(); var ver=$('#srcslist tr#'+this.dotEscape(id)+' .version').html();
var op='removesrc'; var op='removesrc';
this.enableWait(id); //this.enableWait(id);
this.tasks.add({'operation':op,'jail_id':id}); //this.tasks.add({'operation':op,'jail_id':id});
this.tasks.start(); //this.tasks.start();
var posts=[{'name':'operation','value':op},{'name':'jname','value':id}];
if(typeof this.commands[op]!='undefined')
this.loadData(this.commands[op]['cmd'],$.proxy(this.onJailStart,this),posts,false);
}, },
srcUpdate:function(id,vers) srcUpdate:function(id,vers)
{ {
if(typeof vers=='undefined') vers='stable'; if(typeof vers=='undefined') vers='stable';
var ver=$('#srcslist tr#'+this.dotEscape(id)+' .version').html(); var ver=$('#srcslist tr#'+this.dotEscape(id)+' .version').html();
var op='srcup'; var op='srcup';
this.enableWait(id); //this.tasks.add({'operation':op,'jail_id':id});
this.tasks.add({'operation':op,'jail_id':id}); //this.tasks.start();
this.tasks.start(); var posts=[{'name':'operation','value':op},{'name':'jname','value':id}];
if(typeof this.commands[op]!='undefined')
this.loadData(this.commands[op]['cmd'],$.proxy(this.onJailStart,this),posts,false);
}, },
baseRemove:function(id) baseRemove:function(id)
{ {
@@ -1386,9 +1441,15 @@ var clonos={
if(!c) return; if(!c) return;
var ver=$('#baseslist tr#'+this.dotEscape(id)+' .version').html(); var ver=$('#baseslist tr#'+this.dotEscape(id)+' .version').html();
var op='removebase'; var op='removebase';
this.enableWait(id); //this.enableWait(id);
this.tasks.add({'operation':op,'jail_id':id}); //this.tasks.add({'operation':op,'jail_id':id});
this.tasks.start(); //this.tasks.start();
var posts=[{'name':'operation','value':op},{'name':'jname','value':id}];
if(typeof this.commands[op]!='undefined')
{
this.loadData(this.commands[op]['cmd'],$.proxy(this.onJailStart,this),posts,false);
$('tr#'+id+' .jstatus').html(this.translate(this.commands[op]['stat'][1]));
}
}, },
@@ -1403,7 +1464,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1425,7 +1486,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1780,6 +1841,9 @@ var clonos={
var id=dt.id; var id=dt.id;
var table_id=dt.table_id; var table_id=dt.table_id;
var preloadVars=false; var preloadVars=false;
this.DDMenuClose();
switch(table_id) switch(table_id)
{ {
case 'jailslist': case 'jailslist':
@@ -1864,7 +1928,6 @@ var clonos={
break; break;
} }
this.DDMenuClose();
if(preloadVars) if(preloadVars)
{ {
var posts=[{'name':'jail_id','value':id},{'name':'dialog','value':dialog},{'name':'elid','value':elid}]; var posts=[{'name':'jail_id','value':id},{'name':'dialog','value':dialog},{'name':'elid','value':elid}];
@@ -1877,7 +1940,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
{ {
@@ -1886,8 +1949,8 @@ var clonos={
this.notify(data.error_message,'error'); this.notify(data.error_message,'error');
if(typeof data.reload!='undefined') if(typeof data.reload!='undefined')
{ {
if(data.reload) if(data.reload) this.dataReload();
this.loadData('getJsonPage',$.proxy(this.onLoadData,this)); //this.loadData('getJsonPage',$.proxy(this.onLoadData,this));
} }
return; return;
} }
@@ -1895,6 +1958,8 @@ var clonos={
var dialog=data.dialog; var dialog=data.dialog;
this.fillDialogVars(dialog,data.vars); this.fillDialogVars(dialog,data.vars);
if(data.dialog=='bhyve-new' && typeof data.iso_list!='undefined')
$('dialog#bhyve-new select[name="vm_iso_image"]').html(data.iso_list);
this.dialogShow1(dialog,this.cnt_mode); this.dialogShow1(dialog,this.cnt_mode);
/* /*
@@ -1907,6 +1972,36 @@ var clonos={
}, },
dataReload:function()
{
this.loadData('getJsonPage',$.proxy(this.onLoadData,this));
},
fillFormVars:function(form,data)
{
var n=0,
f=$(form);
if(f.length<1) return;
for(n=0,nl=data.length;n<nl;n++)
{
var $el=$('[name="'+data[n].name+'"]'),
type=$el.attr('type'),
val=data[n].value;
switch(type)
{
case 'checkbox':
$el.attr('checked', val);
break;
case 'radio':
$el.filter('[value="'+val+'"]').attr('checked', 'checked');
break;
default:
$el.val(val);
}
}
},
fillDialogVars:function(dialog,vars) fillDialogVars:function(dialog,vars)
{ {
var d=$('dialog#'+dialog); var d=$('dialog#'+dialog);
@@ -1979,7 +2074,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(typeof data.error!='undefined' && data.error) if(typeof data.error!='undefined' && data.error)
{ {
@@ -1999,6 +2094,9 @@ var clonos={
deleteHelperGroup:function(form,id) deleteHelperGroup:function(form,id)
{ {
this.tmp_formdata=$(form).serializeArray();
this.tmp_form=form;
var mode='deleteHelperGroup'; var mode='deleteHelperGroup';
var fh=$('form#newJailSettings'); var fh=$('form#newJailSettings');
if(fh.length==0) if(fh.length==0)
@@ -2015,7 +2113,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(!data) return; if(!data) return;
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
@@ -2034,6 +2132,10 @@ var clonos={
{ {
$('form.helper').html(data.html); $('form.helper').html(data.html);
} }
if(this.tmp_form)
{
this.fillFormVars(this.tmp_form,this.tmp_formdata);
}
}, },
getDbPath:function() getDbPath:function()
@@ -2056,6 +2158,9 @@ var clonos={
addHelperGroup:function(form) addHelperGroup:function(form)
{ {
this.tmp_formdata=$(form).serializeArray();
this.tmp_form=form;
var mode='addHelperGroup'; var mode='addHelperGroup';
var fh=$('form#newJailSettings'); var fh=$('form#newJailSettings');
var posts=[]; var posts=[];
@@ -2072,7 +2177,7 @@ var clonos={
{ {
try{ try{
var data=JSON.parse(data); var data=JSON.parse(data);
}catch(e){alert(e.message);return;} }catch(e){this.debug(e.message,data);return;}
if(!data) return; if(!data) return;
if(typeof data.error!='undefined') if(typeof data.error!='undefined')
@@ -2091,6 +2196,10 @@ var clonos={
{ {
$('form.helper').html(data.html); $('form.helper').html(data.html);
} }
if(this.tmp_form)
{
this.fillFormVars(this.tmp_form,this.tmp_formdata);
}
}, },
notify:function(message,type) notify:function(message,type)
@@ -2129,7 +2238,7 @@ var clonos={
if_wsopened:function() if_wsopened:function()
{ {
if(!this.connected) return; if(!this.connected) return;
if(!_first_start) this.loadData('getJsonPage',$.proxy(this.onLoadData,this)); if(!_first_start) this.dataReload(); //this.loadData('getJsonPage',$.proxy(this.onLoadData,this));
_first_start=false; _first_start=false;
$('#net-stat').attr('class','online icon-online'); $('#net-stat').attr('class','online icon-online');
@@ -2288,7 +2397,7 @@ return;
case 'bstart': case 'bstart':
if(status==1) if(status==1)
{ {
$('#'+id).removeClass('s-on').addClass('s-off').addClass('busy'); $('#'+this.dotEscape(id)).removeClass('s-on').addClass('s-off').addClass('busy');
this.enableWait(id); this.enableWait(id);
} }
if(status==2) if(status==2)
@@ -2301,7 +2410,7 @@ return;
case 'bstop': case 'bstop':
if(status==1) if(status==1)
{ {
$('#'+id).removeClass('s-on').addClass('s-off').addClass('busy'); $('#'+this.dotEscape(id)).removeClass('s-on').addClass('s-off').addClass('busy');
this.enableWait(id); this.enableWait(id);
} }
if(status==2) if(status==2)
@@ -2318,12 +2427,19 @@ return;
case 'jclone': case 'jclone':
case 'bclone': case 'bclone':
case 'jexport': case 'jexport':
case 'srcup':
case 'world':
case 'repo':
if(status==1) if(status==1)
{ {
if(isset(data.data)) if(isset(data.data))
{ {
this.addNewJail(data,cmd); this.addNewJail(data,cmd);
} }
if(['srcup','world','repo'].indexOf(cmd)!=-1)
{
this.enableWait(id);
}
} }
if(status==2) if(status==2)
{ {
@@ -2336,7 +2452,7 @@ return;
case 'removebase': case 'removebase':
if(status==1) if(status==1)
{ {
$('#'+id).removeClass('s-on').addClass('s-off').addClass('busy'); $('#'+this.dotEscape(id)).removeClass('s-on').addClass('s-off').addClass('busy');
this.enableWait(id); this.enableWait(id);
} }
if(status==2) if(status==2)
@@ -2350,7 +2466,7 @@ return;
{ {
for(n in data.data) for(n in data.data)
{ {
$('#'+id+' .'+n).html(data.data[n]); $('#'+this.dotEscape(id)+' .'+n).html(data.data[n]);
} }
} }
break; break;
@@ -2369,6 +2485,16 @@ return;
if(status==2) if(status==2)
{ {
var cmd=data.cmd; var cmd=data.cmd;
if(['srcup','repo','world'].indexOf(cmd)!=-1)
{
$('#'+this.dotEscape(id))
.removeClass('s-off').removeClass('busy').removeClass('maintenance')
.addClass('s-on');
this.enableClear(id);
return;
}
var stat_cl='s-off'; var stat_cl='s-off';
if(isset(data.data)) if(isset(data.data))
{ {
@@ -2378,7 +2504,7 @@ return;
var stat_cl=(stat==0?'s-off':'s-on'); var stat_cl=(stat==0?'s-off':'s-on');
} }
} }
$('#'+id) $('#'+this.dotEscape(id))
.removeClass('maintenance').removeClass('s-on').removeClass('s-off').removeClass('busy') .removeClass('maintenance').removeClass('s-on').removeClass('s-off').removeClass('busy')
.addClass(stat_cl); .addClass(stat_cl);
if(stat==0) this.enablePlay(id); else this.enableStop(id); if(stat==0) this.enablePlay(id); else this.enableStop(id);
@@ -2394,15 +2520,24 @@ return;
var id=data.id; var id=data.id;
var html=this.template; var html=this.template;
if(typeof html=='undefined') html='no data!';
var table='jailslist'; var table='jailslist';
if(['bcreate','bclone'].indexOf(cmd)!=-1) table='bhyveslist'; if(['bcreate','bclone'].indexOf(cmd)!=-1) table='bhyveslist';
if(['srcup'].indexOf(cmd)!=-1) table='srcslist';
if(['repo','world'].indexOf(cmd)!=-1) table='baseslist';
if(isset(data.data)) if(isset(data.data))
{ {
if(isset(this.commands[cmd]['stat']))
data.data['jstatus']=this.translate(this.commands[cmd]['stat'][1]);
if(!isset(data.data['id'])) data.data['id']=data['id'];
for(n in data.data) for(n in data.data)
html=html.replace(new RegExp('#'+n+'#','g'),data.data[n]); html=html.replace(new RegExp('#'+n+'#','g'),data.data[n]);
} }
var el=$('#'+this.dotEscape(id));
if(el.length>0) return;
var trs=$('table#'+table+' tbody tr'); var trs=$('table#'+table+' tbody tr');
for(n=0,nl=trs.length;n<nl;n++) for(n=0,nl=trs.length;n<nl;n++)
{ {
@@ -2418,7 +2553,12 @@ return;
} }
if(!injected) // Вставляем запись в конец таблицы if(!injected) // Вставляем запись в конец таблицы
{ {
$(html).insertAfter(tr); if(trs.length==0)
{
$('table#'+table+' tbody').append(html);
}else{
$(html).insertAfter(tr);
}
status=true; status=true;
} }
}, },
@@ -2477,10 +2617,128 @@ return;
arr[z] = arr[z].join(""); arr[z] = arr[z].join("");
return arr; return arr;
}, },
fileUploadPrepare:function()
{
$('#drag-and-drop-zone').dmUploader(
{
url: '/?upload',
dataType: 'json',
//allowedTypes: 'iso/*',
extFilter: 'iso', //iso;jpg;jpeg;
onInit: function(){
clonos.add_log('Penguin initialized :)');
},
onBeforeUpload: function(id){
//add_log('Starting the upload of #' + id);
clonos.update_file_status(id, 'uploading', 'Uploading...');
},
onNewFile: function(id, file){
clonos.add_log('New file added to queue #' + id);
clonos.add_file(id, file);
},
onComplete: function(){
clonos.add_log('All pending tranfers finished');
},
onUploadProgress: function(id, percent){
var percentStr = percent + '%';
clonos.update_file_progress(id, percentStr);
},
onUploadSuccess: function(id, data){
clonos.add_log('Upload of file #p-' + id + ' completed');
clonos.add_log('Server Response for file #' + id + ': ' + JSON.stringify(data));
clonos.update_file_status(id, 'success', 'Upload Complete');
//clonos.update_file_progress(id, '0');
//window.setTimeout($.proxy(this.deleteItemsOk,this,id),2000);
setTimeout($.proxy(clonos.delete_file,this,id),3000);
clonos.dataReload();
},
onUploadError: function(id, message){
clonos.add_log('Failed to Upload file #p-' + id + ': ' + message);
clonos.update_file_status(id, 'error', message);
},
onFileTypeError: function(file){
clonos.notify('File \'' + file.name + '\' cannot be added: must be an ISO','error');
},
onFileSizeError: function(file){
clonos.notify('File \'' + file.name + '\' cannot be added: size excess limit','error');
},
onFileExtError: function(file){
clonos.notify('File \'' + file.name + '\' has a Not Allowed Extension','error');
},
onFallbackMode: function(message){
alert('Browser not supported(do something else here!): ' + message);
}
});
},
update_file_status:function(id,type,message)
{
console.log(message);
if(type=='error')
{
this.notify(message,'error');
$('#p-'+id+'.line').css('background-color','red');
}
if(type=='success')
{
$('#p-'+id+'.line').css('background-color','green');
}
},
update_file_progress:function(id, percent)
{
$('#p-'+id+'.line').width(percent);
console.log(percent);
},
add_log:function(message)
{
console.log(message);
},
add_file:function(id, file)
{
$('.uploader-progress').append('<div class="file" id="f-'+id+'"><div class="file-name">'+file.name+'</div><div id="p-'+id+'" class="line"></div></div>');
},
delete_file:function(id)
{
$('.uploader-progress #f-'+id).remove();
},
debug:function(message,data)
{
this.dialogClose();
$('body').append('<div id="debug" onclick="clonos.closeDebug();"><h1>'+message+'</h1><div>'+data+'</div>');
},
closeDebug:function()
{
$('#debug').remove();
},
setLang:function(event)
{
var target=event.target;
var lang=$(target).val();
if(localStorage)
{
//localStorage['lang']=lang;
}
document.cookie="lang="+lang+";path=/;";
location.reload();
},
} }
function isset(varr){for(a in arguments){if(typeof arguments[a]=='undefined')return false;}return true;} function isset(varr){for(a in arguments){if(typeof arguments[a]=='undefined')return false;}return true;}
function ws_debug(){
var res=prompt('Введите JSON строку','');
if(res=='' || res==null) return;
var data=JSON.parse(res);
clonos.onChangeStatus(data);
}
$(window).on('load',function(){clonos.start();}); $(window).on('load',function(){clonos.start();});

9
public/js/dmuploader.js Normal file
View File

@@ -0,0 +1,9 @@
/*
* dmuploader.min.js - Jquery File Uploader - 0.1
* http://www.daniel.com.uy/projects/jquery-file-uploader/
*
* Copyright (c) 2013 Daniel Morales
* Dual licensed under the MIT and GPL licenses.
* http://www.daniel.com.uy/doc/license/
*/
(function(t){var n="dmUploader";var r={url:document.URL,method:"POST",extraData:{},maxFileSize:0,allowedTypes:"*",extFilter:null,dataType:null,fileName:"file",onInit:function(){},onFallbackMode:function(){message},onNewFile:function(e,t){},onBeforeUpload:function(e){},onComplete:function(){},onUploadProgress:function(e,t){},onUploadSuccess:function(e,t){},onUploadError:function(e,t){},onFileTypeError:function(e){},onFileSizeError:function(e){},onFileExtError:function(e){}};var i=function(e,n){this.element=t(e);this.settings=t.extend({},r,n);if(!this.checkBrowser()){return false}this.init();return true};i.prototype.checkBrowser=function(){if(window.FormData===undefined){this.settings.onFallbackMode.call(this.element,"Browser doesn't support Form API");return false}if(this.element.find("input[type=file]").length>0){return true}if(!this.checkEvent("drop",this.element)||!this.checkEvent("dragstart",this.element)){this.settings.onFallbackMode.call(this.element,"Browser doesn't support Ajax Drag and Drop");return false}return true};i.prototype.checkEvent=function(e,t){var t=t||document.createElement("div");var e="on"+e;var n=e in t;if(!n){if(!t.setAttribute){t=document.createElement("div")}if(t.setAttribute&&t.removeAttribute){t.setAttribute(e,"");n=typeof t[e]=="function";if(typeof t[e]!="undefined"){t[e]=undefined}t.removeAttribute(e)}}t=null;return n};i.prototype.init=function(){var e=this;e.queue=new Array;e.queuePos=-1;e.queueRunning=false;e.element.on("drop",function(t){t.preventDefault();var n=t.originalEvent.dataTransfer.files;e.queueFiles(n)});e.element.find("input[type=file]").on("change",function(n){var r=n.target.files;e.queueFiles(r);t(this).val("")});this.settings.onInit.call(this.element)};i.prototype.queueFiles=function(e){var n=this.queue.length;for(var r=0;r<e.length;r++){var i=e[r];if(this.settings.maxFileSize>0&&i.size>this.settings.maxFileSize){this.settings.onFileSizeError.call(this.element,i);continue}if(this.settings.allowedTypes!="*"&&!i.type.match(this.settings.allowedTypes)){this.settings.onFileTypeError.call(this.element,i);continue}if(this.settings.extFilter!=null){var s=this.settings.extFilter.toLowerCase().split(";");var o=i.name.toLowerCase().split(".").pop();if(t.inArray(o,s)<0){this.settings.onFileExtError.call(this.element,i);continue}}this.queue.push(i);var u=this.queue.length-1;this.settings.onNewFile.call(this.element,u,i)}if(this.queueRunning){return false}if(this.queue.length==n){return false}this.processQueue();return true};i.prototype.processQueue=function(){var n=this;n.queuePos++;if(n.queuePos>=n.queue.length){n.settings.onComplete.call(n.element);n.queuePos=n.queue.length-1;n.queueRunning=false;return}var r=n.queue[n.queuePos];var i=new FormData;i.append(n.settings.fileName,r);n.settings.onBeforeUpload.call(n.element,n.queuePos);t.each(n.settings.extraData,function(e,t){i.append(e,t)});n.queueRunning=true;t.ajax({url:n.settings.url,type:n.settings.method,dataType:n.settings.dataType,data:i,cache:false,contentType:false,processData:false,forceSync:false,xhr:function(){var r=t.ajaxSettings.xhr();if(r.upload){r.upload.addEventListener("progress",function(t){var r=0;var i=t.loaded||t.position;var s=t.total||e.totalSize;if(t.lengthComputable){r=Math.ceil(i/s*100)}n.settings.onUploadProgress.call(n.element,n.queuePos,r)},false)}return r},success:function(e,t,r){n.settings.onUploadSuccess.call(n.element,n.queuePos,e)},error:function(e,t,r){n.settings.onUploadError.call(n.element,n.queuePos,r)},complete:function(e,t){n.processQueue()}})};t.fn.dmUploader=function(e){return this.each(function(){if(!t.data(this,n)){t.data(this,n,new i(this,e))}})};t(document).on("dragenter",function(e){e.stopPropagation();e.preventDefault()});t(document).on("dragover",function(e){e.stopPropagation();e.preventDefault()});t(document).on("drop",function(e){e.stopPropagation();e.preventDefault()})})(jQuery)

View File

@@ -42,6 +42,12 @@ clonos.lang={
"Rename":"Переименовать", "Rename":"Переименовать",
"Renaming":"Переименовываем", "Renaming":"Переименовываем",
"Renamed":"Переименовано", "Renamed":"Переименовано",
"Fetch":"Получить",
"Fetching":"Получаем",
"Fetched":"Получено",
"Compile":"Собрать",
"Compiling":"Собираем",
"Compiled":"Собрано",
//"Create jail":"Создание контейнера", //"Create jail":"Создание контейнера",
//"Edit jail":"Редактирование параметров контейнера", //"Edit jail":"Редактирование параметров контейнера",

View File

@@ -8,6 +8,7 @@ $nodes=array_reverse($nodes);
$ids=array(); $ids=array();
$nth=0; $nth=0;
$hres=$this->getTableChunk('baseslist','tbody');
if(!empty($nodes))foreach($nodes as $node) if(!empty($nodes))foreach($nodes as $node)
{ {
$db1=new Db('base',$node['nodename']); $db1=new Db('base',$node['nodename']);
@@ -26,24 +27,24 @@ if(!empty($nodes))foreach($nodes as $node)
} }
$ids[]=$base['idx']; $ids[]=$base['idx'];
$bid=$base['ver'].'-'.$base['arch'].'-'.$base['stable']; $id='base'.$base['ver'].'-'.$base['arch'].'-'.$base['stable'];
$hres=$this->getTableChunk('baseslist','tbody');
if($hres!==false) if($hres!==false)
{ {
$html_tpl=$hres[1]; $html_tpl=$hres[1];
$vars=array( $vars=array(
'bid'=>$bid, 'id'=>$id,
'nth-num'=>'nth'.$num, 'nth-num'=>'nth'.$num,
'node'=>$node['nodename'], 'node'=>$node['nodename'],
'name'=>$base['name'], 'name'=>$base['name'],
'platform'=>$base['platform'], 'platform'=>$base['platform'],
'arch'=>$base['arch'], 'arch'=>$base['arch'],
'targetarch'=>$base['targetarch'], 'targetarch'=>$base['targetarch'],
'ver'=>$base['ver'], 'version'=>$base['ver'],
'stable'=>($base['stable']==1)?'stable':'release', 'version1'=>($base['stable']==1)?'stable':'release',
'elf'=>$base['elf'], 'elf'=>$base['elf'],
'date'=>$base['date'], 'date'=>$base['date'],
'jstatus'=>'',
'maintenance'=>($idle==0)?' maintenance':'', 'maintenance'=>($idle==0)?' maintenance':'',
'deltitle'=>$this->translate('Delete'), 'deltitle'=>$this->translate('Delete'),
); );
@@ -54,23 +55,45 @@ if(!empty($nodes))foreach($nodes as $node)
$html.=$html_tpl; $html.=$html_tpl;
} }
$ids[]='#base'.$bid; //$ids[]='#base'.$bid;
$ids[]='#'.$id;
} }
$nth++; $nth++;
} }
} }
$html=str_replace(array("\n","\r","\t"),'',$html);
$tasks=''; $tasks='';
if(!empty($ids)) if(!empty($ids))
{ {
$tasks=$this->getRunningTasks($ids); $tasks=$this->getRunningTasks($ids);
} }
$html_tpl=str_replace(array("\n","\r","\t"),'',$hres[1]);
if($hres!==false)
{
$vars=array(
'nth-num'=>'nth0',
'status'=>'',
//'jstatus'=>$this->translate('Updating'),
//'icon'=>'spin6 animate-spin',
'desktop'=>' s-off',
'maintenance'=>' maintenance busy',
'updtitle'=>$this->translate('Update'),
'deltitle'=>$this->translate('Delete'),
);
foreach($vars as $var=>$val)
$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
}
echo json_encode(array( echo json_encode(array(
'tbody'=>$html, 'tbody'=>$html,
'error'=>false, 'error'=>false,
'func'=>'fillTable', 'func'=>'fillTable',
'id'=>'baseslist', 'id'=>'baseslist',
'tasks'=>$tasks, 'tasks'=>$tasks,
'template'=>$html_tpl,
)); ));

View File

@@ -1,16 +1,16 @@
<tbody> <tbody>
<tr class="#nth-num##maintenance#" id="#name##bid#"> <tr class="#nth-num##maintenance#" id="#id#"> <!-- #name# -->
<td class="wordwreck">#node#</td> <td class="wordwreck node">#node#</td>
<td class="txtleft">#name#</td> <td class="txtleft name">#name#</td>
<td class="txtleft">#platform#</td> <td class="txtleft platform">#platform#</td>
<td>#arch#</td> <td class="arch">#arch#</td>
<td>#targetarch#</td> <td class="targetarch">#targetarch#</td>
<td class="version">#ver#</td> <td class="version">#version#</td>
<td class="txtleft">#stable#</td> <td class="txtleft version1">#version1#</td>
<td>#elf#</td> <td class="elf">#elf#</td>
<td class="small">#date#</td> <td class="small date">#date#</td>
<td width="5" class="ops op-del" title="#deltitle#"><span class="icon-cancel"></span></td> <td width="5" class="ops op-del" title="#deltitle#"><span class="icon-cancel"></span></td>
<td class="ops"><span class="icon-cnt"><span></span></span></td> <td class="ops"><span class="icon-cnt"><span></span></span></td>
<td class="jstatus wdt-90"></td> <td class="jstatus wdt-90">#jstatus#</td>
</tr> </tr>
</tbody> </tbody>

View File

@@ -13,6 +13,7 @@ $allnodes=array();
$jail_ids=array(); $jail_ids=array();
$nth=0; $nth=0;
$hres=$this->getTableChunk('bhyveslist','tbody');
if(!empty($nodes))foreach($nodes as $node) if(!empty($nodes))foreach($nodes as $node)
{ {
$db1=new Db('base',$node); $db1=new Db('base',$node);
@@ -25,7 +26,6 @@ if(!empty($nodes))foreach($nodes as $node)
if(!empty($bhyves)) foreach($bhyves as $bhyve) if(!empty($bhyves)) foreach($bhyves as $bhyve)
{ {
$hres=$this->getTableChunk('bhyveslist','tbody');
if($hres!==false) if($hres!==false)
{ {
$html_tpl=$hres[1]; $html_tpl=$hres[1];

View File

@@ -2,7 +2,7 @@
<tr class="#nth-num##desktop##maintenance#" id="#jname#"> <tr class="#nth-num##desktop##maintenance#" id="#jname#">
<td class="node">#node#</td> <td class="node">#node#</td>
<td class="txtleft jname">#jname#</td> <td class="txtleft jname">#jname#</td>
<td class="txtleft vm_ram">#vm_ram#</td> <td class="txtcenter vm_ram">#vm_ram#</td>
<td class="vm_cpus">#vm_cpus#</td> <td class="vm_cpus">#vm_cpus#</td>
<td class="vm_os_type">#vm_os_type#</td> <td class="vm_os_type">#vm_os_type#</td>
<td class="jstatus">#vm_status#</td> <td class="jstatus">#vm_status#</td>

View File

@@ -19,10 +19,10 @@ $clonos->useDialogs(array(
<thead> <thead>
<th class="wdt-120">Имя сервера</th> <th class="wdt-120">Имя сервера</th>
<th class="txtleft">Виртуальная машина</th> <th class="txtleft">Виртуальная машина</th>
<th class="txtleft wdt-70">RAM</th> <th class="txtcenter wdt-70">RAM</th>
<th class="wdt-30">CPU</th> <th class="wdt-30">CPU</th>
<th class="wdt-100">Тип ОС</th> <th class="txtcenter wdt-100">Тип ОС</th>
<th class="wdt-120">Статус</th> <th class="txtcenter wdt-120">Статус</th>
<th colspan="4" class="wdt-100">Действия</th> <th colspan="4" class="wdt-100">Действия</th>
<th class="wdt-30">VNC</th> <th class="wdt-30">VNC</th>
</thead> </thead>

View File

@@ -1,19 +1,21 @@
<?php <?php
$hash=$this->url_hash; //=preg_replace('/^#/','',$this->_vars['hash']); $hash=$this->url_hash; //=preg_replace('/^#/','',$this->_vars['hash']);
$db_path=false; $db_path=false;
if(isset($this->_vars['db_path']) && !empty($this->_vars['db_path'])) if(!isset($this->_vars['db_path']))
{ {
$db_path=$this->_vars['db_path']; //$db_path=$this->_vars['db_path'];
$res=$this->cbsd_cmd('make_tmp_helper module='.$hash); $res=$this->cbsd_cmd('make_tmp_helper module='.$hash);
if($res['retval']==0) if($res['retval']==0)
{ {
$db_path=$res['message']; $db_path=$res['message'];
}else{ }else{
echo json_encode(array('error'=>true,'errorMessage'=>'Error on open temporary form file!')); echo json_encode(array('error'=>true,'errorMessage'=>'Error on open temporary form database!'));
return; return;
} }
}else{
$db_path=$this->_vars['db_path'];
} }
$form=new Forms('',$hash,$db_path); $form=new Forms('',$hash,$db_path);

View File

@@ -22,6 +22,7 @@ $allnodes=array();
$jail_ids=array(); $jail_ids=array();
$nth=0; $nth=0;
$hres=$this->getTableChunk('jailslist','tbody');
if(!empty($nodes))foreach($nodes as $node) if(!empty($nodes))foreach($nodes as $node)
{ {
$db1=new Db('base',$node); $db1=new Db('base',$node);
@@ -33,8 +34,6 @@ if(!empty($nodes))foreach($nodes as $node)
$num=$nth & 1; $num=$nth & 1;
if(!empty($jails)) foreach($jails as $jail) if(!empty($jails)) foreach($jails as $jail)
{ {
$hres=$this->getTableChunk('jailslist','tbody');
if($hres!==false) if($hres!==false)
{ {
$html_tpl=$hres[1]; $html_tpl=$hres[1];

View File

@@ -91,7 +91,7 @@ if(empty($hash))
$db_path=$db->getFileName(); $db_path=$db->getFileName();
$form=new Forms($jail_name,$hash,$db_path); $form=new Forms($jail_name,$hash,$db_path);
$res=$form->generate(); $res=$form->generate();
$res['html']='<h1>'.$this->translate('Helper settings').'</h1>'.$res['html']; $res['html']='<h1>'.$this->translate('Helper settings: '.$hash).'</h1>'.$res['html'];
} }

View File

@@ -25,7 +25,7 @@ $clonos->useDialogs(array(
<th class="wdt-200 elastic">Имя сервера</th> <th class="wdt-200 elastic">Имя сервера</th>
<th class="txtleft">Контейнер</th> <th class="txtleft">Контейнер</th>
<th class="txtleft wdt-200">IP-адрес</th> <th class="txtleft wdt-200">IP-адрес</th>
<th class="wdt-120">Статус</th> <th class="txtcenter wdt-120">Статус</th>
<th colspan="4" class="wdt-100">Действия</th> <th colspan="4" class="wdt-100">Действия</th>
<th class="wdt-30">VNC</th> <th class="wdt-30">VNC</th>
</tr> </tr>

View File

@@ -1,7 +1,7 @@
<?php <?php
$db=new Db('base','storage_media'); $db=new Db('base','storage_media');
$res=$db->select('SELECT idx,name,path FROM media'); $res=$db->select('SELECT idx,name,path,jname FROM media where type="iso"');
$html=''; $html='';
if($res!==false) if($res!==false)
@@ -20,6 +20,7 @@ if($res!==false)
'mediaid'=>$item['idx'], 'mediaid'=>$item['idx'],
'medianame'=>$item['name'], 'medianame'=>$item['name'],
'mediapath'=>$item['path'], 'mediapath'=>$item['path'],
'jname'=>$item['jname'],
'deltitle'=>' title="'.$this->translate('Delete').'"', 'deltitle'=>' title="'.$this->translate('Delete').'"',
); );

View File

@@ -2,19 +2,22 @@
$section_name='media'; $section_name='media';
$clonos->useDialogs(array( $clonos->useDialogs(array(
$section_name, //$section_name,
'media-upload',
)); ));
?> ?>
<h1>Subnet list</h1> <h1>Virtual media list</h1>
<p> <p>
<span class="top-button icon-plus id:<?php echo $section_name;?>">Add ISO</span> <!-- <span class="top-button icon-plus id:<?php echo $section_name;?>">Info</span> -->
<span class="top-button icon-plus id:media-upload">Upload ISO</span>
</p> </p>
<table class="tsimple" id="<?php echo $section_name;?>slist" width="100%"> <table class="tsimple" id="<?php echo $section_name;?>slist" width="100%">
<thead> <thead>
<td class="wdt-200 keyname">Storage name</td> <td class="wdt-200 keyname">Name of the disk</td>
<td class="txtleft">Path</td> <td class="txtleft">Path</td>
<td class="txtleft wdt-80">VM</td>
<td class="wdt-80">Action</td> <td class="wdt-80">Action</td>
</thead> </thead>
<tbody></tbody> <tbody></tbody>

View File

@@ -2,6 +2,7 @@
<tr id="#mediaid#"> <tr id="#mediaid#">
<td class="txtleft">#medianame#</td> <td class="txtleft">#medianame#</td>
<td class="txtleft wordwreck"><span class="max-100">#mediapath#</span></td> <td class="txtleft wordwreck"><span class="max-100">#mediapath#</span></td>
<td class="txtleft">#jname#</td>
<td class="ops"> <td class="ops">
<span#deltitle# class="icon-cancel"></span> <span#deltitle# class="icon-cancel"></span>
</td> </td>

View File

@@ -2,19 +2,22 @@
$section_name='media'; $section_name='media';
$clonos->useDialogs(array( $clonos->useDialogs(array(
$section_name, //$section_name,
'media-upload',
)); ));
?> ?>
<h1>Список подсетей</h1> <h1>Список виртуальных дисков</h1>
<p> <p>
<span class="top-button icon-plus id:<?php echo $section_name;?>">Добавить ISO</span> <!-- <span class="top-button icon-plus id:<?php echo $section_name;?>">Info</span> -->
<span class="top-button icon-plus id:media-upload">Добавить ISO</span>
</p> </p>
<table class="tsimple" id="<?php echo $section_name;?>slist" width="100%"> <table class="tsimple" id="<?php echo $section_name;?>slist" width="100%">
<thead> <thead>
<td class="wdt-200 keyname">Имя носителя</td> <td class="wdt-200 keyname">Имя носителя</td>
<td class="txtleft">Путь</td> <td class="txtleft">Путь</td>
<td class="txtleft wdt-80">Клетка/VM</td>
<td class="wdt-80">Действия</td> <td class="wdt-80">Действия</td>
</thead> </thead>
<tbody></tbody> <tbody></tbody>

View File

@@ -3,7 +3,7 @@
<table class="tfill"> <table class="tfill">
<thead> <thead>
<tr> <tr>
<td width="200">Item</td><td width="200">Value</td> <td width="200">Param</td><td width="200">Values</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -14,7 +14,7 @@
<tr><td>Num of cores:</td><td id="num-cores"></td></tr> <tr><td>Num of cores:</td><td id="num-cores"></td></tr>
<tr><td>Average freq. Mhz:</td><td id="average"></td></tr> <tr><td>Average freq. Mhz:</td><td id="average"></td></tr>
<tr><td>Summary RAM:</td><td id="sum-ram"></td></tr> <tr><td>Summary RAM:</td><td id="sum-ram"></td></tr>
<tr><td>Summary Storage:</td><td id="sum-storage"></td></tr> <tr><td>Summary storage size:</td><td id="sum-storage"></td></tr>
</tbody> </tbody>
<tbody class="error" style="display:none;"> <tbody class="error" style="display:none;">
<tr><td colspan="2" class="error_message">Unable to fetch net info!</td></tr> <tr><td colspan="2" class="error_message">Unable to fetch net info!</td></tr>
@@ -23,216 +23,13 @@
<p>It is an open source and free product which powered by other project (major importance list):</p> <p>It is an open source and free product which powered by other project (major importance list):</p>
<ul> <ul>
<li><a href="https://www.bsdstore.ru/" target="_blank">CBSD Project</a> FreeBSD OS virtual environment management framework</li> <li><a href="https://www.bsdstore.ru/" target="_blank">CBSD Project</a> FreeBSD OS virtual environment management framework</li>
<li><a href="https://www.freebsd.org/" target="_blank">FreeBSD Project</a> FreeBSD is a free and open source Unix-like operating system descended from Research Unix created in <a href="https://en.wikipedia.org/wiki/Berkeley_Software_Distribution">University of California, Berkeley, U.S.</a></li> <li><a href="https://www.freebsd.org/" target="_blank">FreeBSD Project</a> FreeBSD is a free and open source Unix-like operating system descended from Research Unix created in <a href="https://en.wikipedia.org/wiki/Berkeley_Software_Distribution">University of California, Berkeley, U.S.</li>
<li><a href="https://puppet.com/" target="_blank">Puppet</a> Puppet is an open-source configuration management tool.</li> <li><a href="https://puppet.com/" target="_blank">Puppet</a> Puppet is an open-source configuration management tool.</li>
<li>and many other..</li> <li>and many other..</li>
</ul> </ul>
<?php
<!--
return; CHAT:
echo '<pre>'; <input type="text" id="wsinp" />
print_r($wd->getHello()); <input type="button" onclick="clonos.wssend($('#wsinp').val());$('#wsinp').val('');" value="Send" />
-->
return;
function fetch_node_inv($dbfilepath)
{
global $allncpu, $allcpufreq, $allphysmem, $allnodes, $nodetable, $alljails, $knownfreq, $workdir;
$stat = file_exists($dbfilepath);
if (!$stat) {
$nodetable .= "<tr><td bgcolor=\"#CCFFCC\">$allnodes</td><td colspan=10><center>$dbfilepath not found</center></td></tr>";
return 0;
}
$db = new SQLite3($dbfilepath); $db->busyTimeout(5000);
$results = $db->query('SELECT COUNT(*) FROM jails;');
if (!($results instanceof Sqlite3Result)) {
$numjails=0;
} else {
while ($row = $results->fetchArray()) {
$numjails=$row[0];
}
}
$gwinfo="";
$netres = $db->query('SELECT ip4,ip6,mask4,mask6 FROM net;');
if (!($netres instanceof Sqlite3Result)) {
echo "Error: $dbfilepath";
$gwinfo="unable to fetch net info";
} else {
while ($row = $netres->fetchArray()) {
for ($i=0;$i<4;$i++)
if (isset($row[$i])) $gwinfo.= $row[$i]." ";
}
}
$netres = $db->query('select * from gw;');
if (!($netres instanceof Sqlite3Result)) {
} else {
while ($row = $netres->fetchArray()) {
for ($i=0;$i<4;$i++)
if (isset($row[$i])) $gwinfo.= $row[$i]." ";
}
}
$results = $db->query('SELECT nodename,nodeip,fs,ncpu,physmem,cpufreq,osrelease FROM local;');
if (!($results instanceof Sqlite3Result)) {
$nodetable .=<<<EOF
<tr>
<td bgcolor="#CCFFCC">$allnodes</td><td colspan=10></td>
</tr>
EOF;
} else {
while ($row = $results->fetchArray()) {
list($nodename, $nodeip, $fs, $ncpu, $physmem, $cpufreq, $osrelease) = $row;
$descrfile=$workdir."/var/db/nodedescr/".$nodename.".descr";
$desc="";
if (file_exists($descrfile)) {
$fp = fopen($descrfile, "r");
$size = filesize($descrfile);
if ($size>0)
$desc = fread($fp, filesize($descrfile));
fclose($fp);
}
$locfile=$workdir."/var/db/nodedescr/".$nodename.".location";
$loc="";
if (file_exists($locfile)) {
$fp = fopen($locfile, "r");
$size = filesize($locfile);
if ($size>0)
$loc = fread($fp, filesize($locfile));
fclose($fp);
}
$notesfile=$workdir."/var/db/nodedescr/".$nodename.".notes";
$notes="";
if (file_exists($notesfile)) {
$fp = fopen($notesfile, "r");
$size = filesize($notesfile);
if ($size>0)
$notes = fread($fp, filesize($notesfile));
fclose($fp);
}
$nodetable .=<<<EOF
<tr rel="{$nodename}">
<td bgcolor="#CCFFCC" class="node-name" data-file="descr" data-type="text">$nodename</td>
<td data-togle="toolkip" title="$gwinfo">$nodeip</td>
<td class="edited" data-file="descr" data-type="textarea">$desc</td>
<td class="edited" data-file="location" data-type="text">$loc</td>
<td>$osrelease</td>
<td>$fs</td>
<td>$physmem</td>
<td>$ncpu</td>
<td>$cpufreq</td>
<td>$numjails</td>
<td class="edited" data-file="notes" data-type="textarea">$notes</td>
</tr>
EOF;
$allncpu+=$ncpu;
$allphysmem+=$physmem;
$allcpufreq+=$cpufreq;
$alljails+=$numjails;
if ($cpufreq>1) $knownfreq++;
}
}
$db->close();
}
function show_overview($workdir)
{
global $allncpu, $allcpufreq, $allphysmem, $allnodes, $nodetable, $alljails, $knownfreq, $workdir;
echo "<strong>Summary statistics for cloud:</strong>";
$allncpu=0;
$allcpufreq=0;
$allphysmem=0;
$allnodes=0;
$nodetable="";
$alljails=0;
$knownfreq=0;
$offlinenodes=0;
$db = new SQLite3("$workdir/var/db/nodes.sqlite"); $db->busyTimeout(5000);
$sql = "SELECT nodename,ip FROM nodelist";
$result = $db->query($sql);//->fetchArray(SQLITE3_ASSOC);
$row = array();
$i = 0;
while($res = $result->fetchArray(SQLITE3_ASSOC)){
if(!isset($res['nodename'])) continue;
$nodename = $res['nodename'];
$nodeip = $res['ip'];
++$allnodes;
$path=$workdir."/var/db/";
$postfix=".sqlite";
$dbpath=$path.chop($nodename).$postfix;
$idle=check_locktime($nodeip);
if ( $idle == 0 ) {
$offlinenodes++;
}
fetch_node_inv($dbpath);
}
fetch_node_inv($workdir."/var/db/local.sqlite");
if ( $offlinenodes == 0 ) {
$offlinecolor="#FFFF99";
} else {
$offlinecolor="#FF9B77";
}
if ( $knownfreq > 0 ) {
$avgfreq=round($allcpufreq / $knownfreq);
} else {
$avgfreq=0;
}
$outstr=<<<EOF
<table>
<tr>
<td bgcolor="#00FF00">Num of nodes:</td><td bgcolor="#FFFF99">$allnodes</td>
</tr>
<tr>
<td bgcolor="#00FF00">Online nodes:</td><td bgcolor="#FFFF99">$allnodes</td>
</tr>
<tr>
<td bgcolor="$offlinecolor">Offline nodes:</td><td bgcolor="$offlinecolor">$offlinenodes</td>
</tr>
<tr>
<td bgcolor="#00FF00">Num of jails:</td><td bgcolor="#FFFF99">$alljails</td>
</tr>
<tr>
<td bgcolor="#00FF00">Num of core:</td><td bgcolor="#FFFF99">$allncpu</td>
</tr>
<tr>
<td bgcolor="#00FF00">Average freq. Mhz:</td><td bgcolor="#FFFF99">$avgfreq</td>
</tr>
<tr>
<td bgcolor="#00FF00">Summary RAM:</td><td bgcolor="#FFFF99">$allphysmem</td>
</tr>
<tr>
<td bgcolor="#00FF00">Summary Storage:</td><td bgcolor="#FFFF99">Unknown</td>
</tr>
</table>
EOF;
echo $outstr;
}
show_overview($wd->workdir);

View File

@@ -0,0 +1,7 @@
<h1>ClonOS Settings</h1>
<?php
$form=new Forms('cbsd-settings');
$res=$form->generate();
echo $res['html'];

View File

@@ -1,4 +1,4 @@
<h1>Настройки CBSD</h1> <h1>Настройки ClonOS</h1>
<?php <?php
$form=new Forms('cbsd-settings'); $form=new Forms('cbsd-settings');

View File

@@ -8,6 +8,7 @@ $nodes=array_reverse($nodes);
$ids=array(); $ids=array();
$nth=0; $nth=0;
$hres=$this->getTableChunk('srcslist','tbody');
if(!empty($nodes))foreach($nodes as $node) if(!empty($nodes))foreach($nodes as $node)
{ {
$db1=new Db('base',$node['nodename']); $db1=new Db('base',$node['nodename']);
@@ -25,7 +26,6 @@ if(!empty($nodes))foreach($nodes as $node)
$idle=$this->check_locktime($node['ip']); $idle=$this->check_locktime($node['ip']);
} }
$hres=$this->getTableChunk('srcslist','tbody');
if($hres!==false) if($hres!==false)
{ {
$html_tpl=$hres[1]; $html_tpl=$hres[1];
@@ -35,10 +35,12 @@ if(!empty($nodes))foreach($nodes as $node)
'node'=>$node['nodename'], 'node'=>$node['nodename'],
'name'=>$base['name'], 'name'=>$base['name'],
'platform'=>$base['platform'], 'platform'=>$base['platform'],
'ver'=>$base['ver'], 'version'=>$base['ver'],
'ver1'=>$vers, 'version1'=>$vers,
'rev'=>$base['rev'], 'rev'=>$base['rev'],
'date'=>$base['date'], 'date'=>$base['date'],
'jstatus'=>'',
'icon'=>'',
'maintenance'=>($idle==0)?' maintenance':'', 'maintenance'=>($idle==0)?' maintenance':'',
'deltitle'=>$this->translate('Delete'), 'deltitle'=>$this->translate('Delete'),
'updtitle'=>$this->translate('Update'), 'updtitle'=>$this->translate('Update'),
@@ -57,16 +59,37 @@ if(!empty($nodes))foreach($nodes as $node)
} }
} }
$html=str_replace(array("\n","\r","\t"),'',$html);
$tasks=''; $tasks='';
if(!empty($ids)) if(!empty($ids))
{ {
$tasks=$this->getRunningTasks($ids); $tasks=$this->getRunningTasks($ids);
} }
$html_tpl=str_replace(array("\n","\r","\t"),'',$hres[1]);
if($hres!==false)
{
$vars=array(
'nth-num'=>'nth0',
'status'=>'',
'jstatus'=>$this->translate('Updating'),
//'icon'=>'spin6 animate-spin',
'desktop'=>' s-off',
'maintenance'=>' maintenance busy',
'updtitle'=>$this->translate('Update'),
'deltitle'=>$this->translate('Delete'),
);
foreach($vars as $var=>$val)
$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
}
echo json_encode(array( echo json_encode(array(
'tbody'=>$html, 'tbody'=>$html,
'error'=>false, 'error'=>false,
'func'=>'fillTable', 'func'=>'fillTable',
'id'=>'srcslist', 'id'=>'srcslist',
'tasks'=>$tasks, 'tasks'=>$tasks,
'template'=>$html_tpl,
)); ));

View File

@@ -1,14 +1,14 @@
<tbody> <tbody>
<tr class="#nth-num##maintenance#" id="src#ver#"> <tr class="#nth-num##maintenance#" id="src#version#">
<td class="wordwreck">#node#</td> <td class="wordwreck node">#node#</td>
<!--td class="txtleft">#platform#</td--> <!--td class="txtleft">#platform#</td-->
<td class="version">#ver#</td> <td class="version">#version#</td>
<td class="version1">#ver1#</td> <td class="version1">#version1#</td>
<td class="txtleft nowrap">#rev#</td> <td class="txtleft nowrap rev">#rev#</td>
<td class="small">#date#</td> <td class="small date">#date#</td>
<td class="ops op-update" title="#updtitle#"><span class="icon-arrows-cw"></span></td> <td class="op-update" title="#updtitle#"><span class="icon-arrows-cw"></span></td>
<td class="ops op-del" title="#deltitle#"><span class="icon-cancel"></span></td> <td class="op-del" title="#deltitle#"><span class="icon-cancel"></span></td>
<td class="ops"><span class="icon-cnt"><span></span></span></td> <td class="ops"><span class="icon-cnt"><span></span></span></td>
<td class="jstatus"></td> <td class="jstatus">#jstatus#</td>
</tr> </tr>
</tbody> </tbody>

View File

@@ -56,7 +56,10 @@ vm_efi="uefi";
#iso_site=""; # must be merged from CBSD profiles #iso_site=""; # must be merged from CBSD profiles
#iso_img=""; # must be merged from CBSD profiles #iso_img=""; # must be merged from CBSD profiles
#register_iso_name="" # must be merged from CBSD profiles #register_iso_name="" # must be merged from CBSD profiles
#register_iso_as="" # must be merged from CBSD profiles #register_iso_as="" # must be merged from CBSD profiles
#register_iso_name# # template for iso name variable
#register_iso_as# # template for iso path variable
#iso_var_block# # template for block of vars: iso_extract, iso_img_dist, iso_img, iso_site
#vm_hostbridge="hostbridge"; # must be merged from CBSD profiles #vm_hostbridge="hostbridge"; # must be merged from CBSD profiles
#bhyve_flags=""; # must be merged from CBSD profiles #bhyve_flags=""; # must be merged from CBSD profiles

77
public/upload.php Normal file
View File

@@ -0,0 +1,77 @@
<?php
header('Content-Type: application/json');
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
$path=realpath('').'/media/';
if(is_uploaded_file($_FILES['file']['tmp_name']))
{
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$file = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_FILENAME));
$uid = uniqid();
$date = time();
$returnJson[]=array('filepath'=>$path);
//$filename=$path.$filename.'-'.$uid.".".$ext;
$file=$file.'.'.$ext;
$filename=$path.$file; //.'.'.$ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $filename))
{
$status = 'ok'; //'Successfully uploaded!';
}else{
$status = 'Upload Fail: Unknown error occurred!';
}
}
}
if($status!='ok') {echo json_encode(array('status' => $status));exit;}
return;
$valid_exts = array('image/jpeg', 'image/jpg', 'image/png', 'image/gif'); // valid extensions
$max_size = 30000 * 1024; // max file size in bytes
$json = array();
if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
{
for($i=0;$i<count($_FILES['file']['tmp_name']);$i++)
{
$path="/media/";
if(is_uploaded_file($_FILES['file']['tmp_name'][$i]) )
{
// get uploaded file extension
$ext = strtolower(pathinfo($_FILES['file']['name'][$i], PATHINFO_EXTENSION));
// looking for format and size validity
if (in_array($ext, $valid_exts) AND $_FILES['file']['size'][$i] < $max_size)
{
// unique file path
$uid = uniqid();
$date = date('Y-m-d-H-i-s');
$path = $path ."image_" .$date. '_' . $uid . "." .$ext;
$returnJson[]= array("filepath"=>$path);
$filename = "image_" . $date . "_" .$uid . "." . $ext;
//$this->createthumb($i,$filename);
// move uploaded file from temp to uploads directory
if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $path))
{
$status = 'ok'; //'Successfully uploaded!';
//perform sql updates here
}else{
$status = 'Upload Fail: Unknown error occurred!';
}
}else{
$status = 'Upload Fail: Unsupported file format or It is too large to upload!';
}
}else{
$status = 'Upload Fail: File not uploaded!';
}
}
}else{
$status = 'Bad request!';
}
echo json_encode(array('status' => $status));
//echo json_encode($json);