poller.php流程,poller_recovery.php

#!/usr/bin/php -q

/*

+-------------------------------------------------------------------------+

| Copyright (C) 2004-2020 The Cacti Group |

| |

| 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 2 |

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

+-------------------------------------------------------------------------+

| Cacti: The Complete RRDtool-based Graphing Solution |

+-------------------------------------------------------------------------+

| This code is designed, written, and maintained by the Cacti Group. See |

| about.php and/or the AUTHORS file for specific developer information. |

+-------------------------------------------------------------------------+

| http://www.cacti.net/ |

+-------------------------------------------------------------------------+

*/

/* tick use required as of PHP 4.3.0 to accomodate signal handling */

declare(ticks = 1);

require(__DIR__ . '/include/cli_check.php');

require_once($config['base_path'] . '/lib/poller.php');

require_once($config['base_path'] . '/lib/boost.php');

require_once($config['base_path'] . '/lib/dsstats.php');

/* display_version - displays version information */

function display_version() {

$version = get_cacti_version();

print "Cacti Boost RRD Update Poller, Version $version " . COPYRIGHT_YEARS . "\n";

}

/*display_help - displays the usage of the function */

function display_help () {

display_version();

print "\nusage: poller_recovery.php [--verbose] [--force] [--debug]\n\n";

print "Cacti's Remote Poller Recovery Script. This poller will transfer all offline boost records\n";

print "to the Main Cacti Pollers boost table\n";

print "Optional:\n";

print " --verbose - Show details logs at the command line\n";

print " --force - Force the execution of a update process\n";

print " --debug - Display verbose output during execution\n\n";

}

function sig_handler($signo) {

switch ($signo) {

case SIGTERM:

case SIGINT:

cacti_log('WARNING: Boost Poller terminated by user', false, 'BOOST');

/* tell the main poller that we are done */

db_execute("REPLACE INTO settings (name, value) VALUES ('boost_poller_status', 'terminated - end time:" . date('Y-m-d G:i:s') ."')");

exit;

break;

default:

/* ignore all other signals */

}

}

function debug($string) {

global $debug;

if ($debug) {

print trim($string) . "\n";

}

}

global $local_db_cnn_id, $remote_db_cnn_id;

$recovery_pid = db_fetch_cell("SELECT value FROM settings WHERE name='recovery_pid'", true, $local_db_cnn_id);

$packet_data = db_fetch_row("SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'", true, $remote_db_cnn_id);

if (isset($packet_data['Value'])) {

$max_allowed_packet = $packet_data['Value'];

} else {

$max_allowed_packet = 1E6;

}

/* process calling arguments */

$parms = $_SERVER['argv'];

array_shift($parms);

$debug = false;

$forcerun = false;

$verbose = false;

$poller_id = $config['poller_id'];

if (cacti_sizeof($parms)) {

foreach($parms as $parameter) {

if (strpos($parameter, '=')) {

list($arg, $value) = explode('=', $parameter);

} else {

$arg = $parameter;

$value = '';

}

switch ($arg) {

case '-d':

case '--debug':

$debug = true;

break;

case '-f':

case '--force':

$forcerun = true;

break;

case '--verbose':

$verbose = true;

break;

case '--version':

case '-V':

case '-v':

display_version();

exit;

case '--help':

case '-H':

case '-h':

display_help();

exit;

default:

print 'ERROR: Invalid Parameter ' . $parameter . "\n\n";

display_help();

exit;

}

}

}

/* check for an invalid run locaiton */

if ($poller_id == 1) {

print "ERROR: This command is only to be run on remote Cacti Data Collectors\n";

exit(1);

}

/* install signal handlers for UNIX only */

if (function_exists('pcntl_signal')) {

pcntl_signal(SIGTERM, 'sig_handler');

pcntl_signal(SIGINT, 'sig_handler');

}

/* take time and log performance data */

$start = microtime(true);

$record_limit = 10000;

$inserted = 0;

$sleep_time = 1;

debug('About to start recovery processing');

if (!empty($recovery_pid)) {

$pid = posix_kill($recovery_pid, 0);

if ($pid === false) {

$run = true;

} else {

$run = false;

}

} else {

$run = true;

}

if ($run) {

debug('No pid exists, starting recovery process!');

db_execute("DELETE FROM settings WHERE name='recovery_pid'", true, $local_db_cnn_id);

$end_count = 0;

/* let the console know you are in recovery mode */

db_execute_prepared('UPDATE poller

SET status="5"

WHERE id= ?', array($poller_id), true, $remote_db_cnn_id);

poller_push_reindex_data_to_poller(0, 0, true);

while (true) {

$max_time = db_fetch_cell("SELECT MAX(time)

FROM (

SELECT time

FROM poller_output_boost

ORDER BY time ASC

LIMIT $record_limit

) AS rs", '', true, $local_db_cnn_id);

if (empty($max_time)) {

break;

} else {

$rows = db_fetch_assoc_prepared('SELECT *

FROM poller_output_boost

WHERE time <= ?

ORDER BY time ASC, local_data_id ASC',

array($max_time));

if (cacti_sizeof($rows)) {

$count = 0;

$sql_array = array();

foreach($rows as $r) {

$sql = '(' . $r['local_data_id'] . ',' . db_qstr($r['rrd_name']) . ',' . db_qstr($r['time']) . ',' . db_qstr($r['output']) . ')';

$count += strlen($sql);

if ($count >= $max_allowed_packet) {

db_execute('INSERT IGNORE INTO poller_output_boost

(local_data_id, rrd_name, time, output)

VALUES ' . implode(',', $sql_array), true, $remote_db_cnn_id);

$inserted += cacti_sizeof($sql_array);

$sql_array = array();

$count = 0;

}

$sql_array[] = $sql;

}

if ($count > 0) {

db_execute("INSERT IGNORE INTO poller_output_boost

(local_data_id, rrd_name, time, output)

VALUES " . implode(',', $sql_array), true, $remote_db_cnn_id);

$inserted += cacti_sizeof($rows);

}

/* remove the recovery records */

if (is_object($local_db_cnn_id)) {

db_execute_prepared('DELETE FROM poller_output_boost

WHERE time <= ?',

array($max_time), true, $local_db_cnn_id);

}

}

sleep($sleep_time);

}

}

/* let the console know you are in online mode */

db_execute_prepared('UPDATE poller

SET status="2"

WHERE id= ?', array($poller_id), false, $remote_db_cnn_id);

} else {

debug('Recovery process still running, exiting');

cacti_log('Recovery process still running for Poller ' . $poller_id . '. PID is ' . $recovery_pid);

exit(1);

}

$end = microtime(true);

cacti_log('RECOVERY STATS: Time:' . round($end - $start, 2) . ' Records:' . $inserted, false, 'SYSTEM');

exit(0);

一键复制

编辑

Web IDE

原始数据

按行查看

历史

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值