2016-09-14 10:53:04 -05:00
#!/usr/bin/env php
2015-05-22 16:35:38 +01:00
< ? php
/*
* LibreNMS
*
* Copyright ( c ) 2014 Neil Lathwood < https :// github . com / laf / http :// www . lathwood . co . uk / fa >
*
* 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 .
*/
2016-09-14 10:53:04 -05:00
chdir ( __DIR__ ); // cwd to the directory containing this script
2016-10-03 11:48:19 -05:00
require_once 'includes/common.php' ;
2017-07-17 13:02:28 -05:00
require_once 'includes/functions.php' ;
require_once 'includes/dbFacile.php' ;
2016-10-03 11:48:19 -05:00
2015-07-13 20:10:26 +02:00
$options = getopt ( 'm:h::' );
2015-05-22 16:35:38 +01:00
if ( isset ( $options [ 'h' ])) {
2016-08-28 17:32:55 -05:00
echo
2015-07-13 20:10:26 +02:00
" \n Validate setup tool
2015-05-22 16:35:38 +01:00
2015-07-13 20:10:26 +02:00
Usage : ./ validate . php [ - m < module > ] [ - h ]
- h This help section .
- m Any sub modules you want to run , comma separated :
2015-07-24 07:39:20 +01:00
- mail : this will test your email settings ( uses default_mail option even if default_only is not set ) .
- dist - poller : this will test for the install running as a distributed poller .
2016-02-01 23:29:37 +00:00
- rrdcheck : this will check to see if your rrd files are corrupt
2015-05-22 16:35:38 +01:00
2015-07-13 20:10:26 +02:00
Example : ./ validate . php - m mail .
2015-05-22 16:35:38 +01:00
2015-07-13 20:10:26 +02:00
"
2015-08-06 19:02:05 +00:00
;
2015-07-13 20:10:26 +02:00
exit ;
2015-05-22 16:35:38 +01:00
}
2016-10-03 11:48:19 -05:00
2017-07-17 13:02:28 -05:00
// Buffer output
ob_start ();
register_shutdown_function ( function () {
global $versions ;
$output = ob_get_clean ();
if ( ! isset ( $versions )) {
$versions = version_info ();
}
@ ob_end_clean ();
echo <<< EOF
====================================
Component | Version
--------- | -------
LibreNMS | { $versions [ 'local_ver' ]}
DB Schema | { $versions [ 'db_schema' ]}
PHP | { $versions [ 'php_ver' ]}
MySQL | { $versions [ 'mysql_ver' ]}
RRDTool | { $versions [ 'rrdtool_ver' ]}
SNMP | { $versions [ 'netsnmp_ver' ]}
====================================
$output
EOF ;
});
2016-10-03 11:48:19 -05:00
// critical config.php checks
if ( ! file_exists ( 'config.php' )) {
print_fail ( 'config.php does not exist, please copy config.php.default to config.php' );
exit ;
}
2017-07-17 13:02:28 -05:00
$pre_checks_failed = false ;
2016-10-03 11:48:19 -05:00
$syntax_check = `php -ln config.php` ;
if ( ! str_contains ( $syntax_check , 'No syntax errors detected' )) {
2015-05-22 16:35:38 +01:00
print_fail ( 'Syntax error in config.php' );
2016-10-03 11:48:19 -05:00
echo $syntax_check ;
2017-07-17 13:02:28 -05:00
$pre_checks_failed = true ;
2015-05-22 16:35:38 +01:00
}
2016-10-03 11:48:19 -05:00
$first_line = rtrim ( `head -n1 config.php` );
if ( ! starts_with ( $first_line , '<?php' )) {
print_fail ( " config.php doesn't start with a <?php - please fix this ( $first_line ) " );
2017-07-17 13:02:28 -05:00
$pre_checks_failed = true ;
2016-08-31 10:20:07 +02:00
}
2016-10-03 11:48:19 -05:00
if ( str_contains ( `tail config.php` , '?>' )) {
print_fail ( " Remove the ?> at the end of config.php " );
2017-07-17 13:02:28 -05:00
$pre_checks_failed = true ;
}
// Composer checks
if ( ! file_exists ( 'vendor/autoload.php' )) {
print_fail ( 'Composer has not been run, dependencies are missing' , 'composer install --no-dev' );
$pre_checks_failed = true ;
}
// Check php modules we use to make sure they are loaded
2017-09-16 01:29:54 +01:00
$extensions = array ( 'mysqli' , 'pcre' , 'curl' , 'session' , 'snmp' , 'mcrypt' , 'xml' );
2017-07-17 13:02:28 -05:00
foreach ( $extensions as $extension ) {
2017-09-16 01:29:54 +01:00
if ( extension_loaded ( $extension ) == false ) {
2017-07-17 13:02:28 -05:00
$missing_extensions [] = $extension ;
}
}
if ( ! empty ( $missing_extensions )) {
print_fail ( " We couldn't find the following php extensions, please ensure they are installed: " );
foreach ( $missing_extensions as $extension ) {
echo " $extension\n " ;
}
$pre_checks_failed = true ;
2016-10-03 11:48:19 -05:00
}
2017-07-17 13:02:28 -05:00
if ( $pre_checks_failed ) {
2016-10-03 11:48:19 -05:00
exit ;
2015-12-10 23:02:48 +00:00
}
2017-07-17 13:02:28 -05:00
$init_modules = array ( 'nodb' );
2016-11-21 14:12:59 -06:00
require 'includes/init.php' ;
2016-04-29 12:53:02 -05:00
// make sure install_dir is set correctly, or the next includes will fail
2016-08-28 17:32:55 -05:00
if ( ! file_exists ( $config [ 'install_dir' ] . '/config.php' )) {
2016-04-29 12:53:02 -05:00
print_fail ( '$config[\'install_dir\'] is not set correctly. It should probably be set to: ' . getcwd ());
exit ;
}
2016-10-03 11:48:19 -05:00
// Check we are running this as the root user
if ( function_exists ( 'posix_getpwuid' )) {
$userinfo = posix_getpwuid ( posix_geteuid ());
$username = $userinfo [ 'name' ];
} else {
$username = getenv ( 'USERNAME' ) ? : getenv ( 'USER' ); //http://php.net/manual/en/function.get-current-user.php
}
2016-10-19 14:14:12 -05:00
if ( ! ( $username === 'root' || ( isset ( $config [ 'user' ]) && $username === $config [ 'user' ]))) {
print_fail ( 'You need to run this script as root' . ( isset ( $config [ 'user' ]) ? ' or ' . $config [ 'user' ] : '' ));
2016-10-03 11:48:19 -05:00
}
2015-09-21 21:06:57 +00:00
// Let's test the user configured if we have it
if ( isset ( $config [ 'user' ])) {
$tmp_user = $config [ 'user' ];
$tmp_dir = $config [ 'install_dir' ];
2016-01-25 23:17:02 +00:00
$find_result = rtrim ( `find $tmp_dir \! -user $tmp_user` );
2015-09-21 21:06:57 +00:00
if ( ! empty ( $find_result )) {
// This isn't just the log directory, let's print the list to the user
2017-07-03 16:17:07 -05:00
$files = array_diff ( explode ( PHP_EOL , $find_result ), array (
" $tmp_dir /logs/error_log " ,
" $tmp_dir /logs/access_log " ,
));
if ( ! empty ( $files )) {
2017-03-02 08:04:29 +00:00
print_fail (
" We have found some files that are owned by a different user than $tmp_user , " .
'this will stop you updating automatically and / or rrd files being updated causing graphs to fail.' ,
" chown -R $tmp_user : $tmp_user { $config [ 'install_dir' ] } "
);
2016-11-23 11:41:13 -06:00
print_list ( $files , " \t %s \n " );
2015-09-21 21:06:57 +00:00
}
}
2016-08-28 17:32:55 -05:00
} else {
2015-12-10 23:02:48 +00:00
print_warn ( 'You don\'t have $config["user"] set, this most likely needs to be set to librenms' );
}
2015-09-21 21:06:57 +00:00
2015-05-22 16:35:38 +01:00
// Run test on MySQL
2017-04-06 16:02:37 -05:00
try {
dbConnect ();
2015-05-22 16:35:38 +01:00
print_ok ( 'Database connection successful' );
2017-04-06 16:02:37 -05:00
} catch ( \LibreNMS\Exceptions\DatabaseConnectException $e ) {
print_fail ( 'Error connecting to your database ' . $e -> getMessage ());
2015-05-22 16:35:38 +01:00
}
2017-04-06 16:02:37 -05:00
// pull in the database config settings
mergedb ();
2015-05-22 16:35:38 +01:00
2015-08-06 19:02:05 +00:00
// Test for MySQL Strict mode
$strict_mode = dbFetchCell ( " SELECT @@global.sql_mode " );
2017-03-02 08:04:29 +00:00
if ( str_contains ( $strict_mode , 'STRICT_TRANS_TABLES' )) {
2017-02-23 23:02:51 +00:00
//FIXME - Come back to this once other MySQL modes are fixed
//print_fail('You have MySQL STRICT_TRANS_TABLES enabled, please disable this until full support has been added: https://dev.mysql.com/doc/refman/5.0/en/sql-mode.html');
}
2017-07-03 21:46:45 +01:00
// Test for lower case table name support
$lc_mode = dbFetchCell ( " SELECT @@global.lower_case_table_names " );
if ( $lc_mode != 0 ) {
print_fail ( 'You have lower_case_table_names set to 1 or true in mysql config.' , 'Set lower_case_table_names=0 in your mysql config file' );
}
2017-02-23 23:02:51 +00:00
if ( empty ( $strict_mode ) === false ) {
print_fail ( " You have not set sql_mode='' in your mysql config " );
2015-08-06 19:02:05 +00:00
}
2017-02-27 18:28:01 +00:00
// Test for correct character set and collation
$collation = dbFetchRows ( " SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA S WHERE schema_name = ' " . $config [ 'db_name' ] . " ' AND ( DEFAULT_CHARACTER_SET_NAME != 'utf8' OR DEFAULT_COLLATION_NAME != 'utf8_unicode_ci') " );
if ( empty ( $collation ) !== true ) {
2017-03-13 02:21:26 +00:00
print_fail ( 'MySQL Database collation is wrong: ' . implode ( ' ' , $collation [ 0 ]), 'https://t.libren.ms/-zdwk' );
2017-02-27 18:28:01 +00:00
}
2017-03-02 08:04:29 +00:00
$collation_tables = dbFetchRows ( " SELECT T.TABLE_NAME, C.CHARACTER_SET_NAME, C.COLLATION_NAME FROM information_schema.TABLES AS T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS C WHERE C.collation_name = T.table_collation AND T.table_schema = ' " . $config [ 'db_name' ] . " ' AND ( C.CHARACTER_SET_NAME != 'utf8' OR C.COLLATION_NAME != 'utf8_unicode_ci' ); " );
if ( empty ( $collation_tables ) !== true ) {
print_fail ( 'MySQL tables collation is wrong: ' , 'http://bit.ly/2lAG9H8' );
print_list ( $collation_tables , " \t %s \n " );
2017-02-27 18:28:01 +00:00
}
2017-03-02 08:04:29 +00:00
$collation_columns = dbFetchRows ( " SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ' " . $config [ 'db_name' ] . " ' AND ( CHARACTER_SET_NAME != 'utf8' OR COLLATION_NAME != 'utf8_unicode_ci' ); " );
if ( empty ( $collation_columns ) !== true ) {
2017-03-13 02:21:26 +00:00
print_fail ( 'MySQL column collation is wrong: ' , 'https://t.libren.ms/-zdwk' );
2017-03-02 08:04:29 +00:00
print_list ( $collation_columns , " \t %s \n " );
2017-02-27 18:28:01 +00:00
}
2017-04-05 09:00:28 +01:00
if ( is_file ( 'misc/db_schema.yaml' )) {
$master_schema = Symfony\Component\Yaml\Yaml :: parse (
file_get_contents ( 'misc/db_schema.yaml' )
);
$current_schema = dump_db_schema ();
$schema_update = array ();
foreach (( array ) $master_schema as $table => $data ) {
if ( empty ( $current_schema [ $table ])) {
print_fail ( " Database: missing table ( $table ) " );
$columns = array_map ( 'column_schema_to_sql' , $data [ 'Columns' ]);
$indexes = array_map ( 'index_schema_to_sql' , $data [ 'Indexes' ]);
2017-04-05 11:19:22 -05:00
$def = implode ( ', ' , array_merge ( array_values ( $columns ), array_values ( $indexes )));
2017-04-05 09:00:28 +01:00
2017-04-05 11:19:22 -05:00
$schema_update [] = " CREATE TABLE ` $table ` ( $def ); " ;
2017-04-05 09:00:28 +01:00
} else {
$previous_column = '' ;
foreach ( $data [ 'Columns' ] as $column => $cdata ) {
$cur = $current_schema [ $table ][ 'Columns' ][ $column ];
2017-07-03 21:46:45 +01:00
if ( $cur [ 'Default' ] == 'current_timestamp()' ) {
$cur [ 'Default' ] = 'CURRENT_TIMESTAMP' ;
}
if ( $cur [ 'Extra' ] == 'on update current_timestamp()' ) {
$cur [ 'Extra' ] = 'on update CURRENT_TIMESTAMP' ;
}
2017-04-05 09:00:28 +01:00
if ( empty ( $current_schema [ $table ][ 'Columns' ][ $column ])) {
print_fail ( " Database: missing column ( $table / $column ) " );
$sql = " ALTER TABLE ` $table ` ADD " . column_schema_to_sql ( $cdata );
if ( ! empty ( $previous_column )) {
$sql .= " AFTER ` $previous_column ` " ;
}
$schema_update [] = $sql . ';' ;
} elseif ( $cdata != $cur ) {
print_fail ( " Database: incorrect column ( $table / $column ) " );
$schema_update [] = " ALTER TABLE ` $table ` CHANGE ` $column ` " . column_schema_to_sql ( $cdata ) . ';' ;
}
$previous_column = $column ;
unset ( $current_schema [ $table ][ 'Columns' ][ $column ]); // remove checked columns
}
foreach ( $current_schema [ $table ][ 'Columns' ] as $column => $_unused ) {
print_fail ( " Database: extra column ( $table / $column ) " );
$schema_update [] = " ALTER TABLE ` $table ` DROP ` $column `; " ;
}
foreach ( $data [ 'Indexes' ] as $name => $index ) {
if ( empty ( $current_schema [ $table ][ 'Indexes' ][ $name ])) {
print_fail ( " Database: missing index ( $table / $name ) " );
$schema_update [] = " ALTER TABLE ` $table ` ADD " . index_schema_to_sql ( $index ) . ';' ;
} elseif ( $index != $current_schema [ $table ][ 'Indexes' ][ $name ]) {
print_fail ( " Database: incorrect index ( $table / $name ) " );
$schema_update [] = " ALTER TABLE ` $table ` DROP INDEX ` $name `, " . index_schema_to_sql ( $index ) . ';' ;
}
unset ( $current_schema [ $table ][ 'Indexes' ][ $name ]);
}
foreach ( $current_schema [ $table ][ 'Indexes' ] as $name => $_unused ) {
print_fail ( " Database: extra index ( $table / $name ) " );
$schema_update [] = " ALTER TABLE ` $table ` DROP INDEX ` $name `; " ;
}
}
unset ( $current_schema [ $table ]); // remove checked tables
}
foreach ( $current_schema as $table => $data ) {
print_fail ( " Database: extra table ( $table ) " );
$schema_update [] = " DROP TABLE ` $table `; " ;
}
} else {
print_warn ( " We haven't detected the db_schema.yaml file " );
}
if ( empty ( $schema_update )) {
print_ok ( 'Database schema correct' );
} else {
print_fail ( " We have detected that your database schema may be wrong, please report the following to us on IRC or the community site (https://t.libren.ms/5gscd): " );
print_list ( $schema_update , " \t %s \n " , 30 );
}
2017-07-17 13:02:28 -05:00
$versions = version_info ();
// Check that rrdtool config version is what we see
if ( isset ( $config [ 'rrdtool_version' ]) && ( version_compare ( $config [ 'rrdtool_version' ], $versions [ 'rrdtool_ver' ], '>' ))) {
print_fail ( 'The rrdtool version you have specified is newer than what is installed.' , " Either comment out \$ config['rrdtool_version'] = ' { $config [ 'rrdtool_version' ] } '; or set \$ config['rrdtool_version'] = ' { $versions [ 'rrdtool_ver' ] } '; " );
}
if ( check_git_exists () === true ) {
2017-09-07 03:18:19 -05:00
if ( $config [ 'update_channel' ] == 'master' ) {
if ( $versions [ 'local_sha' ] != $versions [ 'github' ][ 'sha' ]) {
$commit_date = new DateTime ( '@' . $versions [ 'local_date' ], new DateTimeZone ( date_default_timezone_get ()));
if ( $commit_date -> diff ( new DateTime ()) -> days > 0 ) {
print_warn ( " Your install is over 24 hours out of date, last update: " . $commit_date -> format ( 'r' ));
}
2017-08-24 06:28:59 +01:00
}
2017-07-17 13:02:28 -05:00
2017-09-07 03:18:19 -05:00
if ( $versions [ 'local_branch' ] != 'master' ) {
print_warn ( " Your local git branch is not master, this will prevent automatic updates. " );
}
2017-07-17 13:02:28 -05:00
}
// check for modified files
$modifiedcmd = 'git diff --name-only --exit-code' ;
if ( $username === 'root' ) {
$modifiedcmd = 'su ' . $config [ 'user' ] . ' -c "' . $modifiedcmd . '"' ;
}
exec ( $modifiedcmd , $cmdoutput , $code );
if ( $code !== 0 && ! empty ( $cmdoutput )) {
print_warn ( " Your local git contains modified files, this could prevent automatic updates. \n Modified files: " );
print_list ( $cmdoutput , " \t %s \n " );
}
} else {
print_warn ( 'Unable to locate git. This should probably be installed.' );
}
2016-11-15 07:18:07 +00:00
$ini_tz = ini_get ( 'date.timezone' );
$sh_tz = rtrim ( shell_exec ( 'date +%Z' ));
$php_tz = date ( 'T' );
if ( empty ( $ini_tz )) {
2017-03-02 08:04:29 +00:00
print_fail (
'You have no timezone set for php.' ,
'http://php.net/manual/en/datetime.configuration.php#ini.date.timezone'
);
2016-11-15 07:18:07 +00:00
} elseif ( $sh_tz !== $php_tz ) {
print_fail ( " You have a different system timezone ( $sh_tz ) specified to the php configured timezone ( $php_tz ), please correct this. " );
2015-11-19 10:20:56 +00:00
}
2015-05-22 16:35:38 +01:00
// Test transports
2015-07-13 20:10:26 +02:00
if ( $config [ 'alerts' ][ 'email' ][ 'enable' ] === true ) {
print_warn ( 'You have the old alerting system enabled - this is to be deprecated on the 1st of June 2015: https://groups.google.com/forum/#!topic/librenms-project/1llxos4m0p4' );
2015-05-22 16:35:38 +01:00
}
2015-05-24 21:41:42 +01:00
// Test rrdcached
2015-05-22 16:35:38 +01:00
if ( ! $config [ 'rrdcached' ]) {
$rrd_dir = stat ( $config [ 'rrd_dir' ]);
if ( $rrd_dir [ 4 ] == 0 || $rrd_dir [ 5 ] == 0 ) {
2015-07-13 20:10:26 +02:00
print_warn ( 'Your RRD directory is owned by root, please consider changing over to user a non-root user' );
2015-05-22 16:35:38 +01:00
}
2015-07-13 20:10:26 +02:00
2015-05-22 16:35:38 +01:00
if ( substr ( sprintf ( '%o' , fileperms ( $config [ 'rrd_dir' ])), - 3 ) != 775 ) {
2017-03-02 08:04:29 +00:00
print_warn ( 'Your RRD directory is not set to 0775' , " chmod 775 { $config [ 'rrd_dir' ] } " );
2015-05-22 16:35:38 +01:00
}
}
2016-02-11 21:26:06 +00:00
if ( isset ( $config [ 'rrdcached' ])) {
check_rrdcached ();
}
2015-05-24 21:41:42 +01:00
// Disk space and permission checks
2015-05-22 16:35:38 +01:00
if ( substr ( sprintf ( '%o' , fileperms ( $config [ 'temp_dir' ])), - 3 ) != 777 ) {
2015-07-13 20:10:26 +02:00
print_warn ( 'Your tmp directory (' . $config [ 'temp_dir' ] . " ) is not set to 777 so graphs most likely won't be generated " );
2015-05-22 16:35:38 +01:00
}
2015-07-13 20:10:26 +02:00
$space_check = ( disk_free_space ( $config [ 'install_dir' ]) / 1024 / 1024 );
2015-05-22 16:35:38 +01:00
if ( $space_check < 512 && $space_check > 1 ) {
2015-07-13 20:10:26 +02:00
print_warn ( 'Disk space where ' . $config [ 'install_dir' ] . ' is located is less than 512Mb' );
2015-05-22 16:35:38 +01:00
}
2015-07-13 20:10:26 +02:00
2015-05-22 16:35:38 +01:00
if ( $space_check < 1 ) {
2015-07-13 20:10:26 +02:00
print_fail ( 'Disk space where ' . $config [ 'install_dir' ] . ' is located is empty!!!' );
2015-05-22 16:35:38 +01:00
}
2015-05-24 21:41:42 +01:00
// Check programs
2017-01-16 13:19:23 -06:00
$bins = array ( 'fping' , 'fping6' , 'rrdtool' , 'snmpwalk' , 'snmpget' , 'snmpbulkwalk' );
2015-05-24 21:41:42 +01:00
foreach ( $bins as $bin ) {
2017-01-16 13:19:23 -06:00
$cmd = rtrim ( shell_exec ( " which { $config [ $bin ] } 2>/dev/null " ));
if ( ! $cmd ) {
2017-01-25 00:25:40 +00:00
print_fail ( " $bin location is incorrect or bin not installed. \n \t You can also manually set the path to $bin by placing the following in config.php: \n \t \$ config[' $bin '] = \" /path/to/ $bin\ " ; " );
2017-05-15 17:45:02 -05:00
} elseif ( in_array ( $bin , array ( 'fping' , 'fping6' ))) {
if ( trim ( shell_exec ( " which getcap 2>/dev/null " ))) {
if ( ! str_contains ( shell_exec ( " getcap $cmd " ), " $cmd = cap_net_raw+ep " )) {
print_fail ( " $bin should have CAP_NET_RAW! " , " setcap cap_net_raw+ep $cmd " );
}
} elseif ( ! ( fileperms ( $cmd ) & 2048 )) {
print_fail ( " $bin should be suid! " , " chmod u+s $cmd " );
}
2015-07-13 20:10:26 +02:00
}
2016-02-11 21:26:06 +00:00
}
$disabled_functions = explode ( ',' , ini_get ( 'disable_functions' ));
$required_functions = array ( 'exec' , 'passthru' , 'shell_exec' , 'escapeshellarg' , 'escapeshellcmd' , 'proc_close' , 'proc_open' , 'popen' );
foreach ( $required_functions as $function ) {
if ( in_array ( $function , $disabled_functions )) {
print_fail ( " $function is disabled in php.ini " );
}
}
if ( ! function_exists ( 'openssl_random_pseudo_bytes' )) {
print_warn ( " openssl_random_pseudo_bytes is not being used for user password hashing. This is a recommended function (https://secure.php.net/openssl_random_pseudo_bytes) " );
if ( ! is_readable ( '/dev/urandom' )) {
print_warn ( " It also looks like we can't use /dev/urandom for user password hashing. We will fall back to generating our own hash - be warned " );
2015-05-24 21:41:42 +01:00
}
}
2016-10-03 11:48:19 -05:00
// check poller
2017-03-22 03:14:03 -05:00
if ( dbFetchCell ( 'SELECT COUNT(*) FROM `pollers`' )) {
2017-03-22 17:13:40 -05:00
if ( dbFetchCell ( 'SELECT COUNT(*) FROM `pollers` WHERE `last_polled` >= DATE_ADD(NOW(), INTERVAL - 5 MINUTE)' ) == 0 ) {
2017-03-22 03:14:03 -05:00
print_fail ( " The poller has not run in the last 5 minutes, check the cron job " );
}
} else {
2016-10-03 11:48:19 -05:00
print_fail ( 'The poller has never run, check the cron job' );
}
2017-03-22 03:14:03 -05:00
if ( dbFetchCell ( 'SELECT COUNT(*) FROM `devices`' ) == 0 ) {
print_warn ( " You have not added any devices yet. " );
} else {
// check discovery last run
if ( dbFetchCell ( 'SELECT COUNT(*) FROM `devices` WHERE `last_discovered` IS NOT NULL' ) == 0 ) {
print_fail ( 'Discovery has never run, check the cron job' );
} elseif ( dbFetchCell ( " SELECT COUNT(*) FROM `devices` WHERE `last_discovered` <= DATE_ADD(NOW(), INTERVAL - 24 HOUR) AND `ignore` = 0 AND `disabled` = 0 AND `status` = 1 " ) > 0 ) {
print_fail ( " Discovery has not completed in the last 24 hours, check the cron job " );
}
// check devices polling
if ( count ( $devices = dbFetchColumn ( " SELECT `hostname` FROM `devices` WHERE (`last_polled` < DATE_ADD(NOW(), INTERVAL - 5 MINUTE) OR `last_polled` IS NULL) AND `ignore` = 0 AND `disabled` = 0 AND `status` = 1 " )) > 0 ) {
print_warn ( " Some devices have not been polled in the last 5 minutes.
You may have performance issues . Check your poll log and see : http :// docs . librenms . org / Support / Performance / " );
print_list ( $devices , " \t %s \n " );
}
if ( count ( $devices = dbFetchColumn ( 'SELECT `hostname` FROM `devices` WHERE last_polled_timetaken > 300 AND `ignore` = 0 AND `disabled` = 0 AND `status` = 1' )) > 0 ) {
print_fail ( " Some devices have not completed their polling run in 5 minutes, this will create gaps in data.
2017-01-09 14:17:16 -06:00
Check your poll log and refer to http :// docs . librenms . org / Support / Performance / " );
2017-03-22 03:14:03 -05:00
print_list ( $devices , " \t %s \n " );
}
2016-10-03 11:48:19 -05:00
}
2017-03-22 03:14:03 -05:00
2015-05-24 21:41:42 +01:00
// Modules test
2015-07-13 20:10:26 +02:00
$modules = explode ( ',' , $options [ 'm' ]);
2015-05-22 16:35:38 +01:00
foreach ( $modules as $module ) {
switch ( $module ) {
2016-08-28 17:32:55 -05:00
case 'mail' :
if ( $config [ 'alert' ][ 'transports' ][ 'mail' ] === true ) {
$run_test = 1 ;
if ( empty ( $config [ 'alert' ][ 'default_mail' ])) {
print_fail ( 'default_mail config option needs to be specified to test email' );
2015-07-13 20:10:26 +02:00
$run_test = 0 ;
2016-08-28 17:32:55 -05:00
} elseif ( $config [ 'email_backend' ] == 'sendmail' ) {
if ( empty ( $config [ 'email_sendmail_path' ])) {
print_fail ( " You have selected sendmail but not configured email_sendmail_path " );
$run_test = 0 ;
} elseif ( ! file_exists ( $config [ 'email_sendmail_path' ])) {
print_fail ( " The configured email_sendmail_path is not valid " );
$run_test = 0 ;
}
} elseif ( $config [ 'email_backend' ] == 'smtp' ) {
if ( empty ( $config [ 'email_smtp_host' ])) {
print_fail ( 'You have selected SMTP but not configured an SMTP host' );
$run_test = 0 ;
}
if ( empty ( $config [ 'email_smtp_port' ])) {
print_fail ( 'You have selected SMTP but not configured an SMTP port' );
$run_test = 0 ;
}
if (( $config [ 'email_smtp_auth' ] === true ) && ( empty ( $config [ 'email_smtp_username' ]) || empty ( $config [ 'email_smtp_password' ]))) {
print_fail ( 'You have selected SMTP auth but have not configured both username and password' );
$run_test = 0 ;
}
} //end if
if ( $run_test == 1 ) {
if ( $err = send_mail ( $config [ 'alert' ][ 'default_mail' ], 'Test email' , 'Testing email from NMS' )) {
print_ok ( 'Email has been sent' );
} else {
print_fail ( 'Issue sending email to ' . $config [ 'alert' ][ 'default_mail' ] . ' with error ' . $err );
}
2015-07-13 20:10:26 +02:00
}
} //end if
2016-08-28 17:32:55 -05:00
break ;
case 'dist-poller' :
if ( $config [ 'distributed_poller' ] !== true ) {
print_fail ( 'You have not enabled distributed_poller' );
} else {
if ( empty ( $config [ 'distributed_poller_memcached_host' ])) {
print_fail ( 'You have not configured $config[\'distributed_poller_memcached_host\']' );
} elseif ( empty ( $config [ 'distributed_poller_memcached_port' ])) {
print_fail ( 'You have not configured $config[\'distributed_poller_memcached_port\']' );
} else {
$connection = @ fsockopen ( $config [ 'distributed_poller_memcached_host' ], $config [ 'distributed_poller_memcached_port' ]);
if ( ! is_resource ( $connection )) {
print_fail ( 'We could not get memcached stats, it is possible that we cannot connect to your memcached server, please check' );
} else {
fclose ( $connection );
print_ok ( 'Connection to memcached is ok' );
}
2015-07-13 20:10:26 +02:00
}
2016-08-28 17:32:55 -05:00
if ( empty ( $config [ 'rrdcached' ])) {
print_fail ( 'You have not configured $config[\'rrdcached\']' );
} elseif ( empty ( $config [ 'rrd_dir' ])) {
print_fail ( 'You have not configured $config[\'rrd_dir\']' );
} else {
check_rrdcached ();
2015-05-22 16:35:38 +01:00
}
}
2016-08-28 17:32:55 -05:00
break ;
case 'rrdcheck' :
// Loop through the rrd_dir
$rrd_directory = new RecursiveDirectoryIterator ( $config [ 'rrd_dir' ]);
// Filter out any non rrd files
$rrd_directory_filter = new LibreNMS\RRDRecursiveFilterIterator ( $rrd_directory );
$rrd_iterator = new RecursiveIteratorIterator ( $rrd_directory_filter );
$rrd_total = iterator_count ( $rrd_iterator );
$rrd_iterator -> rewind (); // Rewind iterator in case iterator_count left iterator in unknown state
echo " \n Scanning " . $rrd_total . " rrd files in " . $config [ 'rrd_dir' ] . " ... \n " ;
// Count loops so we can push status to the user
$loopcount = 0 ;
$screenpad = 0 ;
foreach ( $rrd_iterator as $filename => $file ) {
2016-02-01 23:46:28 +00:00
$rrd_test_result = rrdtest ( $filename , $output , $error );
2016-02-01 23:29:37 +00:00
2016-02-01 23:46:28 +00:00
$loopcount ++ ;
2016-08-28 17:32:55 -05:00
if (( $loopcount % 50 ) == 0 ) {
2016-02-01 23:46:28 +00:00
//This lets us update the previous status update without spamming in most consoles
echo " \033 [ " . $screenpad . " D " ;
$test_status = 'Status: ' . $loopcount . '/' . $rrd_total ;
echo $test_status ;
$screenpad = strlen ( $test_status );
2016-02-01 23:29:37 +00:00
}
2016-02-01 23:46:28 +00:00
// A non zero result means there was some kind of error
2016-08-28 17:32:55 -05:00
if ( $rrd_test_result > 0 ) {
2016-02-01 23:46:28 +00:00
echo " \033 [ " . $screenpad . " D " ;
print_fail ( 'Error parsing "' . $filename . '" RRD ' . trim ( $error ));
2016-02-01 23:29:37 +00:00
$screenpad = 0 ;
}
2016-08-28 17:32:55 -05:00
}
echo " \033 [ " . $screenpad . " D " ;
echo " Status: " . $loopcount . " / " . $rrd_total . " - Complete \n " ;
2016-02-01 23:29:37 +00:00
2016-08-28 17:32:55 -05:00
break ;
2015-07-13 20:10:26 +02:00
} //end switch
} //end foreach
2015-05-22 16:35:38 +01:00
// End
2015-07-13 20:10:26 +02:00
2016-08-28 17:32:55 -05:00
function print_ok ( $msg )
{
2016-10-03 11:48:19 -05:00
c_echo ( " [%gOK%n] $msg\n " );
2015-07-13 20:10:26 +02:00
} //end print_ok()
2015-05-22 16:35:38 +01:00
2017-03-02 08:04:29 +00:00
function print_fail ( $msg , $fix = null )
2016-08-28 17:32:55 -05:00
{
2017-03-02 08:04:29 +00:00
c_echo ( " [%RFAIL%n] $msg " );
if ( $fix && strlen ( $msg ) > 72 ) {
echo PHP_EOL . " " ;
}
print_fix ( $fix );
}
2015-07-13 20:10:26 +02:00
2015-05-22 16:35:38 +01:00
2017-03-02 08:04:29 +00:00
function print_warn ( $msg , $fix = null )
2016-08-28 17:32:55 -05:00
{
2017-03-02 08:04:29 +00:00
c_echo ( " [%YWARN%n] $msg " );
if ( $fix && strlen ( $msg ) > 72 ) {
echo PHP_EOL . " " ;
}
print_fix ( $fix );
}
/**
* @ param $fix
*/
function print_fix ( $fix )
{
if ( ! empty ( $fix )) {
c_echo ( " [%BFIX%n] %B $fix %n " );
}
echo PHP_EOL ;
}
2016-02-11 21:26:06 +00:00
2016-08-28 17:32:55 -05:00
function check_rrdcached ()
{
2016-02-11 21:26:06 +00:00
global $config ;
2016-08-28 17:32:55 -05:00
list ( $host , $port ) = explode ( ':' , $config [ 'rrdcached' ]);
2016-02-11 21:26:06 +00:00
if ( $host == 'unix' ) {
// Using socket, check that file exists
if ( ! file_exists ( $port )) {
print_fail ( " $port doesn't appear to exist, rrdcached test failed " );
}
2016-08-28 17:32:55 -05:00
} else {
2016-02-11 21:26:06 +00:00
$connection = @ fsockopen ( $host , $port );
if ( is_resource ( $connection )) {
fclose ( $connection );
2016-08-28 17:32:55 -05:00
} else {
2016-02-11 21:26:06 +00:00
print_fail ( 'Cannot connect to rrdcached instance' );
}
}
} //end check_rrdcached