123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662 |
- <?php
- /**
- * Network equipment FDB tables archive implementation
- */
- class FDBArchive {
- /**
- * Contains system alter config as key=>value
- *
- * @var array
- */
- protected $altCfg = array();
- /**
- * Contains all available switches devices as id=>data
- *
- * @var array
- */
- protected $allSwitches = array();
- /**
- * Contains existing switches MAC addresses as mac=>id
- *
- * @var array
- */
- protected $allSwitchesMac = array();
- /**
- * Contains available users data from cache
- *
- * @var array
- */
- protected $allUserData = array();
- /**
- * Contains available users mac address as mac=>login
- *
- * @var array
- */
- protected $allUsersMac = array();
- /**
- * Contains available ONU devices mac address as mac=>id
- *
- * @var array
- */
- protected $allOnuMac = array();
- /**
- * Contains available ONU devices assigned users id=>login
- *
- * @var array
- */
- protected $allOnuUsers = array();
- /**
- * Protected database model placeholder
- *
- * @var object
- */
- protected $archive = '';
- /**
- * Object wide json helper placeholder
- *
- * @var object
- */
- protected $json = '';
- /**
- * Days counter before automatic archive cleanup/rotation
- *
- * @var int
- */
- protected $daysRotate = 0;
- /**
- * Placeholder for SW_FDB_EXTEN_INFO alter.ini option
- */
- protected $fdbExtenInfo = false;
- /**
- * Contains default FDB caches storage path
- */
- const PATH_CACHE = 'exports/';
- /**
- * Contains default FDB caches storage path for OLTs
- */
- const OLT_PATH_CACHE = 'exports/pondata/fdb/';
- /**
- * Contains default switches FDB cache record postfix
- */
- const EXT_SWITCHES = '_fdb';
- /**
- * Contains default switches FDB VLAN cache record postfix
- */
- const EXT_SWITCHES_VLAN = '_vlan';
- /**
- * Contains default switches FDB ports descriptions cache record postfix
- */
- const EXT_SWITCHES_PORTDESCR = '_portdescr';
- /**
- * Contains default PON OLT FDB cache record postfix
- */
- const EXT_OLTS = '_OLTFDB';
- /**
- * Contains default archive database table name
- */
- const TABLE_ARCHIVE = 'fdbarchive';
- /**
- * Contains default module controller URL
- */
- const URL_ME = '?module=fdbarchive';
- /**
- * Contains default fdb cache module URL
- */
- const URL_CACHE = '?module=switchpoller';
- /**
- * Another required URLs for internal routing
- */
- const URL_SWITCHPROFILE = '?module=switches&edit=';
- const URL_USERPROFILE = '?module=userprofile&username=';
- const URL_ONUPROFILE = '?module=ponizer&editonu=';
- public function __construct() {
- $this->loadConfigs();
- $this->initJson();
- $this->initArchive();
- $this->loadSwitches();
- }
- /**
- * Preloads system configs into protected props for further usage
- *
- * @global object $ubillingConfig
- *
- * @return void
- */
- protected function loadConfigs() {
- global $ubillingConfig;
- $this->altCfg = $ubillingConfig->getAlter();
- if (isset($this->altCfg['FDBARCHIVE_MAX_AGE'])) {
- if (!empty($this->altCfg['FDBARCHIVE_MAX_AGE'])) {
- if (is_numeric($this->altCfg['FDBARCHIVE_MAX_AGE'])) {
- $this->daysRotate = $this->altCfg['FDBARCHIVE_MAX_AGE'];
- }
- }
- }
- $this->fdbExtenInfo = $ubillingConfig->getAlterParam('SW_FDB_EXTEN_INFO');
- }
- /**
- * Inits archive model as protected property for further usage
- *
- * @return void
- */
- protected function initArchive() {
- $this->archive = new NyanORM(self::TABLE_ARCHIVE);
- }
- /**
- * Inits archive model as protected property for further usage
- *
- * @return void
- */
- protected function initJson() {
- $this->json = new wf_JqDtHelper();
- }
- /**
- * Loads switches into protected property
- *
- * @return void
- */
- protected function loadSwitches() {
- $switches = new nya_switches();
- $this->allSwitches = $switches->getAll('id');
- if (!empty($this->allSwitches)) {
- foreach ($this->allSwitches as $io => $each) {
- if (!empty($each['swid'])) {
- $this->allSwitchesMac[$each['swid']] = $each['id'];
- }
- }
- }
- }
- /**
- * Loads user data into protected properties for further usage
- *
- * @return void
- */
- protected function loadUserData() {
- $this->allUserData = zb_UserGetAllDataCache();
- if (!empty($this->allUserData)) {
- $this->allUsersMac = zb_UserGetAllMACs();
- $this->allUsersMac = array_flip($this->allUsersMac);
- }
- }
- /**
- * Loads PON ONU devices data into protected properties for further usage
- *
- * @return void
- */
- protected function loadOnuData() {
- $onu = new nya_pononu();
- $allOnu = $onu->getAll();
- if (!empty($allOnu)) {
- foreach ($allOnu as $io => $each) {
- if (!empty($each['mac'])) {
- $this->allOnuMac[$each['mac']] = $each['id'];
- if (!empty($each['login'])) {
- $this->allOnuUsers[$each['id']] = $each['login'];
- }
- }
- }
- }
- }
- /**
- * Extracts IP address from switch cache record name
- *
- * @param string $cacheRecord
- *
- * @return string
- */
- protected function extractSwitchIP($cacheRecord) {
- $result = '';
- if (!empty($cacheRecord)) {
- $result .= zb_ExtractIpAddress($cacheRecord);
- }
- return($result);
- }
- /**
- * Tryin to detect switch ID by its IP address
- *
- * @param string $ip
- *
- * @return int/void
- */
- protected function getSwitchId($ip) {
- $result = '';
- if (!empty($this->allSwitches)) {
- foreach ($this->allSwitches as $io => $each) {
- if ($each['ip'] == $ip) {
- $result = $each['id'];
- return($result);
- }
- }
- }
- return($result);
- }
- /**
- * Extracts OLT id from cache record name
- *
- * @param string $cacheRecord
- *
- * @return int
- */
- protected function extractOltId($cacheRecord) {
- $result = '';
- if (!empty($cacheRecord)) {
- $result = ubRouting::filters($cacheRecord, 'int');
- }
- return($result);
- }
- /**
- * Trying to get OLT IP for existing device by its ID
- *
- * @param int $id
- *
- * @return string
- */
- protected function getOltIp($id) {
- $result = '';
- if (isset($this->allSwitches[$id])) {
- $result .= $this->allSwitches[$id]['ip'];
- }
- return($result);
- }
- /**
- * Performs cache scanning and saving into archive of current PON devices FDB cache
- *
- * @return void
- */
- protected function saveOltCache() {
- $newDate = curdatetime();
- if (@$this->altCfg['PON_ENABLED']) {
- $allCachedData = rcms_scandir(self::OLT_PATH_CACHE, '*' . self::EXT_OLTS);
- if (!empty($allCachedData)) {
- foreach ($allCachedData as $cacheIndex => $cacheFile) {
- $rawData = file_get_contents(self::OLT_PATH_CACHE . $cacheFile);
- if (!empty($rawData)) {
- $oltId = $this->extractOltId($cacheFile);
- $oltIp = $this->getOltIp($oltId);
- //filling new archive record
- $this->archive->data('date', $newDate);
- $this->archive->data('devid', $oltId);
- $this->archive->data('devip', $oltIp);
- $this->archive->data('data', $rawData);
- //we need some different parsing of raw data in this case
- $this->archive->data('pon', '1');
- $this->archive->create();
- }
- }
- }
- }
- }
- /**
- * Performs cache scanning and saving into archive of current switches FDB cache
- *
- * @return void
- */
- protected function saveSwitchesCache() {
- $newDate = curdatetime();
- $allCachedData = rcms_scandir(self::PATH_CACHE, '*' . self::EXT_SWITCHES);
- if (!empty($allCachedData)) {
- foreach ($allCachedData as $cacheIndex => $cacheFile) {
- $rawData = file_get_contents(self::PATH_CACHE . $cacheFile);
- if (!empty($rawData)) {
- $rawDataVLAN = '';
- $rawDataPortDescr = '';
- if (file_exists(self::PATH_CACHE . $cacheFile . self::EXT_SWITCHES_VLAN)) {
- $rawDataVLAN = file_get_contents(self::PATH_CACHE . $cacheFile . self::EXT_SWITCHES_VLAN);
- }
- if (file_exists(self::PATH_CACHE . $cacheFile . self::EXT_SWITCHES_PORTDESCR)) {
- $rawDataPortDescr = file_get_contents(self::PATH_CACHE . $cacheFile . self::EXT_SWITCHES_PORTDESCR);
- }
- $switchIp = $this->extractSwitchIP($cacheFile);
- $switchId = $this->getSwitchId($switchIp);
- //filling new archive record
- $this->archive->data('date', $newDate);
- $this->archive->data('devid', $switchId);
- $this->archive->data('devip', $switchIp);
- $this->archive->data('data', $rawData);
- $this->archive->data('datavlan', $rawDataVLAN);
- $this->archive->data('dataportdescr', $rawDataPortDescr);
- $this->archive->data('pon', '0');
- $this->archive->create();
- }
- }
- }
- }
- /**
- * Performs cache scanning and storing into archive
- *
- * @return void
- */
- public function storeArchive() {
- $this->saveSwitchesCache();
- if ($this->altCfg['PON_ENABLED']) {
- $this->saveOltCache();
- }
- $this->rotateArchive();
- }
- /**
- * Performs automatic archived data rotation
- *
- * @return void
- */
- protected function rotateArchive() {
- if ($this->daysRotate) {
- $this->archive->whereRaw("`date` <= NOW() - INTERVAL " . $this->daysRotate . " DAY");
- $this->archive->delete();
- }
- }
- /**
- * Renders archive container
- *
- * @return string
- */
- public function renderArchive() {
- $result = '';
- $macFilter = '';
- $switchIdFilter = '';
- if (ubRouting::checkGet('macfilter')) {
- $macFilter .= '&macfilter=' . ubRouting::get('macfilter');
- }
- if (ubRouting::checkGet('switchidfilter')) {
- $macFilter .= '&switchidfilter=' . ubRouting::get('switchidfilter');
- }
- if ($this->fdbExtenInfo) {
- $columns = array('Date', __('Switch') . ' / ' . __('OLT'), 'Port', __('Port description'), 'VLAN', 'Location', 'MAC', __('User') . ' / ' . __('Device'));
- } else {
- $columns = array('Date', __('Switch') . ' / ' . __('OLT'), 'Port', 'Location', 'MAC', __('User') . ' / ' . __('Device'));
- }
- $opts = '"order": [[ 0, "desc" ]]';
- $result .= wf_JqDtLoader($columns, self::URL_ME . '&ajax=true' . $macFilter . $switchIdFilter, false, 'Objects', 100, $opts);
- return($result);
- }
- /**
- * Trying to detect is device switch/user or ONU by mac. Returns profile view control.
- *
- * @param string $mac
- *
- * @return string
- */
- protected function getEntityControl($mac) {
- $result = '';
- if (isset($this->allUsersMac[$mac])) {
- $userLogin = $this->allUsersMac[$mac];
- $result .= wf_Link(self::URL_USERPROFILE . $userLogin, web_profile_icon() . ' ' . @$this->allUserData[$userLogin]['fulladress']);
- return($result);
- }
- if (isset($this->allSwitchesMac[$mac])) {
- $switchId = $this->allSwitchesMac[$mac];
- $switchIcon = wf_img('skins/menuicons/switches.png', __('Switch')) . ' ';
- $result .= wf_Link(self::URL_SWITCHPROFILE . $switchId, $switchIcon . @$this->allSwitches[$switchId]['location']);
- return($result);
- }
- if (isset($this->allOnuMac[$mac])) {
- $onuId = $this->allOnuMac[$mac];
- $onuIcon = wf_img('skins/switch_models.png', __('ONU')) . ' ';
- $onuAssignedUser = '';
- if (isset($this->allOnuUsers[$onuId])) {
- $onuUserLogin = $this->allOnuUsers[$onuId];
- if (isset($this->allUserData[$onuUserLogin])) {
- $onuAssignedUser .= @$this->allUserData[$onuUserLogin]['fulladress'];
- }
- }
- $result .= wf_Link(self::URL_ONUPROFILE . $onuId, $onuIcon . $onuAssignedUser);
- }
- return($result);
- }
- /**
- * Trying to detect ONU device by mac. Returns profile view control.
- *
- * @param string $onuMac
- *
- * @return string
- */
- protected function getOnuHandle($onuMac) {
- $result = '';
- if (!empty($onuMac)) {
- if (isset($this->allOnuMac[$onuMac])) {
- $onuId = $this->allOnuMac[$onuMac];
- $result .= wf_Link(self::URL_ONUPROFILE . $onuId, $onuId);
- }
- }
- return($result);
- }
- /**
- * Parses archive raw data and stores data into instance json helper
- *
- * @param array $archiveRecord
- * @param string $macFilter
- * @param int $switchIdFilter
- *
- * @return void
- */
- protected function parseData($archiveRecord, $macFilter = '', $switchIdFilter = '') {
- if (!empty($archiveRecord)) {
- $recordDate = $archiveRecord['date'];
- $recordId = $archiveRecord['devid'];
- $recordIp = $archiveRecord['devip'];
- $switchIcon = wf_img('skins/menuicons/switches.png') . ' ';
- //normal switch data
- if ($archiveRecord['pon'] != 1) {
- $fdbData = @unserialize($archiveRecord['data']);
- if (!empty($fdbData)) {
- $fdbDataVLAN = array();
- $fdbDataPortDescr = array();
- if ($this->fdbExtenInfo) {
- $fdbDataVLAN = @unserialize($archiveRecord['datavlan']);
- $fdbDataPortDescr = @unserialize($archiveRecord['dataportdescr']);
- }
- foreach ($fdbData as $eachMac => $eachPort) {
- // if we have MACs stored along with VLANs (separated with underscore '_')
- // - we need to extract MAC portion
- $eachMAC_VLAN = '';
- if (ispos($eachMac, '_')) {
- // storing original value in "MAC_VLAN" representation
- $eachMAC_VLAN = $eachMac;
- // storing only extracted MAC portion
- $eachMac = substr($eachMac, 0, stripos($eachMac, '_'));
- }
- $filtered = true;
- //basic user MAC filtering
- if ($macFilter) {
- if ($eachMac != $macFilter) {
- $filtered = false;
- }
- }
- //filter records only from some switch ID
- if ($switchIdFilter) {
- if ($recordId != $switchIdFilter) {
- $filtered = false;
- }
- }
- if ($filtered) {
- $switchLink = $switchIcon . ' ' . __('Not exists');
- if (!empty($recordId)) {
- $switchLink = wf_Link(self::URL_SWITCHPROFILE . $recordId, $switchIcon . @$this->allSwitches[$recordId]['location']);
- }
- $data[] = $recordDate;
- $data[] = $recordIp;
- $data[] = $eachPort;
- if ($this->fdbExtenInfo) {
- $eachPortDescr = '';
- $eachVLAN = '';
- if (!empty($fdbDataPortDescr[$eachPort])) {
- $eachPortDescr = $fdbDataPortDescr[$eachPort];
- }
- if (!empty($fdbDataVLAN[$eachMAC_VLAN])) {
- $eachVLAN = $fdbDataVLAN[$eachMAC_VLAN];
- }
- $data[] = $eachPortDescr;
- $data[] = $eachVLAN;
- }
- $data[] = $switchLink;
- $data[] = $eachMac;
- $data[] = $this->getEntityControl($eachMac);
- $this->json->addRow($data);
- unset($data);
- }
- }
- }
- } else {
- //PON FDB data
- $fdbData = @unserialize($archiveRecord['data']);
- if (!empty($fdbData)) {
- foreach ($fdbData as $eachMacPon => $eachOnuData) {
- $switchLink = $switchIcon . ' ' . __('Not exists');
- if (!empty($recordId)) {
- $switchLink = wf_Link(self::URL_SWITCHPROFILE . $recordId, $switchIcon . @$this->allSwitches[$recordId]['location']);
- }
- if (!empty($eachOnuData)) {
- foreach ($eachOnuData as $eachOnuId => $onuFdb) {
- $filtered = true;
- //basic MAC filtering behind ONU
- if ($macFilter) {
- if ($onuFdb['mac'] != $macFilter) {
- $filtered = false;
- }
- }
- //filter records only from some OLT ID
- if ($switchIdFilter) {
- if ($recordId != $switchIdFilter) {
- $filtered = false;
- }
- }
- if ($filtered) {
- $data[] = $recordDate;
- $data[] = $recordIp;
- $data[] = $this->getOnuHandle($eachMacPon);
- if ($this->fdbExtenInfo) {
- $data[] = '';
- $data[] = @$onuFdb['vlan'];
- }
- $data[] = $switchLink;
- $data[] = $onuFdb['mac'];
- $data[] = $this->getEntityControl($eachMacPon);
- $this->json->addRow($data);
- unset($data);
- }
- }
- }
- }
- }
- }
- }
- }
- /**
- * Renders JSON data for background ajax requests
- *
- * @return void
- */
- public function ajArchiveData() {
- if (!ubRouting::checkGet('macfilter') AND ! ubRouting::checkGet('switchidfilter')) {
- //ugly hack to prevent memory overusage.
- $this->archive->whereRaw("`date` >= DATE_SUB(NOW(),INTERVAL 4 HOUR)");
- }
- $allArchiveRecords = $this->archive->getAll();
- $macFilter = '';
- $switchIdFilter = '';
- if (ubRouting::checkGet('macfilter')) {
- $macFilter = ubRouting::get('macfilter');
- }
- if (ubRouting::checkGet('switchidfilter')) {
- $switchIdFilter = ubRouting::get('switchidfilter', 'int');
- }
- if (!empty($allArchiveRecords)) {
- $this->loadUserData();
- if ($this->altCfg['PON_ENABLED']) {
- $this->loadOnuData();
- }
- foreach ($allArchiveRecords as $io => $each) {
- $this->parseData($each, $macFilter, $switchIdFilter);
- }
- }
- $this->json->getJson();
- }
- /**
- * Renders basic navigation controls
- *
- * @return string
- */
- public static function renderNavigationPanel() {
- $result = wf_Link(self::URL_CACHE, wf_img_sized('skins/fdbmacsearch.png', '', '16', '16') . ' ' . __('Current FDB cache'), false, 'ubButton') . ' ';
- $result .= wf_Link(self::URL_ME, wf_img('skins/fdbarchive.png', '', '16', '16') . ' ' . __('FDB') . ' ' . __('Archive'), false, 'ubButton') . ' ';
- if (ubRouting::checkGet('macfilter') OR ubRouting::checkGet('switchidfilter')) {
- $result .= wf_Link(self::URL_ME, wf_img('skins/icon_cleanup.png') . __('Cleanup') . ' ' . __('Filters'), false, 'ubButton') . ' ';
- }
- return($result);
- }
- }
|