12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238 |
- <?php
- /**
- * Equipment configuration backup aka Envy implementation
- */
- class Envy {
- /**
- * Contains system billing.ini config as key=>value
- *
- * @var array
- */
- protected $billCfg = array();
- /**
- * System alter.ini config stored as key=>value
- *
- * @var array
- */
- protected $altCfg = array();
- /**
- * Contains all available devices models
- *
- * @var array
- */
- protected $allModels = array();
- /**
- * Contains filtered devices which need to be backuped as switchid=>data
- *
- * @var array
- */
- protected $allDevices = array();
- /**
- * Contains available envy-scripts as modelid=>data
- *
- * @var array
- */
- protected $allScripts = array();
- /**
- * Contain all available switches as switchid=>data
- *
- * @var arrays
- */
- protected $allSwitches = array();
- /**
- * Contains all available previously stored device configs from db as id=>recordData
- *
- * @var array
- */
- protected $allConfigs = array();
- /**
- * Envy devices data model placeholder
- *
- * @var object
- */
- protected $devices = '';
- /**
- * Envy scripts data model placeholder
- *
- * @var object
- */
- protected $scripts = '';
- /**
- * Envy archive data model placeholder
- *
- * @var object
- */
- protected $archive = '';
- /**
- * System messages helper object placeholder
- *
- * @var object
- */
- protected $messages = '';
- /**
- * Contains process manager instance
- *
- * @var object
- */
- protected $stardust = '';
- /**
- * Some other required consts for routing etc
- */
- const URL_ME = '?module=envy';
- const TMP_PATH = 'exports/';
- const SCRIPT_PREFIX = 'ENVYSCRIPT_';
- const DL_PREFIX = 'ENVYCONFIG_';
- const ROUTE_SCRIPTS = 'scriptsmgr';
- const ROUTE_DEVICES = 'devicesmgr';
- const ROUTE_DIFF = 'diff';
- const ROUTE_ARCHVIEW = 'viewarchiveid';
- const ROUTE_ARCHALL = 'archiveall';
- const ROUTE_ARCHIVE_AJ = 'ajarchive';
- const ROUTE_FILTER = 'devicefilter';
- const ROUTE_CLEANUP = 'cleanuparchive';
- const ENVYPROC_PID = 'ENVYPROC_';
- /**
- * ___ _ ____ ___ _
- * / _ \ '_ \ \ / / | | |
- * | __/ | | \ V /| |_| |
- * \___|_| |_|\_/ \__, |
- * __/ |
- * |___/
- */
- /**
- * Creates new envy sin instance
- */
- public function __construct() {
- $this->initMessages();
- $this->loadConfigs();
- $this->loadAlter();
- $this->loadDeviceModels();
- $this->loadSwitches();
- $this->initScrips();
- $this->initStarDust();
- $this->loadScripts();
- $this->initDevices();
- $this->loadDevices();
- $this->initArchive();
- $this->loadArchive();
- }
- /**
- * Loads all required configs into protected props
- *
- * @global object $ubillingConfig
- *
- * @return
- */
- protected function loadConfigs() {
- global $ubillingConfig;
- $this->billCfg = $ubillingConfig->getBilling();
- $this->ubConfig = $ubillingConfig;
- }
- /**
- * Loads system alter.ini config into private data property
- *
- * @return void
- */
- protected function loadAlter() {
- $this->altCfg = $this->ubConfig->getAlter();
- }
- /**
- * Creates new message helper instance
- *
- * @return void
- */
- protected function initMessages() {
- $this->messages = new UbillingMessageHelper();
- }
- /**
- * Creates new devices data model instance
- *
- * @return void
- */
- protected function initDevices() {
- $this->devices = new NyanORM('envydevices');
- }
- /**
- * Creates new scrips data model instance
- *
- * @return void
- */
- protected function initScrips() {
- $this->scripts = new NyanORM('envyscripts');
- }
- /**
- * Creates new archive data model instance
- *
- * @return void
- */
- protected function initArchive() {
- $this->archive = new NyanORM('envydata');
- }
- /**
- * Inits process manager
- *
- * @return void
- */
- protected function initStarDust() {
- $this->stardust = new StarDust();
- }
- /**
- * Performs check of Switch envy process lock via DB.
- * Using this only for checks of possibility real collector runs.
- *
- * @param int $swId
- *
- * @return bool
- */
- protected function isProcessLocked($swIP) {
- $this->stardust->setProcess(self::ENVYPROC_PID . $swIP);
- $result = $this->stardust->isRunning();
- return($result);
- }
- /**
- * Updates some Switch process stats
- *
- * @param int $swIP Existing Switch IP
- * @param int $processStartTime process start timestame
- * @param int $processEndTime process end timestamp
- * @param bool $finished process finished or not flag
- *
- * @return void
- */
- protected function processStatsUpdate($swIP, $finished = false) {
- //collector process locking and releasing of locks here
- if ($finished) {
- //release lock
- $this->stardust->setProcess(self::ENVYPROC_PID . $swIP);
- $this->stardust->stop();
- } else {
- //set lock for process of some DevID
- $this->stardust->setProcess(self::ENVYPROC_PID . $swIP);
- $this->stardust->start();
- }
- }
- /**
- * Loads all available envy devices from database for further usage
- *
- * @return void
- */
- protected function loadDevices() {
- $this->allDevices = $this->devices->getAll('switchid');
- }
- /**
- * Loads all available envy scripts from database for further usage
- *
- * @return void
- */
- protected function loadScripts() {
- $this->allScripts = $this->scripts->getAll('modelid');
- }
- /**
- * Loads available device models from database
- *
- * @return void
- */
- protected function loadDeviceModels() {
- $this->allModels = zb_SwitchModelsGetAll();
- }
- /**
- * Loads all existing swithes directory from database into protected prop
- *
- * @return void
- */
- protected function loadSwitches() {
- $switchesTmp = zb_SwitchesGetAll();
- if (!empty($switchesTmp)) {
- foreach ($switchesTmp as $io => $each) {
- $this->allSwitches[$each['id']] = $each;
- }
- }
- }
- /**
- * Loads existing archive records from database
- *
- * @return void
- */
- protected function loadArchive() {
- $this->archive->selectable(array('id', 'date', 'switchid'));
- $this->archive->orderBy('id', 'ASC'); // must be from old to new due the getLastDate mechanics
- $this->allConfigs = $this->archive->getAll('id');
- }
- /**
- * Renders envy-script creation form
- *
- * @return string
- */
- protected function renderScriptCreateForm() {
- $result = '';
- if (!empty($this->allModels)) {
- $inputs = '';
- $modelsTmp = array();
- foreach ($this->allModels as $io => $each) {
- if (!isset($this->allScripts[$each['id']])) {
- $modelsTmp[$each['id']] = $each['modelname'];
- }
- }
- /**
- * I am the way and the truth and the life. No one comes to the Father except through me
- */
- $inputs .= wf_Selector('newscriptmodel', $modelsTmp, __('Model'), '', true);
- $inputs .= __('Script') . wf_tag('br');
- $inputs .= wf_TextArea('newscriptdata', '', '', true, '60x20');
- $inputs .= wf_Submit(__('Create'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- } else {
- show_error(__('Available switch models') . ': ' . __('No'));
- }
- return($result);
- }
- /**
- * Renders envy-script editing form
- *
- * @return string
- */
- protected function renderScriptEditForm($modelId) {
- $result = '';
- $modelId = ubRouting::filters($modelId, 'int');
- if (isset($this->allScripts[$modelId])) {
- $scriptData = $this->allScripts[$modelId];
- $inputs = '';
- $inputs .= wf_HiddenInput('editscriptid', $scriptData['id']);
- $inputs .= wf_HiddenInput('editscriptmodel', $scriptData['modelid'], __('Model'), '', true);
- $inputs .= __('Script') . wf_tag('br');
- $inputs .= wf_TextArea('editscriptdata', '', $scriptData['data'], true, '60x20');
- $inputs .= wf_Submit(__('Save'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- }
- return($result);
- }
- /**
- * Creates new envy script preset in database
- *
- * @param int $modelId
- * @param string $scriptData
- *
- * @return void/string on error
- */
- public function createScript($modelId, $scriptData) {
- $result = '';
- $modelId = ubRouting::filters($modelId, 'int');
- $scriptData = ubRouting::filters($scriptData, 'mres');
- if (!empty($modelId)) {
- if (!isset($this->allScripts[$modelId])) {
- $this->scripts->data('modelid', $modelId);
- $this->scripts->data('data', $scriptData);
- $this->scripts->create();
- $newId = $this->scripts->getLastId();
- log_register('ENVY CREATE SCRIPT [' . $newId . '] MODEL [' . $modelId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_ALREADY_EXISTS';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_NOMODELID';
- }
- return($result);
- }
- /**
- * Saves changes in envy script
- *
- * @return void/string on error
- */
- public function saveScript() {
- $result = '';
- if (ubRouting::checkPost(array('editscriptid', 'editscriptmodel'))) {
- $scriptId = ubRouting::post('editscriptid', 'int');
- $modelId = ubRouting::post('editscriptmodel', 'int');
- $scriptData = ubRouting::post('editscriptdata', 'mres');
- if (isset($this->allScripts[$modelId])) {
- $this->scripts->where('id', '=', $scriptId);
- $this->scripts->data('data', $scriptData);
- $this->scripts->save();
- log_register('ENVY CHANGE SCRIPT [' . $scriptId . '] MODEL [' . $modelId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGMODELID';
- }
- }
- return($result);
- }
- /**
- * Deletes existing envy script from database
- *
- * @param int $modelId
- *
- * @return void/string on result
- */
- public function deleteScript($modelId) {
- $result = '';
- $modelId = ubRouting::filters($modelId, 'int');
- if (!empty($modelId)) {
- if (isset($this->allScripts[$modelId])) {
- $scriptData = $this->allScripts[$modelId];
- $this->scripts->where('modelid', '=', $modelId);
- $this->scripts->delete();
- log_register('ENVY DELETE SCRIPT [' . $scriptData['id'] . '] MODEL [' . $modelId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGMODELID';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_NOMODELID';
- }
- return($result);
- }
- /**
- * Renders available envy scripts and some controls
- *
- * @return string
- */
- public function renderScriptsList() {
- $result = '';
- $allModelNames = array();
- if (!empty($this->allModels)) {
- foreach ($this->allModels as $io => $each) {
- $allModelNames[$each['id']] = $each['modelname'];
- }
- }
- if (!empty($this->allScripts)) {
- $cells = wf_TableCell(__('Equipment models'));
- $cells .= wf_TableCell(__('Actions'));
- $rows = wf_TableRow($cells, 'row1');
- foreach ($this->allScripts as $io => $each) {
- $cells = wf_TableCell(@$allModelNames[$each['modelid']]);
- $scriptControls = '';
- $scriptControls .= wf_JSAlert(self::URL_ME . '&deletescript=' . $each['modelid'], web_delete_icon(), $this->messages->getDeleteAlert()) . ' ';
- $scriptControls .= wf_modalAuto(web_edit_icon(), __('Edit') . ' ' . @$allModelNames[$each['modelid']], $this->renderScriptEditForm($each['modelid']));
- $cells .= wf_TableCell($scriptControls);
- $rows .= wf_TableRow($cells, 'row5');
- }
- $result .= wf_TableBody($rows, '100%', 0, 'sortable');
- } else {
- $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'warning');
- }
- return($result);
- }
- /**
- * Renders default controls panel for module
- *
- * @return string
- */
- public function renderControls() {
- $result = '';
- if (ubRouting::checkGet(self::ROUTE_SCRIPTS) OR ubRouting::checkGet(self::ROUTE_DEVICES) OR ubRouting::checkGet(self::ROUTE_DIFF)) {
- if (!ubRouting::checkGet('devfilter')) {
- $result .= wf_BackLink(self::URL_ME) . ' '; //default back control
- } else {
- $result .= wf_BackLink(self::URL_ME . '&' . self::ROUTE_DEVICES . '=true') . ' '; //devfiltered diff backs to device manager
- }
- } else {
- $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_SCRIPTS . '=true', wf_img('skins/switch_models.png') . ' ' . __('Scripts'), false, 'ubButton') . ' ';
- $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_DEVICES . '=true', wf_img('skins/ymaps/switchdir.png') . ' ' . __('Devices'), false, 'ubButton') . ' ';
- $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_DIFF . '=true', wf_img('skins/diff_icon.png') . ' ' . __('Changes'), false, 'ubButton') . ' ';
- $cleanupAlert = __('All configs for each of devices will be deletet from the archive except the last one');
- $result .= wf_ConfirmDialog(self::URL_ME . '&' . self::ROUTE_CLEANUP . '=true', wf_img('skins/icon_cleanup.png') . ' ' . __('Cleanup'), $cleanupAlert, 'ubButton', self::URL_ME);
- }
- if (ubRouting::checkGet(self::ROUTE_SCRIPTS)) {
- $result .= wf_modalAuto(web_icon_create() . ' ' . __('Create new script'), __('Create new script'), $this->renderScriptCreateForm(), 'ubButton') . ' ';
- }
- if (ubRouting::checkGet(self::ROUTE_DEVICES)) {
- $result .= wf_modalAuto(web_icon_create() . ' ' . __('Create new device'), __('Create new device'), $this->renderDeviceCreateForm(), 'ubButton') . ' ';
- $saveAllNotice = $this->messages->getEditAlert() . ' ' . __('Store all devices configs into archive') . '?';
- $result .= wf_JSAlert(self::URL_ME . '&' . self::ROUTE_ARCHALL . '=true', wf_img('skins/icon_restoredb.png') . ' ' . __('Store all'), $saveAllNotice, '', 'ubButton');
- }
- return($result);
- }
- /**
- * Renders new device creation form
- *
- * @return string
- */
- public function renderDeviceCreateForm() {
- $result = '';
- $switchesTmp = array();
- if (!empty($this->allSwitches)) {
- if (!empty($this->allScripts)) {
- foreach ($this->allSwitches as $io => $each) {
- if (!isset($this->allDevices[$each['id']])) {
- if (isset($this->allScripts[$each['modelid']])) {
- $switchesTmp[$each['id']] = $each['ip'] . ' - ' . $each['location'];
- }
- }
- }
- $inputs = '';
- $inputs .= wf_Selector('newdeviceswitchid', $switchesTmp, __('Switch'), '', true);
- $inputs .= wf_TextInput('newdevicelogin', __('Login'), '', true, '');
- $inputs .= wf_PasswordInput('newdevicepassword', __('Password'), '', true, '');
- $inputs .= wf_PasswordInput('newdeviceenablepassword', __('Enable password'), '', true, '');
- $inputs .= wf_TextInput('newdevicecustom1', __('Custom field'), '', true, '');
- $inputs .= wf_TextInput('newdevicecutstart', __('Lines to cut at start'), '0', true, '');
- $inputs .= wf_TextInput('newdevicecutend', __('Lines to cut at end'), '0', true, '');
- $inputs .= wf_TextInput('newdeviceport', __('Port'), '', true, '');
- $inputs .= wf_CheckInput('newdeviceactive', __('Active'), true, true);
- $inputs .= wf_delimiter(0);
- $inputs .= wf_Submit(__('Create'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- } else {
- $result .= $this->messages->getStyledMessage(__('Available envy scripts') . ': ' . __('No'), 'error');
- }
- } else {
- $result .= $this->messages->getStyledMessage(__('Available switches') . ': ' . __('No'), 'error');
- }
- return($result);
- }
- /**
- * Renders device editing form for existing envy-device
- *
- * @param int $switchId
- *
- * @return string
- */
- protected function renderDeviceEditForm($switchId) {
- $result = '';
- $deviceId = ubRouting::filters($switchId, 'int');
- if (isset($this->allDevices[$switchId])) {
- $deviceData = $this->allDevices[$switchId];
- $inputs = '';
- $inputs .= wf_HiddenInput('editdeviceid', $deviceData['id']);
- $inputs .= wf_HiddenInput('editdeviceswitchid', $deviceData['switchid']);
- $inputs .= wf_TextInput('editdevicelogin', __('Login'), $deviceData['login'], true, '');
- $inputs .= wf_PasswordInput('editdevicepassword', __('Password'), $deviceData['password'], true, '');
- $inputs .= wf_PasswordInput('editdeviceenablepassword', __('Enable password'), $deviceData['enablepassword'], true, '');
- $inputs .= wf_TextInput('editdevicecustom1', __('Custom field'), $deviceData['custom1'], true, '');
- $inputs .= wf_TextInput('editdevicecutstart', __('Lines to cut at start'), $deviceData['cutstart'], true, '');
- $inputs .= wf_TextInput('editdevicecutend', __('Lines to cut at end'), $deviceData['cutend'], true, '');
- $inputs .= wf_TextInput('editdeviceport', __('Port'), $deviceData['port'], true, '');
- $inputs .= wf_CheckInput('editdeviceactive', __('Active'), true, $deviceData['active']);
- $inputs .= wf_delimiter(0);
- $inputs .= wf_Submit(__('Save'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- } else {
- $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': EX_NODEVICE', 'error');
- }
- return($result);
- }
- /**
- * Creates new device in database
- *
- * @return string
- */
- public function createDevice() {
- $result = '';
- if (ubRouting::checkPost(array('newdeviceswitchid'))) {
- $switchId = ubRouting::post('newdeviceswitchid', 'int');
- $active = (ubRouting::post('newdeviceactive')) ? 1 : 0;
- $login = ubRouting::post('newdevicelogin', 'mres');
- $password = ubRouting::post('newdevicepassword', 'mres');
- $enablepassword = ubRouting::post('newdeviceenablepassword', 'mres');
- $custom1 = ubRouting::post('newdevicecustom1', 'mres');
- $cutstart = ubRouting::post('newdevicecutstart', 'int');
- $cutend = ubRouting::post('newdevicecutend', 'int');
- $port = ubRouting::post('newdeviceport', 'int');
- if (!empty($switchId)) {
- if (!isset($this->allDevices[$switchId])) {
- if (isset($this->allSwitches[$switchId])) {
- $this->devices->data('switchid', $switchId);
- $this->devices->data('active', $active);
- $this->devices->data('login', $login);
- $this->devices->data('password', $password);
- $this->devices->data('enablepassword', $enablepassword);
- $this->devices->data('custom1', $custom1);
- $this->devices->data('cutstart', $cutstart);
- $this->devices->data('cutend', $cutend);
- $this->devices->data('port', $port);
- $this->devices->create();
- $newId = $this->devices->getLastId();
- log_register('ENVY CREATE DEVICE [' . $newId . '] SWITCHID [' . $switchId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGSWITCHID [' . $switchId . ']';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_DEVICEALREADYEXISTS';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_EMPTYSWITCHID';
- }
- }
- return($result);
- }
- /**
- * Catches device editing request and saves changes in database
- *
- * @return void/string on error
- */
- public function saveDevice() {
- $result = '';
- if (ubRouting::checkPost(array('editdeviceswitchid', 'editdeviceid'))) {
- $deviceId = ubRouting::post('editdeviceid', 'int');
- $switchId = ubRouting::post('editdeviceswitchid', 'int');
- $active = (ubRouting::post('editdeviceactive')) ? 1 : 0;
- $login = ubRouting::post('editdevicelogin', 'mres');
- $password = ubRouting::post('editdevicepassword', 'mres');
- $enablepassword = ubRouting::post('editdeviceenablepassword', 'mres');
- $custom1 = ubRouting::post('editdevicecustom1', 'mres');
- $cutstart = ubRouting::post('editdevicecutstart', 'int');
- $cutend = ubRouting::post('editdevicecutend', 'int');
- $port = ubRouting::post('editdeviceport', 'int');
- if (!empty($switchId)) {
- if (isset($this->allDevices[$switchId])) {
- if (isset($this->allSwitches[$switchId])) {
- $this->devices->where('id', '=', $deviceId);
- $this->devices->data('active', $active);
- $this->devices->data('login', $login);
- $this->devices->data('password', $password);
- $this->devices->data('enablepassword', $enablepassword);
- $this->devices->data('custom1', $custom1);
- $this->devices->data('cutstart', $cutstart);
- $this->devices->data('cutend', $cutend);
- $this->devices->data('port', $port);
- $this->devices->save();
- log_register('ENVY EDIT DEVICE [' . $deviceId . '] SWITCHID [' . $switchId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGSWITCHID [' . $switchId . ']';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_DEVICENOTEXISTS';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_EMPTYSWITCHID';
- }
- }
- return($result);
- }
- /**
- * Deletes existing envy device from database
- *
- * @param int $switchId
- *
- * @return void/string on error
- */
- public function deleteDevice($switchId) {
- $result = '';
- $switchId = ubRouting::filters($switchId, 'int');
- if (!empty($switchId)) {
- if (isset($this->allDevices[$switchId])) {
- $devData = $this->allDevices[$switchId];
- $this->devices->where('switchid', '=', $switchId);
- $this->devices->delete();
- log_register('ENVY DELETE DEVICE [' . $devData['id'] . '] SWITCHID [' . $switchId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGSWITCHID [' . $switchId . ']';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_EMPTYSWITCHID';
- }
- return($result);
- }
- /**
- * Returns last envy-device configuration date
- *
- * @param int $switchId
- *
- * @return string
- */
- protected function getLastConfigDate($switchId) {
- $result = '';
- if (!empty($this->allConfigs)) {
- foreach ($this->allConfigs as $io => $each) {
- if ($each['switchid'] == $switchId) {
- $result = $each['date'];
- }
- }
- }
- return($result);
- }
- /**
- * Renders available envy-devices with some their params
- *
- * @return string
- */
- public function renderDevicesList() {
- $result = '';
- if (!empty($this->allDevices)) {
- $countActive = 0;
- $countInactive = 0;
- $allModelNames = array();
- if (!empty($this->allModels)) {
- foreach ($this->allModels as $io => $each) {
- $allModelNames[$each['id']] = $each['modelname'];
- }
- }
- $cells = wf_TableCell(__('ID'));
- $cells .= wf_TableCell(__('Latest config'));
- $cells .= wf_TableCell(__('IP'));
- $cells .= wf_TableCell(__('Switch'));
- $cells .= wf_TableCell(__('Model'));
- $cells .= wf_TableCell(__('Active'));
- $cells .= wf_TableCell(__('Actions'));
- $rows = wf_TableRow($cells, 'row1');
- foreach ($this->allDevices as $io => $each) {
- $switchData = @$this->allSwitches[$each['switchid']];
- $rowClass = 'row5';
- //this switch may be deleted
- if (empty($switchData)) {
- $switchData = array(
- 'id' => $each['switchid'],
- 'modelid' => 0,
- 'ip' => __('Deleted'),
- 'desc' => '',
- 'location' => __('Deleted'),
- 'snmp' => '',
- 'geo' => '',
- 'parentid' => '',
- 'swid' => '',
- 'snmpwrite' => '',
- );
- $rowClass = 'sigdeleteduser';
- }
- $scriptAvailable = (isset($this->allScripts[$switchData['modelid']])) ? true : false;
- $modelLabel = ($scriptAvailable) ? wf_img_sized('skins/icon_ok.gif', __('Envy script available'), '12') : wf_img_sized('skins/delete_small.png', __('Envy script unavailable'), '12');
- $cells = wf_TableCell($each['switchid']);
- $cells .= wf_TableCell($this->getLastConfigDate($each['switchid']));
- $cells .= wf_TableCell($switchData['ip']);
- $cells .= wf_TableCell($switchData['location']);
- $cells .= wf_TableCell($modelLabel . ' ' . @$allModelNames[$switchData['modelid']]);
- $cells .= wf_TableCell(web_bool_led($each['active']));
- $devControls = '';
- $devControls .= wf_JSAlert(self::URL_ME . '&deletedevice=' . $each['switchid'], web_delete_icon(), $this->messages->getDeleteAlert()) . ' ';
- $devControls .= wf_modalAuto(web_edit_icon(), __('Edit') . ' ' . $switchData['ip'], $this->renderDeviceEditForm($each['switchid'])) . ' ';
- $devControls .= wf_Link(self::URL_ME . '&previewdevice=' . $each['switchid'], web_icon_search('Preview')) . ' ';
- $storeAlert = $this->messages->getEditAlert() . ' ' . __('Backup device configuration to archive') . '?';
- $devControls .= wf_JSAlert(self::URL_ME . '&' . self::ROUTE_DEVICES . '&=true' . '&storedevice=' . $each['switchid'], wf_img('skins/icon_restoredb.png', __('Backup device configuration to archive')), $storeAlert) . ' ';
- $devControls .= wf_Link('?module=switches&edit=' . $each['switchid'], wf_img('skins/menuicons/switches.png', __('Go to switch'))) . ' ';
- $devControls .= wf_Link(self::URL_ME . '&' . self::ROUTE_DIFF . '=true' . '&devfilter=' . $each['switchid'], wf_img('skins/diff_icon.png', __('Changes')));
- $cells .= wf_TableCell($devControls);
- $rows .= wf_TableRow($cells, $rowClass);
- if ($each['active']) {
- $countActive++;
- } else {
- $countInactive++;
- }
- }
- $result .= wf_TableBody($rows, '100%', 0, 'sortable');
- $countersLabel = __('Total') . ': ' . ($countActive + $countInactive) . ' ' . __('Active') . ': ' . $countActive . ' ' . __('Inactive') . ': ' . $countInactive;
- $result .= wf_tag('br') . wf_tag('b', false) . $countersLabel . wf_tag('b', true);
- } else {
- $result .= $this->messages->getStyledMessage(__('No envy devices available'), 'warning');
- }
- return($result);
- }
- /**
- * Returns deivice polling script with preprocessed macro data
- *
- * @param int $switchId
- *
- * @return string
- */
- protected function parseMacro($switchId) {
- $result = '';
- if (isset($this->allDevices[$switchId])) {
- if (isset($this->allSwitches[$switchId])) {
- if (isset($this->allScripts[$this->allSwitches[$switchId]['modelid']])) {
- $result = $this->allScripts[$this->allSwitches[$switchId]['modelid']]['data'];
- $deviceData = $this->allDevices[$switchId];
- $macroLogin = (!empty($deviceData['login'])) ? $deviceData['login'] : 'empty_login';
- $macroPass = (!empty($deviceData['password'])) ? $deviceData['password'] : 'empty_password';
- $macroEnPass = (!empty($deviceData['enablepassword'])) ? $deviceData['enablepassword'] : 'empty_enablepassword';
- $macroCust1 = (!empty($deviceData['custom1'])) ? $deviceData['custom1'] : 'empty_custom1';
- $macroPort = (!empty($deviceData['port'])) ? $deviceData['port'] : 'empty_port';
- //some macro replacing here
- $result = str_replace('{IP}', $this->allSwitches[$switchId]['ip'], $result);
- $result = str_replace('{LOGIN}', $macroLogin, $result);
- $result = str_replace('{PASSWORD}', $macroPass, $result);
- $result = str_replace('{ENABLEPASSWORD}', $macroEnPass, $result);
- $result = str_replace('{CUSTOM1}', $macroCust1, $result);
- $result = str_replace('{PORT}', $macroPort, $result);
- }
- }
- }
- return($result);
- }
- /**
- * Runs envy script for some envy device and returns script result
- *
- * @param int $switchId
- *
- * @return string
- */
- public function runDeviceScript($switchId) {
- $result = '';
- if (isset($this->allDevices[$switchId])) {
- $scriptData = $this->parseMacro($switchId);
- if (!empty($scriptData)) {
- $filePath = self::TMP_PATH . self::SCRIPT_PREFIX . $switchId;
- file_put_contents($filePath, $scriptData);
- $result .= shell_exec($this->billCfg['EXPECT_PATH'] . ' ' . $filePath);
- }
- }
- return($result);
- }
- /**
- * Renders script results preview
- *
- * @param string $data
- *
- * @return string
- */
- public function previewScriptsResult($data) {
- $result = '';
- if (!empty($data)) {
- $inputs = wf_tag('textarea', false, 'fileeditorarea', 'name="envypreview" cols="145" rows="30" spellcheck="false"');
- $inputs .= $data;
- $inputs .= wf_tag('textarea', true);
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- } else {
- $result .= $this->messages->getStyledMessage(__('Empty reply received'), 'warning');
- }
- return($result);
- }
- /**
- * Renders form for filtering some envy-device in archive
- *
- * @return string
- */
- public function renderArchiveFilterForm() {
- $result = '';
- $devicesTmp = array('0' => __('All'));
- if (!empty($this->allDevices)) {
- foreach ($this->allDevices as $io => $each) {
- @$switchData = $this->allSwitches[$each['switchid']];
- $devicesTmp[$each['switchid']] = @$switchData['ip'] . ' - ' . @$switchData['location'];
- }
- $curDeviceId = ubRouting::checkPost('devicefilter') ? ubRouting::post('devicefilter', 'int') : 0;
- $inputs = wf_Selector('devicefilter', $devicesTmp, __('Device'), $curDeviceId, false, false) . ' ';
- $inputs .= wf_Submit(__('Show'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- }
- return($result);
- }
- /**
- * Renders previously envy data arhive container
- *
- * @return string
- */
- public function renderArchive() {
- $result = '';
- $columns = array('Date', 'IP', 'Device', 'Actions');
- $opts = '"order": [[ 0, "desc" ]]';
- $devFilter = ubRouting::checkPost('devicefilter') ? ubRouting::post('devicefilter', 'int') : 0;
- $result .= wf_JqDtLoader($columns, self::URL_ME . '&' . self::ROUTE_ARCHIVE_AJ . '=true&' . self::ROUTE_FILTER . '=' . $devFilter, false, __('Config'), 100, $opts);
- $result .= wf_delimiter(0);
- $result .= $this->renderArchiveFilterForm();
- return($result);
- }
- /**
- * Renders background JSON data for existing configs archive
- *
- * @return void
- */
- public function getAjArchive() {
- $json = new wf_JqDtHelper();
- $devFilter = ubRouting::checkGet('devicefilter') ? ubRouting::get('devicefilter', 'int') : 0;
- if (!empty($this->allConfigs)) {
- foreach ($this->allConfigs as $io => $each) {
- if (!$devFilter OR $devFilter == $each['switchid']) {
- @$switchData = $this->allSwitches[$each['switchid']];
- //maybe deleted switch?
- if (empty($switchData)) {
- $switchData = array(
- 'ip' => __('Deleted'),
- 'location' => __('ID') . ' [' . $each['switchid'] . '] ' . __('Deleted'),
- );
- }
- $data[] = $each['date'];
- $data[] = @$switchData['ip'];
- $data[] = @$switchData['location'];
- $archControls = '';
- $archControls .= wf_JSAlert(self::URL_ME . '&deletearchiveid=' . $each['id'], web_delete_icon(), $this->messages->getDeleteAlert() . ' ' . $each['date']) . ' ';
- $archControls .= wf_Link(self::URL_ME . '&' . self::ROUTE_ARCHVIEW . '=' . $each['id'], web_icon_search('Config')) . ' ';
- $storeAlert = $this->messages->getEditAlert() . ' ' . __('Backup device configuration to archive') . '?';
- $archControls .= wf_JSAlert(self::URL_ME . '&' . self::ROUTE_DEVICES . '&=true' . '&storedevice=' . $each['switchid'] . '&resave=true', wf_img('skins/icon_envy_resave.png', __('Backup device configuration to archive')), $storeAlert) . ' ';
- $archControls .= wf_Link(self::URL_ME . '&downloadarchiveid=' . $each['id'], web_icon_download());
- $data[] = $archControls;
- $json->addRow($data);
- unset($data);
- }
- }
- }
- $json->getJson();
- }
- /**
- * Saves device config data into archive
- *
- * @param int $switchId
- * @param string $data
- *
- * @return void/string on error
- */
- protected function storeArchiveData($switchId, $data) {
- $result = '';
- $switchId = ubRouting::filters($switchId, 'int');
- if (!empty($switchId)) {
- if (isset($this->allDevices[$switchId])) {
- $curdate = curdatetime();
- $startOffset = ($this->allDevices[$switchId]['cutstart']) ? $this->allDevices[$switchId]['cutstart'] : 0;
- $endOffset = ($this->allDevices[$switchId]['cutend']) ? $this->allDevices[$switchId]['cutend'] : 0;
- //Optional data cutting on storing to archive
- if ($startOffset OR $endOffset) {
- $cutTmp = explodeRows($data);
- $cuttedData = '';
- if (!empty($cutTmp)) {
- $totalLines = sizeof($cutTmp);
- $lineCount = 0;
- foreach ($cutTmp as $lineIndex => $eachLineContent) {
- if ($lineCount >= $startOffset AND ( $lineCount < ($totalLines - $endOffset))) {
- $cuttedData .= $eachLineContent;
- }
- $lineCount++;
- }
- //now replacing initial data with cutted data
- $data = $cuttedData;
- }
- }
- $data = ubRouting::filters($data, 'mres');
- $this->archive->data('switchid', $switchId);
- $this->archive->data('date', $curdate);
- $this->archive->data('config', $data);
- $this->archive->create();
- log_register('ENVY STORE ARCHIVE SWITCHID [' . $switchId . ']');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGSWITCHID [' . $switchId . ']';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_EMPTYSWITCHID';
- }
- return($result);
- }
- /**
- * Deletes existing archive record from daabase
- *
- * @param int $recordId
- *
- * @return void/string on error
- */
- public function deleteArchiveRecord($recordId) {
- $result = '';
- $recordId = ubRouting::filters($recordId, 'int');
- if (!empty($recordId)) {
- if (isset($this->allConfigs[$recordId])) {
- $recordData = $this->allConfigs[$recordId];
- $this->archive->where('id', '=', $recordId);
- $this->archive->delete();
- log_register('ENVY DELETE ARCHIVE RECORD [' . $recordId . '] SWITCHID [' . $recordData['switchid'] . '] DATE `' . $recordData['date'] . '`');
- } else {
- $result .= __('Something went wrong') . ': EX_WRONGRECORDID [' . $recordId . ']';
- }
- } else {
- $result .= __('Something went wrong') . ': EX_EMPTYRECORDID';
- }
- return($result);
- }
- /**
- * Returns device config saved in some archive record
- *
- * @param int $recordId
- *
- * @return string
- */
- public function renderArchiveRecordConfig($recordId) {
- $result = '';
- if (isset($this->allConfigs[$recordId])) {
- $this->archive->selectable('config');
- $this->archive->where('id', '=', $recordId);
- $rawConfig = $this->archive->getAll();
- $result = $rawConfig[0]['config'];
- }
- return($result);
- }
- /**
- * Downloads record file
- *
- * @param int $recordId
- *
- * @return void
- */
- public function downloadArchiveRecordConfig($recordId) {
- if (isset($this->allConfigs[$recordId])) {
- $recordData = $this->allConfigs[$recordId];
- $switchId = $recordData['switchid'];
- $switchIp = (isset($this->allSwitches[$switchId])) ? $this->allSwitches[$switchId]['ip'] : '';
- $this->archive->selectable('config');
- $this->archive->where('id', '=', $recordId);
- $rawConfig = $this->archive->getAll();
- $configContent = $rawConfig[0]['config'];
- $tmpFilePath = self::TMP_PATH . self::DL_PREFIX . $recordData['date'] . '_' . $switchId . '_' . $switchIp . '.txt';
- file_put_contents($tmpFilePath, $configContent);
- zb_DownloadFile($tmpFilePath);
- }
- }
- /**
- * Start process for get and store config data
- *
- * @param int $devId
- *
- * @return void
- */
- public function procStoreArchiveData($devId) {
- if (!$this->isProcessLocked($this->allSwitches[$devId]['ip'])) {
- //starting process
- $this->processStatsUpdate($this->allSwitches[$devId]['ip'], false);
- //polling device
- $this->storeArchiveData($devId, $this->runDeviceScript($devId));
- //finishing process
- $this->processStatsUpdate($this->allSwitches[$devId]['ip'], true);
- }
- }
- /**
- * Stores all available envy-devices configs into archive
- *
- * @return void
- */
- public function storeArchiveAllDevices() {
- if (!empty($this->allScripts)) {
- if (!empty($this->allDevices)) {
- if (!$this->isProcessLocked('ALL')) {
- //starting envy process
- $this->processStatsUpdate('ALL', false);
- foreach ($this->allDevices as $io => $each) {
- if ($each['active']) {
- if (@!$this->altCfg['MULTI_ENVY_PROC']) {
- $this->procStoreArchiveData($each['switchid']);
- } else {
- //starting herd of envy here!
- $procTimeout = 0;
- if ($this->altCfg['MULTI_ENVY_PROC'] > 1) {
- $procTimeout = ubRouting::filters($this->altCfg['MULTI_ENVY_PROC'], 'int');
- }
- $this->stardust->runBackgroundProcess('/bin/ubapi "multienvy&devid=' . $each['switchid'] . '"', $procTimeout);
- }
- }
- }
- //finishing envy process
- $this->processStatsUpdate('ALL', true);
- }
- }
- }
- }
- /**
- * Renders diff search form
- *
- * @return string
- */
- public function renderDiffForm() {
- $result = '';
- $devFilter = (ubRouting::checkGet('devfilter')) ? ubRouting::get('devfilter', 'int') : '';
- if (!empty($this->allConfigs)) {
- $confTmp = array();
- foreach ($this->allConfigs as $io => $each) {
- if (isset($this->allSwitches[$each['switchid']])) {
- $switchData = $this->allSwitches[$each['switchid']];
- $swichLabel = $switchData['ip'] . ' - ' . $switchData['location'];
- } else {
- $swichLabel = $each['switchid'] . ' - ' . __('Unknown');
- }
- if ($devFilter) {
- if ($each['switchid'] == $devFilter) {
- $confTmp[$each['id']] = $each['date'] . ' ' . $swichLabel;
- }
- } else {
- $confTmp[$each['id']] = $each['date'] . ' ' . $swichLabel;
- }
- }
- $currDiffOne = (ubRouting::checkPost('diffone')) ? ubRouting::post('diffone') : '';
- $currDiffTwo = (ubRouting::checkPost('difftwo')) ? ubRouting::post('difftwo') : '';
- $inputs = wf_HiddenInput('rundiff', 'true');
- $inputs .= __('Compare') . ' ';
- $inputs .= wf_Selector('diffone', $confTmp, '', $currDiffOne, false) . ' ';
- $inputs .= __('and') . ' ';
- $inputs .= wf_Selector('difftwo', $confTmp, '', $currDiffTwo, false) . ' ';
- $inputs .= wf_Submit(__('Show'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- } else {
- $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'info');
- }
- return($result);
- }
- /**
- * Compares some two existing configs from archive and displays diff results
- *
- * @param int $configIdOne
- * @param int $configIdTwo
- *
- * @return string
- */
- public function renderDiff($configIdOne, $configIdTwo) {
- $result = '';
- $configIdOne = ubRouting::filters($configIdOne, 'int');
- $configIdTwo = ubRouting::filters($configIdTwo, 'int');
- if (!empty($configIdOne) AND !empty($configIdTwo)) {
- //same config check
- if ($configIdOne != $configIdTwo) {
- if (isset($this->allConfigs[$configIdOne]) AND isset($this->allConfigs[$configIdTwo])) {
- //gettin both configs from database
- $this->archive->selectable('config');
- $this->archive->where('id', '=', $configIdOne);
- $rawConfig = $this->archive->getAll();
- $configOne = $rawConfig[0]['config'];
- $this->archive->where('id', '=', $configIdTwo);
- $rawConfig = $this->archive->getAll();
- $configTwo = $rawConfig[0]['config'];
- if ($configOne == $configTwo) {
- $result .= $this->messages->getStyledMessage(__('No difference between this two configurations'), 'success');
- } else {
- $result .= $this->messages->getStyledMessage(__('Something is different in this two configurations'), 'warning');
- }
- $result .= wf_delimiter(0);
- $result .= Diff::toTable(Diff::compare($configOne, $configTwo, false));
- } else {
- $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': EX_NO_ARCHIVEID', 'error');
- }
- } else {
- $result .= $this->messages->getStyledMessage(__('Same configs selected'), 'info');
- }
- }
- return($result);
- }
- /**
- * Deletes all records from archive except the last one for each of envy-devices
- *
- * @return void
- */
- public function cleanupArchive() {
- $cleanupCounter = 0;
- if (!empty($this->allConfigs)) {
- foreach ($this->allConfigs as $recordId => $archiveData) {
- $switchId = $archiveData['switchid'];
- $lastConfigDate = $this->getLastConfigDate($switchId);
- if ($archiveData['date'] != $lastConfigDate) {
- $this->archive->where('id', '=', $recordId);
- $this->archive->delete();
- log_register('ENVY CLEANUP ARCHIVE RECORD [' . $recordId . '] SWITCHID [' . $switchId . '] DATE `' . $archiveData['date'] . '`');
- $cleanupCounter++;
- }
- }
- }
- log_register('ENVVY ARCHIVE `' . $cleanupCounter . '` RECORDS CLEANED');
- }
- // __o__
- // /\ | /\ ,__, \
- // /__\|/__\o/o / / ,
- // __(\ , , | `7 / \_ /)
- // _.-' \\ _)\_/) | __||___, <----)_)---<< //
- // ,-' _.---'\\ (/ (6\> |___// /_ /_\ ,_,_, / )\ //
- // ,'_.--' \\ /` _ /\>/._\/\/__/\ | =/= / / / \_ //
- // \\ / ,_//\ \>' , / ,/ / ) `0 / / /,__, \ //
- // \\ \_('o | )> _)\_/) |\/ __\\_/ /o/o /- //
- // , ,\\ `7 / / (/ (0\> , _/,/ /_'/ \j / o<\>>o
- // _)\_/) \\,__\\_\' /` _ /\>_)\_/)|_|_/ __//___,____/_\
- // (/ (9\> \\_) | / / ,_//\ (/ (6\> )_/_// /_ /__\_/_/
- // /` _ /\> /\\\/_/ '\_(' | /` _ /\>/._\/\/__/
- // / ,_//\ \>' \_)/ \_| _/// ,_//\ \> _)_/
- // \_(' | )> x / _/ / _/ \\_('\|| )> x)_::\ ______,
- // / \>_//( ( / /--.,/ +/ \>__// o /----.,/( )\\))
- // \' \| ) \| / / / ' \' \| )___/ \ \/ \\\\\
- // / +-/</\/ / / \_| / +-/o/----+ |
- // / ' \ _/,/ _ / _/ / _// ' \_\, ___ /
- // / \_| _// ( __,/( ( / / / \_| _/\_|-" /, /
- // / _/ / _/ ^-' | | \| / / / _/ / _/ )\| | _/
- // ( ( / / /_/ \_ \_\/ / ( ( / / /_/ \_ \_(__
- // \| / / / /_/,/ \| / / / / /
- // \/ / / // ( \/ / / / _/
- // _/,/ _/_/,^-' _/,/ _/_/,/
- // / ( /_/ ( / ( /_/ (
- // ^-' ^-' ^-' ^-'
- // Now I watched when the Lamb opened one of the seven seals, and I heard one of the four
- // living creatures say with a voice like thunder, “Come!”
- }
|