2010-09-03 18:26:59 +00:00
#!/usr/bin/env php
2009-09-07 11:07:59 +00:00
< ? php
2008-03-12 20:01:46 +00:00
2012-05-09 10:01:42 +00:00
/**
2016-09-08 14:12:23 +01:00
* LibreNMS
2011-09-08 12:24:18 +00:00
*
2016-09-08 14:12:23 +01:00
* This file is part of LibreNMS.
2012-05-09 10:01:42 +00:00
*
2016-09-08 14:12:23 +01:00
* @package LibreNMS
2012-05-09 10:01:42 +00:00
* @subpackage cli
2013-10-28 12:01:36 -07:00
* @copyright (C) 2006 - 2012 Adam Armstrong
2011-09-08 12:24:18 +00:00
*/
2016-08-21 08:07:14 -05:00
use LibreNMS\Exceptions\HostUnreachableException ;
2016-11-21 14:12:59 -06:00
$init_modules = array ();
require __DIR__ . '/includes/init.php' ;
2007-04-03 14:10:23 +00:00
2017-10-28 05:59:25 +02:00
$options = getopt ( 'Pbg:p:f::' );
2015-03-19 22:06:13 +00:00
if ( isset ( $options [ 'g' ]) && $options [ 'g' ] >= 0 ) {
$cmd = array_shift ( $argv );
array_shift ( $argv );
array_shift ( $argv );
array_unshift ( $argv , $cmd );
$poller_group = $options [ 'g' ];
2016-08-01 22:01:01 -05:00
} elseif ( $config [ 'distributed_poller' ] === true ) {
2015-05-09 10:34:55 +01:00
$poller_group = $config [ 'distributed_poller_group' ];
2016-08-01 22:01:01 -05:00
} else {
$poller_group = 0 ;
2015-03-19 22:06:13 +00:00
}
2015-05-09 10:34:55 +01:00
2015-03-19 22:06:13 +00:00
if ( isset ( $options [ 'f' ]) && $options [ 'f' ] == 0 ) {
$cmd = array_shift ( $argv );
array_shift ( $argv );
array_unshift ( $argv , $cmd );
2016-08-09 15:00:12 -05:00
$force_add = true ;
2016-08-01 22:01:01 -05:00
} else {
2016-08-09 15:00:12 -05:00
$force_add = false ;
2015-03-19 22:06:13 +00:00
}
2016-01-21 22:04:52 +01:00
$port_assoc_mode = $config [ 'default_port_association_mode' ];
2016-08-28 17:32:55 -05:00
$valid_assoc_modes = get_port_assoc_modes ();
if ( isset ( $options [ 'p' ])) {
2016-01-21 22:04:52 +01:00
$port_assoc_mode = $options [ 'p' ];
2016-08-28 17:32:55 -05:00
if ( ! in_array ( $port_assoc_mode , $valid_assoc_modes )) {
2016-01-21 22:04:52 +01:00
echo " Invalid port association mode ' " . $port_assoc_mode . " ' \n " ;
2016-08-28 17:32:55 -05:00
echo 'Valid modes: ' . join ( ', ' , $valid_assoc_modes ) . " \n " ;
2016-08-07 12:16:40 -05:00
exit ( 1 );
2016-01-21 22:04:52 +01:00
}
$cmd = array_shift ( $argv );
array_shift ( $argv );
array_shift ( $argv );
array_unshift ( $argv , $cmd );
}
2017-10-28 05:59:25 +02:00
if ( isset ( $options [ 'P' ])) {
$cmd = array_shift ( $argv );
array_shift ( $argv );
array_unshift ( $argv , $cmd );
}
if ( isset ( $options [ 'b' ])) {
$cmd = array_shift ( $argv );
array_shift ( $argv );
array_unshift ( $argv , $cmd );
}
2015-07-13 20:10:26 +02:00
if ( ! empty ( $argv [ 1 ])) {
$host = strtolower ( $argv [ 1 ]);
$community = $argv [ 2 ];
$snmpver = strtolower ( $argv [ 3 ]);
$port = 161 ;
$transport = 'udp' ;
2017-10-28 05:59:25 +02:00
$additional = array ();
if ( isset ( $options [ 'b' ])) {
$additional = array (
'ping_fallback' => 1 ,
);
}
if ( isset ( $options [ 'P' ])) {
$community = '' ;
$snmpver = 'v2c' ;
$additional = array (
'snmp_disable' => 1 ,
'os' => $argv [ 2 ] ? mres ( $argv [ 2 ]) : " ping " ,
'hardware' => $argv [ 3 ] ? mres ( $argv [ 3 ]) : '' ,
);
} elseif ( $snmpver === 'v3' ) {
2015-07-13 20:10:26 +02:00
$seclevel = $community ;
// These values are the same as in defaults.inc.php
$v3 = array (
'authlevel' => 'noAuthNoPriv' ,
'authname' => 'root' ,
'authpass' => '' ,
'authalgo' => 'MD5' ,
'cryptopass' => '' ,
'cryptoalgo' => 'AES' ,
);
2016-08-01 22:01:01 -05:00
// v3
2015-07-13 20:10:26 +02:00
if ( $seclevel === 'nanp' or $seclevel === 'any' or $seclevel === 'noAuthNoPriv' ) {
$v3 [ 'authlevel' ] = 'noAuthNoPriv' ;
$v3args = array_slice ( $argv , 4 );
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
$port = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ')$/' , $arg )) {
2015-07-13 20:10:26 +02:00
$transport = $arg ;
2016-08-01 22:01:01 -05:00
} else {
2015-07-13 20:10:26 +02:00
// should add a sanity check of chars allowed in user
$user = $arg ;
}
}
if ( $seclevel === 'nanp' ) {
2017-07-14 01:17:59 +01:00
array_unshift ( $config [ 'snmp' ][ 'v3' ], $v3 );
2015-07-13 20:10:26 +02:00
}
2016-08-01 22:01:01 -05:00
} elseif ( $seclevel === 'anp' or $seclevel === 'authNoPriv' ) {
2015-07-13 20:10:26 +02:00
$v3 [ 'authlevel' ] = 'authNoPriv' ;
$v3args = array_slice ( $argv , 4 );
$v3 [ 'authname' ] = array_shift ( $v3args );
$v3 [ 'authpass' ] = array_shift ( $v3args );
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
$port = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ')$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(sha|md5)$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$v3 [ 'authalgo' ] = $arg ;
2016-08-01 22:01:01 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo 'Invalid argument: ' . $arg . " \n " ;
2016-08-07 12:16:40 -05:00
exit ( 1 );
2015-07-13 20:10:26 +02:00
}
}
2017-07-14 01:17:59 +01:00
array_unshift ( $config [ 'snmp' ][ 'v3' ], $v3 );
2016-08-01 22:01:01 -05:00
} elseif ( $seclevel === 'ap' or $seclevel === 'authPriv' ) {
2015-07-13 20:10:26 +02:00
$v3 [ 'authlevel' ] = 'authPriv' ;
$v3args = array_slice ( $argv , 4 );
$v3 [ 'authname' ] = array_shift ( $v3args );
$v3 [ 'authpass' ] = array_shift ( $v3args );
$v3 [ 'cryptopass' ] = array_shift ( $v3args );
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
$port = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ')$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(sha|md5)$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$v3 [ 'authalgo' ] = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(aes|des)$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$v3 [ 'cryptoalgo' ] = $arg ;
2016-08-01 22:01:01 -05:00
} else {
2015-07-13 20:10:26 +02:00
echo 'Invalid argument: ' . $arg . " \n " ;
2016-08-07 12:16:40 -05:00
exit ( 1 );
2015-07-13 20:10:26 +02:00
}
} //end while
2017-05-20 12:59:58 +01:00
array_unshift ( $config [ 'snmp' ][ 'v3' ], $v3 );
2012-05-09 16:18:23 +00:00
}
2016-08-01 22:01:01 -05:00
} else {
// v2c or v1
2015-07-13 20:10:26 +02:00
$v2args = array_slice ( $argv , 2 );
while ( $arg = array_shift ( $v2args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
$port = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/(' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ')/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(v1|v2c)$/i' , $arg )) {
2015-07-13 20:10:26 +02:00
$snmpver = $arg ;
}
2012-05-09 16:18:23 +00:00
}
2012-05-15 15:18:57 +00:00
2015-07-13 20:10:26 +02:00
if ( $community ) {
2017-07-14 01:17:59 +01:00
array_unshift ( $config [ 'snmp' ][ 'community' ], $community );
2012-05-09 16:18:23 +00:00
}
2015-07-13 20:10:26 +02:00
} //end if
2012-05-15 15:18:57 +00:00
2016-08-07 12:16:40 -05:00
try {
2017-10-28 05:59:25 +02:00
$device_id = addHost ( $host , $snmpver , $port , $transport , $poller_group , $force_add , $port_assoc_mode , $additional );
2016-08-07 12:16:40 -05:00
$device = device_by_id_cache ( $device_id );
echo " Added device { $device [ 'hostname' ] } ( $device_id ) \n " ;
2016-08-01 22:01:01 -05:00
exit ( 0 );
2016-08-07 12:16:40 -05:00
} catch ( HostUnreachableException $e ) {
print_error ( $e -> getMessage ());
foreach ( $e -> getReasons () as $reason ) {
echo " $reason\n " ;
}
exit ( 2 );
2016-08-28 17:32:55 -05:00
} catch ( Exception $e ) {
2016-08-07 12:16:40 -05:00
print_error ( $e -> getMessage ());
exit ( 3 );
2016-05-02 20:20:29 +00:00
}
2016-08-01 22:01:01 -05:00
} else {
2016-08-16 19:52:36 -05:00
c_echo (
2016-08-28 17:32:55 -05:00
" \n " . $config [ 'project_name_version' ] . ' Add Host Tool
2011-03-22 20:27:39 +00:00
2017-10-28 05:59:25 +02:00
Usage (SNMPv1/2c) : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname%n> [community] [v1|v2c] [port] [' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ']
Usage (SNMPv3) :
Config Defaults : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname%n> any v3 [user] [port] [' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ']
No Auth, No Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname%n> nanp v3 [user] [port] [' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ']
Auth, No Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname%n> anp v3 <user> <password> [md5|sha] [port] [' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ']
Auth, Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname%n> ap v3 <user> <password> <enckey> [md5|sha] [aes|dsa] [port] [' . implode ( '|' , $config [ 'snmp' ][ 'transports' ]) . ']
Usage (ICMP only) : ./addhost.php [-g <poller group>] [-f] -P <%Whostname%n> [os] [hardware]
-g <poller group> allows you to add a device to be pinned to a specific poller when using distributed polling. X can be any number associated with a poller group
-f forces the device to be added by skipping the icmp and snmp check against the host.
-p <port assoc mode> allow you to set a port association mode for this device. By default ports are associated by \'ifIndex\'.
For Linux/Unix based devices \'ifName\' or \'ifDescr\' might be useful for a stable iface mapping.
The default for this installation is \'' . $config [ 'default_port_association_mode' ] . '\'
Valid port assoc modes are: ' . join ( ', ' , $valid_assoc_modes ) . '
-b Add the host with SNMP if it replies to it, otherwise only ICMP.
-P Add the host with only ICMP, no SNMP or OS discovery.
2007-04-03 14:10:23 +00:00
2015-07-13 20:10:26 +02:00
%rRemember to run discovery for the host afterwards.%n
2015-11-03 13:58:12 +01:00
'
2016-05-02 20:20:29 +00:00
);
2016-08-07 12:16:40 -05:00
exit ( 1 );
2016-05-02 20:20:29 +00:00
}