2016-09-14 15:53:04 +00:00
#!/usr/bin/env php
2013-11-04 06:16:01 +00:00
< ? php
/*
* Daily Task Checks
* ( c ) 2013 LibreNMS Contributors
*/
2018-07-30 21:58:38 +00:00
use App\Models\Device ;
2019-06-19 21:01:53 +00:00
use App\Models\DeviceGroup ;
2018-07-30 21:58:38 +00:00
use Illuminate\Database\Eloquent\Collection ;
2019-07-18 16:05:43 +00:00
use LibreNMS\Alert\AlertDB ;
2017-10-22 18:30:31 +00:00
use LibreNMS\Config ;
2017-11-24 09:37:52 +00:00
use LibreNMS\Exceptions\LockException ;
use LibreNMS\Util\MemcacheLock ;
2017-10-22 18:30:31 +00:00
2016-11-21 20:12:59 +00:00
$init_modules = array ( 'alerts' );
require __DIR__ . '/includes/init.php' ;
2017-08-26 20:35:39 +00:00
include_once __DIR__ . '/includes/notifications.php' ;
2013-11-04 06:16:01 +00:00
2017-11-24 09:37:52 +00:00
$options = getopt ( 'df:o:t:r:' );
2016-01-11 21:58:40 +00:00
if ( isset ( $options [ 'd' ])) {
echo " DEBUG \n " ;
$debug = true ;
}
2013-11-04 06:16:01 +00:00
2014-10-24 22:40:42 +00:00
if ( $options [ 'f' ] === 'update' ) {
2019-06-26 13:49:04 +00:00
if ( ! Config :: get ( 'update' )) {
2016-02-22 22:10:56 +00:00
exit ( 0 );
}
2019-06-26 13:49:04 +00:00
if ( Config :: get ( 'update_channel' ) == 'master' ) {
2016-02-22 22:10:56 +00:00
exit ( 1 );
2019-06-26 13:49:04 +00:00
} elseif ( Config :: get ( 'update_channel' ) == 'release' ) {
2016-02-22 22:10:56 +00:00
exit ( 3 );
2015-07-29 22:03:25 +00:00
}
2016-02-22 22:10:56 +00:00
exit ( 0 );
2014-10-24 22:40:42 +00:00
}
2013-11-04 06:16:01 +00:00
2016-07-30 15:57:09 +00:00
if ( $options [ 'f' ] === 'rrd_purge' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'rrd_purge' , 0 , 86000 );
2016-08-01 14:08:57 +00:00
}
2017-11-24 09:37:52 +00:00
$rrd_purge = Config :: get ( 'rrd_purge' );
$rrd_dir = Config :: get ( 'rrd_dir' );
if ( is_numeric ( $rrd_purge ) && $rrd_purge > 0 ) {
$cmd = " find $rrd_dir -type f -mtime + $rrd_purge -print -exec rm -f { } + " ;
$purge = `$cmd` ;
if ( ! empty ( $purge )) {
echo " Purged the following RRD files due to old age (over $rrd_purge days old): \n " ;
echo $purge ;
}
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
2016-07-30 15:57:09 +00:00
}
}
2014-10-24 22:40:42 +00:00
if ( $options [ 'f' ] === 'syslog' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'syslog_purge' , 0 , 86000 );
}
$syslog_purge = Config :: get ( 'syslog_purge' );
if ( is_numeric ( $syslog_purge )) {
$rows = ( int ) dbFetchCell ( 'SELECT MIN(seq) FROM syslog' );
while ( true ) {
$limit = dbFetchRow ( 'SELECT seq FROM syslog WHERE seq >= ? ORDER BY seq LIMIT 1000,1' , array ( $rows ));
if ( empty ( $limit )) {
break ;
}
2015-07-13 18:10:26 +00:00
2017-11-24 09:37:52 +00:00
if ( dbDelete ( 'syslog' , 'seq >= ? AND seq < ? AND timestamp < DATE_SUB(NOW(), INTERVAL ? DAY)' , array ( $rows , $limit , $syslog_purge )) > 0 ) {
$rows = $limit ;
echo " Syslog cleared for entries over $syslog_purge days 1000 limit \n " ;
} else {
break ;
}
2015-07-13 18:10:26 +00:00
}
2017-11-24 09:37:52 +00:00
dbDelete ( 'syslog' , 'seq >= ? AND timestamp < DATE_SUB(NOW(), INTERVAL ? DAY)' , array ( $rows , $syslog_purge ));
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
2014-03-18 14:13:27 +00:00
}
}
2015-07-13 18:10:26 +00:00
2019-02-21 12:23:01 +00:00
if ( $options [ 'f' ] === 'ports_fdb' ) {
$ret = lock_and_purge ( 'ports_fdb' , 'updated_at < DATE_SUB(NOW(), INTERVAL ? DAY)' );
exit ( $ret );
}
2014-10-24 22:40:42 +00:00
if ( $options [ 'f' ] === 'eventlog' ) {
2017-11-24 09:37:52 +00:00
$ret = lock_and_purge ( 'eventlog' , 'datetime < DATE_SUB(NOW(), INTERVAL ? DAY)' );
exit ( $ret );
2014-03-18 14:13:27 +00:00
}
2015-07-13 18:10:26 +00:00
2014-10-24 22:40:42 +00:00
if ( $options [ 'f' ] === 'authlog' ) {
2017-11-24 09:37:52 +00:00
$ret = lock_and_purge ( 'authlog' , 'datetime < DATE_SUB(NOW(), INTERVAL ? DAY)' );
exit ( $ret );
2014-10-02 00:37:43 +00:00
}
2015-07-13 18:10:26 +00:00
2014-11-03 17:25:45 +00:00
if ( $options [ 'f' ] === 'perf_times' ) {
2017-11-24 09:37:52 +00:00
$ret = lock_and_purge ( 'perf_times' , 'start < UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL ? DAY))' );
exit ( $ret );
2014-11-03 17:25:45 +00:00
}
2015-07-13 18:10:26 +00:00
2015-04-06 19:47:28 +00:00
if ( $options [ 'f' ] === 'callback' ) {
2016-01-19 21:50:00 +00:00
include_once 'includes/callback.php' ;
2015-04-06 19:47:28 +00:00
}
2015-07-13 18:10:26 +00:00
2015-06-22 20:55:31 +00:00
if ( $options [ 'f' ] === 'device_perf' ) {
2017-11-24 09:37:52 +00:00
$ret = lock_and_purge ( 'device_perf' , 'timestamp < DATE_SUB(NOW(),INTERVAL ? DAY)' );
exit ( $ret );
2015-06-22 20:55:31 +00:00
}
2015-09-27 15:35:33 +00:00
2018-07-03 13:27:20 +00:00
if ( $options [ 'f' ] === 'ports_purge' ) {
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'ports_purge' , 0 , 86000 );
}
$ports_purge = Config :: get ( 'ports_purge' );
if ( $ports_purge ) {
$interfaces = dbFetchRows ( 'SELECT * from `ports` AS P, `devices` AS D WHERE `deleted` = 1 AND D.device_id = P.device_id' );
foreach ( $interfaces as $interface ) {
delete_port ( $interface [ 'port_id' ]);
}
echo " All deleted ports now purged \n " ;
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
}
}
2017-10-22 18:30:31 +00:00
if ( $options [ 'f' ] === 'handle_notifiable' ) {
2017-08-26 20:35:39 +00:00
if ( $options [ 't' ] === 'update' ) {
$title = 'Error: Daily update failed' ;
2017-11-24 09:37:52 +00:00
$poller_name = Config :: get ( 'distributed_poller_name' );
2017-08-26 20:35:39 +00:00
if ( $options [ 'r' ]) {
2017-10-22 18:30:31 +00:00
// result was a success (1), remove the notification
2017-08-26 20:35:39 +00:00
remove_notification ( $title );
} else {
2017-10-22 18:30:31 +00:00
// result was a failure (0), create the notification
2017-08-26 20:35:39 +00:00
new_notification (
$title ,
2017-11-24 09:37:52 +00:00
" The daily update script (daily.sh) has failed on $poller_name . "
. 'Please check output by hand. If you need assistance, '
2017-08-26 20:35:39 +00:00
. 'visit the <a href="https://www.librenms.org/#support">LibreNMS Website</a> to find out how.' ,
2 ,
'daily.sh'
);
}
2018-01-10 14:40:58 +00:00
} elseif ( $options [ 't' ] === 'phpver' ) {
$error_title = 'Error: PHP version too low' ;
$warn_title = 'Warning: PHP version too low' ;
remove_notification ( $warn_title ); // remove warning
// if update is not set to false and version is min or newer
if ( Config :: get ( 'update' ) && $options [ 'r' ]) {
2019-02-07 19:23:30 +00:00
if ( $options [ 'r' ] === 'php53' ) {
$phpver = '5.6.4' ;
$eol_date = 'January 10th, 2018' ;
2019-02-08 14:17:02 +00:00
} elseif ( $options [ 'r' ] === 'php56' ) {
2019-02-07 19:23:30 +00:00
$phpver = '7.1.3' ;
$eol_date = 'February 1st, 2019' ;
}
2019-02-08 14:17:02 +00:00
if ( isset ( $phpver )) {
new_notification (
$error_title ,
" PHP version $phpver is the minimum supported version as of $eol_date . We recommend you update to PHP a supported version of PHP (7.2 suggested) to continue to receive updates. If you do not update PHP, LibreNMS will continue to function but stop receiving bug fixes and updates. " ,
2 ,
'daily.sh'
);
exit ( 1 );
}
2018-01-10 14:40:58 +00:00
}
remove_notification ( $error_title );
exit ( 0 );
2017-08-26 20:35:39 +00:00
}
}
2015-09-27 15:35:33 +00:00
if ( $options [ 'f' ] === 'notifications' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'notifications' , 0 , 86000 );
}
post_notifications ();
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
}
2015-09-27 15:35:33 +00:00
}
2015-12-13 16:16:39 +00:00
2016-03-02 18:39:16 +00:00
if ( $options [ 'f' ] === 'bill_data' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'syslog_purge' , 0 , 86000 );
}
$billing_data_purge = Config :: get ( 'billing_data_purge' );
if ( is_numeric ( $billing_data_purge ) && $billing_data_purge > 0 ) {
# Deletes data older than XX months before the start of the last complete billing period
echo " Deleting billing data more than $billing_data_purge month before the last completed billing cycle \n " ;
$sql = " DELETE bill_data
FROM bill_data
INNER JOIN ( SELECT bill_id ,
2016-03-02 18:39:16 +00:00
SUBDATE (
2017-11-24 09:37:52 +00:00
SUBDATE (
ADDDATE (
subdate ( curdate (), ( day ( curdate ()) - 1 )), # Start of this month
bill_day - 1 ), # Billing anniversary
INTERVAL IF ( bill_day > DAY ( curdate ()), 1 , 0 ) MONTH ), # Deal with anniversary not yet happened this month
INTERVAL ? MONTH ) AS threshold # Adjust based on config threshold
FROM bills ) q
ON bill_data . bill_id = q . bill_id AND bill_data . timestamp < q . threshold ; " ;
dbQuery ( $sql , array ( $billing_data_purge ));
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
2016-03-02 18:39:16 +00:00
}
}
2016-05-02 19:06:51 +00:00
if ( $options [ 'f' ] === 'alert_log' ) {
2017-11-24 09:37:52 +00:00
$ret = lock_and_purge ( 'alert_log' , 'time_logged < DATE_SUB(NOW(),INTERVAL ? DAY)' );
exit ( $ret );
2016-05-02 19:06:51 +00:00
}
2015-12-13 16:16:39 +00:00
if ( $options [ 'f' ] === 'purgeusers' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'purgeusers' , 0 , 86000 );
}
$purge = 0 ;
2019-06-26 13:49:04 +00:00
if ( is_numeric ( \LibreNMS\Config :: get ( 'radius.users_purge' )) && Config :: get ( 'auth_mechanism' ) === 'radius' ) {
2019-06-23 05:29:12 +00:00
$purge = \LibreNMS\Config :: get ( 'radius.users_purge' );
2015-12-13 16:16:39 +00:00
}
2019-06-26 13:49:04 +00:00
if ( is_numeric ( \LibreNMS\Config :: get ( 'active_directory.users_purge' )) && Config :: get ( 'auth_mechanism' ) === 'active_directory' ) {
2019-06-23 05:29:12 +00:00
$purge = \LibreNMS\Config :: get ( 'active_directory.users_purge' );
2015-12-13 16:16:39 +00:00
}
2017-11-24 09:37:52 +00:00
if ( $purge > 0 ) {
foreach ( dbFetchRows ( " SELECT DISTINCT(`user`) FROM `authlog` WHERE `datetime` >= DATE_SUB(NOW(), INTERVAL ? DAY) " , array ( $purge )) as $user ) {
$users [] = $user [ 'user' ];
}
2018-08-26 12:42:21 +00:00
if ( dbDelete ( 'users' , " username NOT IN " . dbGenPlaceholders ( count ( $users )), $users )) {
2017-11-24 09:37:52 +00:00
echo " Removed users that haven't logged in for $purge days " ;
}
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
2015-12-13 16:16:39 +00:00
}
}
2016-10-14 23:29:55 +00:00
if ( $options [ 'f' ] === 'refresh_alert_rules' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'refresh_alert_rules' , 0 , 86000 );
2016-10-14 23:29:55 +00:00
}
2017-11-24 09:37:52 +00:00
echo 'Refreshing alert rules queries' . PHP_EOL ;
2018-10-15 21:03:56 +00:00
$rules = dbFetchRows ( 'SELECT `id`, `rule`, `builder`, `extra` FROM `alert_rules`' );
2017-11-24 09:37:52 +00:00
foreach ( $rules as $rule ) {
2018-10-15 21:03:56 +00:00
$rule_options = json_decode ( $rule [ 'extra' ], true );
2018-10-16 07:00:50 +00:00
if ( $rule_options [ 'options' ][ 'override_query' ] !== 'on' ) {
2019-07-18 16:05:43 +00:00
$data [ 'query' ] = AlertDB :: genSQL ( $rule [ 'rule' ], $rule [ 'builder' ]);
2018-10-15 21:03:56 +00:00
if ( ! empty ( $data [ 'query' ])) {
dbUpdate ( $data , 'alert_rules' , 'id=?' , array ( $rule [ 'id' ]));
unset ( $data );
}
2017-11-24 09:37:52 +00:00
}
}
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
2016-10-14 23:29:55 +00:00
}
}
2016-12-12 14:26:17 +00:00
2019-06-19 21:01:53 +00:00
if ( $options [ 'f' ] === 'refresh_device_groups' ) {
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'refresh_device_groups' , 0 , 86000 );
}
echo 'Refreshing device group table relationships' . PHP_EOL ;
DeviceGroup :: all () -> each ( function ( $deviceGroup ) {
if ( $deviceGroup -> type == 'dynamic' ) {
/** @var DeviceGroup $deviceGroup */
$deviceGroup -> rules = $deviceGroup -> getParser () -> generateJoins () -> toArray ();
$deviceGroup -> save ();
}
});
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
}
}
2016-12-12 14:26:17 +00:00
if ( $options [ 'f' ] === 'notify' ) {
2019-06-23 05:29:12 +00:00
if ( \LibreNMS\Config :: has ( 'alert.default_mail' )) {
2016-12-12 14:26:17 +00:00
send_mail (
2019-06-23 05:29:12 +00:00
\LibreNMS\Config :: get ( 'alert.default_mail' ),
2018-02-16 10:08:26 +00:00
'[LibreNMS] Auto update has failed for ' . Config :: get ( 'distributed_poller_name' ),
2016-12-12 14:26:17 +00:00
" We just attempted to update your install but failed. The information below should help you fix this. \r \n \r \n " . $options [ 'o' ]
);
}
}
2017-03-22 10:17:13 +00:00
if ( $options [ 'f' ] === 'peeringdb' ) {
2017-11-24 09:37:52 +00:00
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'peeringdb' , 0 , 86000 );
}
cache_peeringdb ();
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
}
2017-03-22 10:17:13 +00:00
}
2017-10-27 20:03:58 +00:00
if ( $options [ 'f' ] === 'refresh_os_cache' ) {
2017-11-03 21:10:24 +00:00
echo 'Clearing OS cache' . PHP_EOL ;
unlink ( Config :: get ( 'install_dir' ) . '/cache/os_defs.cache' );
2017-10-27 20:03:58 +00:00
}
2018-07-30 21:58:38 +00:00
if ( $options [ 'f' ] === 'recalculate_device_dependencies' ) {
// fix broken dependency max_depth calculation in case things weren't done though eloquent
try {
if ( Config :: get ( 'distributed_poller' )) {
MemcacheLock :: lock ( 'recalculate_device_dependencies' , 0 , 86000 );
}
\LibreNMS\DB\Eloquent :: boot ();
// update all root nodes and recurse, chunk so we don't blow up
Device :: doesntHave ( 'parents' ) -> with ( 'children' ) -> chunk ( 100 , function ( Collection $devices ) {
// anonymous recursive function
$recurse = function ( Device $device ) use ( & $recurse ) {
$device -> updateMaxDepth ();
$device -> children -> each ( $recurse );
};
$devices -> each ( $recurse );
});
} catch ( LockException $e ) {
echo $e -> getMessage () . PHP_EOL ;
exit ( - 1 );
}
}