diff --git a/php/clonos.php b/php/clonos.php
index 2a4eddfb..5118a360 100644
--- a/php/clonos.php
+++ b/php/clonos.php
@@ -1,2790 +1,2793 @@
-0,
-		'username'=>'guest',
-		'unregistered'=>true,
-	);
-/*
-	public $projectId=0;
-	public $jailId=0;
-	public $moduleId=0;
-	public $helper='';
-	public $mode='';
-	public $form='';
-
-	private $_vars=array();
-	private $_db_tasks=null;
-	private $_db_jails=null;
-*/
-
-	function __construct($_REALPATH,$uri=''){	# /usr/home/web/cp/clonos
-
-		$this->_post=($_SERVER['REQUEST_METHOD']=='POST');
-		$this->_vars=$_POST;
-		if(isset($_COOKIE['lang'])) $this->language=$_COOKIE['lang'];
-
-		$this->workdir=getenv('WORKDIR'); # // /usr/jails
-		$this->environment=getenv('APPLICATION_ENV');
-		$this->realpath=$_REALPATH.'/'; # /usr/home/web/cp/clonos/
-		$this->realpath_php=$_REALPATH.'/php/'; # /usr/home/web/cp/clonos/php/
-		$this->realpath_public=$_REALPATH.'/public/'; # /usr/home/web/cp/clonos/public/
-		$this->media_import=$_REALPATH.'/media_import/';
-
-		if($this->environment=='development'){
-			$sentry_file=$this->realpath_php.'sentry.php';
-			if(file_exists($sentry_file))include($sentry_file);
-		}
-
-		if(isset($_SERVER['SERVER_NAME']) && !empty(trim($_SERVER['SERVER_NAME']))){
-			$this->server_name=$_SERVER['SERVER_NAME'];
-		} else {
-			$this->server_name=$_SERVER['SERVER_ADDR'];
-		}
-
-		if(!empty($uri)){
-			$str=str_replace('/index.php','',$uri);
-			$this->uri_chunks=explode('/',$str);
-		}else if(isset($this->_vars['path'])){
-			$str=trim($this->_vars['path'],'/');
-			$this->uri_chunks=explode('/',$str);
-		}
-
-		$this->config=new Config();
-
-		/* determine lang */
-		if(!array_key_exists($this->language, $this->config->languages)) $this->language='en';
-		include($this->realpath_public.'/lang/'.$this->language.'.php');
-		$this->translate_arr=$lang;
-		unset($lang);
-
-		$this->_client_ip=$_SERVER['REMOTE_ADDR'];
-
-		if(isset($this->_vars['path'])){
-			//$this->realpath_page=$this->realpath_public.'pages/'.trim($this->_vars['path'],'/').'/';
-			//echo $this->_vars['path'];
-			//print_r($this->uri_chunks);
-			$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
-			$this->json_name=$this->realpath_page.'a.json.php';
-			//echo $this->realpath_page;
-		}else if($_SERVER['REQUEST_URI']){
-			//$this->realpath_page=$this->realpath_public.'pages/'.trim($_SERVER['REQUEST_URI'],'/').'/';
-			if(isset($this->uri_chunks[0]))
-				$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
-		}
-
-		if(isset($this->_vars['hash'])) $this->url_hash=preg_replace('/^#/','',$this->_vars['hash']);
-
-//		$this->json_name=$this->realpath_php.'pages'
-//		$clonos->json_name=$file_path.'a.json.php';
-
-		$this->_db_tasks=new Db('base','cbsdtaskd');
-		$this->_db_local=new Db('base','local');
-
-		$this->menu=new Menu($this->config->menu,$this);
-
-		if(isset($this->_vars['mode'])) $this->mode=$this->_vars['mode'];
-		if(isset($this->_vars['form_data'])) $this->form=$this->_vars['form_data'];
-
-		$ures=$this->userAutologin();
-		$this->sys_vars['authorized']=false;
-		if($ures!==false){
-			if(isset($ures['id']) && is_numeric($ures['id']) && $ures['id']>0){
-				$this->_user_info=$ures;
-				$this->_user_info['unregistered']=false;
-				$this->sys_vars['authorized']=true;
-			}else{
-				$this->_user_info['unregistered']=true;
-				if($this->json_req) exit;
-			}
-		}
-
-		if($this->_post && isset($this->mode)){
-			if(isset($this->_user_info['error']) && $this->_user_info['error']){
-				if($this->mode!='login'){
-					echo json_encode(array('error'=>true,'unregistered_user'=>true));
-					exit;
-				}
-			}
-
-			if($this->_user_info['unregistered'] && $this->mode!='login'){
-				echo json_encode(array('error'=>true,'unregistered_user'=>true));
-				exit;
-			}
-
-			unset($_POST);
-
-			// functions, running without parameters
-			$new_array=array();
-			$cfunc='ccmd_'.$this->mode;
-			if(method_exists($this,$cfunc)){
-				$ccmd_res=array();
-				$ccmd_res=$this->$cfunc();
-				
-				if(is_array($ccmd_res)){
-					$new_array=array_merge($this->sys_vars,$ccmd_res);
-				} else {
-					echo json_encode($ccmd_res);
-					return;
-				}
-				echo json_encode($new_array);
-				return;
-			}
-
-			$included_result_array='';
-			switch($this->mode){
-				//case 'login':	 		echo json_encode($this->login()); return;
-				case 'getTasksStatus':		echo json_encode($this->_getTasksStatus($this->form['jsonObj'])); return;
-
-				/*
-				case '_getJsonPage':
-					if(file_exists($this->json_name))
-					{
-						include($this->json_name);
-						
-						if(is_array($included_result_array))
-						{
-							$new_array=array_merge($this->sys_vars,$included_result_array);
-							echo json_encode($new_array);
-							return;
-						} else echo '{}';
-						
-					} else echo '{}'; return;
-				*/
-				//case 'freejname':		echo json_encode($this->getFreeJname()); break;
-				case 'helpersAdd':		echo json_encode($this->helpersAdd($this->mode)); return;
-				case 'addHelperGroup':		echo json_encode($this->addHelperGroup($this->mode)); return;
-				//case 'addJailHelperGroup':	echo json_encode($this->addJailHelperGroup()); return;
-				//case 'deleteJailHelperGroup':	echo json_encode($this->deleteJailHelperGroup()); return;
-				case 'deleteHelperGroup':	echo json_encode($this->deleteHelperGroup($this->mode)); return;
-				//case 'jailRestart':		echo json_encode($this->jailRestart()); return;
-				//case 'jailStart':		echo json_encode($this->jailStart()); return;
-				//case 'jailStop':		echo json_encode($this->jailStop()); return;
-				//case 'jailRemove':		echo json_encode($this->jailRemove()); return;
-				//case 'saveJailHelperValues':	echo json_encode($this->saveJailHelperValues()); return;
-
-				case 'saveHelperValues':	$redirect='/jailscontainers/';
-				case 'jailAdd': 		if(!isset($redirect)) $redirect=''; echo json_encode($this->jailAdd($redirect)); return;
-
-				//case 'jailClone':		echo json_encode($this->jailClone()); return;
-				//case 'jailRename':		echo json_encode($this->jailRename()); return;
-				//case 'bhyveRename':		echo json_encode($this->bhyveRename()); return;
-				//case 'jailEdit':		echo json_encode($this->jailEdit()); return;
-				//case 'jailEditVars':		echo json_encode($this->jailEditVars()); return;
-				//case 'jailCloneVars':		echo json_encode($this->jailCloneVars()); return;
-				//case 'jailRenameVars':		echo json_encode($this->jailRenameVars()); return;
-				//case 'bhyveRenameVars':		echo json_encode($this->bhyveRenameVars()); return;
-				//case 'bhyveRestart':		echo json_encode($this->bhyveRestart()); return;
-				//case 'bhyveStart':		echo json_encode($this->bhyveStart()); return;
-				//case 'bhyveStop':		echo json_encode($this->bhyveStop()); return;
-				//case 'bhyveAdd':		echo json_encode($this->bhyveAdd()); return;
-				//case 'bhyveRemove':		echo json_encode($this->bhyveRemove()); return;
-				//case 'bhyveEdit':		echo json_encode($this->bhyveEdit()); return;
-				//case 'bhyveEditVars':		echo json_encode($this->bhyveEditVars()); return;
-				//case 'bhyveObtain':		echo json_encode($this->bhyveObtain()); return;
-				//case 'bhyveClone':		echo json_encode($this->bhyveClone()); return;		
-				//case 'authkeyAdd':		echo json_encode($this->authkeyAdd()); return;
-				//case 'authkeyRemove':		echo json_encode($this->()); return;
-				//case 'vpnetAdd':		echo json_encode($this->vpnetAdd()); return;
-				//case 'vpnetRemove':		echo json_encode($this->vpnetRemove()); return;
-				//case 'updateBhyveISO':		echo json_encode($this->updateBhyveISO()); return;
-				/*
-				case 'mediaAdd':
-					//echo json_encode($this->mediaAdd());
-					return;
-				*/
-				//case 'mediaRemove':		echo json_encode($this->mediaRemove()); return;
-				//case 'logLoad':			echo json_encode($this->logLoad()); return;
-				//case 'logFlush':		echo json_encode($this->logFlush()); return;
-				//case 'basesCompile':		echo json_encode($this->basesCompile()); return;
-				//case 'repoCompile':		echo json_encode($this->repoCompile()); return;
-				//case 'srcUpdate':		echo json_encode($this->srcUpdate()); return;
-				//case 'srcRemove':		echo json_encode($this->srcRemove()); return;
-				//case 'baseRemove':		echo json_encode($this->baseRemove()); return;
-				//case 'usersAdd':		echo json_encode($this->usersAdd()); return;
-				//case 'usersEdit':		echo json_encode($this->usersEdit()); return;
-				//case 'userRemove':		echo json_encode($this->userRemove()); return;
-				//case 'userGetInfo':		echo json_encode($this->userGetInfo()); return;
-				//case 'userEditInfo':		echo json_encode($this->userEditInfo()); return;
-				//case 'vmTemplateAdd':		echo json_encode($this->vmTemplateAdd()); return;
-				//case 'vmTemplateEditInfo':	echo json_encode($this->vmTemplateEditInfo()); return;
-				//case 'vmTemplateEdit':		echo json_encode($this->vmTemplateEdit()); return;
-				//case 'vmTemplateRemove':	echo json_encode($this->vmTemplateRemove()); return;
-				//case 'getImportedImageInfo':	echo json_encode($this->getImportedImageInfo()); return;
-				//case 'imageImport':		echo json_encode($this->imageImport()); return;
-				//case 'imageExport':		echo json_encode($this->imageExport()); return;
-				//case 'imageRemove': echo json_encode($this->imageRemove()); return;
-				//case 'getSummaryInfo': echo json_encode($this->getSummaryInfo()); return;
-					
-/*				case 'saveHelperValues':
-					echo json_encode($this->saveHelperValues());
-					return;
-*/
-			}
-		}
-	}
-
-	function ccmd_getJsonPage(){
-		$included_result_array=false;
-		if(file_exists($this->json_name)){
-			include($this->json_name);
-			
-			if(is_array($included_result_array)){
-				$new_array=array_merge($this->sys_vars,$included_result_array);
-				echo json_encode($new_array);
-				exit;
-			}
-		}
-		echo json_encode($this->sys_vars);
-		exit;
-	}
-
-	/* example return array('message'=>'unregistered user','errorCode'=>1) */
-	function ccmd_login(){
-		return $this->userRegisterCheck($this->_vars['form_data']);
-	}
-
-	function redis_publish($key,$message){
-		if(empty($key) || empty($message)) return false;
-		$redis=new Redis();
-		$redis->connect('10.0.0.3',6379);
-		$res=$redis->publish($key,$message);
-	}
-
-	function getLang(){
-		return $this->language;
-	}
-
-	function translate($phrase){
-		if(isset($this->translate_arr[$phrase])) return $this->translate_arr[$phrase];
-		return $phrase;
-	}
-
-	function getTableChunk($table_name='',$tag){
-		if(empty($table_name)) return false;
-		if(isset($this->table_templates[$table_name][$tag])) return $this->table_templates[$table_name][$tag];
-
-		$file_name=$this->realpath_page.$table_name.'.table';
-		if(!file_exists($file_name)) return false;
-		$file=file_get_contents($file_name);
-		$pat='#[\s]*?<'.$tag.'[^>]*>(.*)<\/'.$tag.'>#iUs';
- 		if(preg_match($pat,$file,$res)){
-			$this->table_templates[$table_name][$tag]=$res;
-			return $res;
-		}
-		return '';
-	}
-
-	function check_locktime($nodeip){
-		$lockfile=$this->workdir."/ftmp/shmux_${nodeip}.lock";
-		if (!file_exists($lockfile)) return 0;
-
-		$cur_time = time();
-		$st_time=filemtime($lockfile);
-
-		$difftime=(( $cur_time - $st_time ) / 60 );
-		if ( $difftime > 1 ) return round($difftime);
-		return 0; //lock exist but too fresh
-	}
-
-	function check_vmonline($vm){
-		$vmmdir="/dev/vmm";
-
-		if(!file_exists($vmmdir)) return 0;
-
-		if($handle=opendir($vmmdir)){
-			while(false!==($entry=readdir($handle))){
-				if($entry[0]==".") continue;
-				if($vm==$entry) return 1;
-			}
-			closedir($handle);
-		}
-
-		return 0;
-	}
-
-	function get_node_info($nodename,$value){
-		$db = new Db('', '', $this->realpath."/var/db/nodes.sqlite"); 
-		if (!$db->isConnected()) return array('error'=>true,'res'=> $db->error_message);
-
-		$result = $db->select("SELECT ? FROM nodelist WHERE nodename=?", array([$value],[$nodename]));
-
-		foreach($result as $res){
-			if(isset($res[$value])){
-				return $res[$value];
-			}
-		}
-		// TODO: what if not found ?
-	}
-
-	function getRunningTasks($ids=array()){
-		$check_arr=array(
-			'jcreate'=>'Creating',
-			'jstart'=>'Starting',
-			'jstop'=>'Stopping',
-			'jrestart'=>'Restarting',
-			'jremove'=>'Removing',
-			'jexport'=>'Exporting',
-			'jclone'=>'Cloning',
-			'bcreate'=>'Creating',
-			'bstart'=>'Starting',
-			'bstop'=>'Stopping',
-			'brestart'=>'Restarting',
-			'bremove'=>'Removing',
-			'bclone'=>'Cloning',
-			'vm_obtain'=>'Creating',
-			'removesrc'=>'Removing',
-			'srcup'=>'Updating',
-			'removebase'=>'Removing',
-			'world'=>'Compiling',
-			'repo'=>'Fetching',
-			'imgremove'=>'Removing',
-		);
-
-		$res=array();
-		if(!empty($ids)){
-			$tid=join("','",$ids);
-			$query="SELECT id,cmd,status,jname FROM taskd WHERE status<2 AND jname IN (?)";
-			$cmd='';
-			$txt_status='';
-			$tasks=$this->_db_tasks->select($query, array([$tid]));
-			if(!empty($tasks)) foreach($tasks as $task){
-				$rid=preg_replace('/^#/','',$task['jname']);
-				foreach($check_arr as $key=>$val){
-					if(strpos($task['cmd'],$key)!==false){
-						$cmd=$key;
-						$txt_status=$val;
-						break;
-					}
-				}
-				$res[$rid]['status']=$task['status'];
-				$res[$rid]['task_cmd']=$cmd;
-				$res[$rid]['txt_status']=$txt_status;
-				$res[$rid]['task_id']=$task['id'];
-			}
-			return $res;
-		}
-		return null;
-	}
-
-/*
-	function getProjectsListOnStart(){
-		$query='SELECT * FROM projects';
-		$res=$this->_db->select($query, array());
-		echo '	var projects=',json_encode($res),PHP_EOL;
-	}
-*/
-
-/*
-	function getTaskStatus($task_id){
-		$status=$this->_db_tasks->selectOne("SELECT status,logfile,errcode 
-					FROM taskd WHERE id=?", array([$task_id]);
-
-		if($status['errcode']>0) $status['errmsg']=file_get_contents($status['logfile']);
-
-		return $status;
-	}
-*/
-
-	private function doTask($key, $task){
-		if($task['status'] != -1) return(false);
-
-		switch($task['operation']){
-			case 'jstart':		$res=$this->jailStart($key);break;
-			case 'jstop':		$res=$this->jailStop($key);break;
-			case 'jrestart':	$res=$this->jailRestart($key);break;
-			//case 'jedit':		$res=$this->jailEdit('jail'.$key);break;
-			case 'jremove':		$res=$this->jailRemove($key);break;
-						
-			case 'bstart':		$res=$this->bhyveStart($key);break;
-			case 'bstop':		$res=$this->bhyveStop($key);break;
-			case 'brestart':	$res=$this->bhyveRestart($key);break;
-			case 'bremove':		$res=$this->bhyveRemove($key);break;
-			case 'removesrc':	$res=$this->srcRemove($key);break;
-			case 'srcup':		$res=$this->srcUpdate($key);break;
-			case 'removebase':	$res=$this->baseRemove($key);break;
-						
-			//case 'jexport':	$res=$this->jailExport('jail'.$key,$task['jname'],$key);break;
-			//case 'jimport':	$res=$this->jailImport('jail'.$key,$task['jname'],$key);break;
-			//case 'jclone':	$res=$this->jailClone('jail'.$key,$key,$obj[$key]);break;
-			//case 'madd':		$res=$this->moduleAdd('jail'.$key,$task['jname'],$key);break;
-			////case 'mremove':	$res=$this->moduleRemove('jail'.$key,$task['jname'],$key);break;
-			//case 'sstart':	$res=$this->serviceStart($task);break;
-			//case 'sstop':		$res=$this->serviceStop($task);break;
-			////case 'projremove':	$res=$this->projectRemove($key,$task);break;
-		}
-	}
-
-	function _getTasksStatus($jsonObj){
-		//return $jsonObj;
-		$tasks=array();
-		$obj=json_decode($jsonObj,true);
-		if(empty($ids)) return $obj; // TODO: error? this return NULL..
-
-		if(isset($obj['proj_ops'])) return $this->GetProjectTasksStatus($obj);
-		if(isset($obj['mod_ops'])) return $this->GetModulesTasksStatus($obj);
-
-		$ops_array=$this->_cmd_array;
-		$stat_array=array(
-			'jcreate'=>array($this->translate('Creating'),$this->translate('Created')),
-			'jstart'=>array($this->translate('Starting'),$this->translate('Launched')),
-			'jstop'=>array($this->translate('Stopping'),$this->translate('Stopped')),
-			'jrestart'=>array($this->translate('Restarting'),$this->translate('Restarted')),
-			'jedit'=>array($this->translate('Saving'),$this->translate('Saved')),
-			'jremove'=>array($this->translate('Removing'),$this->translate('Removed')),
-			'jexport'=>array($this->translate('Exporting'),$this->translate('Exported')),
-			'jimport'=>array($this->translate('Importing'),$this->translate('Imported')),
-			'jclone'=>array($this->translate('Cloning'),$this->translate('Cloned')),
-			'madd'=>array($this->translate('Installing'),$this->translate('Installed')),
-			//'mremove'=>array('Removing','Removed'),
-			'sstart'=>array($this->translate('Starting'),$this->translate('Started')),
-			'sstop'=>array($this->translate('Stopping'),$this->translate('Stopped')),
-			'vm_obtain'=>array($this->translate('Creating'),$this->translate('Created')),
-			'srcup'=>array($this->translate('Updating'),$this->translate('Updated')),
-			'world'=>array($this->translate('Compiling'),$this->translate('Compiled')),
-			'repo'=>array($this->translate('Fetching'),$this->translate('Fetched')),
-			//'projremove'=>array('Removing','Removed'),
-		);
-		$stat_array['bcreate']=&$stat_array['jcreate'];
-		$stat_array['bstart']=&$stat_array['jstart'];
-		$stat_array['bstop']=&$stat_array['jstop'];
-		$stat_array['brestart']=&$stat_array['jrestart'];
-		$stat_array['bremove']=&$stat_array['jremove'];
-		$stat_array['bclone']=&$stat_array['jclone'];
-		$stat_array['removesrc']=&$stat_array['jremove'];
-		$stat_array['removebase']=&$stat_array['jremove'];
-		$stat_array['imgremove']=&$stat_array['jremove'];
-
-		foreach($obj as $key=>$task){
-			$status=$task['status'];
-			if(in_array($task['operation'],$ops_array)){
-				if(false !== ($res=$this->runTask($key,$task))){
-					if($res['error']) $obj[$key]['retval']=$res['retval'];
-					if(!empty($res['error_message'])) $obj[$key]['error_message']=$res['error_message'];
-
-					if(isset($res['message'])){
-						$task_id=intval($res['message']);
-						if($task_id>0){
-							$tasks[]=$task_id;
-							$obj[$key]['task_id']=$task_id;
-							//$obj[$key]['txt_log']=file_get_contents('/tmp/taskd.'.$task_id.'.log');
-						}
-					}
-				}else $tasks[]=$task['task_id'];
-			}
-
-			if($status==-1) $obj[$key]['status']=0;
-		}
-
-		$ids=join(',',$tasks);
-		if(empty($ids)) return $obj;
-
-		$statuses=$this->_db_tasks->select("SELECT id,status,logfile,errcode FROM taskd WHERE id IN (?)", array([$ids]));
-
-		//print_r($statuses);
-		foreach($obj as $key=>$task){
-			if(!empty($statuses)) foreach($statuses as $stat){
-				if($task['task_id']!=$stat['id']) continue;
-
-				$obj[$key]['status']=$stat['status'];
-				$num=($stat['status']<2?0:1);
-				$obj[$key]['txt_status']=$stat_array[$obj[$key]['operation']][$num];
-				if($stat['errcode']>0){
-					$obj[$key]['errmsg']=file_get_contents($stat['logfile']);
-					$obj[$key]['txt_status']=$this->translate('Error');
-				}
-
-				//Return the IP of the cloned jail if it was assigned by DHCP
-
-				if($stat['status']==2){
-					switch($task['operation']){
-						case 'jcreate':
-						case 'jclone':
-							$res=$this->getJailInfo($obj[$key]['jail_id'],$task['operation']);
-							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
-							break;
-						case 'bclone':
-							$res=$this->getBhyveInfo($obj[$key]['jail_id']);
-							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
-							break;
-						case 'repo':
-							$res=$this->fillRepoTr($obj[$key]['jail_id'],true,false);
-							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
-							break;
-						case 'srcup':
-							$res=$this->getSrcInfo($obj[$key]['jail_id']);
-							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
-							break;
-					}
-				}
-			}
-		}
-
-		return $obj;
-	}
-
-	function ccmd_jailRename() {
-		$form=$this->_vars['form_data'];
-		$cmd = "task owner=%s mode=new {cbsd_loc} jrename old=%s new=%s host_hostname=%s ip4_addr=%s restart=1";
-		$args = array($this->_user_info['username'], $form['oldJail'], $form['jname'], $form['host_hostname'], $form['ip4_addr']);
-		$res=CBSD::run($cmd, $args);
-
-		$err='Jail is not renamed!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Jail was renamed!';
-			$taskId=$res['message'];
-		}else{
-			$err=$res['error'];
-		}
-
-		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode);
-	}
-
-	function ccmd_jailClone() {
-		$form=$this->_vars['form_data'];
-		$cmd = 'task owner=%s mode=new {cbsd_loc} jclone checkstate=0 old=%s new=%s host_hostname=%s ip4_addr=%s';
-		$args = array($this->_user_info['username'], $form['oldJail'], $form['jname'], $form['host_hostname'], $form['ip4_addr']);
-		$res=CBSD::run($cmd, $args);
-
-		$err='Jail is not cloned!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Jail was cloned!';
-			$taskId=$res['message'];
-		}else{
-			$err=$res['error'];
-		}
-
-		$html='';
-		$hres=$this->getTableChunk('jailslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'nth-num'=>'nth0',				// TODO: actual data
-				'node'=>'local',				// TODO: actual data
-				'ip4_addr'=>str_replace(',',',',$form['ip4_addr']),
-				'jname'=>$form['jname'],
-				'jstatus'=>$this->translate('Cloning'),
-				'icon'=>'spin6 animate-spin',
-				'desktop'=>' s-on',
-				'maintenance'=>' maintenance',
-				'protected'=>'icon-cancel',
-				'protitle'=>$this->translate('Delete'),
-				'vnc_title'=>$this->translate('Open VNC'),
-				'reboot_title'=>$this->translate('Restart jail'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode,'html'=>$html);
-	}
-
-	function getJailInfo($jname,$op=''){
-		$stats=array(''=>'','jclone'=>'Cloned','jcreate'=>'Created');
-		$html='';
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$jail=$db->selectOne("SELECT jname,ip4_addr,status,protected FROM jails WHERE jname=?", array([$jname]));
-			$hres=$this->getTableChunk('jailslist','tbody');
-			if($hres!==false){
-				$html_tpl=$hres[1];
-//				$status=$jail['status'];
-				$vars=array(
-					'nth-num'=>'nth0',
-					'node'=>'local',
-					'ip4_addr'=>str_replace(',',',',$jail['ip4_addr']),
-					'jname'=>$jail['jname'],
-					'jstatus'=>$this->translate($stats[$op]),
-					'icon'=>'spin6 animate-spin',
-					'desktop'=>' s-on',
-					'maintenance'=>' maintenance',
-					'protected'=>($jail['protected']==1)?'icon-lock':'icon-cancel',
-					'protitle'=>($jail['protected']==1)?' title="'.$this->translate('Protected jail').'"':' title="'.$this->translate('Delete').'"',
-					'vnc_title'=>$this->translate('Open VNC'),
-					'reboot_title'=>$this->translate('Restart jail'),
-				);
-
-				foreach($vars as $var=>$val)
-					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-				$html.=$html_tpl;
-			}
-		}
-
-		$html=preg_replace('#
 jname=jail1 inter=0
-		$cmd = 'task owner=%s mode=new {cbsd_loc} forms module=%s jname=%s inter=0';
-		$args = array($username, $this->url_hash, $jail_name);
-		$res=CBSD::run($cmd, $args);
-
-		$err='Helper values is saved!';
-		$taskId=-1;
-		if($res['retval']==0) {
-			$err='Helper values was not saved!';
-			$taskId=$res['message'];
-		}
-
-		return array(
-			'jail_id'=>$jail_name,
-			'taskId'=>$taskId,
-			'mode'=>$this->mode,
-		);
-	}
-
-	function jailAdd($redirect=''){	//$mode='jailAdd'
-		//if(!empty($arr)) $form=$arr; else
-		$form=$this->form;
-		$helper=preg_replace('/^#/','',$this->_vars['hash']);
-
-		$db_path='';
-		$with_img_helpers='';
-		if($this->mode=='saveHelperValues'){
-			if($helper=='' && $this->_vars['path']=='/settings/') return $this->saveSettingsCBSD();
-
-			if(!isset($this->_vars['db_path'])){
-				$res=CBSD::run('make_tmp_helper module=%s', array($helper));
-				if($res['retval']==0) $db_path=$res['message']; else{
-					echo json_encode(array('error'=>true,'errorMessage'=>'Error opening temporary form database!'));
-					return;
-				}
-			}else $db_path=$this->_vars['db_path'];
-
-			
-			/*
-			$file_name=$this->workdir.'/formfile/'.$helper.'.sqlite';
-			if(file_exists($file_name)){
-				$tmp_name=tempnam("/tmp","HLPR");
-				copy($file_name,$tmp_name);
-				
-				$db=new Db('file',$tmp_name);
-				if($db->isConnected()){
-					foreach($form as $key=>$val){
-						if($key!='jname' && $key!='ip4_addr'){
-							$query="update forms set new=? where param=?";
-							$db->update($query, array([$val],[$key]));
-							unset($form[$key]);
-						}
-					}
-					
-					$with_img_helpers=$tmp_name;
-					//echo $with_img_helpers;
-				}
-			}
-			*/
-
-			$db=new Db('file',$db_path);
-			if($db->isConnected()){
-				foreach($form as $key=>$val){
-					if($key!='jname' && $key!='ip4_addr'){
-						$db->update("update forms set new=? where param=?", array([$val],[$key]));
-						unset($form[$key]);
-					}
-				}
-
-				$with_img_helpers=$db_path;
-			}
-
-			$form['interface']='auto';
-			$form['user_pw_root']='';
-			$form['astart']=1;
-			$form['host_hostname']=$form['jname'].'.my.domain';
-		}
-
-		$err=array();
-		$arr=array(
-			'workdir'=>$this->workdir,
-			'mount_devfs'=>1,
-			'arch'=>'native',
-			'mkhostfile'=>1,
-			'devfs_ruleset'=>4,
-			'ver'=>'native',
-			'mount_src'=>0,
-			'mount_obj'=>0,
-			'mount_kernel'=>0,
-			'applytpl'=>1,
-			'floatresolv'=>1,
-			'allow_mount'=>1,
-			'allow_devfs'=>1,
-			'allow_nullfs'=>1,
-			'mkhostsfile'=>1,
-			'pkg_bootstrap'=>0,
-			'mdsize'=>0,
-			'runasap'=>0,
-			'with_img_helpers'=>$with_img_helpers,
-		);
-
-		$arr_copy=array('jname','host_hostname','ip4_addr','user_pw_root','interface');
-		foreach($arr_copy as $a) if(isset($form[$a])) $arr[$a]=$form[$a];
-
-		$arr_copy=array('baserw','mount_ports','astart','vnet');
-		foreach($arr_copy as $a) if(isset($form[$a]) && $form[$a]=='on') $arr[$a]=1; else $arr[$a]=0;
-
-		$sysrc=array();
-		if(isset($form['serv-ftpd'])) $sysrc[]=$form['serv-ftpd'];
-		if(isset($form['serv-sshd'])) $sysrc[]=$form['serv-sshd'];
-		$arr['sysrc_enable']=implode(' ',$sysrc);
-
-		/* create jail */
-		$file_name='/tmp/'.$arr['jname'].'.conf';
-
-		$file=file_get_contents($this->realpath_public.'templates/jail.tpl');
-		if(!empty($file)) foreach($arr as $var=>$val) $file=str_replace('#'.$var.'#',$val,$file);
-		file_put_contents($file_name,$file);
-
-		$username=$this->_user_info['username'];
-
-		//$cbsd_queue_name='/clonos/'.trim($this->_vars['path'],'/').'/';
-		$res=CBSD::run('task owner=%s mode=new {cbsd_loc} jcreate inter=0 jconf=%s', array($username, $file_name));
-		//.' cbsd_queue_name='.$cbsd_queue_name);
-
-		$err='Jail is not created!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Jail was created!';
-			$taskId=$res['message'];
-		}
-
-		// local - change to the real server on which the jail was created!
-		$jid=$arr['jname'];
-
-		$table='jailslist';
-		$html='';
-		$hres=$this->getTableChunk($table,'tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'nth-num'=>'nth0',		// TODO: fix actual data!
-				'node'=>'local',		// TODO: fix actual data!
-				'ip4_addr'=>str_replace(',',',',$form['ip4_addr']),
-				'jname'=>$arr['jname'],
-				'jstatus'=>$this->translate('Creating'),
-				'icon'=>'spin6 animate-spin',
-				'desktop'=>' s-off',
-				'maintenance'=>' busy maintenance',
-				'protected'=>'icon-cancel',
-				'protitle'=>$this->translate('Delete'),
-				'vnc_title'=>$this->translate('Open VNC'),
-				'reboot_title'=>$this->translate('Restart jail'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		/*
-		$this->redis_publish($cbsd_queue_name,json_encode(array(
-			'jail_id'=>$jid,
-			'cmd'=>'jcreate',
-			'html'=>$html,
-			'mode'=>$this->mode,
-			'table'=>$table,
-		)));
-		*/
-
-		return array(
-			'errorMessage'=>$err,
-			'jail_id'=>$jid,
-			'taskId'=>$taskId,
-			'mode'=>$this->mode,
-			'redirect'=>$redirect,
-			'db_path'=>$db_path
-		);	//,'html'=>$html
-	}
-
-	function ccmd_jailRenameVars(){
-		$form=$this->_vars['form_data'];
-		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
-
-		$err=false;
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$query="SELECT jname,host_hostname FROM jails WHERE jname=?;"; //ip4_addr
-			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
-		} else {
-			$err=true;
-		}
-
-		if(empty($res['vars'])) $err=true;
-
-		if($err){
-			$res['error']=true;
-			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
-			$res['jail_id']=$form['jail_id'];
-			$res['reload']=true;
-			return $res;
-		}
-
-		$orig_jname=$res['vars']['jname'];
-		//$res['vars']['jname'].='clone';
-		$res['vars']['ip4_addr']='DHCP';
-		$res['vars']['host_hostname']=preg_replace('/^'.$orig_jname.'/',$res['vars']['jname'],$res['vars']['host_hostname']);
-		$res['error']=false;
-		$res['dialog']=$form['dialog'];
-		$res['jail_id']=$form['jail_id'];
-		return $res;
-	}
-
-	function ccmd_jailCloneVars(){
-		$form=$this->_vars['form_data'];
-		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
-
-		$err=false;
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$query="SELECT jname,host_hostname FROM jails WHERE jname=?;";	//ip4_addr
-			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
-		}else $err=true;
-
-		if(empty($res['vars'])) $err=true;
-		if($err){
-			$res['error']=true;
-			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
-			$res['jail_id']=$form['jail_id'];
-			$res['reload']=true;
-			return $res;
-		}
-
-		$orig_jname=$res['vars']['jname'];
-		$res['vars']['jname'].='clone';
-		$res['vars']['ip4_addr']='DHCP';
-		$res['vars']['host_hostname']=preg_replace('/^'.$orig_jname.'/',$res['vars']['jname'],$res['vars']['host_hostname']);
-		$res['error']=false;
-		$res['dialog']=$form['dialog'];
-		$res['jail_id']=$form['jail_id'];
-		return $res;
-	}
-
-	function ccmd_jailEditVars(){
-		$form=$this->_vars['form_data'];
-		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
-
-		$err=false;
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$query="SELECT jname,host_hostname,ip4_addr,allow_mount,interface,mount_ports,astart,vnet FROM jails WHERE jname=?;";
-			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
-		}else $err=true;
-		if(empty($res['vars']))	$err=true;
-
-		if($err){
-			$res['error']=true;
-			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
-			$res['jail_id']=$form['jail_id'];
-			$res['reload']=true;
-			return $res;
-		}
-
-		$res['error']=false;
-		$res['dialog']=$form['dialog'];
-		$res['jail_id']=$form['jail_id'];
-		return $res;
-	}
-
-	function ccmd_jailEdit(){
-		$form=$this->_vars['form_data'];
-
-		$str=array();
-		$jname=$form['jname'];
-		$arr=array('host_hostname','ip4_addr','allow_mount','interface','mount_ports','astart','vnet');
-		foreach($arr as $a){
-			if(isset($form[$a])){
-				$val=$form[$a];
-				if($val=='on') $val=1;
-				$str[]=$a.'='.$val;
-			}else $str[]=$a.'=0';
-		}
-
-		$cmd='jset jname=%s %s';
-		$res=CBSD::run($cmd, array($jname, join(' ',$str)));
-		$res['mode']='jailEdit';
-		$res['form']=$form;
-		return $res;
-	}
-
-	function ccmd_jailStart(){
-		//$cbsd_queue_name=trim($this->_vars['path'],'/');
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} jstart inter=0 jname=%s',
-			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
-		);
-		//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/');	// autoflush=2
-		return $res;
-	}
-
-	function ccmd_jailStop(){
-		//$cbsd_queue_name=trim($this->_vars['path'],'/');
-		$res=CBSD::run(
-			'task owner='.$username.' mode=new {cbsd_loc} jstop inter=0 jname=%s',
-			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
-		);
-		//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/');	// autoflush=2
-		return $res;
-	}
-
-	function ccmd_jailRestart(){
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} jrestart inter=0 jname=%s',
-			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
-		);	// autoflush=2
-		return $res;
-	}
-
-	function ccmd_jailRemove(){
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} jremove inter=0 jname=%s',
-			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
-		);	// autoflush=2
-		return $res;
-	}
-
-	function ccmd_bhyveClone(){
-		$form=$this->_vars['form_data'];
-
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} bclone checkstate=0 old=%s new=%s',
-			array($this->_user_info['username'], $form['oldBhyve'], $form['vm_name'])
-		);
-
-		$err='Virtual Machine is not renamed!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Virtual Machine was renamed!';
-			$taskId=$res['message'];
-		}else $err=$res['error'];
-
-		$html='';
-		$hres=$this->getTableChunk('bhyveslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'nth-num'=>'nth0',				// TODO: actual data
-				'node'=>'local',				// TODO: actual data
-				'jname'=>$form['vm_name'],
-				'vm_ram'=>$form['vm_ram'],
-				'vm_cpus'=>$form['vm_cpus'],
-				'vm_os_type'=>$form['vm_os_type'],
-				'jstatus'=>$this->translate('Cloning'),
-				'icon'=>'spin6 animate-spin',
-				'desktop'=>' s-on',
-				'maintenance'=>' maintenance',
-				'protected'=>'icon-cancel',
-				'protitle'=>$this->translate('Delete'),
-				'vnc_title'=>$this->translate('Open VNC'),
-				'reboot_title'=>$this->translate('Restart VM'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		return array('errorMessage'=>$err,'vm_name'=>$form['vm_name'],'jail_id'=>$form['vm_name'],'taskId'=>$taskId,'mode'=>$this->mode,'html'=>$html);
-	}
-
-	function getBhyveInfo($jname){
-		$statuses=array('Not Launched','Launched','unknown-1','Maintenance','unknown-3','unknown-4','unknown-5','unknown-6');
-		$html='';
-		$db=new Db('base','local');
-		if($db->isConnected())	{
-			$bhyve=$db->selectOne("SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden FROM bhyve WHERE jname=?", array([$jname]));
-			$hres=$this->getTableChunk('bhyveslist','tbody');
-			if($hres!==false){
-				$html_tpl=$hres[1];
-				$status=$this->check_vmonline($bhyve['jname']);
-				$vars=array(
-					'jname'=>$bhyve['jname'],
-					'nth-num'=>'nth0',
-					'desktop'=>'',
-					'maintenance'=>'',
-					'node'=>'local',
-					'vm_name'=>'',
-					'vm_ram'=>$this->fileSizeConvert($bhyve['vm_ram']),
-					'vm_cpus'=>$bhyve['vm_cpus'],
-					'vm_os_type'=>$bhyve['vm_os_type'],
-					'vm_status'=>$this->translate($statuses[$status]),
-					'desktop'=>($status==0)?' s-off':' s-on',
-					'icon'=>($status==0)?'play':'stop',
-					'protected'=>'icon-cancel',
-					'protitle'=>' title="'.$this->translate('Delete').'"',
-					'vnc_title'=>$this->translate('Open VNC'),
-					'reboot_title'=>$this->translate('Restart bhyve'),
-				);
-
-				foreach($vars as $var=>$val)
-					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-				$html.=$html_tpl;
-			}
-		}
-
-		$html=preg_replace('#]*>#','',$html);
-		$html=str_replace(array('
',"\n","\r","\t"),'',$html);
-
-		return array('html'=>$html);
-	}
-
-	function ccmd_bhyveEditVars(){
-		$form=$this->_vars['form_data'];
-		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
-
-		$err=false;
-		$db=new Db('base','local');
-		if($db->isConnected())	{
-			$query="SELECT b.jname as vm_name,vm_cpus,vm_ram,vm_vnc_port,bhyve_vnc_tcp_bind,interface FROM bhyve AS b INNER JOIN jails AS j ON b.jname=j.jname AND b.jname=?;";
-			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
-			$res['vars']['vm_ram']=$this->fileSizeConvert($res['vars']['vm_ram'],1024,false,true);
-		}else{
-			$err=true;
-		}
-		if(empty($res['vars'])) $err=true;
-
-		if($err){
-			$res['error']=true;
-			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
-			$res['jail_id']=$form['jail_id'];
-			$res['reload']=true;
-			return $res;
-		}
-
-		$res['vars']['vm_vnc_password']='-nochange-';
-		$res['error']=false;
-		$res['dialog']=$form['dialog'];
-		$res['jail_id']=$form['jail_id'];
-		$res['iso_list']=$this->ccmd_updateBhyveISO($form['jail_id']);
-		return $res;
-	}
-
-	function ccmd_bhyveRename(){
-		$form=$this->_vars['form_data'];
-
-		$res=CBSD::run(
-			"task owner=%s mode=new /usr/local/bin/cbsd brename old=%s new=%s restart=1",
-			array($this->_user_info['username'], $form['oldJail'], $form['jname'])
-		);
-
-		$err='Virtual Machine is not renamed!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Virtual Machine was renamed!';
-			$taskId=$res['message'];
-		}else $err=$res['error'];
-
-		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode);
-	}
-
-	function ccmd_bhyveRenameVars(){
-		$form=$this->_vars['form_data'];
-		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
-
-		$jname=$form['jail_id'];
-		$err=false;
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$query="SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden FROM bhyve WHERE jname=?"; //ip4_addr
-			$res['vars']=$db->selectOne($query, array([$jname]));
-		}else $err=true;
-
-		if(empty($res['vars'])) $err=true;
-
-		if($err){
-			$res['error']=true;
-			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.'); // XSS 
-			$res['jail_id']=$form['jail_id']; // Possible XSS
-//			$res['reload']=true;
-			return $res;
-		}
-
-		$res['error']=false;
-		$res['dialog']=$form['dialog']; // Possible XSS
-		$res['jail_id']=$form['jail_id'];
-		return $res;
-	}
-
-	function ccmd_bhyveEdit(){
-		$form=$this->form;
-
-		$str=array();
-		$jname=$form['jname'];
-
-		$ram=$form['vm_ram'];
-		$ram_tmp=$ram;
-		$ram=str_replace(' ','',$ram);
-		$ram=str_ireplace('mb','m',$ram);
-		$ram=str_ireplace('gb','g',$ram);
-		$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])){
-				$val=$form[$a];
-				if($val=='on') $val=1;
-				$str[]=$a.'='.$val;
-			}else $str[]=$a.'=0';
-		}
-
-		$form['vm_ram']=$ram_tmp;
-
-		/* check mounted ISO */
-		$db=new Db('base','storage_media');
-		if(!$db->isConnected()) return(false); // TODO: Fix return
-
-		$res=$db->selectOne('SELECT * FROM media WHERE jname=? AND type="iso"', array([$jname]));
-		if($res!==false && !empty($res)){
-			CBSD::run(
-				'cbsd media mode=unregister name="%s" path="%s" jname=%s type=%s',
-				array($res['name'], $res['path'], $jname, $res['type'])
-			);
-			$res=$db->selectOne(
-				'SELECT * FROM media WHERE idx=?',
-				array([(int)$form['vm_iso_image']])
-			); 
-			if($res!==false && !empty($res) && $form['vm_iso_image']!=-2){
-				CBSD::run(
-					'cbsd media mode=register name="%s" path="%s" jname=%s type=%s',
-					array($res['name'], $res['path'], $jname, $res['type'])
-				);
-			}
-		}
-		//exit;
-
-		/* end check */
-
-		$cmd='bset jname=%s %s';
-		$res=CBSD::run($cmd, array($jname, join(' ',$str)));
-		$res['mode']='bhyveEdit';
-		$res['form']=$form;
-		return $res;
-	}
-
-	function ccmd_bhyveAdd(){
-		$form=$this->form;
-
-		$os_types=$this->config->os_types;
-		$sel_os=$form['vm_os_profile'];
-		list($os_num,$item_num)=explode('.',$sel_os);
-		if(!isset($os_types[$os_num])) return array('error'=>true,'errorMessage'=>'Error in list of OS types!');
-		$os_name=$os_types[$os_num]['os'];
-		$os_items=$os_types[$os_num]['items'][$item_num];
-
-		$err=array();
-		$arr=array(
-			'workdir'=>$this->workdir,
-			'jname'=>$form['vm_name'],
-			'host_hostname'=>'',
-			'ip4_addr'=>'',
-			'arch'=>'native',
-			'ver'=>'native',
-			'astart'=>0,
-			'interface'=>$form['interface'],
-			'vm_size'=>$form['vm_size'],
-			'vm_cpus'=>$form['vm_cpus'],
-			'vm_ram'=>$form['vm_ram'],
-			'vm_os_type'=>$os_items['type'],
-			'vm_efi'=>'uefi',
-			'vm_os_profile'=>$os_items['profile'],
-			'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;
-		$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)){
-			$iso_id=(int)$iso_id;
-			if($iso_id>0){
-				$db=new Db('base','storage_media');
-				if(!$db->isConnected()) return(false); // TODO: return error
-				$res=$db->selectOne('SELECT name,path FROM media WHERE idx= ?', array([$iso_id])); // OK, $iso_id is casted as int above.
-				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 */
-		$file_name='/tmp/'.$arr['jname'].'.conf';
-
-		$file=file_get_contents($this->realpath_public.'templates/vm.tpl');
-		if(!empty($file)){
-			foreach($arr as $var=>$val) $file=str_replace('#'.$var.'#',$val,$file);
-		}
-		//echo $file;exit;
-		file_put_contents($file_name,$file);
-
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} bcreate inter=0 jconf=%s',
-			array($this->_user_info['username'], $file_name)
-		);
-
-		$err='Virtual Machine is not created!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Virtual Machine was created!';
-			$taskId=$res['message'];
-		}
-		// local - change to the real server on which the jail is created!
-		$jid=$arr['jname'];
-
-		$vm_ram=str_replace('g',' GB',$form['vm_ram']);
-
-		$html='';
-		$hres=$this->getTableChunk('bhyveslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'nth-num'=>'nth0',				// TODO: actual data
-				'node'=>'local',				// TODO: actual data
-				'jname'=>$arr['jname'],
-				'vm_status'=>$this->translate('Creating'),
-				'vm_cpus'=>$form['vm_cpus'],
-				'vm_ram'=>$vm_ram,
-				'vm_os_type'=>$os_items['type'],	//$os_name,
-				'vnc_port'=>'',
-				'vnc_port_status'=>'',
-				'icon'=>'spin6 animate-spin',
-				'desktop'=>' s-off',
-				'maintenance'=>' maintenance',
-				'protected'=>'icon-cancel',
-				'protitle'=>$this->translate('Delete'),
-				'vnc_title'=>$this->translate('Open VNC'),
-				'reboot_title'=>$this->translate('Restart VM'),
-			);
-			
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-			
-			$html=$html_tpl;
-		}
-		
-		return array('errorMessage'=>$err,'jail_id'=>$jid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode);
-	}
-
-	function ccmd_bhyveObtain(){
-		$form=$this->_vars['form_data'];
-		$os_types=$this->config->os_types;
-		$os_types_obtain=$this->config->os_types_obtain;
-		$sel_os=$form['vm_os_profile'];
-		list($os_num,$item_num)=explode('.',$sel_os);
-		if(!isset($os_types[$os_num])) return array('error'=>true,'errorMessage'=>'Error in list of OS types!');
-		//$os_name=$os_types[$os_num]['os'];
-		$os_items=$os_types[$os_num]['items'][$item_num];
-		$os_type=$os_items['type'];
-
-		//echo '';print_r($os_types_obtain);exit;
-
-		// os select
-		list($one,$two)=explode('.',$sel_os,2);
-
-		if(isset($os_types_obtain[$one]))
-		{
-			if(isset($os_types_obtain[$one]['items'][$two]))
-			{
-				$os_profile=$os_types_obtain[$one]['items'][$two]['profile'];
-				$os_type=$os_types_obtain[$one]['items'][$two]['type'];
-			}
-		}
-
-		$key_name='/usr/home/olevole/.ssh/authorized_keys';
-		if(!isset($form['vm_authkey'])) $form['vm_authkey']=0;
-		$key_id=(int)$form['vm_authkey'];
-
-		$db=new Db('base','authkey');
-		if(!$db->isConnected())  return array('error'=>true,'errorMessage'=>'Database error!');
-
-		//if($nres['name']!==false) $key_name=$nres['name'];
-		$nres=$db->selectOne('SELECT authkey FROM authkey WHERE idx=?', array([$key_id, PDO::PARAM_INT]));
-		if($nres['authkey']!==false) $authkey=$nres['authkey']; else $authkey='';
-		//var_dump($nres);exit;
-
-		$user_pw=(!empty($form['user_password']))?' ci_user_pw_user='.$form['user_password'].' ':'';
-
-		$res=CBSD::run( // TODO: THIS SEEMS WRONG pw_user={$form['vm_password']} {$user_pw}vnc_password={$form['vnc_password']}";
-			'task owner=%s mode=new {cbsd_loc} bcreate jname=%s 
-			vm_os_profile="%s" imgsize=%s vm_cpus=%s vm_ram=%s vm_os_type=%s mask=%s 
-			ip4_addr=%s ci_ip4_addr=%s ci_gw4=%s ci_user_pubkey="%s" ci_user_pw_user=%s %svnc_password=%s',
-			array(
-				$this->_user_info['username'],
-				$form['vm_name'],
-				$os_profile,
-				$form['vm_size'],
-				$form['vm_cpus'],
-				$form['vm_ram'],
-				$os_type,
-				$form['mask'],
-				$form['ip4_addr'],
-				$form['ip4_addr'],
-				$form['gateway'],
-				$authkey,
-				$form['vm_password'],
-				$user_pw,
-				$form['vnc_password']
-			)
-		);
-
-		$err='Virtual Machine is not created!';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Virtual Machine was created!';
-			$taskId=$res['message'];
-		}
-
-		$vm_ram=str_replace('g',' GB',$form['vm_ram']);
-
-		$html='';
-		$hres=$this->getTableChunk('bhyveslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'nth-num'=>'nth0',				// TODO: actual data
-				'node'=>'local',				// TODO: actual data
-				'jname'=>$form['vm_name'],
-				'vm_status'=>$this->translate('Creating'),
-				'vm_cpus'=>$form['vm_cpus'],
-				'vm_ram'=>$vm_ram,
-				'vm_os_type'=>$os_type,
-				'icon'=>'spin6 animate-spin',
-				'desktop'=>' s-off',
-				'maintenance'=>' maintenance',
-				'protected'=>'icon-cancel',
-				'protitle'=>$this->translate('Delete'),
-				'vnc_title'=>$this->translate('Open VNC'),
-				'reboot_title'=>$this->translate('Restart VM'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-			
-			$html=$html_tpl;
-		}
-
-		return array('errorMessage'=>$err,'jail_id'=>$form['vm_name'],'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode);
-	}
-
-	function ccmd_bhyveStart(){
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} bstart inter=0 jname=%s',
-			array($this->_user_info['username'], $this->form['jname'])
-		);	// autoflush=2
-	}
-
-	function ccmd_bhyveStop(){
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} bstop inter=0 jname=%s',
-			array($this->_user_info['username'], $this->form['jname'])
-		);	// autoflush=2
-	}
-
-	function ccmd_bhyveRestart(){
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} brestart inter=0 jname=%s',
-			array($this->_user_info['username'], $this->form['jname'])
-		);	// autoflush=2
-	}
-
-	function ccmd_bhyveRemove(){
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} bremove inter=0 jname=%s',
-			array($this->_user_info['username'], $this->form['jname'])
-		);	// autoflush=2
-	}
-
-	function ccmd_authkeyAdd(){
-		$db=new Db('base','authkey');
-		if(!$db->isConnected()) return array('error'=>'Database error');
-
-		//$res=array('error'=>false,'lastId'=>2);
-		$res=$db->insert("INSERT INTO authkey (name,authkey) VALUES (?, ?)", array([$this->form['keyname']], [$this->form['keysrc']]));
-		if($res['error']) return array('error'=>$res);
-		
-		$html='';
-		$hres=$this->getTableChunk('authkeyslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'keyid'=>$res['lastID'],
-				'keyname'=>$this->form['keyname'],
-				'keysrc'=>$this->form['keysrc'],
-				'deltitle'=>$this->translate('Delete'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		return array('keyname'=>$this->form['keyname'],'html'=>$html);
-	}
-
-	function ccmd_authkeyRemove(){
-		$form=$this->_vars['form_data'];
-
-		$db=new Db('base','authkey');
-		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
-
-		$res=$db->update('DELETE FROM authkey WHERE idx=?', array([$form['auth_id']]));
-		if($res===false) return array('error'=>true,'res'=>print_r($res,true));
-
-		return array('error'=>false,'auth_id'=>$form['auth_id']);
-	}
-
-	function ccmd_vpnetAdd(){
-		$form=$this->_vars['form_data'];
-
-		$db=new Db('base','vpnet');
-		if(!$db->isConnected()) return array('error'=>'Database error');
-
-		$res=$db->insert("INSERT INTO vpnet (name,vpnet) VALUES (?, ?)", array([$form['netname']],[$form['network']]));
-		if($res['error']) return array('error'=>$res);
-
-		$html='';
-		$hres=$this->getTableChunk('vpnetslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$vars=array(
-				'netid'=>$res['lastID'],
-				'netname'=>$form['netname'],
-				'network'=>$form['network'],
-				'deltitle'=>$this->translate('Delete'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		return array('netname'=>$form['netname'],'html'=>$html);
-	}
-
-	function ccmd_vpnetRemove(){
-		$form=$this->_vars['form_data'];
-
-		$db=new Db('base','vpnet');
-		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
-
-		$res=$db->update('DELETE FROM vpnet WHERE idx=?', array([(int)$form['vpnet_id']]));
-		if($res===false) return array('error'=>true,'res'=>print_r($res,true));
-
-		return array('error'=>false,'vpnet_id'=>$form['vpnet_id']);
-	}
-
-	function ccmd_mediaRemove(){
-
-		$db=new Db('base','storage_media');
-		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
-
-		//$res=$db->update('DELETE FROM media WHERE idx=?', array([$this->form['media_id']]));
-		$res=$db->selectOne('SELECT * FROM media WHERE idx=?', array([(int)$this->form['media_id'], PDO::PARAM_INT]));
-		if($res===false || empty($res)) return array('error'=>true,'res'=>print_r($res,true));
-
-		//if($res['jname']=='-')	// если медиа отвязана, то про
-
-		$res=CBSD::run(
-			'media mode=remove name="%s" path="%s" jname="%s" type="%s"', //.$res['name']
-			array($res['name'], $res['path'], $res['jname'], $res['type'])
-		);
-
-		if($res['error']){
-			$arr['error']=true;
-			$arr['error_message']='File image was not deleted! '.$res['error_message'];
-		}else $arr['error']=false;
-
-		$arr['media_id']=$this->form['media_id'];
-		$arr['cmd']=$res;
-		//echo json_encode($arr);
-
-		//return array('error'=>false,'media_id'=>$this->form['media_id']);
-		return $arr;
-	}
-
-	function ccmd_srcRemove(){
-		$ver=str_replace('src','',$this->formform['jname']);
-		if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
-		return CBSD::run(
-			'task owner='.$username.' mode=new {cbsd_loc} removesrc inter=0 ver=%s jname=#src%s',
-			array($this->_user_info['username'], $ver, $ver)
-		);
-	}
-
-	function ccmd_srcUpdate(){
-		$ver=str_replace('src','',$this->form['jname']);
-		$stable=(preg_match('#\.\d#',$ver))?0:1;
-		if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} srcup stable=%s inter=0 ver=%s jname=#src%s',
-			array($this->_user_info['username'], $stable, $ver, $ver)
-		);
-	}
-
-	function getSrcInfo($id){
-		$id=str_replace('src','',$id);
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'Database error');
-		$res=$db->selectOne("SELECT idx,name,platform,ver,rev,date FROM bsdsrc WHERE ver=?", array([(int)$id, PDO::PARAM_INT]));
-
-		$hres=$this->getTableChunk('srcslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$ver=$res['ver'];
-			$vars=array(
-				'nth-num'=>'nth0',
-				'maintenance'=>' busy',
-				'node'=>'local',
-				'ver'=>$res['ver'],
-				'ver1'=>strlen(intval($res['ver']))$res['rev'],
-				'date'=>$res['date'],
-				'protitle'=>$this->translate('Update'),
-				'protitle'=>$this->translate('Delete'),
-			);
-
-			foreach($vars as $var=>$val) $html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		$html=preg_replace('#]*>#','',$html);
-		$html=str_replace(array('
',"\n","\r","\t"),'',$html);
-
-		return array('html'=>$html,'arr'=>$res);
-	}
-
-	function ccmd_baseRemove(){	//$id
-		//$id=str_replace('base','',$id);
-		//base10.3-amd64-0
-		$id=$this->form['jname'];
-		preg_match('#base([0-9\.]+)-([^-]+)-(\d+)#',$id,$res);
-		$ver=$res[1];
-		$arch=$res[2];
-		$stable=$res[3];
-
-		return $this->CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} removebase inter=0 stable=%s ver=%s arch=%s jname=#%s',
-			array($this->_user_info['username'], $stable, $ver, $arch, $this->form['jname'])
-		);
-	}
-
-	function ccmd_basesCompile(){
-		$form=$this->form;
-		if(!isset($form['sources']) || !is_numeric($form['sources'])) return array('error'=>true,'errorMessage'=>'Wrong OS type selected!');
-		$id=(int)$form['sources'];
-
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'Database connect error!');
-
-		$base=$db->selectOne("SELECT idx,platform,ver FROM bsdsrc WHERE idx=?", array([$id, PDO::PARAM_INT])); // Casted above as 
-		$ver=$base['ver'];
-		$stable_arr=array('release','stable');
-		$stable_num=strlen(intval($ver))fillRepoTr($id);
-		$html=$res['html'];
-		$res=$res['arr'];
-
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} world inter=0 stable=%s ver=%s jname=#base%s',
-			array($this->_user_info['username'], $res['stable'], $ver, $bid)
-		);
-		//$res['retval']=0;$res['message']=3;
-
-		$err='';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='World compile start!';
-			$taskId=$res['message'];
-		}
-
-		return array('errorMessage'=>'','jail_id'=>'base'.$bid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode,'txt_status'=>$this->translate('Compiling'));
-	}
-
-	function fillRepoTr($id,$only_td=false,$bsdsrc=true){
-//		preg_match('#base([0-9\.]+)-#',$id,$res);
-//		$id=$res[1];
-
-		$html='';
-
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			if($bsdsrc){
-				$res=$db->selectOne("SELECT idx,platform,ver FROM bsdsrc WHERE idx=?", array([(int)$id, PDO::PARAM_INT]));
-				$res['name']='—';
-				$res['arch']='—';
-				$res['targetarch']='—';
-				$res['stable']=strlen(intval($res['ver']))selectOne("SELECT idx,platform,name,arch,targetarch,ver,stable,elf,date FROM bsdbase WHERE ver=?", array([(int)$id, PDO::PARAM_INT]));
-			}
-			$hres=$this->getTableChunk('baseslist','tbody');
-			if($hres!==false){
-				$html_tpl=$hres[1];
-				$ver=$res['ver'];
-				$vars=array(
-					'bid'=>$res['idx'],
-					'nth-num'=>'nth0',
-					'node'=>'local',
-					'ver'=>$res['ver'],
-					'name'=>'base',
-					'platform'=>$res['platform'],
-					'arch'=>$res['arch'],
-					'targetarch'=>$res['targetarch'],
-					'stable'=>$res['stable']==0?'release':'stable',
-					'elf'=>$res['elf'],
-					'date'=>$res['date'],
-					'maintenance'=>' busy',
-					'protitle'=>$this->translate('Delete'),
-				);
-
-				foreach($vars as $var=>$val)
-					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-				$html=$html_tpl;
-			}
-		}
-
-		if($only_td){
-			$html=preg_replace('#]*>#','',$html);
-			$html=str_replace(array('
',"\n","\r","\t"),'',$html);
-		}
-
-		return array('html'=>$html,'arr'=>$res);
-	}
-
-	function ccmd_repoCompile(){
-		$form=$this->form;
-		if(!isset($form['version']) || !is_numeric($form['version'])) return array('error'=>true,'errorMessage'=>'Wrong OS type input!');
-
-		$stable_arr=array('release','stable');
-		$html='';
-		$hres=$this->getTableChunk('baseslist','tbody');
-		if($hres!==false){
-			$html_tpl=$hres[1];
-			$ver=$form['version'];
-			$stable_num=strlen(intval($ver))'nth0',
-				'bid'=>$bid,
-				'node'=>'local',
-				'ver'=>$ver,
-				'name'=>'base',
-				'platform'=>'—',
-				'arch'=>'—',
-				'targetarch'=>'—',
-				'stable'=>$stable,
-				'elf'=>'—',
-				'date'=>'—',
-				'maintenance'=>' busy',
-				'protitle'=>$this->translate('Delete'),
-			);
-
-			foreach($vars as $var=>$val)
-				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
-
-			$html=$html_tpl;
-		}
-
-		$res=CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} repo action=get sources=base inter=0 stable=%s ver=%s jname=#base%s',
-			array($this->_user_info['username'], $stable_num, $ver, $bid)
-		);
-
-		//$res['retval']=0;$res['message']=3;
-
-		$err='';
-		$taskId=-1;
-		if($res['retval']==0){
-			$err='Repo download start!';
-			$taskId=$res['message'];
-		}
-
-		return array('errorMessage'=>'','jail_id'=>'base'.$bid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode,'txt_status'=>$this->translate('Fetching'));
-	}
-
-	function ccmd_logLoad(){
-		$form=$this->_vars['form_data'];
-		$log_id=$form['log_id'];
-		if(!is_numeric($log_id)) return array('error'=>'Log ID must be a number');
-
-		$html='';
-		$buf='';
-		$log_file='/tmp/taskd.'.$log_id.'.log';
-		if(file_exists($log_file)){
-			$filesize=filesize($log_file);
-			if($filesize<=204800){
-				$buf=file_get_contents($log_file);
-			}else{
-				$fp=fopen($log_file,'r');
-				if($fp)	{
-					fseek($fp,-1000,SEEK_END);
-					$buf=fread($fp,1000);
-					$html='Last 1000 Bytes of big file data:
';
-				}
-				fclose($fp);
-			}
-			$buf=htmlentities(trim($buf));
-			$arr=preg_split('#\n#iSu',trim($buf));
-			if(!empty($arr)) foreach($arr as $txt)
-				$html.=''.$txt.'
';
-
-			return array('html'=>'Log ID: '.$log_id.'
'.$html);
-		}
-
-		return array('error'=>'Log file is not exists!');
-	}
-
-	function ccmd_logFlush(){
-		return CBSD::run('task mode=flushall', array());
-	}
-
-	function getBasesCompileList(){
-		$db1=new Db('base','local');
-		if($db1!==false){
-			$bases=$db1->select("SELECT idx,platform,ver FROM bsdsrc order by cast(ver AS int)", array());
-
-			if(!empty($bases)) foreach($bases as $base){
-				$val=$base['idx'];
-				$stable=strlen(intval($base['ver']))'.$name.'',PHP_EOL;
-			}
-		}
-	}
-
-/*
-	function saveHelperValues(){
-		$form=$this->_vars['form_data'];
-		return $this->jailAdd($form);
-	}
-*/
-	function helpersAdd($mode){
-		if($this->uri_chunks[0]!='jailscontainers' || empty($this->uri_chunks[1])) return array('error'=>true,'errorMessage'=>'Bad url!');
-		$jail_id=$this->uri_chunks[1];
-
-		$helpers=array_keys($this->form);
-		if(!empty($helpers)) foreach($helpers as $helper){
-			$res=CBSD::run(
-				'task owner=%s mode=new {cbsd_loc} forms inter=0 module=%s jname=%s',
-				array($this->_user_info['username'], $helper, $jail_id)
-			);
-		}
-		return array('error'=>false);
-	}
-
-	//function addJailHelperGroup(){
-	function ccmd_addJailHelperGroup(){
-		if($this->uri_chunks[0]!='jailscontainers' || empty($this->uri_chunks[1]) || empty($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
-		$jail_id=$this->uri_chunks[1];
-		$helper=$this->url_hash;
-
-		$db=new Db('helper',array('jname'=>$jail_id,'helper'=>$helper));
-		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'No database file!');
-
-		$db_path=$db->getFileName();
-
-		$res=CBSD::run(
-			'forms inter=0 module=%s formfile=%s group=add',
-			array($helper, $db_path)
-		);
-		$form=new Forms('',$helper,$db_path);
-		$res=$form->generate();
-
-		return array('html'=>$res['html']);
-	}
-
-	function addHelperGroup($mode){
-		$module=$this->url_hash;
-		if(isset($this->form)) $form=$this->form; else $form=array();
-		if(isset($form['db_path']) && !empty($form['db_path']))	{
-			$db_path=$form['db_path'];
-			if(!file_exists($db_path)){
-				$res=CBSD::run('make_tmp_helper module=%s', array($module));
-				if($res['retval']==0) $db_path=$res['message']; else return array('error'=>true,'errorMessage'=>'Error on open temporary form file!');
-			}
-		}else{
-			$res=CBSD::run('make_tmp_helper module=%s', array($module));
-			if($res['retval']==0) $db_path=$res['message'];
-		}
-		CBSD::run('forms inter=0 module=%s formfile=%s group=add', array($module, $db_path));
-		$form=new Forms('',$module,$db_path);
-		$res=$form->generate();
-
-		return array('db_path'=>$db_path,'html'=>$res['html']);
-	}
-
-	function deleteHelperGroup($mode){
-		$module=$this->url_hash;
-		if(isset($this->form)) $form=$this->form; else $form=array();
-		if(!isset($form['db_path']) || empty($form['db_path'])) return;
-
-		if(!file_exists($form['db_path'])) return array('error'=>true,'errorMessage'=>'Error on open temporary form file!');
-		
-		$index=$form['index'];
-		$index=str_replace('ind-','',$index);
-
-		$db_path=$form['db_path'];
-		$res=CBSD::run(
-			'forms inter=0 module=%s formfile=%s group=del index=%s',
-			array($module, $db_path, $index)
-		);
-		$form=new Forms('',$module,$db_path);
-		$res=$form->generate();
-
-		return array('db_path'=>$db_path,'html'=>$res['html']);
-	}
-
-	//function deleteJailHelperGroup(){
-	function ccmd_deleteJailHelperGroup(){
-		$form=$this->form;
-		if(!isset($this->uri_chunks[1]) || !isset($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
-
-		$jail_id=$this->uri_chunks[1];
-		$helper=$this->url_hash;
-		$index=$form['index'];
-		$index=str_replace('ind-','',$index);
-
-		$db=new Db('helper',array('jname'=>$jail_id,'helper'=>$helper));
-		if($db->error) return array('error'=>true,'errorMessage'=>'No helper database!');
-
-		$db_path=$db->getFileName();
-		$res=CBSD::run(
-			'forms inter=0 module=%s formfile=%s group=del index=%s',
-			array($helper, $db_path, $index)
-		);
-		$form=new Forms('',$helper,$db_path);
-		$res=$form->generate();
-
-		return array('html'=>$res['html']);
-	}
-
-	function useDialogs($arr=array()){
-		//print_r($arr);
-		$this->_dialogs=$arr;
-	}
-
-	function placeDialogs(){
-		if(empty($this->_dialogs)) return;
-		echo PHP_EOL;
-		foreach($this->_dialogs as $dialog_name){
-			$file_name=$this->realpath_public.'dialogs/'.$dialog_name.'.php';
-			if(file_exists($file_name)){
-				include($file_name);
-				echo PHP_EOL,PHP_EOL;
-			}
-		}
-	}
-
-	function placeDialogByName($dialog_name=null){
-		if(is_null($dialog_name)) return;
-		echo PHP_EOL;
-		$file_name=$this->realpath_public.'dialogs/'.$dialog_name.'.php';
-		if(file_exists($file_name)){
-			include($file_name);
-			echo PHP_EOL,PHP_EOL;
-		}
-	}
-
-	function runVNC($jname){
-		$query="SELECT vnc_password FROM bhyve WHERE jname=?";
-		$res=$this->_db_local->selectOne($query, array([$jname]));
-
-		$pass='cbsd';
-		if($res!==false) $pass=$res['vnc_password'];
-		
-		$resCBSD::run("vm_vncwss jname=%s permit=%s", array($jname, $this->_client_ip));
-		//$res=$this->_db_local->selectOne("SELECT nodeip FROM local", array());
-		//$nodeip=$res['nodeip'];
-		// need for IPv4/IPv6 regex here, instead of strlen
-		//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.':6081/vnc_auto.html?host='.$nodeip.'&port=6081?password='.$pass);
-		exit;
-	}
-
-	//function getFreeJname($in_helper=false,$type='jail'){
-	function ccmd_getFreeJname($in_helper=false,$type='jail'){
-		$arr=array();
-
-		/* TODO: CHECK THE ORIGINAL CODE
-			$add_cmd=($in_helper)?' default_jailname='.$this->url_hash:'';
-			$add_cmd1=' default_jailname='.$type;
-			$res=$this->cbsd_cmd("freejname".$add_cmd.$add_cmd1);
-		*/
-		if ($in_helper) {
-			$res = CBSD::run('freejname default_jailname=%s default_jailname=%s', array($this->url_hash, $type));
-		} else {
-			$res = CBSD::run('freejname default_jailname=%s', array($type));
-		}
-
-		if($res['error']){
-			$arr['error']=true;
-			$arr['error_message']=$err['error_message'];
-		}else{
-			$arr['error']=false;
-			$arr['freejname']=$res['message'];
-		}
-		return $arr;
-	}
-
-	function ccmd_k8sCreate(){
-		$form=$this->form;
-		$res=array();
-		$ass_arr=array(
-			'master_nodes'=>'init_masters',
-			'worker_nodes'=>'init_workers',
-			'master_ram'=>'master_vm_ram',
-			'master_cpus'=>'master_vm_cpus',
-			'master_img'=>'master_vm_imgsize',
-			'worker_ram'=>'worker_vm_ram',
-			'worker_cpus'=>'worker_vm_cpus',
-			'worker_img'=>'worker_vm_imgsize',
-		);
-
-		$add_param=array(
-			'master_ram'=>'g',
-			'master_img'=>'g',
-			'worker_ram'=>'g',
-			'worker_img'=>'g',
-		);
-
-		foreach($form as $key=>$value)
-		{
-			if(isset($ass_arr[$key]))
-			{
-				if(isset($add_param[$key]))
-				{
-					$value.=$add_param[$key];
-				}
-				$res[$ass_arr[$key]]=$value;
-			}
-		}
-
-		$res['pv_enable']="0";
-		if(isset($form['pv_enable']))
-		{
-			if($form['pv_enable']=='on') $res['pv_enable']="1";
-		}
-
-		$res['kubelet_master']="0";
-		if(isset($form['kubelet_master']))
-		{
-			if($form['kubelet_master']=='on') $res['kubelet_master']="1";
-		}
-
-		$url='http://144.76.225.238/api/v1/create/move';
-		$result=$this->postCurl($url,$res);
-
-		return $result;
-	}
-
-	function ccmd_k8sRemove()
-	{
-		$form=$this->form;
-		if(isset($form['k8sname']) && !empty($form['k8sname']))
-		{
-			$url='http://144.76.225.238/api/v1/destroy/'.$form['k8sname'];
-			return ($this->getCurl($url));
-		}else{
-			return array('error'=>'true','errorMessage'=>'something wrong...');
-		}
-	}
-
-	function postCurl($url,$vars=false)
-	{
-		if($vars===false) return array('error'=>true,'errorMessage'=>'something wrong...');
-
-		$txt_vars=json_encode($vars);
-		//$txt_vars=http_build_query($vars);
-
-
-		$ch = curl_init($url);
-//		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-		curl_setopt($ch, CURLOPT_POST, true);
-		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
-		curl_setopt($ch, CURLOPT_POSTFIELDS, $txt_vars);
-		$result = curl_exec($ch);
-		curl_close($ch);
-		//echo print_r($result,true);exit;
-		return $result;
-	}
-
-	function getCurl($url)
-	{
-		$ch = curl_init($url);
-		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-		curl_setopt($ch, CURLOPT_POST, false);
-		$result = curl_exec($ch);
-		curl_close($ch);
-		return $result;
-	}
-
-	function GhzConvert($Hz=0){
-		$h=1;
-		$l='Mhz';
-
-		if($Hz>1000){
-			$h=1000;
-			$l='Ghz';
-		}
-
-		return round($Hz/$h,2).' '.$l;
-	}
-
-	function fileSizeConvert(int $bytes,$bytes_in_mb=1024,$round=false,$small=false){
-		//$bytes = intval($bytes);
-		//var_dump($bytes);exit;
-
-		$arBytes = array(
-			0 => array(
-				"UNIT" => "tb",
-				"VALUE" => pow($bytes_in_mb, 4)
-			),
-			1 => array(
-				"UNIT" => "gb",
-				"VALUE" => pow($bytes_in_mb, 3)
-			),
-			2 => array(
-				"UNIT" => "mb",
-				"VALUE" => pow($bytes_in_mb, 2)
-			),
-			3 => array(
-				"UNIT" => "kb",
-				"VALUE" => $bytes_in_mb
-			),
-			4 => array(
-				"UNIT" => "b",
-				"VALUE" => 1
-			),
-		);
-
-		$result='0 MB';
-		foreach($arBytes as $arItem){
-			if($bytes >= $arItem["VALUE"]){
-				$result = $bytes / $arItem["VALUE"];
-				if($round) $result=round($result);
-				$result = str_replace(".", "," , strval(round($result, 2))).($small?strtolower(substr($arItem['UNIT'],0,1)):" ".strtoupper($arItem["UNIT"]));
-				break;
-			}
-		}
-		return $result;
-	}
-
-	function colorizeCmd($cmd_string){
-		$arr=$this->_cmd_array;
-		foreach($arr as $item){
-			$cmd_string=str_replace($item,''.$item.'',$cmd_string);
-		}
-
-		$cmd_string=preg_replace('#(\/.+/cbsd)#','$1',$cmd_string);
-
-		return ''.$cmd_string.'';
-	}
-
-	function register_media($path,$file,$ext){
-		$cmd='cbsd media mode=register name=%s path=%s type=%s';
-		$res=CBSD::run($cmd, array($file, $path.$file, $ext));
-		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"', array());
-		if($res===false || empty($res)) return;
-
-		$html='';
-		foreach($res as $r){
-			$html.='';
-		}
-		return $html;
-	}
-
-	function ccmd_updateBhyveISO($iso=''){
-		$db=new Db('base','storage_media');
-		$res=$db->select('SELECT * FROM media WHERE type="iso"', array());
-		if($res===false || empty($res)) return array(); //array('error'=>true,'error_message'=>'Profile ISO is not find!');
-
-		$sel='';
-		//if(empty($iso)) $sel='#sel#';
-		$html='';
-		foreach($res as $r){
-			$sel1='';
-			if(empty($sel) && $iso==$r['jname']) $sel1='#sel1#';
-			$html.='';
-		}
-
-		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;
-	}
-
-	function get_interfaces_html(){
-		$if=$this->config->os_interfaces;
-		$html='';
-		//$m=1;
-		foreach($if as $i){
-			//$html.='';
-			$html.='';
-			//$m++;
-		}
-		return $html;
-	}
-
-	function ccmd_usersAdd(){
-		$form=$this->form;
-
-		$res=$this->userRegister($form);
-		if($res!==false){
-			if(isset($res['user_exists']) && $res['user_exists']){
-				return array('error'=>true,'errorType'=>'user-exists','errorMessage'=>'User always exists!');
-			}
-			return $res;
-		}
-		return array('form'=>$form);
-	}
-
-	function ccmd_usersEdit(){
-		$form=$this->form;
-
-		if(!isset($form['user_id']) || !is_numeric($form['user_id']) || $form['user_id']<1)
-			return array('error'=>true,'error_message'=>'incorrect data!');
-
-		$db=new Db('clonos');
-		if(!$db->isConnected())	return array('error'=>true,'error_message'=>'db connection lost!');
-
-		$user_id=(int)$form['user_id'];
-		$username=$form['username'];
-		$first_name=$form['first_name'];
-		$last_name=$form['last_name'];
-		$is_active=0;
-		if(isset($form['actuser']) && $form['actuser']=='on') $is_active=1;
-
-		$authorized_user_id=0;
-		if(isset($_COOKIE['mhash']))
-		{
-			$mhash=$_COOKIE['mhash'];
-			if(!preg_match('#^[a-f0-9]{32}$#',$mhash)) return array('error'=>true,'error_message'=>'Bad data');
-			$query1="select user_id from auth_list WHERE sess_id=? limit 1";
-			$res1=$db->selectOne($query1, array([$mhash]));
-			{
-				if($res1['user_id']>0)
-				{
-					$authorized_user_id=$res1['user_id'];
-				}else{
-					return array('error'=>true,'error_message'=>'you are still not authorized');
-				}
-			}
-		}else{
-			return array('error'=>true,'error_message'=>'you must be authorized for this operation!');
-		}
-
-		if($user_id==0 || $user_id!=$authorized_user_id)
-		{
-			return array('error'=>true,'error_message'=>'I think you\'re some kind of hacker');
-		}
-
-		if(isset($form['password'])){
-			$password=$this->getPasswordHash($form['password']);
-			$query="UPDATE auth_user SET username=?,password=?,first_name=?,last_name=?,is_active=? WHERE id=?";
-			$res=$db->update($query, array(
-				[$username],
-				[$password],
-				[$first_name],
-				[$last_name],
-				[$is_active],
-				[(int)$user_id]
-			));
-		} else {
-			$query="UPDATE auth_user SET username=?,first_name=?,last_name=?,is_active=? WHERE id=?";
-			$res=$db->update($query, array(
-				[$username],
-				[$first_name],
-				[$last_name],
-				[$is_active],
-				[(int)$user_id]
-			));
-		}
-		return array('error'=>false,'res'=>$res);
-	}
-
-	function getPasswordHash($password){
-		return hash('sha256',hash('sha256',$password).$this->getSalt());
-	}
-
-	private function getSalt(){
-		$salt_file='/var/db/clonos/salt';
-		if(file_exists($salt_file)) return trim(file_get_contents($salt_file));
-		return 'noSalt!';
-	}
-
-	function userRegister($user_info=array()){
-		if(empty($user_info)) return false;
-		if(isset($user_info['username']) && isset($user_info['password'])){
-			$db=new Db('clonos');
-			if($db->isConnected()) {
-				$res=$db->selectOne("SELECT username FROM auth_user WHERE username=?", array([$user_info['username']]));
-				if(!empty($res)){
-					$res['user_exsts']=true;
-					return $res;
-				}
-
-				$password=$this->getPasswordHash($user_info['password']);
-				$is_active=0;
-				if(isset($user_info['actuser']) && $user_info['actuser']=='on') $is_active=1;
-				$query=$db->query_protect("INSERT INTO auth_user
-					(username,password,first_name,last_name,is_active,date_joined) VALUES
-					(?,?,?,?,?,datetime('now','localtime'))");
-				$res=$db->insert($query, array(
-					[$user_info['username']],
-					[$password],
-					[$user_info['first_name']],
-					[$user_info['last_name']],
-					[$is_active]
-				));
-				return array('error'=>false,'res'=>$res);
-			}
-		}
-	}
-
-	function userRegisterCheck($user_info=array()){
-		/*
-		[0] => Array
-		(
-			[id] => 1
-			[username] => admin
-			[password] => 01...87a
-			[first_name] => Admin
-			[last_name] => Admin
-			[last_login] => 
-			[is_active] => 1
-			[date_joined] => 2017-12-02 00:09:00
-			[sess_id] => 
-			[secure_sess_id] => 
-		)
-		*/
-		if(empty($user_info)) return false;
-		if(isset($user_info['login']) && isset($user_info['password'])){
-			$db=new Db('clonos');
-			if($db->isConnected()){
-				$pass=$this->getPasswordHash($user_info['password']);
-				$res=$db->selectOne("SELECT id,username,password FROM auth_user WHERE username=? AND is_active=1", array([$user_info['login']]));
-				if(empty($res) || $res['password'] != $pass){
-					sleep(3);
-					return array('errorCode'=>1,'message'=>'user not found!');
-				}
-				$res['errorCode']=0;
-
-				$id=(int)$res['id'];
-				$memory_hash=md5($id.$res['username'].time());
-				$secure_memory_hash=md5($memory_hash.$this->_client_ip);
-
-				/*
-				$query="update auth_user set sess_id=?, secure_sess_id=?, last_login=datetime('now','localtime') where id=?";
-				$db->update($query);
-				*/
-
-				//$query="update auth_list set secure_sess_id=?,auth_time=datetime('now','localtime') where sess_id=?";	//sess_id='${memory_hash}',
-				$query="UPDATE auth_list 
-						SET sess_id=?,secure_sess_id=?,auth_time=datetime('now','localtime') 
-						WHERE user_id=? AND user_ip=?";
-				$qres=$db->update($query, array(
-					[$memory_hash],
-					[$secure_memory_hash],
-					[$id],
-					[$this->_client_ip]
-				));
-				//print_r($qres);
-				if(isset($qres['rowCount'])){
-					if($qres['rowCount']==0){
-						$query="INSERT INTO auth_list
-							(user_id,sess_id,secure_sess_id,user_ip,auth_time) VALUES
-							(?,?,?,?,datetime('now','localtime'))";
-						$qres=$db->insert($query, array(
-							[$id],
-							[$memory_hash],
-							[$secure_memory_hash],
-							[$this->_client_ip]
-						));
-					}
-				}
-
-				setcookie('mhash',$memory_hash,time()+1209600);
-
-				return $res;
-			}
-		}
-		return array('message'=>'unregistered user','errorCode'=>1);
-	}
-
-	function userAutologin(){
-		if(isset($_COOKIE['mhash'])){
-			$memory_hash=$_COOKIE['mhash'];
-			$secure_memory_hash=md5($memory_hash.$this->_client_ip);
-			$db=new Db('clonos');
-			if($db->isConnected()){
-				$query="SELECT au.id,au.username FROM auth_user au, auth_list al WHERE al.secure_sess_id=? AND au.id=al.user_id AND au.is_active=1";
-				//echo $query;
-				$res=$db->selectOne($query, array([$secure_memory_hash]));
-				//print_r($res);
-				if(!empty($res)){
-					$res['error']=false;
-					return $res;
-				}
-			}
-		}
-		return array('error'=>true);
-	}
-
-	function ccmd_userRemove(){
-		$id=$this->form['user_id'];
-		if(is_numeric($id) && $id>0){
-			$query="DELETE FROM auth_user WHERE id=?";
-			$db=new Db('clonos');
-			if(!$db->isConnected()) return array('error'=>true,'error_message'=>'DB connection error!');
-
-			$res=$db->select($query, array([(int)$id, PDO::PARAM_INT]));
-			return $res;
-		}
-	}
-
-	function ccmd_userEditInfo(){
-		if(!isset($this->form['user_id'])) return array('error'=>true,'error_message'=>'incorrect data!');
-
-		$db=new Db('clonos');
-		if(!$db->isConnected()) return array('error'=>true,'error_message'=>'DB connection error!');
-		$user_id=(int)$this->form['user_id'];
-
-		$res=$db->selectOne("SELECT username,first_name,last_name,is_active AS actuser FROM auth_user WHERE id=?", array([$user_id]));
-		return array(
-			'dialog'=>$this->form['dialog'],
-			'vars'=>$res,
-			'error'=>false,
-			'tblid'=>$this->form['tbl_id'],
-			'user_id'=>$user_id,
-		);
-	}
-
-	function ccmd_userGetInfo(){
-		$db=new Db('clonos');
-		if(!$db->isConnected()) return array('DB connection error!');
-
-		$res=$db->selectOne("SELECT * FROM auth_user", array()); // TODO: What?!
-		return $res;
-	}
-
-	function getUserName(){
-		return $this->_user_info['username'];
-	}
-
-	function ccmd_vmTemplateAdd(){
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return $this->messageError('data incorrect!'); //array('error'=>true,'error_message'=>'data incorrect!');
-		$owner=$this->_user_info['username'];
-		$query="INSERT INTO vmpackages (name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus,owner,timestamp)
-			VALUES (?,?,?,?,?,?,datetime('now','localtime'))";
-
-		$res=$db->insert($query, array(
-			[$this->form['name']],
-			[$this->form['description']],
-			[$this->form['pkg_vm_ram']],
-			[$this->form['pkg_vm_disk']],
-			[$this->form['pkg_vm_cpus']],
-			[$owner]
-		));
-		if($res===false) return $this->messageError('sql error!');
-		if(!$res['error']) return $this->messageSuccess($res); 
-
-		return $this->messageError('sql error!',$res);
-	}
-
-	function ccmd_vmTemplateEditInfo(){
-		if(!isset($this->form['template_id'])) return $this->messageError('incorrect data!');
-
-		$tpl_id=(int)$this->form['template_id'];
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return $this->messageError('DB connection error!');
-
-		$res=$db->selectOne(
-			"select name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus from vmpackages where id=?",
-			array([$tpl_id, PDO::PARAM_INT])
-		);
-		return $this->messageSuccess(array('vars'=>$res,'template_id'=>$tpl_id));
-	}
-
-	function ccmd_vmTemplateEdit(){
-		$id=$this->form['template_id'];
-		if(!isset($id) || $id<1) $this->messageError('wrong data!');
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return $this->messageError('db connection error!');
-
-		$query="update vmpackages set
-			name=?,description=?, pkg_vm_ram=?,pkg_vm_disk=?, pkg_vm_cpus=?, owner=?, timestamp=datetime('now','localtime')
-			where id=?";
-
-		$res=$db->update($query, array(
-			[$this->form['name'], PDO::PARAM_STR],
-			[$this->form['description'], PDO::PARAM_STR],
-			[$this->form['pkg_vm_ram'],  PDO::PARAM_STR],
-			[$this->form['pkg_vm_disk'], PDO::PARAM_STR],
-			[$this->form['pkg_vm_cpus'], PDO::PARAM_STR],
-			[$this->_user_info['username'], PDO::PARAM_STR],
-			[(int)$id, PDO::PARAM_INT]
-		));
-		if($res!==false) return $this->messageSuccess($res);
-
-		return $this->messageError('sql error!');
-	}
-
-	function ccmd_vmTemplateRemove(){
-		$id=$this->form['template_id'];
-		if(!is_numeric($id) || (int)$id <= 0) return $this->messageError('wrong data!');
-
-		$query="DELETE FROM vmpackages WHERE id=?";
-		$db=new Db('base','local');
-		if(!$db->isConnected()) return $this->messageError('DB connection error!');
-
-		$res=$db->select($query, array([$id, PDO::PARAM_INT]));
-		return $this->messageSuccess($res);
-	}
-
-	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);
-	}
-
-	function getImportedImages(){
-		$images=array();
-		$path=$this->media_import;
-		$files=$this->getImagesList($path);
-		foreach($files as $key=>$file){
-			if(file_exists($file['fullname'])){
-				$fp=fopen($file['fullname'],'r');
-				$buf=fread($fp,300);
-				fclose($fp);
-
-				$res=$this->getImageVar('emulator',$buf);
-				$res1=$this->getImageVar('jname',$buf);
-				if(isset($res)) $files[$key]['type']=$res;
-				if(isset($res1)) $files[$key]['jname']=$res1;
-			}
-		}
-		return $files;
-	}
-
-	function ccmd_getImportedImageInfo(){
-		$form=$this->form;
-		$name=$form['id'];
-		$info=$this->getImageInfo($name);
-		return $info;
-	}
-
-	function getImagesList($path){
-		$files=array();
-		foreach (glob($path."*.img") as $filename)
-		{
-			$info=pathinfo($filename);
-			$arr=array(
-				'name'=>$info['basename'],
-				'fullname'=>$filename,
-			);
-			$files[]=$arr;
-		}
-		return $files;
-	}
-
-	function getImageInfo($imgname){
-		if(empty($imgname)) return false;
-
-		$file=$this->media_import.$imgname;
-		if(!file_exists($file)) return false;
-
-		$fp=fopen($file,'r');
-		$buf=fread($fp,300);
-		fclose($fp);
-
-		$type=$this->getImageVar('emulator',$buf);
-		$jname=$this->getImageVar('jname',$buf);
-		$orig_jname=$jname;
-		$ip=$this->getImageVar('ip4_addr',$buf);
-		$hostname=$this->getImageVar('host_hostname',$buf);
-
-		$name_comment='';
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$jail=$db->selectOne("SELECT jname FROM jails WHERE jname=?", array([$jname]));
-
-			if($jname==$jail['jname']){
-				$jres=$this->ccmd_getFreeJname(false,$type);
-				if($jres['error']) return $this->messageError('Something wrong...');
-				$jname=$jres['freejname'];
-				$name_comment='* '.$this->translate('Since imported name already exist, we are change it');
-			}
-		}
-
-		return array('orig_jname'=>$orig_jname,'jname'=>$jname,'host_hostname'=>$hostname,'ip4_addr'=>$ip,'file_id'=>$imgname,
-					'type'=>$type,'name_comment'=>$name_comment);
-	}
-
-	function getImageVar($name,$buf){
-		$val=false;
-		$pat='#'.$name.'="([^\"]*)"#';
-		preg_match($pat,$buf,$res);
-		if(!empty($res)) $val=$res[1];
-		return $val;
-	}
-
-	function ccmd_imageExport(){
-		// cbsd jexport jname=XXX dstdir=
-		$jname=$this->form['id'];
-		if(empty($jname)) $this->messageError('Jname is incorrect in export command! Is «'.$jname.'».');
-
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} jexport gensize=1 jname=%s dstdir=%s',
-			array($this->_user_info['username'], $jname, $this->media_import)
-		);
-	}
-
-	function ccmd_imageImport(){
-
-		$file_id=$this->form['file_id'];
-		$jname=$this->form['jname'];
-		$res=$this->getImageInfo($file_id);
-		if($res===false) return $this->messageError('File not found!');
-
-		$cmd = 'task owner=%s mode=new {cbsd_loc} jimport ';
-		$attrs=array($this->_user_info['username']);
-
-		if($jname!=$res['orig_jname']) {
-			$cmd .= 'new_jname=%s ';
-			$attrs[]= $jname;
-		}
-
-		if($this->form['ip4_addr']!=$res['ip4_addr']){
-			$cmd .= 'new_ip4_addr=%s ';
-			$attrs[]=$this->form['ip4_addr'];
-		}
-
-		if($this->form['host_hostname']!=$res['host_hostname']) {
-			$cmd .= 'new_host_hostname=%s ';
-			$attrs[]=$this->form['host_hostname'];
-		}
-
-		$cmd .= 'jname=%s';
-		$attrs[]=$file;
-
-		return CBSD::run($cmd, $attrs);
-	}
-
-	function ccmd_imageRemove(){
-		return CBSD::run(
-			'task owner=%s mode=new {cbsd_loc} imgremove path=%s img=$s',
-			array($this->_user_info['username'], $this->media_import, $this->form['jname'])
-		);
-	}
-
-	function ccmd_getSummaryInfo(){
-
-		if(!isset($this->form['mode'])) $this->form['mode']='';
-		$jail_name=$this->form['jname'];
-		$res=array();
-
-		if(empty($jail_name)) return $res;
-
-		$res['jname']=$jail_name;
-
-		$db=new Db('racct',array('jname'=>$jail_name));
-		if($db->isConnected()){
-			$quer=$db->select("SELECT ? as name,idx as time,memoryuse,pcpu,pmem,maxproc,openfiles,readbps, writebps,readiops,writeiops 
-								FROM racct ORDER BY idx DESC LIMIT 25;", array([$jail_name]));	// where idx%5=0
-			$res['__all']=$quer;
-		}
-
-		if($this->form['mode'] == 'bhyveslist'){
-			$res['properties']=$this->getSummaryInfoBhyves();
-			return $res;
-		}
-
-		//$workdir/jails-system/$jname/descr
-		$filename=$this->workdir.'/jails-system/'.$jail_name.'/descr';
-		if(file_exists($filename)) $res['description']=nl2br(file_get_contents($filename));
-
-		$sql="SELECT host_hostname,ip4_addr,allow_mount,allow_nullfs,allow_fdescfs,interface,baserw,mount_ports,
-			  astart,vnet,mount_fdescfs,allow_tmpfs,allow_zfs,protected,allow_reserved_ports,allow_raw_sockets,
-			  allow_fusefs,allow_read_msgbuf,allow_vmm,allow_unprivileged_proc_debug
-			  FROM jails WHERE jname=?";
-		$db=new Db('base','local');
-		if($db->isConnected()){
-			$quer=$db->selectOne($sql, array([$jail_name]));
-			$html='';
-
-			foreach($quer as $q=>$k){
-				if(is_numeric($k) && ($k==0 || $k==1)) $k=($k==0)?'no':'yes';
-				$html.='| '.$this->translate($q).' | '.$this->translate($k).' | 
';
-			}
-
-			$html.='
';
-			$res['properties']=$html;
-		}
-
-		return $res;
-	}
-
-	function getSummaryInfoBhyves(){
-
-		$res='';
-
-		/*
-		$bool=array(
-			'created','astart','vm_cpus','vm_os_type','vm_boot','vm_os_profile','bhyve_flags',
-			'vm_vnc_port','bhyve_vnc_tcp_bind','bhyve_vnc_resolution','ip4_addr','state_time',
-			'cd_vnc_wait','protected','hidden','maintenance','media_auto_eject','jailed'
-		);
-		*/
-		$bool=array('astart','hidden','jailed','cd_vnc_wait','protected','media_auto_eject');
-		$chck=array(
-			'bhyve_generate_acpi','bhyve_wire_memory','bhyve_rts_keeps_utc','bhyve_force_msi_irq',
-			'bhyve_x2apic_mode','bhyve_mptable_gen','bhyve_ignore_msr_acc','xhci'
-		);
-
-		$db=new Db('bhyve',array('jname'=>$this->form['jname']));
-		if($db->isConnected()) {
-			$sql="SELECT created, astart, vm_cpus, vm_ram, vm_os_type, vm_boot, vm_os_profile, bhyve_flags,
-				vm_vnc_port, virtio_type, bhyve_vnc_tcp_bind, bhyve_vnc_resolution, cd_vnc_wait,
-				protected, hidden, maintenance, ip4_addr, vnc_password, state_time,
-				vm_hostbridge, vm_iso_path, vm_console, vm_efi, vm_rd_port, bhyve_generate_acpi,
-				bhyve_wire_memory, bhyve_rts_keeps_utc, bhyve_force_msi_irq, bhyve_x2apic_mode,
-				bhyve_mptable_gen, bhyve_ignore_msr_acc, bhyve_vnc_vgaconf text, media_auto_eject,
-				vm_cpu_topology, debug_engine, xhci, cd_boot_firmware, jailed FROM settings";
-			$quer=$db->selectOne($sql, array());
-			$html='';
-
-			foreach($quer as $q=>$k){
-				if(in_array($q,$bool)) $k=($k==0)?'no':'yes';
-				if(in_array($q,$chck)) $k=($k==0)?'no':'yes';
-
-				if($q=='vm_ram') $k=$this->fileSizeConvert($k);
-				if($q=='state_time') $k=date('d.m.Y H:i:s',$k);
-
-				$html.='| '.$this->translate($q).' | '.$this->translate($k).' | 
';
-			}
-
-			$html.='
';
-			$res=$html;
-
-		}
-
-		return $res;
-	}
+require_once("cbsd.php");
+require_once('config.php');
+require_once('db.php');
+require_once('forms.php');
+require_once('menu.php');
+
+class ClonOS {
+	public $server_name='';
+	public $workdir='';
+	public $environment='';
+	public $realpath='';
+	public $realpath_php='';
+	public $realpath_public='';
+	public $realpath_page='';
+	public $uri_chunks=array();
+	public $json_name='';
+	public $language='en';
+	public $language_file_loaded=false;
+	public $translate_arr=array();
+	public $table_templates=array();
+	public $url_hash='';
+	public $media_import='';
+	public $json_req=false;
+	public $sys_vars=array();
+
+	private $_post=false;
+	private $_db=null;
+	private $_client_ip='';
+	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','forms'
+	);
+	private $_user_info=array(
+		'id'=>0,
+		'username'=>'guest',
+		'unregistered'=>true,
+	);
+/*
+	public $projectId=0;
+	public $jailId=0;
+	public $moduleId=0;
+	public $helper='';
+	public $mode='';
+	public $form='';
+
+	private $_vars=array();
+	private $_db_tasks=null;
+	private $_db_jails=null;
+*/
+
+	function __construct($_REALPATH,$uri=''){	# /usr/home/web/cp/clonos
+
+		$this->_post=($_SERVER['REQUEST_METHOD']=='POST');
+		$this->_vars=$_POST;
+		if(isset($_COOKIE['lang'])) $this->language=$_COOKIE['lang'];
+
+		$this->workdir=getenv('WORKDIR'); # // /usr/jails
+		$this->environment=getenv('APPLICATION_ENV');
+		$this->realpath=$_REALPATH.'/'; # /usr/home/web/cp/clonos/
+		$this->realpath_php=$_REALPATH.'/php/'; # /usr/home/web/cp/clonos/php/
+		$this->realpath_public=$_REALPATH.'/public/'; # /usr/home/web/cp/clonos/public/
+		$this->media_import=$_REALPATH.'/media_import/';
+
+		if($this->environment=='development'){
+			$sentry_file=$this->realpath_php.'sentry.php';
+			if(file_exists($sentry_file))include($sentry_file);
+		}
+
+		if(isset($_SERVER['SERVER_NAME']) && !empty(trim($_SERVER['SERVER_NAME']))){
+			$this->server_name=$_SERVER['SERVER_NAME'];
+		} else {
+			$this->server_name=$_SERVER['SERVER_ADDR'];
+		}
+
+		if(!empty($uri)){
+			$str=str_replace('/index.php','',$uri);
+			$this->uri_chunks=explode('/',$str);
+		}else if(isset($this->_vars['path'])){
+			$str=trim($this->_vars['path'],'/');
+			$this->uri_chunks=explode('/',$str);
+		}
+
+		$this->config=new Config();
+   
+		/* determine lang */
+		if(!array_key_exists($this->language, $this->config->languages)) $this->language='en';
+		include($this->realpath_public.'/lang/'.$this->language.'.php');
+		$this->translate_arr=$lang;
+		unset($lang);
+
+		$this->_client_ip=$_SERVER['REMOTE_ADDR'];
+
+		if(isset($this->_vars['path'])){
+			//$this->realpath_page=$this->realpath_public.'pages/'.trim($this->_vars['path'],'/').'/';
+			//echo $this->_vars['path'];
+			//print_r($this->uri_chunks);
+			$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
+			$this->json_name=$this->realpath_page.'a.json.php';
+			//echo $this->realpath_page;
+		}else if($_SERVER['REQUEST_URI']){
+			//$this->realpath_page=$this->realpath_public.'pages/'.trim($_SERVER['REQUEST_URI'],'/').'/';
+			if(isset($this->uri_chunks[0]))
+				$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
+		}
+
+		if(isset($this->_vars['hash'])) $this->url_hash=preg_replace('/^#/','',$this->_vars['hash']);
+
+//		$this->json_name=$this->realpath_php.'pages'
+//		$clonos->json_name=$file_path.'a.json.php';
+
+		$this->_db_tasks=new Db('base','cbsdtaskd');
+		$this->_db_local=new Db('base','local');
+
+		$this->menu=new Menu($this->config->menu,$this);
+
+		if(isset($this->_vars['mode'])) $this->mode=$this->_vars['mode'];
+		if(isset($this->_vars['form_data'])) $this->form=$this->_vars['form_data'];
+
+		$ures=$this->userAutologin();
+		$this->sys_vars['authorized']=false;
+		if($ures!==false){
+			if(isset($ures['id']) && is_numeric($ures['id']) && $ures['id']>0){
+				$this->_user_info=$ures;
+				$this->_user_info['unregistered']=false;
+				$this->sys_vars['authorized']=true;
+			}else{
+				$this->_user_info['unregistered']=true;
+				if($this->json_req) exit;
+			}
+		}
+
+		if($this->_post && isset($this->mode)){
+			if(isset($this->_user_info['error']) && $this->_user_info['error']){
+				if($this->mode!='login'){
+					echo json_encode(array('error'=>true,'unregistered_user'=>true));
+					exit;
+				}
+			}
+
+			if($this->_user_info['unregistered'] && $this->mode!='login'){
+				echo json_encode(array('error'=>true,'unregistered_user'=>true));
+				exit;
+			}
+
+			unset($_POST);
+
+			// functions, running without parameters
+			$new_array=array();
+			$cfunc='ccmd_'.$this->mode;
+			if(method_exists($this,$cfunc)){
+				$ccmd_res=array();
+				$ccmd_res=$this->$cfunc();
+				
+				if(is_array($ccmd_res)){
+					$new_array=array_merge($this->sys_vars,$ccmd_res);
+				} else {
+					echo json_encode($ccmd_res);
+					return;
+				}
+				echo json_encode($new_array);
+				return;
+			}
+
+			$included_result_array='';
+			switch($this->mode){
+				//case 'login':	 		echo json_encode($this->login()); return;
+				case 'getTasksStatus':		echo json_encode($this->_getTasksStatus($this->form['jsonObj'])); return;
+
+				/*
+				case '_getJsonPage':
+					if(file_exists($this->json_name))
+					{
+						include($this->json_name);
+						
+						if(is_array($included_result_array))
+						{
+							$new_array=array_merge($this->sys_vars,$included_result_array);
+							echo json_encode($new_array);
+							return;
+						} else echo '{}';
+						
+					} else echo '{}'; return;
+				*/
+				//case 'freejname':		echo json_encode($this->getFreeJname()); break;
+				case 'helpersAdd':		echo json_encode($this->helpersAdd($this->mode)); return;
+				case 'addHelperGroup':		echo json_encode($this->addHelperGroup($this->mode)); return;
+				//case 'addJailHelperGroup':	echo json_encode($this->addJailHelperGroup()); return;
+				//case 'deleteJailHelperGroup':	echo json_encode($this->deleteJailHelperGroup()); return;
+				case 'deleteHelperGroup':	echo json_encode($this->deleteHelperGroup($this->mode)); return;
+				//case 'jailRestart':		echo json_encode($this->jailRestart()); return;
+				//case 'jailStart':		echo json_encode($this->jailStart()); return;
+				//case 'jailStop':		echo json_encode($this->jailStop()); return;
+				//case 'jailRemove':		echo json_encode($this->jailRemove()); return;
+				//case 'saveJailHelperValues':	echo json_encode($this->saveJailHelperValues()); return;
+
+				case 'saveHelperValues':	$redirect='/jailscontainers/';
+				case 'jailAdd': 		if(!isset($redirect)) $redirect=''; echo json_encode($this->jailAdd($redirect)); return;
+
+				//case 'jailClone':		echo json_encode($this->jailClone()); return;
+				//case 'jailRename':		echo json_encode($this->jailRename()); return;
+				//case 'bhyveRename':		echo json_encode($this->bhyveRename()); return;
+				//case 'jailEdit':		echo json_encode($this->jailEdit()); return;
+				//case 'jailEditVars':		echo json_encode($this->jailEditVars()); return;
+				//case 'jailCloneVars':		echo json_encode($this->jailCloneVars()); return;
+				//case 'jailRenameVars':		echo json_encode($this->jailRenameVars()); return;
+				//case 'bhyveRenameVars':		echo json_encode($this->bhyveRenameVars()); return;
+				//case 'bhyveRestart':		echo json_encode($this->bhyveRestart()); return;
+				//case 'bhyveStart':		echo json_encode($this->bhyveStart()); return;
+				//case 'bhyveStop':		echo json_encode($this->bhyveStop()); return;
+				//case 'bhyveAdd':		echo json_encode($this->bhyveAdd()); return;
+				//case 'bhyveRemove':		echo json_encode($this->bhyveRemove()); return;
+				//case 'bhyveEdit':		echo json_encode($this->bhyveEdit()); return;
+				//case 'bhyveEditVars':		echo json_encode($this->bhyveEditVars()); return;
+				//case 'bhyveObtain':		echo json_encode($this->bhyveObtain()); return;
+				//case 'bhyveClone':		echo json_encode($this->bhyveClone()); return;		
+				//case 'authkeyAdd':		echo json_encode($this->authkeyAdd()); return;
+				//case 'authkeyRemove':		echo json_encode($this->()); return;
+				//case 'vpnetAdd':		echo json_encode($this->vpnetAdd()); return;
+				//case 'vpnetRemove':		echo json_encode($this->vpnetRemove()); return;
+				//case 'updateBhyveISO':		echo json_encode($this->updateBhyveISO()); return;
+				/*
+				case 'mediaAdd':
+					//echo json_encode($this->mediaAdd());
+					return;
+				*/
+				//case 'mediaRemove':		echo json_encode($this->mediaRemove()); return;
+				//case 'logLoad':			echo json_encode($this->logLoad()); return;
+				//case 'logFlush':		echo json_encode($this->logFlush()); return;
+				//case 'basesCompile':		echo json_encode($this->basesCompile()); return;
+				//case 'repoCompile':		echo json_encode($this->repoCompile()); return;
+				//case 'srcUpdate':		echo json_encode($this->srcUpdate()); return;
+				//case 'srcRemove':		echo json_encode($this->srcRemove()); return;
+				//case 'baseRemove':		echo json_encode($this->baseRemove()); return;
+				//case 'usersAdd':		echo json_encode($this->usersAdd()); return;
+				//case 'usersEdit':		echo json_encode($this->usersEdit()); return;
+				//case 'userRemove':		echo json_encode($this->userRemove()); return;
+				//case 'userGetInfo':		echo json_encode($this->userGetInfo()); return;
+				//case 'userEditInfo':		echo json_encode($this->userEditInfo()); return;
+				//case 'vmTemplateAdd':		echo json_encode($this->vmTemplateAdd()); return;
+				//case 'vmTemplateEditInfo':	echo json_encode($this->vmTemplateEditInfo()); return;
+				//case 'vmTemplateEdit':		echo json_encode($this->vmTemplateEdit()); return;
+				//case 'vmTemplateRemove':	echo json_encode($this->vmTemplateRemove()); return;
+				//case 'getImportedImageInfo':	echo json_encode($this->getImportedImageInfo()); return;
+				//case 'imageImport':		echo json_encode($this->imageImport()); return;
+				//case 'imageExport':		echo json_encode($this->imageExport()); return;
+				//case 'imageRemove': echo json_encode($this->imageRemove()); return;
+				//case 'getSummaryInfo': echo json_encode($this->getSummaryInfo()); return;
+					
+/*				case 'saveHelperValues':
+					echo json_encode($this->saveHelperValues());
+					return;
+*/
+			}
+		}
+	}
+
+	function ccmd_getJsonPage(){
+		$included_result_array=false;
+		if(file_exists($this->json_name)){
+			include($this->json_name);
+			
+			if(is_array($included_result_array)){
+				$new_array=array_merge($this->sys_vars,$included_result_array);
+				echo json_encode($new_array);
+				exit;
+			}
+		}
+		echo json_encode($this->sys_vars);
+		exit;
+	}
+
+	/* example return array('message'=>'unregistered user','errorCode'=>1) */
+	function ccmd_login(){
+		return $this->userRegisterCheck($this->_vars['form_data']);
+	}
+
+	function redis_publish($key,$message){
+		if(empty($key) || empty($message)) return false;
+		$redis=new Redis();
+		$redis->connect('10.0.0.3',6379);
+		$res=$redis->publish($key,$message);
+	}
+
+	function getLang(){
+		return $this->language;
+	}
+
+	function translate($phrase){
+		if(isset($this->translate_arr[$phrase])) return $this->translate_arr[$phrase];
+		return $phrase;
+	}
+
+	function getTableChunk($table_name='',$tag){
+		if(empty($table_name)) return false;
+		if(isset($this->table_templates[$table_name][$tag])) return $this->table_templates[$table_name][$tag];
+
+		$file_name=$this->realpath_page.$table_name.'.table';
+		if(!file_exists($file_name)) return false;
+		$file=file_get_contents($file_name);
+		$pat='#[\s]*?<'.$tag.'[^>]*>(.*)<\/'.$tag.'>#iUs';
+ 		if(preg_match($pat,$file,$res)){
+			$this->table_templates[$table_name][$tag]=$res;
+			return $res;
+		}
+		return '';
+	}
+
+	function check_locktime($nodeip){
+		$lockfile=$this->workdir."/ftmp/shmux_${nodeip}.lock";
+		if (!file_exists($lockfile)) return 0;
+
+		$cur_time = time();
+		$st_time=filemtime($lockfile);
+
+		$difftime=(( $cur_time - $st_time ) / 60 );
+		if ( $difftime > 1 ) return round($difftime);
+		return 0; //lock exist but too fresh
+	}
+
+	function check_vmonline($vm){
+		$vmmdir="/dev/vmm";
+
+		if(!file_exists($vmmdir)) return 0;
+
+		if($handle=opendir($vmmdir)){
+			while(false!==($entry=readdir($handle))){
+				if($entry[0]==".") continue;
+				if($vm==$entry) return 1;
+			}
+			closedir($handle);
+		}
+
+		return 0;
+	}
+
+	function get_node_info($nodename,$value){
+		$db = new Db('', '', $this->realpath."/var/db/nodes.sqlite"); 
+		if (!$db->isConnected()) return array('error'=>true,'res'=> $db->error_message);
+
+		$result = $db->select("SELECT ? FROM nodelist WHERE nodename=?", array([$value],[$nodename]));
+
+		foreach($result as $res){
+			if(isset($res[$value])){
+				return $res[$value];
+			}
+		}
+		// TODO: what if not found ?
+	}
+
+	function getRunningTasks($ids=array()){
+		$check_arr=array(
+			'jcreate'=>'Creating',
+			'jstart'=>'Starting',
+			'jstop'=>'Stopping',
+			'jrestart'=>'Restarting',
+			'jremove'=>'Removing',
+			'jexport'=>'Exporting',
+			'jclone'=>'Cloning',
+			'bcreate'=>'Creating',
+			'bstart'=>'Starting',
+			'bstop'=>'Stopping',
+			'brestart'=>'Restarting',
+			'bremove'=>'Removing',
+			'bclone'=>'Cloning',
+			'vm_obtain'=>'Creating',
+			'removesrc'=>'Removing',
+			'srcup'=>'Updating',
+			'removebase'=>'Removing',
+			'world'=>'Compiling',
+			'repo'=>'Fetching',
+			'imgremove'=>'Removing',
+		);
+
+		$res=array();
+		if(!empty($ids)){
+			$tid=join("','",$ids);
+			$query="SELECT id,cmd,status,jname FROM taskd WHERE status<2 AND jname IN (?)";
+			$cmd='';
+			$txt_status='';
+			$tasks=$this->_db_tasks->select($query, array([$tid]));
+			if(!empty($tasks)) foreach($tasks as $task){
+				$rid=preg_replace('/^#/','',$task['jname']);
+				foreach($check_arr as $key=>$val){
+					if(strpos($task['cmd'],$key)!==false){
+						$cmd=$key;
+						$txt_status=$val;
+						break;
+					}
+				}
+				$res[$rid]['status']=$task['status'];
+				$res[$rid]['task_cmd']=$cmd;
+				$res[$rid]['txt_status']=$txt_status;
+				$res[$rid]['task_id']=$task['id'];
+			}
+			return $res;
+		}
+		return null;
+	}
+
+/*
+	function getProjectsListOnStart(){
+		$query='SELECT * FROM projects';
+		$res=$this->_db->select($query, array());
+		echo '	var projects=',json_encode($res),PHP_EOL;
+	}
+*/
+
+/*
+	function getTaskStatus($task_id){
+		$status=$this->_db_tasks->selectOne("SELECT status,logfile,errcode 
+					FROM taskd WHERE id=?", array([$task_id]);
+
+		if($status['errcode']>0) $status['errmsg']=file_get_contents($status['logfile']);
+
+		return $status;
+	}
+*/
+
+	private function doTask($key, $task){
+		if($task['status'] != -1) return(false);
+
+		switch($task['operation']){
+			case 'jstart':		$res=$this->jailStart($key);break;
+			case 'jstop':		$res=$this->jailStop($key);break;
+			case 'jrestart':	$res=$this->jailRestart($key);break;
+			//case 'jedit':		$res=$this->jailEdit('jail'.$key);break;
+			case 'jremove':		$res=$this->jailRemove($key);break;
+						
+			case 'bstart':		$res=$this->bhyveStart($key);break;
+			case 'bstop':		$res=$this->bhyveStop($key);break;
+			case 'brestart':	$res=$this->bhyveRestart($key);break;
+			case 'bremove':		$res=$this->bhyveRemove($key);break;
+			case 'removesrc':	$res=$this->srcRemove($key);break;
+			case 'srcup':		$res=$this->srcUpdate($key);break;
+			case 'removebase':	$res=$this->baseRemove($key);break;
+						
+			//case 'jexport':	$res=$this->jailExport('jail'.$key,$task['jname'],$key);break;
+			//case 'jimport':	$res=$this->jailImport('jail'.$key,$task['jname'],$key);break;
+			//case 'jclone':	$res=$this->jailClone('jail'.$key,$key,$obj[$key]);break;
+			//case 'madd':		$res=$this->moduleAdd('jail'.$key,$task['jname'],$key);break;
+			////case 'mremove':	$res=$this->moduleRemove('jail'.$key,$task['jname'],$key);break;
+			//case 'sstart':	$res=$this->serviceStart($task);break;
+			//case 'sstop':		$res=$this->serviceStop($task);break;
+			////case 'projremove':	$res=$this->projectRemove($key,$task);break;
+		}
+	}
+
+	function _getTasksStatus($jsonObj){
+		//return $jsonObj;
+		$tasks=array();
+		$obj=json_decode($jsonObj,true);
+		if(empty($ids)) return $obj; // TODO: error? this return NULL..
+
+		if(isset($obj['proj_ops'])) return $this->GetProjectTasksStatus($obj);
+		if(isset($obj['mod_ops'])) return $this->GetModulesTasksStatus($obj);
+
+		$ops_array=$this->_cmd_array;
+		$stat_array=array(
+			'jcreate'=>array($this->translate('Creating'),$this->translate('Created')),
+			'jstart'=>array($this->translate('Starting'),$this->translate('Launched')),
+			'jstop'=>array($this->translate('Stopping'),$this->translate('Stopped')),
+			'jrestart'=>array($this->translate('Restarting'),$this->translate('Restarted')),
+			'jedit'=>array($this->translate('Saving'),$this->translate('Saved')),
+			'jremove'=>array($this->translate('Removing'),$this->translate('Removed')),
+			'jexport'=>array($this->translate('Exporting'),$this->translate('Exported')),
+			'jimport'=>array($this->translate('Importing'),$this->translate('Imported')),
+			'jclone'=>array($this->translate('Cloning'),$this->translate('Cloned')),
+			'madd'=>array($this->translate('Installing'),$this->translate('Installed')),
+			//'mremove'=>array('Removing','Removed'),
+			'sstart'=>array($this->translate('Starting'),$this->translate('Started')),
+			'sstop'=>array($this->translate('Stopping'),$this->translate('Stopped')),
+			'vm_obtain'=>array($this->translate('Creating'),$this->translate('Created')),
+			'srcup'=>array($this->translate('Updating'),$this->translate('Updated')),
+			'world'=>array($this->translate('Compiling'),$this->translate('Compiled')),
+			'repo'=>array($this->translate('Fetching'),$this->translate('Fetched')),
+			//'projremove'=>array('Removing','Removed'),
+		);
+		$stat_array['bcreate']=&$stat_array['jcreate'];
+		$stat_array['bstart']=&$stat_array['jstart'];
+		$stat_array['bstop']=&$stat_array['jstop'];
+		$stat_array['brestart']=&$stat_array['jrestart'];
+		$stat_array['bremove']=&$stat_array['jremove'];
+		$stat_array['bclone']=&$stat_array['jclone'];
+		$stat_array['removesrc']=&$stat_array['jremove'];
+		$stat_array['removebase']=&$stat_array['jremove'];
+		$stat_array['imgremove']=&$stat_array['jremove'];
+
+		foreach($obj as $key=>$task){
+			$status=$task['status'];
+			if(in_array($task['operation'],$ops_array)){
+				if(false !== ($res=$this->runTask($key,$task))){
+					if($res['error']) $obj[$key]['retval']=$res['retval'];
+					if(!empty($res['error_message'])) $obj[$key]['error_message']=$res['error_message'];
+
+					if(isset($res['message'])){
+						$task_id=intval($res['message']);
+						if($task_id>0){
+							$tasks[]=$task_id;
+							$obj[$key]['task_id']=$task_id;
+							//$obj[$key]['txt_log']=file_get_contents('/tmp/taskd.'.$task_id.'.log');
+						}
+					}
+				}else $tasks[]=$task['task_id'];
+			}
+
+			if($status==-1) $obj[$key]['status']=0;
+		}
+
+		$ids=join(',',$tasks);
+		if(empty($ids)) return $obj;
+
+		$statuses=$this->_db_tasks->select("SELECT id,status,logfile,errcode FROM taskd WHERE id IN (?)", array([$ids]));
+
+		//print_r($statuses);
+		foreach($obj as $key=>$task){
+			if(!empty($statuses)) foreach($statuses as $stat){
+				if($task['task_id']!=$stat['id']) continue;
+
+				$obj[$key]['status']=$stat['status'];
+				$num=($stat['status']<2?0:1);
+				$obj[$key]['txt_status']=$stat_array[$obj[$key]['operation']][$num];
+				if($stat['errcode']>0){
+					$obj[$key]['errmsg']=file_get_contents($stat['logfile']);
+					$obj[$key]['txt_status']=$this->translate('Error');
+				}
+
+				//Return the IP of the cloned jail if it was assigned by DHCP
+
+				if($stat['status']==2){
+					switch($task['operation']){
+						case 'jcreate':
+						case 'jclone':
+							$res=$this->getJailInfo($obj[$key]['jail_id'],$task['operation']);
+							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
+							break;
+						case 'bclone':
+							$res=$this->getBhyveInfo($obj[$key]['jail_id']);
+							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
+							break;
+						case 'repo':
+							$res=$this->fillRepoTr($obj[$key]['jail_id'],true,false);
+							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
+							break;
+						case 'srcup':
+							$res=$this->getSrcInfo($obj[$key]['jail_id']);
+							if(isset($res['html'])) $obj[$key]['new_html']=$res['html'];
+							break;
+					}
+				}
+			}
+		}
+
+		return $obj;
+	}
+
+	function ccmd_jailRename() {
+		$form=$this->_vars['form_data'];
+		$cmd = "task owner=%s mode=new {cbsd_loc} jrename old=%s new=%s host_hostname=%s ip4_addr=%s restart=1";
+		$args = array($this->_user_info['username'], $form['oldJail'], $form['jname'], $form['host_hostname'], $form['ip4_addr']);
+		$res=CBSD::run($cmd, $args);
+
+		$err='Jail is not renamed!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Jail was renamed!';
+			$taskId=$res['message'];
+		}else{
+			$err=$res['error'];
+		}
+
+		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode);
+	}
+
+	function ccmd_jailClone() {
+		$form=$this->_vars['form_data'];
+		$cmd = 'task owner=%s mode=new {cbsd_loc} jclone checkstate=0 old=%s new=%s host_hostname=%s ip4_addr=%s';
+		$args = array($this->_user_info['username'], $form['oldJail'], $form['jname'], $form['host_hostname'], $form['ip4_addr']);
+		$res=CBSD::run($cmd, $args);
+
+		$err='Jail is not cloned!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Jail was cloned!';
+			$taskId=$res['message'];
+		}else{
+			$err=$res['error'];
+		}
+
+		$html='';
+		$hres=$this->getTableChunk('jailslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'nth-num'=>'nth0',				// TODO: actual data
+				'node'=>'local',				// TODO: actual data
+				'ip4_addr'=>str_replace(',',',',$form['ip4_addr']),
+				'jname'=>$form['jname'],
+				'jstatus'=>$this->translate('Cloning'),
+				'icon'=>'spin6 animate-spin',
+				'desktop'=>' s-on',
+				'maintenance'=>' maintenance',
+				'protected'=>'icon-cancel',
+				'protitle'=>$this->translate('Delete'),
+				'vnc_title'=>$this->translate('Open VNC'),
+				'reboot_title'=>$this->translate('Restart jail'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode,'html'=>$html);
+	}
+
+	function getJailInfo($jname,$op=''){
+		$stats=array(''=>'','jclone'=>'Cloned','jcreate'=>'Created');
+		$html='';
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$jail=$db->selectOne("SELECT jname,ip4_addr,status,protected FROM jails WHERE jname=?", array([$jname]));
+			$hres=$this->getTableChunk('jailslist','tbody');
+			if($hres!==false){
+				$html_tpl=$hres[1];
+//				$status=$jail['status'];
+				$vars=array(
+					'nth-num'=>'nth0',
+					'node'=>'local',
+					'ip4_addr'=>str_replace(',',',',$jail['ip4_addr']),
+					'jname'=>$jail['jname'],
+					'jstatus'=>$this->translate($stats[$op]),
+					'icon'=>'spin6 animate-spin',
+					'desktop'=>' s-on',
+					'maintenance'=>' maintenance',
+					'protected'=>($jail['protected']==1)?'icon-lock':'icon-cancel',
+					'protitle'=>($jail['protected']==1)?' title="'.$this->translate('Protected jail').'"':' title="'.$this->translate('Delete').'"',
+					'vnc_title'=>$this->translate('Open VNC'),
+					'reboot_title'=>$this->translate('Restart jail'),
+				);
+
+				foreach($vars as $var=>$val)
+					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+				$html.=$html_tpl;
+			}
+		}
+
+		$html=preg_replace('#]*>#','',$html);
+		$html=str_replace(array('
',"\n","\r","\t"),'',$html);
+
+		return array('html'=>$html);
+	}
+
+	function saveSettingsCBSD(){
+		return array('error'=>true,'errorMessage'=>'Method is not complete yet! line: '.__LINE__);
+	}
+
+	function ccmd_saveJailHelperValues(){
+		$form=$this->form;
+		$username=$this->_user_info['username'];
+
+		if(!isset($this->uri_chunks[1]) || !isset($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
+		$jail_name=$this->uri_chunks[1];
+
+		$db=new Db('helper',array('jname'=>$jail_name,'helper'=>$this->url_hash));
+		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'No helper database!');
+	
+		foreach($form as $key=>$val) {
+			if($key!='jname' && $key!='ip4_addr') {
+				$query="update forms set new=? where param=?";
+				$db->update($query, array([$val], [$key]));
+				unset($form[$key]);
+			}
+		}
+
+		//cbsd forms module= jname=jail1 inter=0
+		$cmd = 'task owner=%s mode=new {cbsd_loc} forms module=%s jname=%s inter=0';
+		$args = array($username, $this->url_hash, $jail_name);
+		$res=CBSD::run($cmd, $args);
+
+		$err='Helper values is saved!';
+		$taskId=-1;
+		if($res['retval']==0) {
+			$err='Helper values was not saved!';
+			$taskId=$res['message'];
+		}
+
+		return array(
+			'jail_id'=>$jail_name,
+			'taskId'=>$taskId,
+			'mode'=>$this->mode,
+		);
+	}
+
+	function jailAdd($redirect=''){	//$mode='jailAdd'
+		//if(!empty($arr)) $form=$arr; else
+		$form=$this->form;
+		$helper=preg_replace('/^#/','',$this->_vars['hash']);
+
+		$db_path='';
+		$with_img_helpers='';
+		if($this->mode=='saveHelperValues'){
+			if($helper=='' && $this->_vars['path']=='/settings/') return $this->saveSettingsCBSD();
+
+			if(!isset($this->_vars['db_path'])){
+				$res=CBSD::run('make_tmp_helper module=%s', array($helper));
+				if($res['retval']==0) $db_path=$res['message']; else{
+					echo json_encode(array('error'=>true,'errorMessage'=>'Error opening temporary form database!'));
+					return;
+				}
+			}else $db_path=$this->_vars['db_path'];
+
+			
+			/*
+			$file_name=$this->workdir.'/formfile/'.$helper.'.sqlite';
+			if(file_exists($file_name)){
+				$tmp_name=tempnam("/tmp","HLPR");
+				copy($file_name,$tmp_name);
+				
+				$db=new Db('file',$tmp_name);
+				if($db->isConnected()){
+					foreach($form as $key=>$val){
+						if($key!='jname' && $key!='ip4_addr'){
+							$query="update forms set new=? where param=?";
+							$db->update($query, array([$val],[$key]));
+							unset($form[$key]);
+						}
+					}
+					
+					$with_img_helpers=$tmp_name;
+					//echo $with_img_helpers;
+				}
+			}
+			*/
+
+			$db=new Db('file',$db_path);
+			if($db->isConnected()){
+				foreach($form as $key=>$val){
+					if($key!='jname' && $key!='ip4_addr'){
+						$db->update("update forms set new=? where param=?", array([$val],[$key]));
+						unset($form[$key]);
+					}
+				}
+
+				$with_img_helpers=$db_path;
+			}
+
+			$form['interface']='auto';
+			$form['user_pw_root']='';
+			$form['astart']=1;
+			$form['host_hostname']=$form['jname'].'.my.domain';
+		}
+
+		$err=array();
+		$arr=array(
+			'workdir'=>$this->workdir,
+			'mount_devfs'=>1,
+			'arch'=>'native',
+			'mkhostfile'=>1,
+			'devfs_ruleset'=>4,
+			'ver'=>'native',
+			'mount_src'=>0,
+			'mount_obj'=>0,
+			'mount_kernel'=>0,
+			'applytpl'=>1,
+			'floatresolv'=>1,
+			'allow_mount'=>1,
+			'allow_devfs'=>1,
+			'allow_nullfs'=>1,
+			'mkhostsfile'=>1,
+			'pkg_bootstrap'=>0,
+			'mdsize'=>0,
+			'runasap'=>0,
+			'with_img_helpers'=>$with_img_helpers,
+		);
+
+		$arr_copy=array('jname','host_hostname','ip4_addr','user_pw_root','interface');
+		foreach($arr_copy as $a) if(isset($form[$a])) $arr[$a]=$form[$a];
+
+		$arr_copy=array('baserw','mount_ports','astart','vnet');
+		foreach($arr_copy as $a) if(isset($form[$a]) && $form[$a]=='on') $arr[$a]=1; else $arr[$a]=0;
+
+		$sysrc=array();
+		if(isset($form['serv-ftpd'])) $sysrc[]=$form['serv-ftpd'];
+		if(isset($form['serv-sshd'])) $sysrc[]=$form['serv-sshd'];
+		$arr['sysrc_enable']=implode(' ',$sysrc);
+
+		/* create jail */
+		$file_name='/tmp/'.$arr['jname'].'.conf';
+
+		$file=file_get_contents($this->realpath_public.'templates/jail.tpl');
+		if(!empty($file)) foreach($arr as $var=>$val) $file=str_replace('#'.$var.'#',$val,$file);
+		file_put_contents($file_name,$file);
+
+		$username=$this->_user_info['username'];
+
+		//$cbsd_queue_name='/clonos/'.trim($this->_vars['path'],'/').'/';
+		$res=CBSD::run('task owner=%s mode=new {cbsd_loc} jcreate inter=0 jconf=%s', array($username, $file_name));
+		//.' cbsd_queue_name='.$cbsd_queue_name);
+
+		$err='Jail is not created!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Jail was created!';
+			$taskId=$res['message'];
+		}
+
+		// local - change to the real server on which the jail was created!
+		$jid=$arr['jname'];
+
+		$table='jailslist';
+		$html='';
+		$hres=$this->getTableChunk($table,'tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'nth-num'=>'nth0',		// TODO: fix actual data!
+				'node'=>'local',		// TODO: fix actual data!
+				'ip4_addr'=>str_replace(',',',',$form['ip4_addr']),
+				'jname'=>$arr['jname'],
+				'jstatus'=>$this->translate('Creating'),
+				'icon'=>'spin6 animate-spin',
+				'desktop'=>' s-off',
+				'maintenance'=>' busy maintenance',
+				'protected'=>'icon-cancel',
+				'protitle'=>$this->translate('Delete'),
+				'vnc_title'=>$this->translate('Open VNC'),
+				'reboot_title'=>$this->translate('Restart jail'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		/*
+		$this->redis_publish($cbsd_queue_name,json_encode(array(
+			'jail_id'=>$jid,
+			'cmd'=>'jcreate',
+			'html'=>$html,
+			'mode'=>$this->mode,
+			'table'=>$table,
+		)));
+		*/
+
+		return array(
+			'errorMessage'=>$err,
+			'jail_id'=>$jid,
+			'taskId'=>$taskId,
+			'mode'=>$this->mode,
+			'redirect'=>$redirect,
+			'db_path'=>$db_path
+		);	//,'html'=>$html
+	}
+
+	function ccmd_jailRenameVars(){
+		$form=$this->_vars['form_data'];
+		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
+
+		$err=false;
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$query="SELECT jname,host_hostname FROM jails WHERE jname=?;"; //ip4_addr
+			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
+		} else {
+			$err=true;
+		}
+
+		if(empty($res['vars'])) $err=true;
+
+		if($err){
+			$res['error']=true;
+			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
+			$res['jail_id']=$form['jail_id'];
+			$res['reload']=true;
+			return $res;
+		}
+
+		$orig_jname=$res['vars']['jname'];
+		//$res['vars']['jname'].='clone';
+		$res['vars']['ip4_addr']='DHCP';
+		$res['vars']['host_hostname']=preg_replace('/^'.$orig_jname.'/',$res['vars']['jname'],$res['vars']['host_hostname']);
+		$res['error']=false;
+		$res['dialog']=$form['dialog'];
+		$res['jail_id']=$form['jail_id'];
+		return $res;
+	}
+
+	function ccmd_jailCloneVars(){
+		$form=$this->_vars['form_data'];
+		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
+
+		$err=false;
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$query="SELECT jname,host_hostname FROM jails WHERE jname=?;";	//ip4_addr
+			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
+		}else $err=true;
+
+		if(empty($res['vars'])) $err=true;
+		if($err){
+			$res['error']=true;
+			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
+			$res['jail_id']=$form['jail_id'];
+			$res['reload']=true;
+			return $res;
+		}
+
+		$orig_jname=$res['vars']['jname'];
+		$res['vars']['jname'].='clone';
+		$res['vars']['ip4_addr']='DHCP';
+		$res['vars']['host_hostname']=preg_replace('/^'.$orig_jname.'/',$res['vars']['jname'],$res['vars']['host_hostname']);
+		$res['error']=false;
+		$res['dialog']=$form['dialog'];
+		$res['jail_id']=$form['jail_id'];
+		return $res;
+	}
+
+	function ccmd_jailEditVars(){
+		$form=$this->_vars['form_data'];
+		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
+
+		$err=false;
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$query="SELECT jname,host_hostname,ip4_addr,allow_mount,interface,mount_ports,astart,vnet FROM jails WHERE jname=?;";
+			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
+		}else $err=true;
+		if(empty($res['vars']))	$err=true;
+
+		if($err){
+			$res['error']=true;
+			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
+			$res['jail_id']=$form['jail_id'];
+			$res['reload']=true;
+			return $res;
+		}
+
+		$res['error']=false;
+		$res['dialog']=$form['dialog'];
+		$res['jail_id']=$form['jail_id'];
+		return $res;
+	}
+
+	function ccmd_jailEdit(){
+		$form=$this->_vars['form_data'];
+
+		$str=array();
+		$jname=$form['jname'];
+		$arr=array('host_hostname','ip4_addr','allow_mount','interface','mount_ports','astart','vnet');
+		foreach($arr as $a){
+			if(isset($form[$a])){
+				$val=$form[$a];
+				if($val=='on') $val=1;
+				$str[]=$a.'='.$val;
+			}else $str[]=$a.'=0';
+		}
+
+		$cmd='jset jname=%s %s';
+		$res=CBSD::run($cmd, array($jname, join(' ',$str)));
+		$res['mode']='jailEdit';
+		$res['form']=$form;
+		return $res;
+	}
+
+	function ccmd_jailStart(){
+		//$cbsd_queue_name=trim($this->_vars['path'],'/');
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} jstart inter=0 jname=%s',
+			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
+		);
+		//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/');	// autoflush=2
+		return $res;
+	}
+
+	function ccmd_jailStop(){
+		//$cbsd_queue_name=trim($this->_vars['path'],'/');
+		$res=CBSD::run(
+			'task owner='.$username.' mode=new {cbsd_loc} jstop inter=0 jname=%s',
+			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
+		);
+		//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/');	// autoflush=2
+		return $res;
+	}
+
+	function ccmd_jailRestart(){
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} jrestart inter=0 jname=%s',
+			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
+		);	// autoflush=2
+		return $res;
+	}
+
+	function ccmd_jailRemove(){
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} jremove inter=0 jname=%s',
+			array($this->_user_info['username'], $this->_vars['form_data']['jname'])
+		);	// autoflush=2
+		return $res;
+	}
+
+	function ccmd_bhyveClone(){
+		$form=$this->_vars['form_data'];
+
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} bclone checkstate=0 old=%s new=%s',
+			array($this->_user_info['username'], $form['oldBhyve'], $form['vm_name'])
+		);
+
+		$err='Virtual Machine is not renamed!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Virtual Machine was renamed!';
+			$taskId=$res['message'];
+		}else $err=$res['error'];
+
+		$html='';
+		$hres=$this->getTableChunk('bhyveslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'nth-num'=>'nth0',				// TODO: actual data
+				'node'=>'local',				// TODO: actual data
+				'jname'=>$form['vm_name'],
+				'vm_ram'=>$form['vm_ram'],
+				'vm_cpus'=>$form['vm_cpus'],
+				'vm_os_type'=>$form['vm_os_type'],
+				'jstatus'=>$this->translate('Cloning'),
+				'icon'=>'spin6 animate-spin',
+				'desktop'=>' s-on',
+				'maintenance'=>' maintenance',
+				'protected'=>'icon-cancel',
+				'protitle'=>$this->translate('Delete'),
+				'vnc_title'=>$this->translate('Open VNC'),
+				'reboot_title'=>$this->translate('Restart VM'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		return array('errorMessage'=>$err,'vm_name'=>$form['vm_name'],'jail_id'=>$form['vm_name'],'taskId'=>$taskId,'mode'=>$this->mode,'html'=>$html);
+	}
+
+	function getBhyveInfo($jname){
+		$statuses=array('Not Launched','Launched','unknown-1','Maintenance','unknown-3','unknown-4','unknown-5','unknown-6');
+		$html='';
+		$db=new Db('base','local');
+		if($db->isConnected())	{
+			$bhyve=$db->selectOne("SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden FROM bhyve WHERE jname=?", array([$jname]));
+			$hres=$this->getTableChunk('bhyveslist','tbody');
+			if($hres!==false){
+				$html_tpl=$hres[1];
+				$status=$this->check_vmonline($bhyve['jname']);
+				$vars=array(
+					'jname'=>$bhyve['jname'],
+					'nth-num'=>'nth0',
+					'desktop'=>'',
+					'maintenance'=>'',
+					'node'=>'local',
+					'vm_name'=>'',
+					'vm_ram'=>$this->fileSizeConvert($bhyve['vm_ram']),
+					'vm_cpus'=>$bhyve['vm_cpus'],
+					'vm_os_type'=>$bhyve['vm_os_type'],
+					'vm_status'=>$this->translate($statuses[$status]),
+					'desktop'=>($status==0)?' s-off':' s-on',
+					'icon'=>($status==0)?'play':'stop',
+					'protected'=>'icon-cancel',
+					'protitle'=>' title="'.$this->translate('Delete').'"',
+					'vnc_title'=>$this->translate('Open VNC'),
+					'reboot_title'=>$this->translate('Restart bhyve'),
+				);
+
+				foreach($vars as $var=>$val)
+					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+				$html.=$html_tpl;
+			}
+		}
+
+		$html=preg_replace('#]*>#','',$html);
+		$html=str_replace(array('
',"\n","\r","\t"),'',$html);
+
+		return array('html'=>$html);
+	}
+
+	function ccmd_bhyveEditVars(){
+		$form=$this->_vars['form_data'];
+		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
+
+		$err=false;
+		$db=new Db('base','local');
+		if($db->isConnected())	{
+			$query="SELECT b.jname as vm_name,vm_cpus,vm_ram,vm_vnc_port,bhyve_vnc_tcp_bind,interface FROM bhyve AS b INNER JOIN jails AS j ON b.jname=j.jname AND b.jname=?;";
+			$res['vars']=$db->selectOne($query, array([$form['jail_id']]));
+			$res['vars']['vm_ram']=$this->fileSizeConvert($res['vars']['vm_ram'],1024,false,true);
+		}else{
+			$err=true;
+		}
+		if(empty($res['vars'])) $err=true;
+
+		if($err){
+			$res['error']=true;
+			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.');
+			$res['jail_id']=$form['jail_id'];
+			$res['reload']=true;
+			return $res;
+		}
+
+		$res['vars']['vm_vnc_password']='-nochange-';
+		$res['error']=false;
+		$res['dialog']=$form['dialog'];
+		$res['jail_id']=$form['jail_id'];
+		$res['iso_list']=$this->ccmd_updateBhyveISO($form['jail_id']);
+		return $res;
+	}
+
+	function ccmd_bhyveRename(){
+		$form=$this->_vars['form_data'];
+
+		$res=CBSD::run(
+			"task owner=%s mode=new /usr/local/bin/cbsd brename old=%s new=%s restart=1",
+			array($this->_user_info['username'], $form['oldJail'], $form['jname'])
+		);
+
+		$err='Virtual Machine is not renamed!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Virtual Machine was renamed!';
+			$taskId=$res['message'];
+		}else $err=$res['error'];
+
+		return array('errorMessage'=>$err,'jail_id'=>$form['jname'],'taskId'=>$taskId,'mode'=>$this->mode);
+	}
+
+	function ccmd_bhyveRenameVars(){
+		$form=$this->_vars['form_data'];
+		if(!isset($form['jail_id'])) return array('error'=>true,'error_message'=>'Bad jail id!');
+
+		$jname=$form['jail_id'];
+		$err=false;
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$query="SELECT jname,vm_ram,vm_cpus,vm_os_type,hidden FROM bhyve WHERE jname=?"; //ip4_addr
+			$res['vars']=$db->selectOne($query, array([$jname]));
+		}else $err=true;
+
+		if(empty($res['vars'])) $err=true;
+
+		if($err){
+			$res['error']=true;
+			$res['error_message']=$this->translate('Jail '.$form['jail_id'].' is not present.'); // XSS 
+			$res['jail_id']=$form['jail_id']; // Possible XSS
+//			$res['reload']=true;
+			return $res;
+		}
+
+		$res['error']=false;
+		$res['dialog']=$form['dialog']; // Possible XSS
+		$res['jail_id']=$form['jail_id'];
+		return $res;
+	}
+
+	function ccmd_bhyveEdit(){
+		$form=$this->form;
+
+		$str=array();
+		$jname=$form['jname'];
+
+		$ram=$form['vm_ram'];
+		$ram_tmp=$ram;
+		$ram=str_replace(' ','',$ram);
+		$ram=str_ireplace('mb','m',$ram);
+		$ram=str_ireplace('gb','g',$ram);
+		$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])){
+				$val=$form[$a];
+				if($val=='on') $val=1;
+				$str[]=$a.'='.$val;
+			}else $str[]=$a.'=0';
+		}
+
+		$form['vm_ram']=$ram_tmp;
+
+		/* check mounted ISO */
+		$db=new Db('base','storage_media');
+		if(!$db->isConnected()) return(false); // TODO: Fix return
+
+		$res=$db->selectOne('SELECT * FROM media WHERE jname=? AND type="iso"', array([$jname]));
+		if($res!==false && !empty($res)){
+			CBSD::run(
+				'cbsd media mode=unregister name="%s" path="%s" jname=%s type=%s',
+				array($res['name'], $res['path'], $jname, $res['type'])
+			);
+			$res=$db->selectOne(
+				'SELECT * FROM media WHERE idx=?',
+				array([(int)$form['vm_iso_image']])
+			); 
+			if($res!==false && !empty($res) && $form['vm_iso_image']!=-2){
+				CBSD::run(
+					'cbsd media mode=register name="%s" path="%s" jname=%s type=%s',
+					array($res['name'], $res['path'], $jname, $res['type'])
+				);
+			}
+		}
+		//exit;
+
+		/* end check */
+
+		$cmd='bset jname=%s %s';
+		$res=CBSD::run($cmd, array($jname, join(' ',$str)));
+		$res['mode']='bhyveEdit';
+		$res['form']=$form;
+		return $res;
+	}
+
+	function ccmd_bhyveAdd(){
+		$form=$this->form;
+
+		$os_types=$this->config->os_types;
+		$sel_os=$form['vm_os_profile'];
+		list($os_num,$item_num)=explode('.',$sel_os);
+		if(!isset($os_types[$os_num])) return array('error'=>true,'errorMessage'=>'Error in list of OS types!');
+		$os_name=$os_types[$os_num]['os'];
+		$os_items=$os_types[$os_num]['items'][$item_num];
+
+		$err=array();
+		$arr=array(
+			'workdir'=>$this->workdir,
+			'jname'=>$form['vm_name'],
+			'host_hostname'=>'',
+			'ip4_addr'=>'',
+			'arch'=>'native',
+			'ver'=>'native',
+			'astart'=>0,
+			'interface'=>$form['interface'],
+			'vm_size'=>$form['vm_size'],
+			'vm_cpus'=>$form['vm_cpus'],
+			'vm_ram'=>$form['vm_ram'],
+			'vm_os_type'=>$os_items['type'],
+			'vm_efi'=>'uefi',
+			'vm_os_profile'=>$os_items['profile'],
+			'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;
+		$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)){
+			$iso_id=(int)$iso_id;
+			if($iso_id>0){
+				$db=new Db('base','storage_media');
+				if(!$db->isConnected()) return(false); // TODO: return error
+				$res=$db->selectOne('SELECT name,path FROM media WHERE idx= ?', array([$iso_id])); // OK, $iso_id is casted as int above.
+				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 */
+		$file_name='/tmp/'.$arr['jname'].'.conf';
+
+		$file=file_get_contents($this->realpath_public.'templates/vm.tpl');
+		if(!empty($file)){
+			foreach($arr as $var=>$val) $file=str_replace('#'.$var.'#',$val,$file);
+		}
+		//echo $file;exit;
+		file_put_contents($file_name,$file);
+
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} bcreate inter=0 jconf=%s',
+			array($this->_user_info['username'], $file_name)
+		);
+
+		$err='Virtual Machine is not created!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Virtual Machine was created!';
+			$taskId=$res['message'];
+		}
+		// local - change to the real server on which the jail is created!
+		$jid=$arr['jname'];
+
+		$vm_ram=str_replace('g',' GB',$form['vm_ram']);
+
+		$html='';
+		$hres=$this->getTableChunk('bhyveslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'nth-num'=>'nth0',				// TODO: actual data
+				'node'=>'local',				// TODO: actual data
+				'jname'=>$arr['jname'],
+				'vm_status'=>$this->translate('Creating'),
+				'vm_cpus'=>$form['vm_cpus'],
+				'vm_ram'=>$vm_ram,
+				'vm_os_type'=>$os_items['type'],	//$os_name,
+				'vnc_port'=>'',
+				'vnc_port_status'=>'',
+				'icon'=>'spin6 animate-spin',
+				'desktop'=>' s-off',
+				'maintenance'=>' maintenance',
+				'protected'=>'icon-cancel',
+				'protitle'=>$this->translate('Delete'),
+				'vnc_title'=>$this->translate('Open VNC'),
+				'reboot_title'=>$this->translate('Restart VM'),
+			);
+			
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+			
+			$html=$html_tpl;
+		}
+		
+		return array('errorMessage'=>$err,'jail_id'=>$jid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode);
+	}
+
+	function ccmd_bhyveObtain(){
+		$form=$this->_vars['form_data'];
+		$os_types=$this->config->os_types;
+		$os_types_obtain=$this->config->os_types_obtain;
+		$sel_os=$form['vm_os_profile'];
+		list($os_num,$item_num)=explode('.',$sel_os);
+		if(!isset($os_types[$os_num])) return array('error'=>true,'errorMessage'=>'Error in list of OS types!');
+		//$os_name=$os_types[$os_num]['os'];
+		$os_items=$os_types[$os_num]['items'][$item_num];
+		$os_type=$os_items['type'];
+
+		//echo '';print_r($os_types_obtain);exit;
+
+		// os select
+		list($one,$two)=explode('.',$sel_os,2);
+
+		if(isset($os_types_obtain[$one]))
+		{
+			if(isset($os_types_obtain[$one]['items'][$two]))
+			{
+				$os_profile=$os_types_obtain[$one]['items'][$two]['profile'];
+				$os_type=$os_types_obtain[$one]['items'][$two]['type'];
+			}
+		}
+
+		$key_name='/usr/home/olevole/.ssh/authorized_keys';
+		if(!isset($form['vm_authkey'])) $form['vm_authkey']=0;
+		$key_id=(int)$form['vm_authkey'];
+
+		$db=new Db('base','authkey');
+		if(!$db->isConnected())  return array('error'=>true,'errorMessage'=>'Database error!');
+
+		//if($nres['name']!==false) $key_name=$nres['name'];
+		$nres=$db->selectOne('SELECT authkey FROM authkey WHERE idx=?', array([$key_id, PDO::PARAM_INT]));
+		if($nres['authkey']!==false) $authkey=$nres['authkey']; else $authkey='';
+		//var_dump($nres);exit;
+
+		$user_pw=(!empty($form['user_password']))?' ci_user_pw_user='.$form['user_password'].' ':'';
+
+		$res=CBSD::run( // TODO: THIS SEEMS WRONG pw_user={$form['vm_password']} {$user_pw}vnc_password={$form['vnc_password']}";
+			'task owner=%s mode=new {cbsd_loc} bcreate jname=%s 
+			vm_os_profile="%s" imgsize=%s vm_cpus=%s vm_ram=%s vm_os_type=%s mask=%s 
+			ip4_addr=%s ci_ip4_addr=%s ci_gw4=%s ci_user_pubkey="%s" ci_user_pw_user=%s %svnc_password=%s',
+			array(
+				$this->_user_info['username'],
+				$form['vm_name'],
+				$os_profile,
+				$form['vm_size'],
+				$form['vm_cpus'],
+				$form['vm_ram'],
+				$os_type,
+				$form['mask'],
+				$form['ip4_addr'],
+				$form['ip4_addr'],
+				$form['gateway'],
+				$authkey,
+				$form['vm_password'],
+				$user_pw,
+				$form['vnc_password']
+			)
+		);
+
+		$err='Virtual Machine is not created!';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Virtual Machine was created!';
+			$taskId=$res['message'];
+		}
+
+		$vm_ram=str_replace('g',' GB',$form['vm_ram']);
+
+		$html='';
+		$hres=$this->getTableChunk('bhyveslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'nth-num'=>'nth0',				// TODO: actual data
+				'node'=>'local',				// TODO: actual data
+				'jname'=>$form['vm_name'],
+				'vm_status'=>$this->translate('Creating'),
+				'vm_cpus'=>$form['vm_cpus'],
+				'vm_ram'=>$vm_ram,
+				'vm_os_type'=>$os_type,
+				'icon'=>'spin6 animate-spin',
+				'desktop'=>' s-off',
+				'maintenance'=>' maintenance',
+				'protected'=>'icon-cancel',
+				'protitle'=>$this->translate('Delete'),
+				'vnc_title'=>$this->translate('Open VNC'),
+				'reboot_title'=>$this->translate('Restart VM'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+			
+			$html=$html_tpl;
+		}
+
+		return array('errorMessage'=>$err,'jail_id'=>$form['vm_name'],'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode);
+	}
+
+	function ccmd_bhyveStart(){
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} bstart inter=0 jname=%s',
+			array($this->_user_info['username'], $this->form['jname'])
+		);	// autoflush=2
+	}
+
+	function ccmd_bhyveStop(){
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} bstop inter=0 jname=%s',
+			array($this->_user_info['username'], $this->form['jname'])
+		);	// autoflush=2
+	}
+
+	function ccmd_bhyveRestart(){
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} brestart inter=0 jname=%s',
+			array($this->_user_info['username'], $this->form['jname'])
+		);	// autoflush=2
+	}
+
+	function ccmd_bhyveRemove(){
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} bremove inter=0 jname=%s',
+			array($this->_user_info['username'], $this->form['jname'])
+		);	// autoflush=2
+	}
+
+	function ccmd_authkeyAdd(){
+		$db=new Db('base','authkey');
+		if(!$db->isConnected()) return array('error'=>'Database error');
+
+		//$res=array('error'=>false,'lastId'=>2);
+		$res=$db->insert("INSERT INTO authkey (name,authkey) VALUES (?, ?)", array([$this->form['keyname']], [$this->form['keysrc']]));
+		if($res['error']) return array('error'=>$res);
+		
+		$html='';
+		$hres=$this->getTableChunk('authkeyslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'keyid'=>$res['lastID'],
+				'keyname'=>$this->form['keyname'],
+				'keysrc'=>$this->form['keysrc'],
+				'deltitle'=>$this->translate('Delete'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		return array('keyname'=>$this->form['keyname'],'html'=>$html);
+	}
+
+	function ccmd_authkeyRemove(){
+		$form=$this->_vars['form_data'];
+
+		$db=new Db('base','authkey');
+		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
+
+		$res=$db->update('DELETE FROM authkey WHERE idx=?', array([$form['auth_id']]));
+		if($res===false) return array('error'=>true,'res'=>print_r($res,true));
+
+		return array('error'=>false,'auth_id'=>$form['auth_id']);
+	}
+
+	function ccmd_vpnetAdd(){
+		$form=$this->_vars['form_data'];
+
+		$db=new Db('base','vpnet');
+		if(!$db->isConnected()) return array('error'=>'Database error');
+
+		$res=$db->insert("INSERT INTO vpnet (name,vpnet) VALUES (?, ?)", array([$form['netname']],[$form['network']]));
+		if($res['error']) return array('error'=>$res);
+
+		$html='';
+		$hres=$this->getTableChunk('vpnetslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$vars=array(
+				'netid'=>$res['lastID'],
+				'netname'=>$form['netname'],
+				'network'=>$form['network'],
+				'deltitle'=>$this->translate('Delete'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		return array('netname'=>$form['netname'],'html'=>$html);
+	}
+
+	function ccmd_vpnetRemove(){
+		$form=$this->_vars['form_data'];
+
+		$db=new Db('base','vpnet');
+		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
+
+		$res=$db->update('DELETE FROM vpnet WHERE idx=?', array([(int)$form['vpnet_id']]));
+		if($res===false) return array('error'=>true,'res'=>print_r($res,true));
+
+		return array('error'=>false,'vpnet_id'=>$form['vpnet_id']);
+	}
+
+	function ccmd_mediaRemove(){
+
+		$db=new Db('base','storage_media');
+		if(!$db->isConnected()) return array('error'=>true,'res'=>'Database error');
+
+		//$res=$db->update('DELETE FROM media WHERE idx=?', array([$this->form['media_id']]));
+		$res=$db->selectOne('SELECT * FROM media WHERE idx=?', array([(int)$this->form['media_id'], PDO::PARAM_INT]));
+		if($res===false || empty($res)) return array('error'=>true,'res'=>print_r($res,true));
+
+		//if($res['jname']=='-')	// еÑли медиа оÑвÑзана, Ñо пÑоÑ
+
+		$res=CBSD::run(
+			'media mode=remove name="%s" path="%s" jname="%s" type="%s"', //.$res['name']
+			array($res['name'], $res['path'], $res['jname'], $res['type'])
+		);
+
+		if($res['error']){
+			$arr['error']=true;
+			$arr['error_message']='File image was not deleted! '.$res['error_message'];
+		}else $arr['error']=false;
+
+		$arr['media_id']=$this->form['media_id'];
+		$arr['cmd']=$res;
+		//echo json_encode($arr);
+
+		//return array('error'=>false,'media_id'=>$this->form['media_id']);
+		return $arr;
+	}
+
+	function ccmd_srcRemove(){
+		$ver=str_replace('src','',$this->formform['jname']);
+		if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
+		return CBSD::run(
+			'task owner='.$username.' mode=new {cbsd_loc} removesrc inter=0 ver=%s jname=#src%s',
+			array($this->_user_info['username'], $ver, $ver)
+		);
+	}
+
+	function ccmd_srcUpdate(){
+		$ver=str_replace('src','',$this->form['jname']);
+		$stable=(preg_match('#\.\d#',$ver))?0:1;
+		if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} srcup stable=%s inter=0 ver=%s jname=#src%s',
+			array($this->_user_info['username'], $stable, $ver, $ver)
+		);
+	}
+
+	function getSrcInfo($id){
+		$id=str_replace('src','',$id);
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'Database error');
+		$res=$db->selectOne("SELECT idx,name,platform,ver,rev,date FROM bsdsrc WHERE ver=?", array([(int)$id, PDO::PARAM_INT]));
+
+		$hres=$this->getTableChunk('srcslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$ver=$res['ver'];
+			$vars=array(
+				'nth-num'=>'nth0',
+				'maintenance'=>' busy',
+				'node'=>'local',
+				'ver'=>$res['ver'],
+				'ver1'=>strlen(intval($res['ver']))$res['rev'],
+				'date'=>$res['date'],
+				'protitle'=>$this->translate('Update'),
+				'protitle'=>$this->translate('Delete'),
+			);
+
+			foreach($vars as $var=>$val) $html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		$html=preg_replace('#]*>#','',$html);
+		$html=str_replace(array('
',"\n","\r","\t"),'',$html);
+
+		return array('html'=>$html,'arr'=>$res);
+	}
+
+	function ccmd_baseRemove(){	//$id
+		//$id=str_replace('base','',$id);
+		//base10.3-amd64-0
+		$id=$this->form['jname'];
+		preg_match('#base([0-9\.]+)-([^-]+)-(\d+)#',$id,$res);
+		$ver=$res[1];
+		$arch=$res[2];
+		$stable=$res[3];
+
+		return $this->CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} removebase inter=0 stable=%s ver=%s arch=%s jname=#%s',
+			array($this->_user_info['username'], $stable, $ver, $arch, $this->form['jname'])
+		);
+	}
+
+	function ccmd_basesCompile(){
+		$form=$this->form;
+		if(!isset($form['sources']) || !is_numeric($form['sources'])) return array('error'=>true,'errorMessage'=>'Wrong OS type selected!');
+		$id=(int)$form['sources'];
+
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'Database connect error!');
+
+		$base=$db->selectOne("SELECT idx,platform,ver FROM bsdsrc WHERE idx=?", array([$id, PDO::PARAM_INT])); // Casted above as 
+		$ver=$base['ver'];
+		$stable_arr=array('release','stable');
+		$stable_num=strlen(intval($ver))fillRepoTr($id);
+		$html=$res['html'];
+		$res=$res['arr'];
+
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} world inter=0 stable=%s ver=%s jname=#base%s',
+			array($this->_user_info['username'], $res['stable'], $ver, $bid)
+		);
+		//$res['retval']=0;$res['message']=3;
+
+		$err='';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='World compile start!';
+			$taskId=$res['message'];
+		}
+
+		return array('errorMessage'=>'','jail_id'=>'base'.$bid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode,'txt_status'=>$this->translate('Compiling'));
+	}
+
+	function fillRepoTr($id,$only_td=false,$bsdsrc=true){
+//		preg_match('#base([0-9\.]+)-#',$id,$res);
+//		$id=$res[1];
+
+		$html='';
+
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			if($bsdsrc){
+				$res=$db->selectOne("SELECT idx,platform,ver FROM bsdsrc WHERE idx=?", array([(int)$id, PDO::PARAM_INT]));
+				$res['name']='â';
+				$res['arch']='â';
+				$res['targetarch']='â';
+				$res['stable']=strlen(intval($res['ver']))selectOne("SELECT idx,platform,name,arch,targetarch,ver,stable,elf,date FROM bsdbase WHERE ver=?", array([(int)$id, PDO::PARAM_INT]));
+			}
+			$hres=$this->getTableChunk('baseslist','tbody');
+			if($hres!==false){
+				$html_tpl=$hres[1];
+				$ver=$res['ver'];
+				$vars=array(
+					'bid'=>$res['idx'],
+					'nth-num'=>'nth0',
+					'node'=>'local',
+					'ver'=>$res['ver'],
+					'name'=>'base',
+					'platform'=>$res['platform'],
+					'arch'=>$res['arch'],
+					'targetarch'=>$res['targetarch'],
+					'stable'=>$res['stable']==0?'release':'stable',
+					'elf'=>$res['elf'],
+					'date'=>$res['date'],
+					'maintenance'=>' busy',
+					'protitle'=>$this->translate('Delete'),
+				);
+
+				foreach($vars as $var=>$val)
+					$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+				$html=$html_tpl;
+			}
+		}
+
+		if($only_td){
+			$html=preg_replace('#]*>#','',$html);
+			$html=str_replace(array('
',"\n","\r","\t"),'',$html);
+		}
+
+		return array('html'=>$html,'arr'=>$res);
+	}
+
+	function ccmd_repoCompile(){
+		$form=$this->form;
+		if(!isset($form['version']) || !is_numeric($form['version'])) return array('error'=>true,'errorMessage'=>'Wrong OS type input!');
+
+		$stable_arr=array('release','stable');
+		$html='';
+		$hres=$this->getTableChunk('baseslist','tbody');
+		if($hres!==false){
+			$html_tpl=$hres[1];
+			$ver=$form['version'];
+			$stable_num=strlen(intval($ver))'nth0',
+				'bid'=>$bid,
+				'node'=>'local',
+				'ver'=>$ver,
+				'name'=>'base',
+				'platform'=>'â',
+				'arch'=>'â',
+				'targetarch'=>'â',
+				'stable'=>$stable,
+				'elf'=>'â',
+				'date'=>'â',
+				'maintenance'=>' busy',
+				'protitle'=>$this->translate('Delete'),
+			);
+
+			foreach($vars as $var=>$val)
+				$html_tpl=str_replace('#'.$var.'#',$val,$html_tpl);
+
+			$html=$html_tpl;
+		}
+
+		$res=CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} repo action=get sources=base inter=0 stable=%s ver=%s jname=#base%s',
+			array($this->_user_info['username'], $stable_num, $ver, $bid)
+		);
+
+		//$res['retval']=0;$res['message']=3;
+
+		$err='';
+		$taskId=-1;
+		if($res['retval']==0){
+			$err='Repo download start!';
+			$taskId=$res['message'];
+		}
+
+		return array('errorMessage'=>'','jail_id'=>'base'.$bid,'taskId'=>$taskId,'html'=>$html,'mode'=>$this->mode,'txt_status'=>$this->translate('Fetching'));
+	}
+
+	function ccmd_logLoad(){
+		$form=$this->_vars['form_data'];
+		$log_id=$form['log_id'];
+		if(!is_numeric($log_id)) return array('error'=>'Log ID must be a number');
+
+		$html='';
+		$buf='';
+		$log_file='/tmp/taskd.'.$log_id.'.log';
+		if(file_exists($log_file)){
+			$filesize=filesize($log_file);
+			if($filesize<=204800){
+				$buf=file_get_contents($log_file);
+			}else{
+				$fp=fopen($log_file,'r');
+				if($fp)	{
+					fseek($fp,-1000,SEEK_END);
+					$buf=fread($fp,1000);
+					$html='Last 1000 Bytes of big file data:
';
+				}
+				fclose($fp);
+			}
+			$buf=htmlentities(trim($buf));
+			$arr=preg_split('#\n#iSu',trim($buf));
+			if(!empty($arr)) foreach($arr as $txt)
+				$html.=''.$txt.'
';
+
+			return array('html'=>'Log ID: '.$log_id.'
'.$html);
+		}
+
+		return array('error'=>'Log file is not exists!');
+	}
+
+	function ccmd_logFlush(){
+		return CBSD::run('task mode=flushall', array());
+	}
+
+	function getBasesCompileList(){
+		$db1=new Db('base','local');
+		if($db1!==false){
+			$bases=$db1->select("SELECT idx,platform,ver FROM bsdsrc order by cast(ver AS int)", array());
+
+			if(!empty($bases)) foreach($bases as $base){
+				$val=$base['idx'];
+				$stable=strlen(intval($base['ver']))'.$name.'',PHP_EOL;
+			}
+		}
+	}
+
+/*
+	function saveHelperValues(){
+		$form=$this->_vars['form_data'];
+		return $this->jailAdd($form);
+	}
+*/
+	function helpersAdd($mode){
+		if($this->uri_chunks[0]!='jailscontainers' || empty($this->uri_chunks[1])) return array('error'=>true,'errorMessage'=>'Bad url!');
+		$jail_id=$this->uri_chunks[1];
+
+		$helpers=array_keys($this->form);
+		if(!empty($helpers)) foreach($helpers as $helper){
+			$res=CBSD::run(
+				'task owner=%s mode=new {cbsd_loc} forms inter=0 module=%s jname=%s',
+				array($this->_user_info['username'], $helper, $jail_id)
+			);
+		}
+		return array('error'=>false);
+	}
+
+	//function addJailHelperGroup(){
+	function ccmd_addJailHelperGroup(){
+		if($this->uri_chunks[0]!='jailscontainers' || empty($this->uri_chunks[1]) || empty($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
+		$jail_id=$this->uri_chunks[1];
+		$helper=$this->url_hash;
+
+		$db=new Db('helper',array('jname'=>$jail_id,'helper'=>$helper));
+		if(!$db->isConnected()) return array('error'=>true,'errorMessage'=>'No database file!');
+
+		$db_path=$db->getFileName();
+
+		$res=CBSD::run(
+			'forms inter=0 module=%s formfile=%s group=add',
+			array($helper, $db_path)
+		);
+		$form=new Forms('',$helper,$db_path);
+		$res=$form->generate();
+
+		return array('html'=>$res['html']);
+	}
+
+	function addHelperGroup($mode){
+		$module=$this->url_hash;
+		if(isset($this->form)) $form=$this->form; else $form=array();
+		if(isset($form['db_path']) && !empty($form['db_path']))	{
+			$db_path=$form['db_path'];
+			if(!file_exists($db_path)){
+				$res=CBSD::run('make_tmp_helper module=%s', array($module));
+				if($res['retval']==0) $db_path=$res['message']; else return array('error'=>true,'errorMessage'=>'Error on open temporary form file!');
+			}
+		}else{
+			$res=CBSD::run('make_tmp_helper module=%s', array($module));
+			if($res['retval']==0) $db_path=$res['message'];
+		}
+		CBSD::run('forms inter=0 module=%s formfile=%s group=add', array($module, $db_path));
+		$form=new Forms('',$module,$db_path);
+		$res=$form->generate();
+
+		return array('db_path'=>$db_path,'html'=>$res['html']);
+	}
+
+	function deleteHelperGroup($mode){
+		$module=$this->url_hash;
+		if(isset($this->form)) $form=$this->form; else $form=array();
+		if(!isset($form['db_path']) || empty($form['db_path'])) return;
+
+		if(!file_exists($form['db_path'])) return array('error'=>true,'errorMessage'=>'Error on open temporary form file!');
+		
+		$index=$form['index'];
+		$index=str_replace('ind-','',$index);
+
+		$db_path=$form['db_path'];
+		$res=CBSD::run(
+			'forms inter=0 module=%s formfile=%s group=del index=%s',
+			array($module, $db_path, $index)
+		);
+		$form=new Forms('',$module,$db_path);
+		$res=$form->generate();
+
+		return array('db_path'=>$db_path,'html'=>$res['html']);
+	}
+
+	//function deleteJailHelperGroup(){
+	function ccmd_deleteJailHelperGroup(){
+		$form=$this->form;
+		if(!isset($this->uri_chunks[1]) || !isset($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
+
+		$jail_id=$this->uri_chunks[1];
+		$helper=$this->url_hash;
+		$index=$form['index'];
+		$index=str_replace('ind-','',$index);
+
+		$db=new Db('helper',array('jname'=>$jail_id,'helper'=>$helper));
+		if($db->error) return array('error'=>true,'errorMessage'=>'No helper database!');
+
+		$db_path=$db->getFileName();
+		$res=CBSD::run(
+			'forms inter=0 module=%s formfile=%s group=del index=%s',
+			array($helper, $db_path, $index)
+		);
+		$form=new Forms('',$helper,$db_path);
+		$res=$form->generate();
+
+		return array('html'=>$res['html']);
+	}
+
+	function useDialogs($arr=array()){
+		//print_r($arr);
+		$this->_dialogs=$arr;
+	}
+
+	function placeDialogs(){
+		if(empty($this->_dialogs)) return;
+		echo PHP_EOL;
+		foreach($this->_dialogs as $dialog_name){
+			$file_name=$this->realpath_public.'dialogs/'.$dialog_name.'.php';
+			if(file_exists($file_name)){
+				include($file_name);
+				echo PHP_EOL,PHP_EOL;
+			}
+		}
+	}
+
+	function placeDialogByName($dialog_name=null){
+		if(is_null($dialog_name)) return;
+		echo PHP_EOL;
+		$file_name=$this->realpath_public.'dialogs/'.$dialog_name.'.php';
+		if(file_exists($file_name)){
+			include($file_name);
+			echo PHP_EOL,PHP_EOL;
+		}
+	}
+
+	function runVNC($jname){
+		$query="SELECT vnc_password FROM bhyve WHERE jname=?";
+		$res=$this->_db_local->selectOne($query, array([$jname]));
+
+		$pass='cbsd';
+		if($res!==false) $pass=$res['vnc_password'];
+		
+		$resCBSD::run("vm_vncwss jname=%s permit=%s", array($jname, $this->_client_ip));
+		//$res=$this->_db_local->selectOne("SELECT nodeip FROM local", array());
+		//$nodeip=$res['nodeip'];
+		// need for IPv4/IPv6 regex here, instead of strlen
+		//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.':6081/vnc_auto.html?host='.$nodeip.'&port=6081?password='.$pass);
+		exit;
+	}
+
+	//function getFreeJname($in_helper=false,$type='jail'){
+	function ccmd_getFreeJname($in_helper=false,$type='jail'){
+		$arr=array();
+
+		/* TODO: CHECK THE ORIGINAL CODE
+			$add_cmd=($in_helper)?' default_jailname='.$this->url_hash:'';
+			$add_cmd1=' default_jailname='.$type;
+			$res=$this->cbsd_cmd("freejname".$add_cmd.$add_cmd1);
+		*/
+		if ($in_helper) {
+			$res = CBSD::run('freejname default_jailname=%s default_jailname=%s', array($this->url_hash, $type));
+		} else {
+			$res = CBSD::run('freejname default_jailname=%s', array($type));
+		}
+
+		if($res['error']){
+			$arr['error']=true;
+			$arr['error_message']=$err['error_message'];
+		}else{
+			$arr['error']=false;
+			$arr['freejname']=$res['message'];
+		}
+		return $arr;
+	}
+
+	function ccmd_k8sCreate()
+	{
+		$form=$this->form;
+		$res=array();
+		$ass_arr=array(
+			'
+      
+      
+      _nodes'=>'init_masters',
+			'worker_nodes'=>'init_workers',
+			'master_ram'=>'master_vm_ram',
+			'master_cpus'=>'master_vm_cpus',
+			'master_img'=>'master_vm_imgsize',
+			'worker_ram'=>'worker_vm_ram',
+			'worker_cpus'=>'worker_vm_cpus',
+			'worker_img'=>'worker_vm_imgsize',
+		);
+
+		$add_param=array(
+			'master_ram'=>'g',
+			'master_img'=>'g',
+			'worker_ram'=>'g',
+			'worker_img'=>'g',
+		);
+
+		foreach($form as $key=>$value)
+		{
+			if(isset($ass_arr[$key]))
+			{
+				if(isset($add_param[$key]))
+				{
+					$value.=$add_param[$key];
+				}
+				$res[$ass_arr[$key]]=$value;
+			}
+		}
+
+		$res['pv_enable']="0";
+		if(isset($form['pv_enable']))
+		{
+			if($form['pv_enable']=='on') $res['pv_enable']="1";
+		}
+
+		$res['kubelet_master']="0";
+		if(isset($form['kubelet_master']))
+		{
+			if($form['kubelet_master']=='on') $res['kubelet_master']="1";
+		}
+
+		$url='http://144.76.225.238/api/v1/create/move';
+		$result=$this->postCurl($url,$res);
+
+		return $result;
+	}
+
+	function ccmd_k8sRemove()
+	{
+		$form=$this->form;
+		if(isset($form['k8sname']) && !empty($form['k8sname']))
+		{
+			$url='http://144.76.225.238/api/v1/destroy/'.$form['k8sname'];
+			return ($this->getCurl($url));
+		}else{
+			return array('error'=>'true','errorMessage'=>'something wrong...');
+		}
+	}
+	
+	function postCurl($url,$vars=false)
+	{
+		if($vars===false) return array('error'=>true,'errorMessage'=>'something wrong...');
+		
+		$txt_vars=json_encode($vars);
+		//$txt_vars=http_build_query($vars);
+
+		$ch = curl_init($url);
+//		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($ch, CURLOPT_POST, true);
+		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
+		curl_setopt($ch, CURLOPT_POSTFIELDS, $txt_vars);
+		$result = curl_exec($ch);
+		curl_close($ch);
+		//echo print_r($result,true);exit;
+		return $result;
+	}
+
+	function getCurl($url)
+	{
+		$ch = curl_init($url);
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+		curl_setopt($ch, CURLOPT_POST, false);
+		$result = curl_exec($ch);
+		curl_close($ch);
+		return $result;
+	}
+
+	function GhzConvert($Hz=0){
+		$h=1;
+		$l='Mhz';
+
+		if($Hz>1000){
+			$h=1000;
+			$l='Ghz';
+		}
+
+		return round($Hz/$h,2).' '.$l;
+	}
+
+	function fileSizeConvert(int $bytes,$bytes_in_mb=1024,$round=false,$small=false){
+		//$bytes = intval($bytes);
+		//var_dump($bytes);exit;
+
+		$arBytes = array(
+			0 => array(
+				"UNIT" => "tb",
+				"VALUE" => pow($bytes_in_mb, 4)
+			),
+			1 => array(
+				"UNIT" => "gb",
+				"VALUE" => pow($bytes_in_mb, 3)
+			),
+			2 => array(
+				"UNIT" => "mb",
+				"VALUE" => pow($bytes_in_mb, 2)
+			),
+			3 => array(
+				"UNIT" => "kb",
+				"VALUE" => $bytes_in_mb
+			),
+			4 => array(
+				"UNIT" => "b",
+				"VALUE" => 1
+			),
+		);
+
+		$result='0 MB';
+		foreach($arBytes as $arItem){
+			if($bytes >= $arItem["VALUE"]){
+				$result = $bytes / $arItem["VALUE"];
+				if($round) $result=round($result);
+				$result = str_replace(".", "," , strval(round($result, 2))).($small?strtolower(substr($arItem['UNIT'],0,1)):" ".strtoupper($arItem["UNIT"]));
+				break;
+			}
+		}
+		return $result;
+	}
+
+	function colorizeCmd($cmd_string){
+		$arr=$this->_cmd_array;
+		foreach($arr as $item){
+			$cmd_string=str_replace($item,''.$item.'',$cmd_string);
+		}
+
+		$cmd_string=preg_replace('#(\/.+/cbsd)#','$1',$cmd_string);
+
+		return ''.$cmd_string.'';
+	}
+
+	function register_media($path,$file,$ext){
+		$cmd='cbsd media mode=register name=%s path=%s type=%s';
+		$res=CBSD::run($cmd, array($file, $path.$file, $ext));
+		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"', array());
+		if($res===false || empty($res)) return;
+
+		$html='';
+		foreach($res as $r){
+			$html.='';
+		}
+		return $html;
+	}
+
+	function ccmd_updateBhyveISO($iso=''){
+		$db=new Db('base','storage_media');
+		$res=$db->select('SELECT * FROM media WHERE type="iso"', array());
+		if($res===false || empty($res)) return array(); //array('error'=>true,'error_message'=>'Profile ISO is not find!');
+
+		$sel='';
+		//if(empty($iso)) $sel='#sel#';
+		$html='';
+		foreach($res as $r){
+			$sel1='';
+			if(empty($sel) && $iso==$r['jname']) $sel1='#sel1#';
+			$html.='';
+		}
+
+		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;
+	}
+
+	function get_interfaces_html(){
+		$if=$this->config->os_interfaces;
+		$html='';
+		//$m=1;
+		foreach($if as $i){
+			//$html.='';
+			$html.='';
+			//$m++;
+		}
+		return $html;
+	}
+
+	function ccmd_usersAdd(){
+		$form=$this->form;
+
+		$res=$this->userRegister($form);
+		if($res!==false){
+			if(isset($res['user_exists']) && $res['user_exists']){
+				return array('error'=>true,'errorType'=>'user-exists','errorMessage'=>'User always exists!');
+			}
+			return $res;
+		}
+		return array('form'=>$form);
+	}
+
+	function ccmd_usersEdit(){
+		$form=$this->form;
+
+		if(!isset($form['user_id']) || !is_numeric($form['user_id']) || $form['user_id']<1)
+			return array('error'=>true,'error_message'=>'incorrect data!');
+
+		$db=new Db('clonos');
+		if(!$db->isConnected())	return array('error'=>true,'error_message'=>'db connection lost!');
+
+		$user_id=(int)$form['user_id'];
+		$username=$form['username'];
+		$first_name=$form['first_name'];
+		$last_name=$form['last_name'];
+		$is_active=0;
+		if(isset($form['actuser']) && $form['actuser']=='on') $is_active=1;
+
+		$authorized_user_id=0;
+		if(isset($_COOKIE['mhash']))
+		{
+			$mhash=$_COOKIE['mhash'];
+			if(!preg_match('#^[a-f0-9]{32}$#',$mhash)) return array('error'=>true,'error_message'=>'Bad data');
+			$query1="select user_id from auth_list WHERE sess_id=? limit 1";
+			$res1=$db->selectOne($query1, array([$mhash]));
+			{
+				if($res1['user_id']>0)
+				{
+					$authorized_user_id=$res1['user_id'];
+				}else{
+					return array('error'=>true,'error_message'=>'you are still not authorized');
+				}
+			}
+		}else{
+			return array('error'=>true,'error_message'=>'you must be authorized for this operation!');
+		}
+
+		if($user_id==0 || $user_id!=$authorized_user_id)
+		{
+			return array('error'=>true,'error_message'=>'I think you\'re some kind of hacker');
+		}
+
+		if(isset($form['password'])){
+			$password=$this->getPasswordHash($form['password']);
+			$query="UPDATE auth_user SET username=?,password=?,first_name=?,last_name=?,is_active=? WHERE id=?";
+			$res=$db->update($query, array(
+				[$username],
+				[$password],
+				[$first_name],
+				[$last_name],
+				[$is_active],
+				[(int)$user_id]
+			));
+		} else {
+			$query="UPDATE auth_user SET username=?,first_name=?,last_name=?,is_active=? WHERE id=?";
+			$res=$db->update($query, array(
+				[$username],
+				[$first_name],
+				[$last_name],
+				[$is_active],
+				[(int)$user_id]
+			));
+		}
+		return array('error'=>false,'res'=>$res);
+	}
+
+	function getPasswordHash($password){
+		return hash('sha256',hash('sha256',$password).$this->getSalt());
+	}
+
+	private function getSalt(){
+		$salt_file='/var/db/clonos/salt';
+		if(file_exists($salt_file)) return trim(file_get_contents($salt_file));
+		return 'noSalt!';
+	}
+
+	function userRegister($user_info=array()){
+		if(empty($user_info)) return false;
+		if(isset($user_info['username']) && isset($user_info['password'])){
+			$db=new Db('clonos');
+			if($db->isConnected()) {
+				$res=$db->selectOne("SELECT username FROM auth_user WHERE username=?", array([$user_info['username']]));
+				if(!empty($res)){
+					$res['user_exsts']=true;
+					return $res;
+				}
+
+				$password=$this->getPasswordHash($user_info['password']);
+				$is_active=0;
+				if(isset($user_info['actuser']) && $user_info['actuser']=='on') $is_active=1;
+				$query=$db->query_protect("INSERT INTO auth_user
+					(username,password,first_name,last_name,is_active,date_joined) VALUES
+					(?,?,?,?,?,datetime('now','localtime'))");
+				$res=$db->insert($query, array(
+					[$user_info['username']],
+					[$password],
+					[$user_info['first_name']],
+					[$user_info['last_name']],
+					[$is_active]
+				));
+				return array('error'=>false,'res'=>$res);
+			}
+		}
+	}
+
+	function userRegisterCheck($user_info=array()){
+		/*
+		[0] => Array
+		(
+			[id] => 1
+			[username] => admin
+			[password] => 01...87a
+			[first_name] => Admin
+			[last_name] => Admin
+			[last_login] => 
+			[is_active] => 1
+			[date_joined] => 2017-12-02 00:09:00
+			[sess_id] => 
+			[secure_sess_id] => 
+		)
+		*/
+		if(empty($user_info)) return false;
+		if(isset($user_info['login']) && isset($user_info['password'])){
+			$db=new Db('clonos');
+			if($db->isConnected()){
+				$pass=$this->getPasswordHash($user_info['password']);
+				$res=$db->selectOne("SELECT id,username,password FROM auth_user WHERE username=? AND is_active=1", array([$user_info['login']]));
+				if(empty($res) || $res['password'] != $pass){
+					sleep(3);
+					return array('errorCode'=>1,'message'=>'user not found!');
+				}
+				$res['errorCode']=0;
+
+				$id=(int)$res['id'];
+				$memory_hash=md5($id.$res['username'].time());
+				$secure_memory_hash=md5($memory_hash.$this->_client_ip);
+
+				/*
+				$query="update auth_user set sess_id=?, secure_sess_id=?, last_login=datetime('now','localtime') where id=?";
+				$db->update($query);
+				*/
+
+				//$query="update auth_list set secure_sess_id=?,auth_time=datetime('now','localtime') where sess_id=?";	//sess_id='${memory_hash}',
+				$query="UPDATE auth_list 
+						SET sess_id=?,secure_sess_id=?,auth_time=datetime('now','localtime') 
+						WHERE user_id=? AND user_ip=?";
+				$qres=$db->update($query, array(
+					[$memory_hash],
+					[$secure_memory_hash],
+					[$id],
+					[$this->_client_ip]
+				));
+				//print_r($qres);
+				if(isset($qres['rowCount'])){
+					if($qres['rowCount']==0){
+						$query="INSERT INTO auth_list
+							(user_id,sess_id,secure_sess_id,user_ip,auth_time) VALUES
+							(?,?,?,?,datetime('now','localtime'))";
+						$qres=$db->insert($query, array(
+							[$id],
+							[$memory_hash],
+							[$secure_memory_hash],
+							[$this->_client_ip]
+						));
+					}
+				}
+
+				setcookie('mhash',$memory_hash,time()+1209600);
+
+				return $res;
+			}
+		}
+		return array('message'=>'unregistered user','errorCode'=>1);
+	}
+
+	function userAutologin(){
+		if(isset($_COOKIE['mhash'])){
+			$memory_hash=$_COOKIE['mhash'];
+			$secure_memory_hash=md5($memory_hash.$this->_client_ip);
+			$db=new Db('clonos');
+			if($db->isConnected()){
+				$query="SELECT au.id,au.username FROM auth_user au, auth_list al WHERE al.secure_sess_id=? AND au.id=al.user_id AND au.is_active=1";
+				//echo $query;
+				$res=$db->selectOne($query, array([$secure_memory_hash]));
+				//print_r($res);
+				if(!empty($res)){
+					$res['error']=false;
+					return $res;
+				}
+			}
+		}
+		return array('error'=>true);
+	}
+
+	function ccmd_userRemove(){
+		$id=$this->form['user_id'];
+		if(is_numeric($id) && $id>0){
+			$query="DELETE FROM auth_user WHERE id=?";
+			$db=new Db('clonos');
+			if(!$db->isConnected()) return array('error'=>true,'error_message'=>'DB connection error!');
+
+			$res=$db->select($query, array([(int)$id, PDO::PARAM_INT]));
+			return $res;
+		}
+	}
+
+	function ccmd_userEditInfo(){
+		if(!isset($this->form['user_id'])) return array('error'=>true,'error_message'=>'incorrect data!');
+
+		$db=new Db('clonos');
+		if(!$db->isConnected()) return array('error'=>true,'error_message'=>'DB connection error!');
+		$user_id=(int)$this->form['user_id'];
+
+		$res=$db->selectOne("SELECT username,first_name,last_name,is_active AS actuser FROM auth_user WHERE id=?", array([$user_id]));
+		return array(
+			'dialog'=>$this->form['dialog'],
+			'vars'=>$res,
+			'error'=>false,
+			'tblid'=>$this->form['tbl_id'],
+			'user_id'=>$user_id,
+		);
+	}
+
+	function ccmd_userGetInfo(){
+		$db=new Db('clonos');
+		if(!$db->isConnected()) return array('DB connection error!');
+
+		$res=$db->selectOne("SELECT * FROM auth_user", array()); // TODO: What?!
+		return $res;
+	}
+
+	function getUserName(){
+		return $this->_user_info['username'];
+	}
+
+	function ccmd_vmTemplateAdd(){
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return $this->messageError('data incorrect!'); //array('error'=>true,'error_message'=>'data incorrect!');
+		$owner=$this->_user_info['username'];
+		$query="INSERT INTO vmpackages (name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus,owner,timestamp)
+			VALUES (?,?,?,?,?,?,datetime('now','localtime'))";
+
+		$res=$db->insert($query, array(
+			[$this->form['name']],
+			[$this->form['description']],
+			[$this->form['pkg_vm_ram']],
+			[$this->form['pkg_vm_disk']],
+			[$this->form['pkg_vm_cpus']],
+			[$owner]
+		));
+		if($res===false) return $this->messageError('sql error!');
+		if(!$res['error']) return $this->messageSuccess($res); 
+
+		return $this->messageError('sql error!',$res);
+	}
+
+	function ccmd_vmTemplateEditInfo(){
+		if(!isset($this->form['template_id'])) return $this->messageError('incorrect data!');
+
+		$tpl_id=(int)$this->form['template_id'];
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return $this->messageError('DB connection error!');
+
+		$res=$db->selectOne(
+			"select name,description,pkg_vm_ram,pkg_vm_disk,pkg_vm_cpus from vmpackages where id=?",
+			array([$tpl_id, PDO::PARAM_INT])
+		);
+		return $this->messageSuccess(array('vars'=>$res,'template_id'=>$tpl_id));
+	}
+
+	function ccmd_vmTemplateEdit(){
+		$id=$this->form['template_id'];
+		if(!isset($id) || $id<1) $this->messageError('wrong data!');
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return $this->messageError('db connection error!');
+
+		$query="update vmpackages set
+			name=?,description=?, pkg_vm_ram=?,pkg_vm_disk=?, pkg_vm_cpus=?, owner=?, timestamp=datetime('now','localtime')
+			where id=?";
+
+		$res=$db->update($query, array(
+			[$this->form['name'], PDO::PARAM_STR],
+			[$this->form['description'], PDO::PARAM_STR],
+			[$this->form['pkg_vm_ram'],  PDO::PARAM_STR],
+			[$this->form['pkg_vm_disk'], PDO::PARAM_STR],
+			[$this->form['pkg_vm_cpus'], PDO::PARAM_STR],
+			[$this->_user_info['username'], PDO::PARAM_STR],
+			[(int)$id, PDO::PARAM_INT]
+		));
+		if($res!==false) return $this->messageSuccess($res);
+
+		return $this->messageError('sql error!');
+	}
+
+	function ccmd_vmTemplateRemove(){
+		$id=$this->form['template_id'];
+		if(!is_numeric($id) || (int)$id <= 0) return $this->messageError('wrong data!');
+
+		$query="DELETE FROM vmpackages WHERE id=?";
+		$db=new Db('base','local');
+		if(!$db->isConnected()) return $this->messageError('DB connection error!');
+
+		$res=$db->select($query, array([$id, PDO::PARAM_INT]));
+		return $this->messageSuccess($res);
+	}
+
+	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);
+	}
+
+	function getImportedImages(){
+		$images=array();
+		$path=$this->media_import;
+		$files=$this->getImagesList($path);
+		foreach($files as $key=>$file){
+			if(file_exists($file['fullname'])){
+				$fp=fopen($file['fullname'],'r');
+				$buf=fread($fp,300);
+				fclose($fp);
+
+				$res=$this->getImageVar('emulator',$buf);
+				$res1=$this->getImageVar('jname',$buf);
+				if(isset($res)) $files[$key]['type']=$res;
+				if(isset($res1)) $files[$key]['jname']=$res1;
+			}
+		}
+		return $files;
+	}
+
+	function ccmd_getImportedImageInfo(){
+		$form=$this->form;
+		$name=$form['id'];
+		$info=$this->getImageInfo($name);
+		return $info;
+	}
+
+	function getImagesList($path){
+		$files=array();
+		foreach (glob($path."*.img") as $filename)
+		{
+			$info=pathinfo($filename);
+			$arr=array(
+				'name'=>$info['basename'],
+				'fullname'=>$filename,
+			);
+			$files[]=$arr;
+		}
+		return $files;
+	}
+
+	function getImageInfo($imgname){
+		if(empty($imgname)) return false;
+
+		$file=$this->media_import.$imgname;
+		if(!file_exists($file)) return false;
+
+		$fp=fopen($file,'r');
+		$buf=fread($fp,300);
+		fclose($fp);
+
+		$type=$this->getImageVar('emulator',$buf);
+		$jname=$this->getImageVar('jname',$buf);
+		$orig_jname=$jname;
+		$ip=$this->getImageVar('ip4_addr',$buf);
+		$hostname=$this->getImageVar('host_hostname',$buf);
+
+		$name_comment='';
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$jail=$db->selectOne("SELECT jname FROM jails WHERE jname=?", array([$jname]));
+
+			if($jname==$jail['jname']){
+				$jres=$this->ccmd_getFreeJname(false,$type);
+				if($jres['error']) return $this->messageError('Something wrong...');
+				$jname=$jres['freejname'];
+				$name_comment='* '.$this->translate('Since imported name already exist, we are change it');
+			}
+		}
+
+		return array('orig_jname'=>$orig_jname,'jname'=>$jname,'host_hostname'=>$hostname,'ip4_addr'=>$ip,'file_id'=>$imgname,
+					'type'=>$type,'name_comment'=>$name_comment);
+	}
+
+	function getImageVar($name,$buf){
+		$val=false;
+		$pat='#'.$name.'="([^\"]*)"#';
+		preg_match($pat,$buf,$res);
+		if(!empty($res)) $val=$res[1];
+		return $val;
+	}
+
+	function ccmd_imageExport(){
+		// cbsd jexport jname=XXX dstdir=
+		$jname=$this->form['id'];
+		if(empty($jname)) $this->messageError('Jname is incorrect in export command! Is «'.$jname.'».');
+
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} jexport gensize=1 jname=%s dstdir=%s',
+			array($this->_user_info['username'], $jname, $this->media_import)
+		);
+	}
+
+	function ccmd_imageImport(){
+
+		$file_id=$this->form['file_id'];
+		$jname=$this->form['jname'];
+		$res=$this->getImageInfo($file_id);
+		if($res===false) return $this->messageError('File not found!');
+
+		$cmd = 'task owner=%s mode=new {cbsd_loc} jimport ';
+		$attrs=array($this->_user_info['username']);
+
+		if($jname!=$res['orig_jname']) {
+			$cmd .= 'new_jname=%s ';
+			$attrs[]= $jname;
+		}
+
+		if($this->form['ip4_addr']!=$res['ip4_addr']){
+			$cmd .= 'new_ip4_addr=%s ';
+			$attrs[]=$this->form['ip4_addr'];
+		}
+
+		if($this->form['host_hostname']!=$res['host_hostname']) {
+			$cmd .= 'new_host_hostname=%s ';
+			$attrs[]=$this->form['host_hostname'];
+		}
+
+		$cmd .= 'jname=%s';
+		$attrs[]=$file;
+
+		return CBSD::run($cmd, $attrs);
+	}
+
+	function ccmd_imageRemove(){
+		return CBSD::run(
+			'task owner=%s mode=new {cbsd_loc} imgremove path=%s img=$s',
+			array($this->_user_info['username'], $this->media_import, $this->form['jname'])
+		);
+	}
+
+	function ccmd_getSummaryInfo(){
+
+		if(!isset($this->form['mode'])) $this->form['mode']='';
+		$jail_name=$this->form['jname'];
+		$res=array();
+
+		if(empty($jail_name)) return $res;
+
+		$res['jname']=$jail_name;
+
+		$db=new Db('racct',array('jname'=>$jail_name));
+		if($db->isConnected()){
+			$quer=$db->select("SELECT ? as name,idx as time,memoryuse,pcpu,pmem,maxproc,openfiles,readbps, writebps,readiops,writeiops 
+								FROM racct ORDER BY idx DESC LIMIT 25;", array([$jail_name]));	// where idx%5=0
+			$res['__all']=$quer;
+		}
+
+		if($this->form['mode'] == 'bhyveslist'){
+			$res['properties']=$this->getSummaryInfoBhyves();
+			return $res;
+		}
+
+		//$workdir/jails-system/$jname/descr
+		$filename=$this->workdir.'/jails-system/'.$jail_name.'/descr';
+		if(file_exists($filename)) $res['description']=nl2br(file_get_contents($filename));
+
+		$sql="SELECT host_hostname,ip4_addr,allow_mount,allow_nullfs,allow_fdescfs,interface,baserw,mount_ports,
+			  astart,vnet,mount_fdescfs,allow_tmpfs,allow_zfs,protected,allow_reserved_ports,allow_raw_sockets,
+			  allow_fusefs,allow_read_msgbuf,allow_vmm,allow_unprivileged_proc_debug
+			  FROM jails WHERE jname=?";
+		$db=new Db('base','local');
+		if($db->isConnected()){
+			$quer=$db->selectOne($sql, array([$jail_name]));
+			$html='';
+
+			foreach($quer as $q=>$k){
+				if(is_numeric($k) && ($k==0 || $k==1)) $k=($k==0)?'no':'yes';
+				$html.='| '.$this->translate($q).' | '.$this->translate($k).' | 
';
+			}
+
+			$html.='
';
+			$res['properties']=$html;
+		}
+
+		return $res;
+	}
+
+	function getSummaryInfoBhyves(){
+
+		$res='';
+
+		/*
+		$bool=array(
+			'created','astart','vm_cpus','vm_os_type','vm_boot','vm_os_profile','bhyve_flags',
+			'vm_vnc_port','bhyve_vnc_tcp_bind','bhyve_vnc_resolution','ip4_addr','state_time',
+			'cd_vnc_wait','protected','hidden','maintenance','media_auto_eject','jailed'
+		);
+		*/
+		$bool=array('astart','hidden','jailed','cd_vnc_wait','protected','media_auto_eject');
+		$chck=array(
+			'bhyve_generate_acpi','bhyve_wire_memory','bhyve_rts_keeps_utc','bhyve_force_msi_irq',
+			'bhyve_x2apic_mode','bhyve_mptable_gen','bhyve_ignore_msr_acc','xhci'
+		);
+
+		$db=new Db('bhyve',array('jname'=>$this->form['jname']));
+		if($db->isConnected()) {
+			$sql="SELECT created, astart, vm_cpus, vm_ram, vm_os_type, vm_boot, vm_os_profile, bhyve_flags,
+				vm_vnc_port, virtio_type, bhyve_vnc_tcp_bind, bhyve_vnc_resolution, cd_vnc_wait,
+				protected, hidden, maintenance, ip4_addr, vnc_password, state_time,
+				vm_hostbridge, vm_iso_path, vm_console, vm_efi, vm_rd_port, bhyve_generate_acpi,
+				bhyve_wire_memory, bhyve_rts_keeps_utc, bhyve_force_msi_irq, bhyve_x2apic_mode,
+				bhyve_mptable_gen, bhyve_ignore_msr_acc, bhyve_vnc_vgaconf text, media_auto_eject,
+				vm_cpu_topology, debug_engine, xhci, cd_boot_firmware, jailed FROM settings";
+			$quer=$db->selectOne($sql, array());
+			$html='';
+
+			foreach($quer as $q=>$k){
+				if(in_array($q,$bool)) $k=($k==0)?'no':'yes';
+				if(in_array($q,$chck)) $k=($k==0)?'no':'yes';
+
+				if($q=='vm_ram') $k=$this->fileSizeConvert($k);
+				if($q=='state_time') $k=date('d.m.Y H:i:s',$k);
+
+				$html.='| '.$this->translate($q).' | '.$this->translate($k).' | 
';
+			}
+
+			$html.='
';
+			$res=$html;
+
+		}
+
+		return $res;
+	}
 }
\ No newline at end of file