* * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. Please see LICENSE.txt at the top level of * the source code distribution for details. * * @package LibreNMS * @subpackage webui * @link https://www.librenms.org * @copyright 2018 LibreNMS * @author LibreNMS Contributors */ use LibreNMS\Config; use LibreNMS\Enum\CheckStatus; use LibreNMS\Enum\SyslogSeverity; $filter_hostname = $vars['hostname']; $filter_range = $vars['range']; if (isset($searchPhrase) && ! empty($searchPhrase)) { $query = 'message:"' . $searchPhrase . '"'; } else { $query = '*'; } if (isset($current)) { $offset = ($current * $rowCount) - ($rowCount); $limit = $rowCount; } if ($rowCount != -1) { $extra_query = "&limit=$limit&offset=$offset"; } if (! empty($filter_hostname)) { if (! empty($query)) { $query .= ' && '; } $ip = gethostbyname($filter_hostname); $device = device_by_name($filter_hostname); $query .= 'source:"' . $filter_hostname . '" || source:"' . $ip . '"'; if (isset($device['ip']) && $ip != $device['ip']) { $query .= ' || source:"' . $device['ip'] . '"'; } } if (Config::has('graylog.base_uri')) { $graylog_base = Config::get('graylog.base_uri'); } elseif (version_compare(Config::get('graylog.version'), '2.1', '>=')) { $graylog_base = '/api/search/universal/relative'; } else { $graylog_base = '/search/universal/relative'; } $graylog_url = Config::get('graylog.server') . ':' . Config::get('graylog.port') . $graylog_base . '?query=' . urlencode($query) . '&range=' . $filter_range . $extra_query; $context = stream_context_create([ 'http' => [ 'header' => 'Authorization: Basic ' . base64_encode(Config::get('graylog.username') . ':' . Config::get('graylog.password')) . "\r\n" . 'Accept: application/json', ], ]); $messages = json_decode(file_get_contents($graylog_url, false, $context), true); $labels = [ CheckStatus::OK => 'label-info', CheckStatus::UNKNOWN => 'label-default', CheckStatus::WARNING => 'label-warning', CheckStatus::ERROR => 'label-danger', ]; foreach ($messages['messages'] as $message) { if (Config::has('graylog.timezone')) { $userTimezone = new DateTimeZone(Config::get('graylog.timezone')); $graylogTime = new DateTime($message['message']['timestamp']); $offset = $userTimezone->getOffset($graylogTime); $timeInterval = DateInterval::createFromDateString((string) $offset . 'seconds'); $graylogTime->add($timeInterval); $displayTime = $graylogTime->format('Y-m-d H:i:s'); } else { $displayTime = $message['message']['timestamp']; } $color = $labels[SyslogSeverity::STATUS[$message['message']['level']] ?? CheckStatus::UNKNOWN]; $label = ""; $response[] = [ 'timestamp' => $label . $displayTime, 'source' => '' . $message['message']['source'] . '', 'message' => $message['message']['message'], 'facility' => $message['message']['facility'], 'level' => $message['message']['level'], ]; } if (empty($messages['total_results'])) { $total = 0; } else { $total = $messages['total_results']; } $output = ['current'=>$current, 'rowCount'=>$rowCount, 'rows'=>$response, 'total'=>$total]; echo json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);