'; } } $html[] = ''; // So we ge a trailing \n return implode("\n", $html); } function output_cache_busted_stylesheet_links($files) { $html = array(); foreach ( $files as $file ) { $html[] = ''; } return implode("\n", $html); } ?> <?php echo validHtmlStr(ZM_WEB_TITLE_PREFIX); ?> - <?php echo validHtmlStr($title) ?> "; } else { echo ' '; } echo output_cache_busted_stylesheet_links(array( 'css/reset.css', 'css/overlay.css', 'css/bootstrap.min.css', )); echo output_link_if_exists( array( 'css/base/skin.css', 'css/base/views/'.$basename.'.css', 'js/dateTimePicker/jquery-ui-timepicker-addon.css', 'js/jquery-ui-1.12.1/jquery-ui.structure.min.css', ) ); if ( $css != 'base' ) echo output_link_if_exists( array( 'css/'.$css.'/skin.css', 'css/'.$css.'/views/'.$basename.'.css', 'css/'.$css.'/jquery-ui-theme.css', ) ); ?> '; global $error_message; if ( $error_message ) { echo '
'.$error_message.'
'; } } // end function getBodyTopHTML function getNavBarHTML() { # Provide a facility to turn off the headers if you put navbar=0 into the url if ( isset($_REQUEST['navbar']) and $_REQUEST['navbar'] == '0' ) return ''; global $running; global $user; global $bandwidth_options; global $view; global $filterQuery; global $sortQuery; global $limitQuery; if (!$sortQuery) { parseSort(); } if ( (!$filterQuery) and isset($_REQUEST['filter']) ) { parseFilter($_REQUEST['filter']); $filterQuery = $_REQUEST['filter']['query']; } ob_start(); if ( ZM_WEB_NAVBAR_TYPE == "normal" ) { echo getNormalNavBarHTML($running, $user, $bandwidth_options, $view, $filterQuery, $sortQuery, $limitQuery); } else { echo getCollapsedNavBarHTML($running, $user, $bandwidth_options, $view, $filterQuery, $sortQuery, $limitQuery); } return ob_get_clean(); } // // The legacy navigation bar that collapses into a pulldown menu on small screens. // function getNormalNavBarHTML($running, $user, $bandwidth_options, $view, $filterQuery, $sortQuery, $limitQuery) { $status = runtimeStatus($running); ?>
'.PHP_EOL; $result .= 'trending_up'.PHP_EOL; $result .= ' '.translate('Load').': '.getLoad().PHP_EOL; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the current number of connections made to the database function getDbConHTML() { $result=''; $connections = dbFetchOne('SHOW status WHERE variable_name=\'threads_connected\'', 'Value'); $max_connections = dbFetchOne('SHOW variables WHERE variable_name=\'max_connections\'', 'Value'); $percent_used = $max_connections ? 100 * $connections / $max_connections : 100; $class = ( $percent_used > 90 ) ? 'text-warning' : ''; $result .= ''.PHP_EOL; return $result; } // Returns the html representing up to 4 storage areas and their current capacity function getStorageHTML() { $result=''; $func = function($S) { $class = ''; if ( $S->disk_usage_percent() > 98 ) { $class = 'text-danger'; } else if ( $S->disk_usage_percent() > 90 ) { $class = 'text-warning'; } $title = human_filesize($S->disk_used_space()) . ' of ' . human_filesize($S->disk_total_space()). ( ( $S->disk_used_space() != $S->event_disk_space() ) ? ' ' .human_filesize($S->event_disk_space()) . ' used by events' : '' ); return ''.$S->Name() . ': ' . $S->disk_usage_percent().'%' . ''; }; $storage_areas = ZM\Storage::find(array('Enabled'=>true)); $num_storage_areas = count($storage_areas); $storage_paths = null; $storage_areas_with_no_server_id = array(); foreach ( $storage_areas as $area ) { $storage_paths[$area->Path()] = $area; if ( ! $area->ServerId() ) { $storage_areas_with_no_server_id[] = $area; } } $result .= ''.PHP_EOL; return $result; } // Returns the html representing the current capacity of mapped memory filesystem (usually /dev/shm) function getShmHTML() { $result=''; $shm_percent = getDiskPercent(ZM_PATH_MAP); $shm_total_space = disk_total_space(ZM_PATH_MAP); $shm_used = $shm_total_space - disk_free_space(ZM_PATH_MAP); $class = ''; if ( $shm_percent > 98 ) { $class = 'text-danger'; } else if ( $shm_percent > 90 ) { $class = 'text-warning'; } $result .= ' '.PHP_EOL; return $result; } // Returns the html representing the optional web console banner text function getConsoleBannerHTML() { $result=''; if ( defined('ZM_WEB_CONSOLE_BANNER') and ZM_WEB_CONSOLE_BANNER != '' ) { $result .= '

'.validHtmlStr(ZM_WEB_CONSOLE_BANNER).'

'; } return $result; } // Returns the html representing the current high,medium,low bandwidth setting function getBandwidthHTML($bandwidth_options,$user) { $result=''; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the version of ZoneMinder function getZMVersionHTML() { $result=''; $class = (ZM_DYN_DB_VERSION&&(ZM_DYN_DB_VERSION!=ZM_VERSION))?'text-danger':''; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the ZoneMinder logo function getNavBrandHTML() { $result=''; $result .= '' .ZM_HOME_CONTENT. ''.PHP_EOL; return $result; } // Returns the html representing the Console menu item function getConsoleHTML() { $result=''; if ( canView('Monitors') ) { $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the Options menu item function getOptionsHTML() { $result=''; if ( canView('System') ) { $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the Log menu item function getLogHTML() { $result=''; if ( canView('System') ) { if ( ZM\logToDatabase() > ZM\Logger::NOLOG ) { if ( ! ZM_RUN_AUDIT ) { # zmaudit can clean the logs, but if we aren't running it, then we should clean them regularly if ( preg_match('/^\d+$/', ZM_LOG_DATABASE_LIMIT) ) { # Number of lines, instead of an interval $rows = dbFetchOne('SELECT Count(*) AS `Rows` FROM `Logs`', 'Rows'); if ( $rows > ZM_LOG_DATABASE_LIMIT ) { dbQuery('DELETE low_priority FROM `Logs` ORDER BY `TimeKey` ASC LIMIT ?', array($rows - ZM_LOG_DATABASE_LIMIT)); } } else if ( preg_match('/^\d\s*(hour|minute|day|week|month|year)$/', ZM_LOG_DATABASE_LIMIT, $matches) ) { dbQuery('DELETE FROM `Logs` WHERE `TimeKey` < unix_timestamp( NOW() - interval '.ZM_LOG_DATABASE_LIMIT.') LIMIT 100'); } else { ZM\Error('Potentially invalid value for ZM_LOG_DATABASE_LIMIT: ' . ZM_LOG_DATABASE_LIMIT); } } $logstate = logState(); $class = ($logstate == 'ok') ? 'text-success' : ($logstate == 'alert' ? 'text-warning' : (($logstate == 'alarm' ? 'text-danger' : ''))); $result .= ''.PHP_EOL; } } return $result; } // Returns the html representing the log icon function getLogIconHTML() { $result=''; if ( canView('System') ) { if ( ZM\logToDatabase() > ZM\Logger::NOLOG ) { $logstate = logState(); $class = ($logstate == 'ok') ? 'text-success' : ($logstate == 'alert' ? 'text-warning' : (($logstate == 'alarm' ? 'text-danger' : ''))); $result .= ''.PHP_EOL; } } return $result; } // Returns the html representing the X10 Devices menu item function getDevicesHTML() { $result=''; if ( ZM_OPT_X10 && canView('Devices') ) { $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the Groups menu item function getGroupsHTML($view) { $result=''; $class = $view == 'groups' ? ' selected' : ''; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the Filter menu item function getFilterHTML($view,$filterQuery,$sortQuery,$limitQuery) { $result=''; $class = $view == 'filter' ? ' selected' : ''; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the Cycle menu item function getCycleHTML($view) { $result=''; if ( canView('Stream') ) { $class = $view == 'cycle' ? ' selected' : ''; $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the Montage menu item function getMontageHTML($view) { $result=''; if ( canView('Stream') ) { $class = $view == 'cycle' ? ' selected' : ''; $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the MontageReview menu item function getMontageReviewHTML($view) { $result=''; if ( canView('Events') ) { if ( isset($_REQUEST['filter']['Query']['terms']['attr']) ) { $terms = $_REQUEST['filter']['Query']['terms']; $count = 0; foreach ($terms as $term) { if ( $term['attr'] == 'StartDateTime' ) { $count += 1; if ($term['op'] == '>=') $minTime = $term['val']; if ($term['op'] == '<=') $maxTime = $term['val']; } } if ( $count == 2 ) { $montageReviewQuery = '&minTime='.$minTime.'&maxTime='.$maxTime; } } $live = isset($montageReviewQuery) ? '&fit=1'.$montageReviewQuery.'&live=0' : ''; $class = $view == 'montagereview' ? ' selected' : ''; $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the Audit Events Report menu item function getRprtEvntAuditHTML($view) { $result=''; if ( canView('Events') ) { $class = $view == 'report_event_audit' ? ' selected' : ''; $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the header collapse toggle menu item function getHeaderFlipHTML() { $result=''; $header = ( isset($_COOKIE['zmHeaderFlip']) and $_COOKIE['zmHeaderFlip'] == 'down') ? 'down' : 'up'; $result .= ''.PHP_EOL; return $result; } // Returns the html representing the logged in user name and avatar function getAcctCircleHTML($user=null) { $result=''; if ( ZM_OPT_USE_AUTH and $user ) { $result .= ''.PHP_EOL; } return $result; } // Returns the html representing the runtime status button function getStatusBtnHTML($status) { $result=''; if ( canEdit('System') ) { //$result .= ''.PHP_EOL; if ( ZM_SYSTEM_SHUTDOWN ) { $result .= ''.PHP_EOL; } } else if ( canView('System') ) { $result .= ''.PHP_EOL; } return $result; } function runtimeStatus($running=null) { if ( $running == null ) $running = daemonCheck(); if ( $running ) { $state = dbFetchOne('SELECT Name FROM States WHERE isActive=1', 'Name'); if ( $state == 'default' ) $state = ''; } return $running ? ($state ? $state : translate('Running')) : translate('Stopped'); } function xhtmlFooter() { global $cspNonce; global $view; global $skin; if ( canEdit('System') ) { include("skins/$skin/views/state.php"); } ?>