. * * @package phpservermon * @author Pepijn Over * @copyright Copyright (c) 2008-2014 Pepijn Over * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 * @version Release: @package_version@ * @link http://www.phpservermonitor.org/ **/ namespace psm\Module\Server\Controller; use psm\Service\Database; use psm\Service\Template; /** * Server module. Add/edit/delete servers, show a list of all servers etc. */ class ServerController extends AbstractServerController { function __construct(Database $db, Template $tpl) { parent::__construct($db, $tpl); $this->setActions(array( 'index', 'edit', 'save', 'delete', 'view', ), 'index'); // make sure only admins are allowed to edit/delete servers: $this->setMinUserLevelRequiredForAction(PSM_USER_ADMIN, array( 'delete', 'edit', 'save' )); } /** * Prepare the template to show a list of all servers */ protected function executeIndex() { $this->setTemplateId('server_list', 'server/server.tpl.html'); $sidebar = new \psm\Util\Module\Sidebar($this->tpl); $this->setSidebar($sidebar); // check if user is admin, in that case we add the buttons if($this->user->getUserLevel() == PSM_USER_ADMIN) { $sidebar->addLink( 'add_new', psm_get_lang('system', 'add_new'), psm_build_url(array('mod' => 'server', 'action' => 'edit')), 'plus' ); // get the action buttons per server $this->tpl->newTemplate('server_list_admin_actions', 'server/server.tpl.html'); $html_actions = $this->tpl->getTemplate('server_list_admin_actions'); } else { $html_actions = ''; } $sidebar->addLink( 'update', psm_get_lang('menu', 'server_update'), psm_build_url(array('mod' => 'server_update')), 'refresh' ); // we need an array for our template magic (see below): $html_actions = array('html_actions' => $html_actions); $servers = $this->getServers(); $server_count = count($servers); for ($x = 0; $x < $server_count; $x++) { // template magic: push the actions html to the front of the server array // so the template handler will add it first. that way the other server vars // will also be replaced in the html_actions template itself $servers[$x] = $html_actions + $servers[$x]; $servers[$x]['class'] = ($x & 1) ? 'odd' : 'even'; if($servers[$x]['type'] == 'website') { // add link to label $servers[$x]['ip'] = ''.$servers[$x]['ip'].''; } $servers[$x] = $this->formatServer($servers[$x]); } // add servers to template $this->tpl->addTemplateDataRepeat($this->getTemplateId(), 'servers', $servers); } /** * Prepare the template to show the update screen for a single server */ protected function executeEdit() { $this->setTemplateId('server_update', 'server/server.tpl.html'); $sidebar = new \psm\Util\Module\Sidebar($this->tpl); $this->setSidebar($sidebar); $sidebar->addLink( 'go_back', psm_get_lang('system', 'go_back'), psm_build_url(array('mod' => 'server')), 'th-list' ); $server_id = isset($_GET['id']) ? intval($_GET['id']) : 0; $tpl_data = array( 'url_go_back' => psm_build_url(array('mod' => 'server')), ); switch(intval($server_id)) { case 0: // insert mode $tpl_data['titlemode'] = psm_get_lang('system', 'insert'); $tpl_data['edit_server_id'] = '0'; $tpl_data['edit_value_warning_threshold'] = '1'; break; default: // edit mode // get server entry $edit_server = $this->db->selectRow( PSM_DB_PREFIX.'servers', array('server_id' => $server_id) ); if (empty($edit_server)) { $this->addMessage('Invalid server', 'error'); return $this->initializeAction('index'); } $tpl_data = array_merge($tpl_data, array( 'titlemode' => psm_get_lang('system', 'edit') . ' ' . $edit_server['label'], 'edit_server_id' => $edit_server['server_id'], 'edit_value_label' => $edit_server['label'], 'edit_value_ip' => $edit_server['ip'], 'edit_value_port' => $edit_server['port'], 'edit_value_pattern' => $edit_server['pattern'], 'edit_value_warning_threshold' => $edit_server['warning_threshold'], 'edit_type_selected_' . $edit_server['type'] => 'selected="selected"', 'edit_active_selected_' . $edit_server['active'] => 'selected="selected"', 'edit_email_selected_' . $edit_server['email'] => 'selected="selected"', 'edit_sms_selected_' . $edit_server['sms'] => 'selected="selected"', )); break; } $this->tpl->addTemplateData( $this->getTemplateId(), $tpl_data ); } /** * Executes the saving of one of the servers */ protected function executeSave() { // check for add/edit mode if(isset($_POST['label']) && isset($_POST['ip']) && isset($_POST['port'])) { $server_id = isset($_GET['id']) ? intval($_GET['id']) : 0; $clean = array( 'label' => strip_tags($_POST['label']), 'ip' => strip_tags($_POST['ip']), 'port' => intval($_POST['port']), 'type' => in_array($_POST['type'], array('website', 'service')) ? $_POST['type'] : 'website', 'pattern' => $_POST['pattern'], 'warning_threshold' => intval($_POST['warning_threshold']), 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', 'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no', ); // check for edit or add if($server_id > 0) { // edit $this->db->save( PSM_DB_PREFIX.'servers', $clean, array('server_id' => $server_id) ); $this->addMessage(psm_get_lang('servers', 'updated'), 'success'); } else { // add $clean['status'] = 'on'; $this->db->save(PSM_DB_PREFIX.'servers', $clean); $this->addMessage(psm_get_lang('servers', 'inserted'), 'success'); } } $this->initializeAction('index'); } /** * Executes the deletion of one of the servers */ protected function executeDelete() { if(isset($_GET['id'])) { $id = intval($_GET['id']); // do delete $res = $this->db->delete(PSM_DB_PREFIX . 'servers', array('server_id' => $id)); if($res == 1) { $this->db->delete(PSM_DB_PREFIX.'log', array('server_id' => $id)); $this->db->delete(PSM_DB_PREFIX.'users_servers', array('server_id' => $id)); $this->db->delete(PSM_DB_PREFIX.'servers_uptime', array('server_id' => $id)); $this->db->delete(PSM_DB_PREFIX.'servers_history', array('server_id' => $id)); } $this->addMessage(psm_get_lang('system', 'deleted'), 'success'); } $this->initializeAction('index'); } /** * Prepare the view template */ protected function executeView() { $this->setTemplateId('server_view', 'server/view.tpl.html'); $server_id = isset($_GET['id']) ? intval($_GET['id']) : 0; // get server entry $server = $this->db->selectRow( PSM_DB_PREFIX.'servers', array('server_id' => $server_id) ); if (empty($server)) { $this->addMessage('Invalid server', 'error'); return $this->initializeAction('index'); } $sidebar = new \psm\Util\Module\Sidebar($this->tpl); $this->setSidebar($sidebar); $sidebar->setSubtitle($server['label']); if($this->user->getUserLevel() == PSM_USER_ADMIN) { $sidebar->addLink( 'edit', psm_get_lang('system', 'edit'), psm_build_url(array('mod' => 'server', 'action' => 'edit', 'id' => $server_id)), 'edit' ); $sidebar->addLink( 'delete', psm_get_lang('system', 'delete'), "javascript:sm_delete('{$server_id}', 'server');", 'remove' ); } $back_to = isset($_GET['back_to']) ? $_GET['back_to'] : 'server'; $sidebar->addLink( 'go_back', psm_get_lang('system', 'go_back'), psm_build_url(array('mod' => $back_to)), 'th-list' ); $tpl_data = $this->formatServer($server); $history = new \psm\Util\Server\HistoryGraph($this->db, $this->tpl); $tpl_data['html_history'] = $history->createHTML($server_id); $this->tpl->addTemplateData( $this->getTemplateId(), $tpl_data ); } /** * Format server data for display * @param array $server * @return array */ protected function formatServer($server) { $server['rtime'] = round((float) $server['rtime'], 4); $server['last_online'] = psm_timespan($server['last_online']); $server['last_check'] = psm_timespan($server['last_check']); $server['active'] = psm_get_lang('system', $server['active']); $server['email'] = psm_get_lang('system', $server['email']); $server['sms'] = psm_get_lang('system', $server['sms']); $server['url_view'] = psm_build_url(array( 'mod' => 'server', 'action' => 'view', 'id' => $server['server_id'], )); if($server['status'] == 'on' && $server['warning_threshold_counter'] > 0) { $server['status'] = 'warning'; } $server['type'] = psm_get_lang('servers', 'type_' . $server['type']); return $server; } // override parent::createHTMLLabels() protected function createHTMLLabels() { $this->tpl->addTemplateData( $this->getTemplateId(), array( 'subtitle' => psm_get_lang('menu', 'server'), 'label_label' => psm_get_lang('servers', 'label'), 'label_status' => psm_get_lang('menu', 'server_status'), 'label_domain' => psm_get_lang('servers', 'domain'), 'label_port' => psm_get_lang('servers', 'port'), 'label_type' => psm_get_lang('servers', 'type'), 'label_website' => psm_get_lang('servers', 'type_website'), 'label_service' => psm_get_lang('servers', 'type_service'), 'label_type' => psm_get_lang('servers', 'type'), 'label_pattern' => psm_get_lang('servers', 'pattern'), 'label_pattern_description' => psm_get_lang('servers', 'pattern_description'), 'label_last_check' => psm_get_lang('servers', 'last_check'), 'label_rtime' => psm_get_lang('servers', 'latency'), 'label_last_online' => psm_get_lang('servers', 'last_online'), 'label_monitoring' => psm_get_lang('servers', 'monitoring'), 'label_send_email' => psm_get_lang('servers', 'send_email'), 'label_send_sms' => psm_get_lang('servers', 'send_sms'), 'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'), 'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'), 'label_action' => psm_get_lang('system', 'action'), 'label_save' => psm_get_lang('system', 'save'), 'label_go_back' => psm_get_lang('system', 'go_back'), 'label_edit' => psm_get_lang('system', 'edit') . ' ' . psm_get_lang('servers', 'server'), 'label_delete' => psm_get_lang('system', 'delete') . ' ' . psm_get_lang('servers', 'server'), 'label_yes' => psm_get_lang('system', 'yes'), 'label_no' => psm_get_lang('system', 'no'), 'label_add_new' => psm_get_lang('system', 'add_new'), ) ); return parent::createHTMLLabels(); } }