%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Monit/Api/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Monit/Api/StatusController.php |
<?php
/*
* Copyright (C) 2017-2018 EURO-LOG AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\Monit\Api;
use OPNsense\Base\ApiControllerBase;
use OPNsense\Monit\Monit;
/**
* Class StatusController
* @package OPNsense\Monit
*/
class StatusController extends ApiControllerBase
{
/**
* get monit status page
* see monit(1)
* @return array
*/
public function getAction($format = 'xml')
{
$result = array("result" => "failed");
$socketPath = "/var/run/monit.sock";
// map the requested html format from the status page to the Monit text format
$format = $format == 'html' ? 'text' : $format;
// check monit httpd socket defined in monitrc by 'set httpd ...'
if (file_exists($socketPath) && filetype($socketPath) == "socket") {
// set curl options
$ch = curl_init("http://127.0.0.1/_status?format=" . $format);
curl_setopt($ch, CURLOPT_UNIX_SOCKET_PATH, $socketPath);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// get credentials if configured
$mdlMonit = new Monit(false);
if (
(string)$mdlMonit->general->httpdUsername != null && trim((string)$mdlMonit->general->httpdUsername) !== "" &&
(string)$mdlMonit->general->httpdPassword != null && trim((string)$mdlMonit->general->httpdPassword) !== ""
) {
curl_setopt($ch, CURLOPT_USERPWD, ((string)$mdlMonit->general->httpdUsername) . ":" . ((string)$mdlMonit->general->httpdPassword));
}
// send request
if (!$response = curl_exec($ch)) {
$result['status'] = curl_error($ch);
return $result;
}
$HTTPCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($HTTPCode != 200) {
$result['status'] = 'Monit returns with code ' . $HTTPCode;
} else {
$result['result'] = "ok";
// format the response
if ($format == 'xml') {
$result['status'] = simplexml_load_string($response);
} elseif ($format === 'text') {
$result['status'] = '<div class="alert"><pre>' . $this->bashColorToCSS($response) . '</pre></div>';
}
}
} else {
$msg = "
Either the file " . $socketPath . " does not exists or it is not a unix socket.
Please check if the Monit service is running.
If you have started Monit recently, wait for StartDelay seconds and refresh this page.";
if ($format == 'xml') {
$result['status'] = $msg;
} elseif ($format === 'text') {
$result['status'] = '<div class="alert"><pre>' . $msg . '</pre></div>';
}
}
return $result;
}
/**
* convert bash color escape codes to CSS
* @param $string
* @return string
*/
private function bashColorToCSS($string)
{
$colors = [
'/\x1b\[0;30m(.*?)\x1b\[0m/s' => '<strong>$1</strong>',
'/\x1b\[0;30m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>',
'/\x1b\[0;31m(.*?)\x1b\[0m/s' => '<span class="text-danger">$1</span>',
'/\x1b\[0;32m(.*?)\x1b\[0m/s' => '<span class="text-success">$1</span>',
'/\x1b\[0;33m(.*?)\x1b\[0m/s' => '<span class="text-warning">$1</span>',
'/\x1b\[0;34m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>',
'/\x1b\[0;35m(.*?)\x1b\[0m/s' => '<span class="text-danger">$1</span>',
'/\x1b\[0;36m(.*?)\x1b\[0m/s' => '<span class="text-primary">$1</span>',
'/\x1b\[0;37m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>',
'/\x1b\[0;39m(.*?)\x1b\[0m/s' => '<span>$1</span>',
'/\x1b\[1;30m(.*?)\x1b\[0m/s' => '<strong class="text-info">$1</strong>',
'/\x1b\[1;31m(.*?)\x1b\[0m/s' => '<strong class="text-danger">$1</strong>',
'/\x1b\[1;32m(.*?)\x1b\[0m/s' => '<strong class="text-success">$1</strong>',
'/\x1b\[1;33m(.*?)\x1b\[0m/s' => '<strong class="text-warning">$1</strong>',
'/\x1b\[1;34m(.*?)\x1b\[0m/s' => '<strong class="text-info">$1</strong>',
'/\x1b\[1;35m(.*?)\x1b\[0m/s' => '<strong class="text-danger">$1</strong>',
'/\x1b\[1;36m(.*?)\x1b\[0m/s' => '<strong class="text-primary">$1</strong>',
'/\x1b\[1;37m(.*?)\x1b\[0m/s' => '<strong class="text-info">$1</strong>',
'/\x1b\[0;90m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>',
'/\x1b\[0;91m(.*?)\x1b\[0m/s' => '<span class="text-danger">$1</span>',
'/\x1b\[0;92m(.*?)\x1b\[0m/s' => '<span class="text-success">$1</span>',
'/\x1b\[0;93m(.*?)\x1b\[0m/s' => '<span class="text-warning">$1</span>',
'/\x1b\[0;94m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>',
'/\x1b\[0;95m(.*?)\x1b\[0m/s' => '<span class="text-danger">$1</span>',
'/\x1b\[0;96m(.*?)\x1b\[0m/s' => '<span class="text-primary">$1</span>',
'/\x1b\[0;97m(.*?)\x1b\[0m/s' => '<span class="text-info">$1</span>'
];
return preg_replace(array_keys($colors), $colors, $string);
}
}