2007-04-03 14:10:23 +00:00
< ? php
2023-10-07 22:02:45 -05:00
use App\Actions\Device\ValidateDeviceAndCreate ;
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 ;
2017-11-01 17:06:39 +01:00
use LibreNMS\Util\IP ;
2016-08-21 08:07:14 -05:00
2015-03-21 21:30:55 +00:00
$no_refresh = true ;
2019-08-05 14:16:05 -05:00
if ( ! Auth :: user () -> hasGlobalAdmin ()) {
2019-04-11 23:26:42 -05:00
include 'includes/html/error-no-perm.inc.php' ;
2012-04-06 13:56:23 +00:00
2011-03-17 00:09:20 +00:00
exit ;
2007-06-24 14:56:47 +00:00
}
2018-02-09 01:55:18 -06:00
echo ' < div class = " row " >
< div class = " col-sm-3 " >
</ div >
< div class = " col-sm-6 " > ' ;
// first load enabled, after that check snmp variable
$snmp_enabled = ! isset ( $_POST [ 'hostname' ]) || isset ( $_POST [ 'snmp' ]);
if ( ! empty ( $_POST [ 'hostname' ])) {
2021-03-28 17:25:30 -05:00
$hostname = strip_tags ( $_POST [ 'hostname' ]);
if ( ! \LibreNMS\Util\Validate :: hostname ( $hostname ) && ! IP :: isValid ( $hostname )) {
2018-02-09 01:55:18 -06:00
print_error ( " Invalid hostname or IP: $hostname " );
2017-11-01 17:06:39 +01:00
}
2023-10-07 22:02:45 -05:00
$new_device = new \App\Models\Device ([ 'hostname' => $hostname ]);
2019-08-05 14:16:05 -05:00
if ( Auth :: user () -> hasGlobalRead ()) {
2014-06-23 20:20:48 -04:00
// Settings common to SNMPv2 & v3
if ( $_POST [ 'port' ]) {
2023-10-07 22:02:45 -05:00
$new_device -> port = strip_tags ( $_POST [ 'port' ]);
2014-06-23 20:20:48 -04:00
}
2015-07-13 20:10:26 +02:00
2014-06-23 20:20:48 -04:00
if ( $_POST [ 'transport' ]) {
2023-10-07 22:02:45 -05:00
$new_device -> transport = strip_tags ( $_POST [ 'transport' ]);
2015-07-13 20:10:26 +02:00
}
2017-10-28 05:59:25 +02:00
$additional = [];
if ( ! $snmp_enabled ) {
2023-10-07 22:02:45 -05:00
$new_device -> snmp_disable = 1 ;
$new_device -> os = $_POST [ 'os' ] ? strip_tags ( $_POST [ 'os_id' ]) : 'ping' ;
$new_device -> hardware = strip_tags ( $_POST [ 'hardware' ]);
$new_device -> sysName = strip_tags ( $_POST [ 'sysName' ]);
2017-10-28 05:59:25 +02:00
} elseif ( $_POST [ 'snmpver' ] === 'v2c' || $_POST [ 'snmpver' ] === 'v1' ) {
2023-10-07 22:02:45 -05:00
$new_device -> snmpver = strip_tags ( $_POST [ 'snmpver' ]);
$communities = Config :: get ( 'snmp.community' );
2012-05-09 16:18:23 +00:00
if ( $_POST [ 'community' ]) {
2023-10-07 22:02:45 -05:00
$new_device -> community = $_POST [ 'community' ];
$communities = [ $_POST [ 'community' ]];
2012-05-09 16:18:23 +00:00
}
2023-10-07 22:02:45 -05:00
print_message ( " Adding host $hostname communit " . ( count ( $communities ) == 1 ? 'y' : 'ies' ) . ' ' . implode ( ', ' , array_map ( 'htmlspecialchars' , $communities )) . " port $new_device->port using $new_device->transport " );
2016-08-18 20:28:22 -05:00
} elseif ( $_POST [ 'snmpver' ] === 'v3' ) {
2023-10-07 22:02:45 -05:00
$new_device -> snmpver = 'v3' ;
$new_device -> authlevel = strip_tags ( $_POST [ 'authlevel' ]);
$new_device -> authname = $_POST [ 'authname' ];
$new_device -> authpass = $_POST [ 'authpass' ];
$new_device -> authalgo = strip_tags ( $_POST [ 'authalgo' ]);
$new_device -> cryptopass = $_POST [ 'cryptopass' ];
$new_device -> cryptoalgo = $_POST [ 'cryptoalgo' ];
2015-07-13 20:10:26 +02:00
2020-05-12 22:49:39 +02:00
print_message ( " Adding SNMPv3 host: $hostname port: $port " );
2016-08-18 20:28:22 -05:00
} else {
2012-05-09 16:18:23 +00:00
print_error ( 'Unsupported SNMP Version. There was a dropdown menu, how did you reach this error ?' );
} //end if
2020-01-30 13:20:30 +01:00
2016-08-07 12:16:40 -05:00
try {
2023-10-07 22:02:45 -05:00
$new_device -> poller_group = strip_tags ( $_POST [ 'poller_group' ] ? ? '' );
$new_device -> port_association_mode = PortAssociationMode :: getId ( $_POST [ 'port_assoc_mode' ]);
$force_add = ( isset ( $_POST [ 'force_add' ]) && $_POST [ 'force_add' ] == 'on' );
$result = ( new ValidateDeviceAndCreate ( $new_device , $force_add )) -> execute ();
if ( $result ) {
$link = \LibreNMS\Util\Url :: deviceUrl ( $new_device -> device_id );
print_message ( " Device added <a href=' $link '> $hostname ( $new_device->device_id )</a> " );
}
2016-08-07 12:16:40 -05:00
} catch ( HostUnreachableException $e ) {
print_error ( $e -> getMessage ());
foreach ( $e -> getReasons () as $reason ) {
print_error ( $reason );
}
2016-08-18 20:28:22 -05:00
} catch ( Exception $e ) {
2016-08-07 12:16:40 -05:00
print_error ( $e -> getMessage ());
2015-07-13 20:10:26 +02:00
}
2016-08-18 20:28:22 -05:00
} else {
2011-03-28 10:39:55 +00:00
print_error ( " You don't have the necessary privileges to add hosts. " );
2018-02-09 01:55:18 -06:00
}
}
echo ' </ div >
< div class = " col-sm-3 " >
</ div >
</ div > ' ;
2007-04-03 14:10:23 +00:00
2011-10-18 14:41:19 +00:00
$pagetitle [] = 'Add host' ;
2007-04-03 14:10:23 +00:00
?>
2014-10-02 23:14:45 +01:00
< div class = " row " >
< div class = " col-sm-3 " >
</ div >
< div class = " col-sm-6 " >
2014-01-13 10:05:19 +00:00
< form name = " form1 " method = " post " action = " " class = " form-horizontal " role = " form " >
2019-07-17 07:20:26 -05:00
< ? php echo csrf_field () ?>
2014-10-02 23:14:45 +01:00
< div >< h2 > Add Device </ h2 ></ div >
2017-10-28 05:59:25 +02:00
< div class = " alert alert-info " > Devices will be checked for Ping / SNMP reachability before being probed .</ div >
2014-01-13 10:05:19 +00:00
< div class = " well well-lg " >
2018-01-04 16:08:42 -06:00
< div class = " form-group " >
2020-04-09 16:39:37 -05:00
< label for = " hostname " class = " col-sm-3 control-label " > Hostname or IP </ label >
2018-01-04 16:08:42 -06:00
< div class = " col-sm-9 " >
< input type = " text " id = " hostname " name = " hostname " class = " form-control input-sm " placeholder = " Hostname " >
</ div >
</ div >
< div class = 'form-group' >
2017-10-28 05:59:25 +02:00
< label for = 'hardware' class = 'col-sm-3 control-label' > SNMP </ label >
< div class = 'col-sm-4' >
< input type = " checkbox " id = " snmp " name = " snmp " data - size = " small " onChange = " disableSnmp(this); " checked >
</ div >
</ div >
< div id = 'snmp_override' style = " display: none; " >
2018-02-07 06:35:00 +01:00
< div class = 'form-group' >
< label for = 'sysName' class = 'col-sm-3 control-label' > sysName ( optional ) </ label >
< div class = 'col-sm-9' >
< input id = 'sysName' class = 'form-control' name = 'sysName' placeholder = " sysName (optional) " />
</ div >
</ div >
2017-10-28 05:59:25 +02:00
< div class = 'form-group' >
< label for = 'hardware' class = 'col-sm-3 control-label' > Hardware ( optional ) </ label >
< div class = 'col-sm-9' >
< input id = 'hardware' class = 'form-control' name = 'hardware' placeholder = " Hardware (optional) " />
</ div >
</ div >
< div class = 'form-group' >
< label for = 'os' class = 'col-sm-3 control-label' > OS ( optional ) </ label >
< div class = 'col-sm-9' >
< input id = 'os' class = 'form-control' name = 'os' placeholder = " OS (optional) " />
< input type = 'hidden' id = 'os_id' class = 'form-control' name = 'os_id' />
</ div >
</ div >
</ div >
< div id = " snmp_conf " style = " display: block; " >
< div class = " form-group " >
< label for = " snmpver " class = " col-sm-3 control-label " > SNMP Version </ label >
< div class = " col-sm-3 " >
< select name = " snmpver " id = " snmpver " class = " form-control input-sm " onChange = " changeForm(); " >
< option value = " v1 " > v1 </ option >
< option value = " v2c " selected > v2c </ option >
< option value = " v3 " > v3 </ option >
</ select >
</ div >
< div class = " col-sm-3 " >
< input type = " text " name = " port " placeholder = " port " class = " form-control input-sm " >
</ div >
< div class = " col-sm-3 " >
< select name = " transport " id = " transport " class = " form-control input-sm " >
2014-10-11 16:55:32 +00:00
< ? php
2019-06-23 00:29:12 -05:00
foreach ( Config :: get ( 'snmp.transports' ) as $transport ) {
2022-08-30 12:55:37 -05:00
echo " <option value=' " . $transport . " '> " . $transport . '</option>' ;
2014-10-11 16:55:32 +00:00
}
2016-01-21 22:04:52 +01:00
?>
2017-10-28 05:59:25 +02:00
</ select >
</ div >
</ div >
< div class = " form-group " >
< label for = " port_association_mode " class = " col-sm-3 control-label " > Port Association Mode </ label >
< div class = " col-sm-3 " >
< select name = " port_assoc_mode " id = " port_assoc_mode " class = " form-control input-sm " >
2016-01-21 22:04:52 +01:00
< ? php
2022-03-12 16:14:32 -06:00
foreach ( PortAssociationMode :: getModes () as $mode ) {
2016-01-21 22:04:52 +01:00
$selected = '' ;
2019-06-23 00:29:12 -05:00
if ( $mode == Config :: get ( 'default_port_association_mode' )) {
2016-01-21 22:04:52 +01:00
$selected = 'selected' ;
2016-08-18 20:28:22 -05:00
}
2016-01-21 22:04:52 +01:00
2017-10-28 05:59:25 +02:00
echo " <option value= \" $mode\ " $selected > $mode </ option > \n " ;
2016-01-21 22:04:52 +01:00
}
2020-10-29 20:02:26 +02:00
2014-10-11 16:55:32 +00:00
?>
2017-10-28 05:59:25 +02:00
</ select >
</ div >
2014-10-02 23:14:45 +01:00
</ div >
2017-10-28 05:59:25 +02:00
< div id = " snmpv1_2 " >
< div class = " form-group " >
< div class = " col-sm-12 alert alert-info " >
< label class = " control-label text-left input-sm " > SNMPv1 / 2 c Configuration </ label >
</ div >
</ div >
< div class = " form-group " >
< label for = " community " class = " col-sm-3 control-label " > Community </ label >
< div class = " col-sm-9 " >
< input type = " text " name = " community " id = " community " placeholder = " Community " class = " form-control input-sm " >
</ div >
</ div >
2014-10-02 23:14:45 +01:00
</ div >
2017-10-28 05:59:25 +02:00
< div id = " snmpv3 " >
< div class = " form-group " >
< div class = " col-sm-12 alert alert-info " >
< label class = " control-label text-left input-sm " > SNMPv3 Configuration </ label >
</ div >
</ div >
< div class = " form-group " >
< label for = " authlevel " class = " col-sm-3 control-label " > Auth Level </ label >
< div class = " col-sm-3 " >
< select name = " authlevel " id = " authlevel " class = " form-control input-sm " >
< option value = " noAuthNoPriv " selected > noAuthNoPriv </ option >
< option value = " authNoPriv " > authNoPriv </ option >
< option value = " authPriv " > authPriv </ option >
</ select >
</ div >
</ div >
< div class = " form-group " >
< label for = " authname " class = " col-sm-3 control-label " > Auth User Name </ label >
< div class = " col-sm-9 " >
2018-06-23 21:48:03 +02:00
< input type = " text " name = " authname " id = " authname " class = " form-control input-sm " autocomplete = " off " >
2017-10-28 05:59:25 +02:00
</ div >
</ div >
< div class = " form-group " >
< label for = " authpass " class = " col-sm-3 control-label " > Auth Password </ label >
< div class = " col-sm-9 " >
2018-06-23 21:48:03 +02:00
< input type = " text " name = " authpass " id = " authpass " placeholder = " AuthPass " class = " form-control input-sm " autocomplete = " off " >
2017-10-28 05:59:25 +02:00
</ div >
</ div >
< div class = " form-group " >
< label for = " authalgo " class = " col-sm-3 control-label " > Auth Algorithm </ label >
< div class = " col-sm-9 " >
< select name = " authalgo " id = " authalgo " class = " form-control input-sm " >
2021-09-28 18:35:59 -05:00
< ? php
foreach ( \LibreNMS\SNMPCapabilities :: authAlgorithms () as $algo => $enabled ) {
echo " <option value= \" $algo\ " " . ( $enabled ?: ' disabled') . " > $algo </ option > " ;
}
?>
2017-10-28 05:59:25 +02:00
</ select >
2021-09-28 18:35:59 -05:00
< ? php if ( ! \LibreNMS\SNMPCapabilities :: supportsSHA2 ()) { ?>
2021-02-10 14:57:12 +01:00
< label class = " text-left " >< small > Some options are disabled . < a href = " https://docs.librenms.org/Support/FAQ/#optional-requirements-for-snmpv3-sha2-auth " > Read more here </ a ></ small ></ label >
2020-10-29 20:02:26 +02:00
< ? php } ?>
2017-10-28 05:59:25 +02:00
</ div >
</ div >
< div class = " form-group " >
< label for = " cryptopass " class = " col-sm-3 control-label " > Crypto Password </ label >
< div class = " col-sm-9 " >
2018-06-23 21:48:03 +02:00
< input type = " text " name = " cryptopass " id = " cryptopass " placeholder = " Crypto Password " class = " form-control input-sm " autocomplete = " off " >
2017-10-28 05:59:25 +02:00
</ div >
</ div >
< div class = " form-group " >
< label for = " cryptoalgo " class = " col-sm-3 control-label " > Crypto Algorithm </ label >
< div class = " col-sm-9 " >
< select name = " cryptoalgo " id = " cryptoalgo " class = " form-control input-sm " >
2021-09-28 18:35:59 -05:00
< ? php
foreach ( \LibreNMS\SNMPCapabilities :: cryptoAlgoritms () as $algo => $enabled ) {
echo " <option value= \" $algo\ " " . ( $enabled ?: ' disabled') . " > $algo </ option > " ;
}
?>
2017-10-28 05:59:25 +02:00
</ select >
2021-09-28 18:35:59 -05:00
< ? php if ( ! \LibreNMS\SNMPCapabilities :: supportsAES256 ()) { ?>
2021-02-10 14:57:12 +01:00
< label class = " text-left " >< small > Some options are disabled . < a href = " https://docs.librenms.org/Support/FAQ/#optional-requirements-for-snmpv3-sha2-auth " > Read more here </ a ></ small ></ label >
2020-10-29 20:02:26 +02:00
< ? php } ?>
2017-10-28 05:59:25 +02:00
</ div >
</ div >
2014-10-02 23:14:45 +01:00
</ div >
</ div >
2015-03-15 21:44:35 +00:00
< ? php
2019-06-23 00:29:12 -05:00
if ( Config :: get ( 'distributed_poller' ) === true ) {
2021-09-28 18:35:59 -05:00
echo '
2017-10-28 05:59:25 +02:00
< div class = " form-group " >
< label for = " poller_group " class = " col-sm-3 control-label " > Poller Group </ label >
< div class = " col-sm-9 " >
< select name = " poller_group " id = " poller_group " class = " form-control input-sm " >
< option value = " 0 " > Default poller group </ option >
2015-03-15 21:44:35 +00:00
' ;
2021-09-28 18:35:59 -05:00
foreach ( dbFetchRows ( 'SELECT `id`,`group_name` FROM `poller_groups` ORDER BY `group_name`' ) as $group ) {
echo '<option value="' . $group [ 'id' ] . '">' . $group [ 'group_name' ] . '</option>' ;
}
2015-03-15 21:44:35 +00:00
2021-09-28 18:35:59 -05:00
echo '
2017-10-28 05:59:25 +02:00
</ select >
</ div >
2015-03-15 21:44:35 +00:00
</ div >
2016-09-14 02:32:45 +01:00
' ;
2021-09-28 18:35:59 -05:00
} //endif
2016-09-14 02:32:45 +01:00
?>
2015-03-19 22:06:13 +00:00
< div class = " form-group " >
2019-11-05 23:26:11 +01:00
< label for = " force_add " class = " col-sm-3 control-label " > Force add < br >< small > ( No ICMP or SNMP checks performed ) </ small ></ label >
< div class = " col-sm-9 " >
< input type = " checkbox " name = " force_add " id = " force_add " data - size = " small " >
2015-03-19 22:06:13 +00:00
</ div >
</ div >
2015-08-29 18:50:57 +05:30
< hr >
< center >< button type = " submit " class = " btn btn-default " name = " Submit " > Add Device </ button ></ center >
2011-03-27 10:21:19 +00:00
</ div >
2007-04-03 14:10:23 +00:00
</ form >
2014-10-02 23:14:45 +01:00
</ div >
< div class = " col-sm-3 " >
</ div >
</ div >
< script >
function changeForm () {
snmpVersion = $ ( " #snmpver " ) . val ();
if ( snmpVersion == 'v1' || snmpVersion == 'v2c' ) {
$ ( '#snmpv1_2' ) . show ();
$ ( '#snmpv3' ) . hide ();
}
else if ( snmpVersion == 'v3' ) {
$ ( '#snmpv1_2' ) . hide ();
$ ( '#snmpv3' ) . show ();
}
}
$ ( '#snmpv3' ) . toggle ();
2017-10-28 05:59:25 +02:00
function disableSnmp ( e ) {
if ( e . checked ) {
$ ( '#snmp_conf' ) . show ();
$ ( '#snmp_override' ) . hide ();
} else {
$ ( '#snmp_conf' ) . hide ();
$ ( '#snmp_override' ) . show ();
}
}
var os_suggestions = new Bloodhound ({
datumTokenizer : Bloodhound . tokenizers . obj . whitespace ( 'text' ),
queryTokenizer : Bloodhound . tokenizers . whitespace ,
remote : {
url : " ajax_ossuggest.php?term=%QUERY " ,
filter : function ( output ) {
return $ . map ( output , function ( item ) {
return {
text : item . text ,
os : item . os ,
};
});
},
wildcard : " %QUERY "
}
});
os_suggestions . initialize ();
$ ( '#os' ) . typeahead ({
hint : true ,
highlight : true ,
minLength : 1 ,
classNames : {
menu : 'typeahead-left'
}
},
{
source : os_suggestions . ttAdapter (),
async : true ,
displayKey : 'text' ,
valueKey : 'os' ,
templates : {
suggestion : Handlebars . compile ( '<p> {{text}}</p>' )
},
limit : 20
});
$ ( " #os " ) . on ( " typeahead:selected typeahead:autocompleted " , function ( e , datum ) {
$ ( " #os_id " ) . val ( datum . os );
$ ( " #os " ) . html ( '<mark>' + datum . text + '</mark>' );
});
$ ( " [name='snmp'] " ) . bootstrapSwitch ( 'offColor' , 'danger' );
2019-11-05 23:26:11 +01:00
$ ( " [name='force_add'] " ) . bootstrapSwitch ();
2017-10-28 05:59:25 +02:00
< ? php
2018-02-09 01:55:18 -06:00
if ( ! $snmp_enabled ) {
2017-10-28 05:59:25 +02:00
echo ' $("[name=\'snmp\']").trigger(\'click\');' ;
}
?>
2014-10-02 23:14:45 +01:00
</ script >