name = 'Snapin Management'; parent::__construct($name); self::$argTypes = array( 'MSI' => array('msiexec.exe','/i','/quiet'), 'Batch Script' => array('cmd.exe','/c'), 'Bash Script' => array('/bin/bash'), 'VB Script' => array('cscript.exe'), 'Powershell' => array('powershell.exe','-ExecutionPolicy Bypass -NoProfile -File'), 'Mono' => array('mono'), ); //$this->menu['maker'] = _('SnapinPack Config'); if ($_REQUEST['id']) { $this->subMenu = array( "$this->linkformat#snap-gen" => self::$foglang['General'], "$this->linkformat#snap-storage" => sprintf('%s %s',self::$foglang['Storage'],self::$foglang['Group']), $this->membership => self::$foglang['Membership'], $this->delformat => self::$foglang['Delete'], ); $this->notes = array( self::$foglang['Snapin'] => $this->obj->get('name'), self::$foglang['File'] => $this->obj->get('file'), ); } self::$HookManager->processEvent('SUB_MENULINK_DATA',array('menu'=>&$this->menu,'submenu'=>&$this->subMenu,'id'=>&$this->id,'notes'=>&$this->notes,'object'=>&$this->obj,'linkformat'=>&$this->linkformat,'delformat'=>&$this->delformat,'membership'=>&$this->membership)); $this->headerData = array( '', _('Snapin Name'), _('Is Pack'), _('Storage Group'), ); $this->templates = array( '', sprintf('${name}', $this->node, $this->id, _('Edit')), '${packtype}', '${storage_group}', ); $this->attributes = array( array('class'=>'l filter-false','width'=>16), array(), array('class'=>'c','width'=>50), array('class'=>'r'), ); self::$returnData = function(&$Snapin) { if (!$Snapin->isValid()) return; $this->data[] = array( 'id' => $Snapin->get('id'), 'name' => $Snapin->get('name'), 'storage_group' => $Snapin->getStorageGroup()->get('name'), 'description' => $Snapin->get('description'), 'file' => $Snapin->get('file'), 'packtype' => $Snapin->get('packtype') ? _('Yes') : _('No'), ); unset($Snapin); }; } private function maker() { $args = array( 'MSI'=>array('msiexec.exe','/i "[FOG_SNAPIN_PATH]\MyMSI.msi"'), 'MSI + MST'=>array('msiexec.exe','/i "[FOG_SNAPIN_PATH]\MyMST.mst"'), 'Batch Script'=>array('cmd.exe','/c "[FOG_SNAPIN_PATH]\MyScript.bat"'), 'Bash Script'=>array('/bin/bash','"[FOG_SNAPIN_PATH]/MyScript.sh"'), 'VB Script'=>array('cscript.exe','"[FOG_SNAPIN_PATH]\MyScript.vbs"'), 'PowerShell Script'=>array('powershell.exe','-ExecutionPolicy Bypass -File "[FOG_SNAPIN_PATH]\MyScript.ps1"'), 'EXE'=>array('[FOG_SNAPIN_PATH]\MyFile.exe'), 'Mono'=>array('mono','"[FOG_SNAPIN_PATH]/MyFile.exe"'), ); ob_start(); printf(''; return ob_get_clean(); } public function index() { $this->title = _('All Snap-ins'); if (self::getSetting('FOG_DATA_RETURNED') > 0 && self::getClass('SnapinManager')->count() > self::getSetting('FOG_DATA_RETURNED') && $_REQUEST['sub'] != 'list') $this->redirect(sprintf('?node=%s&sub=search',$this->node)); $this->data = array(); array_map(self::$returnData,(array)self::getClass($this->childClass)->getManager()->find()); self::$HookManager->processEvent('SNAPIN_DATA',array('headerData'=>&$this->headerData,'data'=>&$this->data,'templates'=>&$this->templates,'attributes'=>&$this->attributes)); $this->render(); } public function search_post() { $this->data = array(); array_map(self::$returnData,(array)self::getClass($this->childClass)->getManager()->search('',true)); self::$HookManager->processEvent('SNAPIN_DATA',array('headerData'=>&$this->headerData,'data'=>&$this->data,'templates'=>&$this->templates,'attributes'=>&$this->attributes)); $this->render(); } public function add() { $this->title = _('Add New Snapin'); unset($this->headerData); $this->attributes = array( array(), array(), ); $this->templates = array( '${field}', '${input}', ); self::$selected = isset($_REQUEST['snapinfileexist']) ? basename($_REQUEST['snapinfileexist']) : ''; $filelist = array(); array_map(function(&$StorageNode) use (&$filelist) { if (!$StorageNode->isValid()) return; if (!$StorageNode->isValid()) return; $filelist = array_merge((array)$filelist,(array)$StorageNode->get('snapinfiles')); unset($StorageNode); },self::getClass('StorageNodeManager')->find(array('isMaster'=>1,'isEnabled'=>1))); natcasesort($filelist); $filelist = array_values(array_unique(array_filter((array)$filelist))); ob_start(); array_map(self::$buildSelectBox,$filelist); $selectFiles = sprintf('',_('Please select an option'),ob_get_clean()); $argTypes = array( 'MSI' => array('msiexec.exe','/i','/quiet'), ); ob_start(); printf(''; $GroupCount = self::getSubObjectIDs('StorageGroup'); unset($groupselect); if (count($GroupCount) === 1) $groupselect = array_shift($GroupCount); $StorageGroups = self::getClass('StorageGroupManager')->buildSelectBox($_REQUEST['storagegroup'] ? $_REQUEST['storagegroup'] : (isset($groupselect) ? $groupselect : '')); $template1 = ob_get_clean(); $template2 = $this->maker(); $fields = array( _('Snapin Name') => sprintf('',$_REQUEST['name']), _('Snapin Storage Group') => $StorageGroups, _('Snapin Type')=> sprintf('',!$_REQUEST['packtype'] ? ' selected' : '',_('Normal Snapin'),$_REQUEST['packtype'] ? ' selected' : '',_('Snapin Pack')), _('Snapin Description') => sprintf('',$_REQUEST['description']), sprintf('%s%s',_('Snapin Template'),_('Snapin Pack Template')) => sprintf('%s%s',$template1,$template2), sprintf('%s%s',_('Snapin Run With'),_('Snapin Pack File')) => sprintf('',$_REQUEST['rw']), sprintf('%s%s',_('Snapin Run With Argument'),_('Snapin Pack Arguments')) => sprintf('',$_REQUEST['rwa']), sprintf('%s %s:%s',_('Snapin File'),_('Max Size'),ini_get('post_max_size')) => sprintf('',$_FILES['snapin']['name']), (count($filelist) > 0 ? _('Snapin File (exists)') : '') => (count($filelist) > 0 ? $selectFiles : ''), sprintf('%s',_('Snapin Arguments')) => sprintf('',$_REQUEST['args']), _('Snapin Enabled') => '', _('Snapin Arguments Hidden?') => '', _('Snapin Timeout (seconds)') => '', _('Replicate?') => '', _('Reboot after install') => '', _('Shutdown after install') => '', _('Snapin Command') => '', ' ' => sprintf('',_('Add')) ); unset($files,$selectFiles); printf('
'; unset($this->data,$this->templates,$this->attributes,$this->headerData); } public function add_post() { self::$HookManager->processEvent('SNAPIN_ADD_POST'); try { $snapinName = trim($_REQUEST['name']); if (!$snapinName) throw new Exception(_('Please enter a name to give this Snapin')); if (self::getClass('SnapinManager')->exists($snapinName)) throw new Exception(_('Snapin with that name already exists')); if (!$_REQUEST['storagegroup']) throw new Exception(_('Please select a storage group for this snapin to reside in')); $snapinfile = trim(basename($_REQUEST['snapinfileexist'])); $uploadfile = trim(basename($_FILES['snapin']['name'])); if ($uploadfile) $snapinfile = $uploadfile; if (!$snapinfile) throw new Exception(_('A file to use for the snapin must be either uploaded or chosen from the already present list')); $snapinfile = preg_replace('/[^-\w\.]+/','_',$snapinfile); if (!$_REQUEST['storagegroup']) throw new Exception(_('Must have snapin associated to a group')); $StorageNode = self::getClass('StorageGroup',$_REQUEST['storagegroup'])->getMasterStorageNode(); if (!$snapinfile && $_FILES['snapin']['error'] > 0) throw new UploadException($_FILES['snapin']['error']); $src = sprintf('%s/%s',dirname($_FILES['snapin']['tmp_name']),basename($_FILES['snapin']['tmp_name'])); $dest = sprintf('/%s/%s',trim($StorageNode->get('snapinpath'),'/'),$snapinfile); if ($uploadfile) { self::$FOGFTP ->set('host',$StorageNode->get('ip')) ->set('username',$StorageNode->get('user')) ->set('password',$StorageNode->get('pass')); if (!self::$FOGFTP->connect()) throw new Exception(sprintf('%s: %s %s',_('Storage Node'),$StorageNode->get('ip'),_('FTP Connection has failed'))); if (!self::$FOGFTP->chdir($StorageNode->get('snapinpath'))) { if (!self::$FOGFTP->mkdir($StorageNode->get('snapinpath'))) throw new Exception(_('Failed to add snapin, unable to locate snapin directory.')); } if (is_file($dest)) self::$FOGFTP->delete($dest); if (!self::$FOGFTP->put($dest,$src)) throw new Exception(_('Failed to add/update snapin file')); self::$FOGFTP->chmod(0755,$dest); self::$FOGFTP->close(); } $Snapin = self::getClass('Snapin') ->set('name',$snapinName) ->set('packtype',$_REQUEST['packtype']) ->set('description',$_REQUEST['description']) ->set('file',$snapinfile) ->set('args',$_REQUEST['args']) ->set('reboot',(isset($_REQUEST['action']) && $_REQUEST['action'] === 'reboot')) ->set('shutdown',(string)intval((isset($_REQUEST['action']) && $_REQUEST['action'] === 'shutdown'))) ->set('runWith',$_REQUEST['rw']) ->set('runWithArgs',$_REQUEST['rwa']) ->set('isEnabled',(string)intval(isset($_REQUEST['isEnabled']))) ->set('toReplicate',(string)intval(isset($_REQUEST['toReplicate']))) ->set('hide',(string)intval(isset($_REQUEST['isHidden']))) ->set('timeout',$_REQUEST['timeout']) ->addGroup($_REQUEST['storagegroup']); if (!$Snapin->save()) throw new Exception(_('Add snapin failed!')); self::$HookManager->processEvent('SNAPIN_ADD_SUCCESS',array('Snapin'=>&$Snapin)); $this->setMessage(_('Snapin added, Editing now!')); $this->redirect(sprintf('?node=%s&sub=edit&%s=%s', $_REQUEST['node'],$this->id,$Snapin->get('id'))); } catch (Exception $e) { self::$FOGFTP->close(); self::$HookManager->processEvent('SNAPIN_ADD_FAIL',array('Snapin'=>&$Snapin)); $this->setMessage($e->getMessage()); $this->redirect($this->formAction); } } public function edit() { $this->title = sprintf('%s: %s',_('Edit'),$this->obj->get('name')); unset($this->headerData); $this->attributes = array( array(), array(), ); $this->templates = array( '${field}', '${input}', ); self::$selected = $this->obj->get('file'); $filelist = array(); array_map(function(&$StorageNode) use (&$filelist) { if (!$StorageNode->isValid()) return; $filelist = array_merge((array)$filelist,(array)$StorageNode->get('snapinfiles')); unset($StorageNode); },self::getClass('StorageNodeManager')->find(array('isMaster'=>1,'isEnabled'=>1))); natcasesort($filelist); $filelist = array_values(array_filter(array_unique((array)$filelist))); ob_start(); array_map(self::$buildSelectBox,$filelist); $selectFiles = sprintf('',_('Please select an option'),ob_get_clean()); ob_start(); printf(''; $template1 = ob_get_clean(); $template2 = $this->maker(); $fields = array( _('Snapin Name') => sprintf('',$this->obj->get('name')), _('Snapin Type')=> sprintf('',!$this->obj->get('packtype') ? ' selected' : '',_('Normal Snapin'),$this->obj->get('packtype') ? ' selected' : '',_('Snapin Pack')), _('Snapin Description') => sprintf('',$this->obj->get('description')), sprintf('%s%s',_('Snapin Template'),_('Snapin Pack Template')) => sprintf('%s%s',$template1,$template2), sprintf('%s%s',_('Snapin Run With'),_('Snapin Pack File')) => sprintf('',$this->obj->get('runWith')), sprintf('%s%s',_('Snapin Run With Argument'),_('Snapin Pack Arguments')) => sprintf('',$this->obj->get('runWithArgs')), sprintf('%s %s:%s',_('Snapin File'),_('Max Size'),ini_get('post_max_size')) => sprintf('',basename($this->obj->get('file'))), (count($filelist) > 0 ? _('Snapin File (exists)') : '') => (count($filelist) > 0 ? $selectFiles : ''), sprintf('%s',_('Snapin Arguments')) => sprintf('',$this->obj->get('args')), _('Protected') => sprintf('',$this->obj->get('protected') ? ' checked' : ''), _('Reboot after install') => sprintf('',$this->obj->get('reboot') ? ' checked' : ''), _('Shutdown after install') => sprintf('',$this->obj->get('shutdown') ? ' checked' : ''), _('Snapin Enabled') => sprintf('',$this->obj->get('isEnabled') ? ' checked' : ''), _('Replicate?') => sprintf('',$this->obj->get('toReplicate') ? ' checked' : ''), _('Snapin Arguments Hidden?') => sprintf('',$this->obj->get('hide') ? ' checked' : ''), _('Snapin Timeout (seconds)') => sprintf('',$this->obj->get('timeout')), _('Snapin Command') => '', '' => sprintf('',_('Update')), ); echo '