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
*
2013-10-28 12:01:36 -07:00
* @copyright (C) 2006 - 2012 Adam Armstrong
2011-09-08 12:24:18 +00:00
*/
2022-04-04 10:41:18 -05:00
use App\Actions\Device\ValidateDeviceAndCreate ;
use App\Models\Device ;
2019-06-23 00:29:12 -05:00
use LibreNMS\Config ;
2022-03-12 16:14:32 -06:00
use LibreNMS\Enum\PortAssociationMode ;
2016-08-21 08:07:14 -05:00
use LibreNMS\Exceptions\HostUnreachableException ;
2020-09-21 14:54:51 +02:00
$init_modules = [];
2016-11-21 14:12:59 -06:00
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
2022-04-04 10:41:18 -05:00
$device = new Device ;
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 );
2022-04-04 10:41:18 -05:00
$device -> poller_group = $options [ 'g' ];
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
}
2022-03-12 16:14:32 -06:00
$valid_assoc_modes = PortAssociationMode :: getModes ();
2016-08-28 17:32:55 -05:00
if ( isset ( $options [ 'p' ])) {
2022-04-04 10:41:18 -05:00
$device -> port_association_mode = $options [ 'p' ];
if ( ! in_array ( $device -> port_association_mode , $valid_assoc_modes )) {
echo " Invalid port association mode ' " . $device -> port_association_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 );
}
2019-06-23 00:29:12 -05:00
$transports_regex = implode ( '|' , Config :: get ( 'snmp.transports' ));
2020-09-21 14:54:51 +02:00
if ( ! empty ( $argv [ 1 ])) {
2022-04-04 10:41:18 -05:00
$device -> hostname = strtolower ( $argv [ 1 ]);
$device -> snmpver = strtolower ( $argv [ 3 ]);
2017-10-28 05:59:25 +02:00
if ( isset ( $options [ 'P' ])) {
2022-04-04 10:41:18 -05:00
$device -> snmp_disable = 1 ;
$device -> os = $argv [ 2 ] ? : 'ping' ;
$device -> hardware = $argv [ 3 ] ? : '' ;
} elseif ( $device -> snmpver === 'v3' ) {
$seclevel = $argv [ 2 ];
2015-07-13 20:10:26 +02:00
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' ) {
2022-04-04 10:41:18 -05:00
$device -> authlevel = 'noAuthNoPriv' ;
2020-09-21 14:54:51 +02:00
$v3args = array_slice ( $argv , 4 );
2015-07-13 20:10:26 +02:00
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
2022-04-04 10:41:18 -05:00
$device -> port = $arg ;
2019-06-23 00:29:12 -05:00
} elseif ( preg_match ( '/^(' . $transports_regex . ')$/' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> 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
2022-04-04 10:41:18 -05:00
$device -> authname = $arg ;
2015-07-13 20:10:26 +02:00
}
}
2016-08-01 22:01:01 -05:00
} elseif ( $seclevel === 'anp' or $seclevel === 'authNoPriv' ) {
2022-04-04 10:41:18 -05:00
$device -> authlevel = 'authNoPriv' ;
2020-09-21 14:54:51 +02:00
$v3args = array_slice ( $argv , 4 );
2022-04-04 10:41:18 -05:00
$device -> authname = array_shift ( $v3args );
$device -> authpass = array_shift ( $v3args );
2015-07-13 20:10:26 +02:00
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
2022-04-04 10:41:18 -05:00
$device -> port = $arg ;
2019-06-23 00:29:12 -05:00
} elseif ( preg_match ( '/^(' . $transports_regex . ')$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(sha|md5)$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> authalgo = $arg ;
2016-08-01 22:01:01 -05:00
} else {
2020-09-21 14:54:51 +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
}
}
2016-08-01 22:01:01 -05:00
} elseif ( $seclevel === 'ap' or $seclevel === 'authPriv' ) {
2022-04-04 10:41:18 -05:00
$device -> authlevel = 'authPriv' ;
2020-09-21 14:54:51 +02:00
$v3args = array_slice ( $argv , 4 );
2022-04-04 10:41:18 -05:00
$device -> authname = array_shift ( $v3args );
$device -> authpass = array_shift ( $v3args );
$device -> cryptopass = array_shift ( $v3args );
2015-07-13 20:10:26 +02:00
while ( $arg = array_shift ( $v3args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
2022-04-04 10:41:18 -05:00
$device -> port = $arg ;
2019-06-23 00:29:12 -05:00
} elseif ( preg_match ( '/^(' . $transports_regex . ')$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(sha|md5)$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> authalgo = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(aes|des)$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> cryptoalgo = $arg ;
2016-08-01 22:01:01 -05:00
} else {
2020-09-21 14:54:51 +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
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 );
2022-04-04 10:41:18 -05:00
$device -> community = $argv [ 2 ];
2015-07-13 20:10:26 +02:00
while ( $arg = array_shift ( $v2args )) {
// parse all remaining args
if ( is_numeric ( $arg )) {
2022-04-04 10:41:18 -05:00
$device -> port = $arg ;
2019-06-23 00:29:12 -05:00
} elseif ( preg_match ( '/(' . $transports_regex . ')/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> transport = $arg ;
2016-08-01 22:01:01 -05:00
} elseif ( preg_match ( '/^(v1|v2c)$/i' , $arg )) {
2022-04-04 10:41:18 -05:00
$device -> snmpver = $arg ;
2015-07-13 20:10:26 +02:00
}
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 {
2022-04-04 10:41:18 -05:00
$result = ( new ValidateDeviceAndCreate ( $device , $force_add , isset ( $options [ 'b' ]))) -> execute ();
echo " Added device $device->hostname ( $device->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 (
2020-09-21 14:54:51 +02:00
" \n " . Config :: get ( 'project_name' ) . ' Add Host Tool
2011-03-22 20:27:39 +00:00
2020-04-09 16:39:37 -05:00
Usage (SNMPv1/2c) : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname or IP%n> [community] [v1|v2c] [port] [' . $transports_regex . ']
2017-10-28 05:59:25 +02:00
Usage (SNMPv3) :
2020-04-09 16:39:37 -05:00
Config Defaults : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname or IP%n> any v3 [user] [port] [' . $transports_regex . ']
No Auth, No Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname or IP%n> nanp v3 [user] [port] [' . $transports_regex . ']
Auth, No Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname or IP%n> anp v3 <user> <password> [md5|sha] [port] [' . $transports_regex . ']
Auth, Priv : ./addhost.php [-g <poller group>] [-f] [-b] [-p <port assoc mode>] <%Whostname or IP%n> ap v3 <user> <password> <enckey> [md5|sha] [aes|des] [port] [' . $transports_regex . ']
Usage (ICMP only) : ./addhost.php [-g <poller group>] [-f] -P <%Whostname or IP%n> [os] [hardware]
2017-10-28 05:59:25 +02:00
-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.
2019-06-23 00:29:12 -05:00
The default for this installation is \'' . Config :: get ( 'default_port_association_mode' ) . '\'
2017-10-28 05:59:25 +02:00
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
}