poller.php,poller.php

#!/usr/bin/env php

/**

* poller.php

*

* -Description-

*

* 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.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program. If not, see .

*

* @package LibreNMS

* @subpackage poller

* @copyright (C) 2006 - 2012 Adam Armstrong

* Modified 4/17/19

* @author Heath Barnhart

*/

use LibreNMS\Config;

use LibreNMS\Alert\AlertRules;

$init_modules = ['polling', 'alerts', 'laravel'];

require __DIR__ . '/includes/init.php';

$poller_start = microtime(true);

echo Config::get('base_url') . " Poller\n";

$options = getopt('h:m:i:n:r::d::v::a::f::q');

if (isset($options['h'])) {

if ($options['h'] == 'odd') {

$options['n'] = '1';

$options['i'] = '2';

} elseif ($options['h'] == 'even') {

$options['n'] = '0';

$options['i'] = '2';

} elseif ($options['h'] == 'all') {

$where = ' ';

$doing = 'all';

} elseif ($options['h']) {

if (is_numeric($options['h'])) {

$where = "AND `device_id` = " . $options['h'];

$doing = $options['h'];

} else {

if (preg_match('/\*/', $options['h'])) {

$where = "AND `hostname` LIKE '" . str_replace('*', '%', mres($options['h'])) . "'";

} else {

$where = "AND `hostname` = '" . mres($options['h']) . "'";

}

$doing = $options['h'];

}

}

}

if (isset($options['i']) && $options['i'] && isset($options['n'])) {

$where = true;

// FIXME

$query = 'SELECT * FROM (SELECT @rownum :=0) r,

(

SELECT @rownum := @rownum +1 AS rownum, `devices`.*

FROM `devices`

WHERE `disabled` = 0

ORDER BY `device_id` ASC

) temp

WHERE MOD(temp.rownum, '.mres($options['i']).') = '.mres($options['n']).';';

$doing = $options['n'].'/'.$options['i'];

}

if (empty($where)) {

echo "-h | Poll single device\n";

echo "-h odd Poll odd numbered devices (same as -i 2 -n 0)\n";

echo "-h even Poll even numbered devices (same as -i 2 -n 1)\n";

echo "-h all Poll all devices\n\n";

echo "-i -n Poll as instance of \n";

echo " Instances start at 0. 0-3 for -n 4\n\n";

echo "Debugging and testing options:\n";

echo "-r Do not create or update RRDs\n";

echo "-f Do not insert data into InfluxDB\n";

echo "-p Do not insert data into Prometheus\n";

echo "-d Enable debugging output\n";

echo "-v Enable verbose debugging output\n";

echo "-m Specify module(s) to be run. Comma separate modules, submodules may be added with /\n";

echo "\n";

echo "No polling type specified!\n";

exit;

}

if (set_debug(isset($options['d'])) || isset($options['v'])) {

$versions = version_info();

echo <<

===================================

Version info:

Commit SHA: {$versions['local_sha']}

Commit Date: {$versions['local_date']}

DB Schema: {$versions['db_schema']}

PHP: {$versions['php_ver']}

MySQL: {$versions['mysql_ver']}

RRDTool: {$versions['rrdtool_ver']}

SNMP: {$versions['netsnmp_ver']}

==================================

EOH;

echo "DEBUG!\n";

if (isset($options['v'])) {

$vdebug = true;

}

update_os_cache(true); // Force update of OS Cache

}

if (isset($options['r'])) {

Config::set('norrd', true);

}

if (isset($options['f'])) {

Config::set('noinfluxdb', true);

}

if (isset($options['p'])) {

$prometheus = false;

}

if (isset($options['g'])) {

Config::set('nographite', true);

}

if (Config::get('base_url') !== true && Config::get('influxdb.enable') === true) {

$influxdb = influxdb_connect();

} else {

$influxdb = false;

}

if (Config::get('base_url') !== true && Config::get('graphite.enable') === true) {

$graphite = fsockopen(Config::get('graphite.host'), Config::get('graphite.port'));

if ($graphite !== false) {

echo "Connection made to " . Config::get('graphite.host') . " for Graphite support\n";

} else {

echo "Connection to " . Config::get('graphite.host') . " has failed, Graphite support disabled\n";

Config::set('nographite', true);

}

} else {

$graphite = false;

}

// If we've specified modules with -m, use them

$module_override = parse_modules('poller', $options);

rrdtool_initialize();

echo "Starting polling run:\n\n";

$polled_devices = 0;

$unreachable_devices = 0;

if (!isset($query)) {

$query = "SELECT * FROM `devices` WHERE `disabled` = 0 $where ORDER BY `device_id` ASC";

}

foreach (dbFetch($query) as $device) {

if ($device['os_group'] == 'cisco') {

$device['vrf_lite_cisco'] = dbFetchRows("SELECT * FROM `vrf_lite_cisco` WHERE `device_id` = " . $device['device_id']);

} else {

$device['vrf_lite_cisco'] = '';

}

if (!poll_device($device, $module_override)) {

$unreachable_devices++;

}

echo "#### Start Alerts ####\n";

$rules = new AlertRules();

$rules->runRules($device['device_id']);

echo "#### End Alerts ####\r\n";

$polled_devices++;

}

$poller_end = microtime(true);

$poller_run = ($poller_end - $poller_start);

$poller_time = substr($poller_run, 0, 5);

if ($graphite !== false) {

fclose($graphite);

}

if ($polled_devices) {

dbInsert(array(

'type' => 'poll',

'doing' => $doing,

'start' => $poller_start,

'duration' => $poller_time,

'devices' => $polled_devices,

'poller' => Config::get('base_url')

), 'perf_times');

}

$string = $argv[0] . " $doing " . date(Config::get('dateformat.compact')) . " - $polled_devices devices polled in $poller_time secs";

d_echo("$string\n");

if (!isset($options['q'])) {

printStats();

}

logfile($string);

rrdtool_close();

// Remove this for testing

// print_r(get_defined_vars());

if ($polled_devices === $unreachable_devices) {

exit(6);

}

exit(0);

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值