2014-07-07 00:15:04 +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.
*/
2019-06-19 16:01:53 -05:00
use App\Models\Device ;
use App\Models\DeviceGroup ;
2019-07-29 16:32:37 -05:00
use App\Models\PortsFdb ;
use App\Models\Sensor ;
use Illuminate\Database\Eloquent\Builder ;
use Illuminate\Routing\Router ;
2019-11-08 13:11:56 +00:00
use Illuminate\Support\Facades\Validator ;
2018-09-19 13:47:45 +01:00
use LibreNMS\Alerting\QueryBuilderParser ;
2018-09-19 23:38:01 +01:00
use LibreNMS\Config ;
2019-04-10 16:33:25 -05:00
use LibreNMS\Exceptions\InvalidIpException ;
use LibreNMS\Util\IPv4 ;
2017-11-18 11:33:03 +01:00
2017-11-29 09:42:52 +00:00
function api_success ( $result , $result_name , $message = null , $code = 200 , $count = null , $extra = null )
{
if ( isset ( $result ) && ! isset ( $result_name )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Result name not specified' );
2017-11-29 09:42:52 +00:00
}
2017-12-02 16:53:45 -06:00
2019-07-29 16:32:37 -05:00
$output = [ 'status' => 'ok' ];
2017-12-02 16:53:45 -06:00
2017-11-29 09:42:52 +00:00
if ( isset ( $result )) {
$output [ $result_name ] = $result ;
}
if ( isset ( $message ) && $message != '' ) {
$output [ 'message' ] = $message ;
}
if ( ! isset ( $count ) && is_array ( $result )) {
$count = count ( $result );
}
if ( isset ( $count )) {
$output [ 'count' ] = $count ;
}
if ( isset ( $extra )) {
$output = array_merge ( $output , $extra );
}
2019-07-29 16:32:37 -05:00
return response () -> json ( $output , $code , [], JSON_PRETTY_PRINT );
2017-11-29 09:42:52 +00:00
} // end api_success()
2015-07-13 20:10:26 +02:00
2017-11-29 09:42:52 +00:00
function api_success_noresult ( $code , $message = null )
{
2019-07-29 16:32:37 -05:00
return api_success ( null , null , $message , $code );
2017-11-29 09:42:52 +00:00
} // end api_success_noresult
function api_error ( $statusCode , $message )
{
2019-07-29 16:32:37 -05:00
return response () -> json ([
2017-11-29 09:42:52 +00:00
'status' => 'error' ,
'message' => $message
2019-07-29 16:32:37 -05:00
], $statusCode , [], JSON_PRETTY_PRINT );
2017-11-29 09:42:52 +00:00
} // end api_error()
2019-07-29 16:32:37 -05:00
function api_not_found ()
2018-02-09 21:14:55 +00:00
{
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "This API route doesn't exist." );
2018-02-09 21:14:55 +00:00
}
2019-07-29 16:32:37 -05:00
function api_get_graph ( array $vars )
2017-11-29 09:42:52 +00:00
{
2019-07-29 16:32:37 -05:00
global $dur ; // Needed for callback within graph code
2017-11-29 09:42:52 +00:00
2019-07-29 16:32:37 -05:00
$auth = '1' ;
$base64_output = '' ;
2019-08-12 09:46:36 -05:00
// prevent ugly error for undefined graphs from being passed to the user
list ( $type , $subtype ) = extract_graph_type ( $vars [ 'type' ]);
if ( ! is_file ( base_path ( "includes/html/graphs/ $type /auth.inc.php" ))) {
return api_error ( 400 , 'Invalid graph type' );
}
2019-07-29 16:32:37 -05:00
ob_start ();
rrdtool_initialize ( false );
include 'includes/html/graphs/graph.inc.php' ;
rrdtool_close ();
$image = ob_get_contents ();
ob_end_clean ();
if ( $vars [ 'output' ] === 'base64' ) {
return api_success ([ 'image' => $base64_output , 'content-type' => get_image_type ()], 'image' );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return response ( $image , 200 , [ 'Content-Type' => get_image_type ()]);
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
function check_bill_permission ( $bill_id , $callback )
2017-11-29 09:42:52 +00:00
{
2019-07-29 16:32:37 -05:00
if ( ! bill_permitted ( $bill_id )) {
return api_error ( 403 , 'Insufficient permissions to access this bill' );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return $callback ( $bill_id );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
function check_device_permission ( $device_id , $callback = null )
2017-11-29 09:42:52 +00:00
{
2019-07-29 16:32:37 -05:00
if ( ! device_permitted ( $device_id )) {
return api_error ( 403 , 'Insufficient permissions to access this device' );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return is_callable ( $callback ) ? $callback ( $device_id ) : true ;
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
function check_port_permission ( $port_id , $device_id , $callback )
2017-11-29 09:42:52 +00:00
{
2019-07-29 16:32:37 -05:00
if ( ! device_permitted ( $device_id ) && ! port_permitted ( $port_id , $device_id )) {
return api_error ( 403 , 'Insufficient permissions to access this port' );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return $callback ( $port_id );
2017-11-29 09:42:52 +00:00
}
2015-07-13 20:10:26 +02:00
2019-08-12 09:46:36 -05:00
function get_graph_by_port_hostname ( \Illuminate\Http\Request $request , $ifname = null , $type = 'port_bits' )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// This will return a graph for a given port by the ifName
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2017-07-04 23:41:22 +02:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$vars = [
2019-08-12 09:46:36 -05:00
'port' => $ifname ?: $request -> route ( 'ifname' ),
'type' => $request -> route ( 'type' , $type ),
2019-07-29 16:32:37 -05:00
'output' => $request -> get ( 'output' , 'display' ),
'width' => $request -> get ( 'width' , 1075 ),
'height' => $request -> get ( 'height' , 300 ),
];
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'from' )) {
$vars [ 'from' ] = $request -> get ( 'from' );
2015-07-13 20:10:26 +02:00
}
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'to' )) {
$vars [ 'to' ] = $request -> get ( 'to' );
2015-12-19 19:10:18 +00:00
}
2019-07-29 16:32:37 -05:00
$port = $request -> get ( 'ifDescr' ) ? 'ifDescr' : 'ifName' ;
$vars [ 'id' ] = dbFetchCell ( "SELECT `P`.`port_id` FROM `ports` AS `P` JOIN `devices` AS `D` ON `P`.`device_id` = `D`.`device_id` WHERE `D`.`device_id`=? AND `P`.` $port `=? AND `deleted` = 0 LIMIT 1" , [ $device_id , $vars [ 'port' ]]);
2017-12-02 16:53:45 -06:00
2019-07-29 16:32:37 -05:00
return check_port_permission ( $vars [ 'id' ], $device_id , function () use ( $vars ) {
return api_get_graph ( $vars );
});
2014-07-08 14:39:19 +01:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_port_stats_by_port_hostname ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-08-12 09:46:36 -05:00
$ifName = $request -> route ( 'ifname' );
// handle %2f in paths and pass to get_graph_by_port_hostname if needed
if ( str_contains ( $ifName , '/' )) {
$parts = explode ( '/' , $request -> path ());
if ( isset ( $parts [ 5 ])) {
$ifName = urldecode ( $parts [ 5 ]);
if ( isset ( $parts [ 6 ])) {
return get_graph_by_port_hostname ( $request , $ifName , $parts [ 6 ]);
}
}
}
2015-07-13 20:10:26 +02:00
// This will return port stats based on a devices hostname and ifName
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-07-13 20:10:26 +02:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$port = dbFetchRow ( 'SELECT * FROM `ports` WHERE `device_id`=? AND `ifName`=? AND `deleted` = 0' , [ $device_id , $ifName ]);
return check_port_permission ( $port [ 'port_id' ], $device_id , function () use ( $request , $port ) {
$in_rate = $port [ 'ifInOctets_rate' ] * 8 ;
$out_rate = $port [ 'ifOutOctets_rate' ] * 8 ;
$port [ 'in_rate' ] = formatRates ( $in_rate );
$port [ 'out_rate' ] = formatRates ( $out_rate );
$port [ 'in_perc' ] = number_format ( $in_rate / $port [ 'ifSpeed' ] * 100 , 2 , '.' , '' );
$port [ 'out_perc' ] = number_format ( $out_rate / $port [ 'ifSpeed' ] * 100 , 2 , '.' , '' );
$port [ 'in_pps' ] = format_bi ( $port [ 'ifInUcastPkts_rate' ]);
$port [ 'out_pps' ] = format_bi ( $port [ 'ifOutUcastPkts_rate' ]);
//only return requested columns
if ( $request -> has ( 'columns' )) {
$cols = explode ( "," , $request -> get ( 'columns' ));
foreach ( array_keys ( $port ) as $c ) {
if ( ! in_array ( $c , $cols )) {
unset ( $port [ $c ]);
}
2016-12-23 21:54:13 +01:00
}
}
2019-07-29 16:32:37 -05:00
return api_success ( $port , 'port' );
});
2014-07-07 00:15:04 +01:00
}
2014-07-08 14:39:19 +01:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_graph_generic_by_hostname ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// This will return a graph type given a device id.
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$sensor_id = $request -> route ( 'sensor_id' );
$vars = [];
$vars [ 'type' ] = $request -> route ( 'type' , 'device_uptime' );
$vars [ 'output' ] = $request -> get ( 'output' , 'display' );
2017-01-19 10:09:20 +00:00
if ( isset ( $sensor_id )) {
$vars [ 'id' ] = $sensor_id ;
2017-12-06 22:27:30 +00:00
if ( str_contains ( $vars [ 'type' ], '_wireless' )) {
$vars [ 'type' ] = str_replace ( 'device_' , '' , $vars [ 'type' ]);
} else {
// If this isn't a wireless graph we need to fix the name.
$vars [ 'type' ] = str_replace ( 'device_' , 'sensor_' , $vars [ 'type' ]);
}
2017-01-19 10:09:20 +00:00
}
2016-05-04 15:50:41 -04:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
$device = device_by_id_cache ( $device_id );
2019-07-29 16:32:37 -05:00
$vars [ 'device' ] = $device [ 'device_id' ];
2016-05-04 15:50:41 -04:00
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function () use ( $request , $device , $vars ) {
if ( $request -> has ( 'from' )) {
$vars [ 'from' ] = $request -> get ( 'from' );
}
2017-11-29 09:42:52 +00:00
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'to' )) {
$vars [ 'to' ] = $request -> get ( 'to' );
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$vars [ 'width' ] = $request -> get ( 'width' , 1075 );
$vars [ 'height' ] = $request -> get ( 'height' , 300 );
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
return api_get_graph ( $vars );
});
2014-07-08 14:39:19 +01:00
}
2014-07-13 21:28:26 +01:00
2018-01-18 18:43:15 +03:00
function list_locations ()
{
$locations = dbFetchRows ( "SELECT `locations`.* FROM `locations` WHERE `locations`.`location` IS NOT NULL" );
$total_locations = count ( $locations );
if ( $total_locations == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Locations do not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $locations , 'locations' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function get_device ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// return details of a single device
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-07-13 20:10:26 +02:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
// find device matching the id
$device = device_by_id_cache ( $device_id );
if ( ! $device ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Device $hostname does not exist" );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function () use ( $device ) {
$host_id = get_vm_parent_id ( $device );
if ( is_numeric ( $host_id )) {
$device = array_merge ( $device , [ 'parent_id' => $host_id ]);
}
return api_success ([ $device ], 'devices' );
});
2014-09-27 15:25:43 +10:00
}
2019-07-29 16:32:37 -05:00
function list_devices ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// This will return a list of devices
2019-07-29 16:32:37 -05:00
$order = $request -> get ( 'order' );
$type = $request -> get ( 'type' );
$query = $request -> get ( 'query' );
$param = [];
2018-01-14 23:43:55 +03:00
2015-07-13 20:10:26 +02:00
if ( empty ( $order )) {
$order = 'hostname' ;
}
if ( stristr ( $order , ' desc' ) === false && stristr ( $order , ' asc' ) === false ) {
2018-01-14 23:43:55 +03:00
$order = 'd.`' . $order . '` ASC' ;
2015-07-13 20:10:26 +02:00
}
2019-05-13 09:45:19 -05:00
$select = " d.*, GROUP_CONCAT(dd.device_id) AS dependency_parent_id, GROUP_CONCAT(dd.hostname) AS dependency_parent_hostname, `location`, `lat`, `lng` " ;
2018-11-28 16:49:18 -06:00
$join = " LEFT JOIN `device_relationships` AS dr ON dr.`child_device_id` = d.`device_id` LEFT JOIN `devices` AS dd ON dr.`parent_device_id` = dd.`device_id` LEFT JOIN `locations` ON `locations`.`id` = `d`.`location_id`" ;
2018-01-14 23:43:55 +03:00
2015-07-13 20:10:26 +02:00
if ( $type == 'all' || empty ( $type )) {
$sql = '1' ;
2018-08-28 18:44:47 +02:00
} elseif ( $type == 'active' ) {
$sql = "`d`.`ignore`='0' AND `d`.`disabled`='0'" ;
2017-02-08 22:57:15 +01:00
} elseif ( $type == 'location' ) {
2018-11-28 16:49:18 -06:00
$sql = "`locations`.`location` LIKE '%" . $query . "%'" ;
2019-10-20 17:18:10 +02:00
} elseif ( $type == 'hostname' ) {
$sql = "`d`.`hostname` LIKE '%" . $query . "%'" ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'ignored' ) {
2018-01-22 21:10:39 +00:00
$sql = "`d`.`ignore`='1' AND `d`.`disabled`='0'" ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'up' ) {
2018-01-22 21:10:39 +00:00
$sql = "`d`.`status`='1' AND `d`.`ignore`='0' AND `d`.`disabled`='0'" ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'down' ) {
2018-01-22 21:10:39 +00:00
$sql = "`d`.`status`='0' AND `d`.`ignore`='0' AND `d`.`disabled`='0'" ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'disabled' ) {
2018-01-22 21:10:39 +00:00
$sql = "`d`.`disabled`='1'" ;
2017-06-19 12:49:43 -05:00
} elseif ( $type == 'os' ) {
2018-01-22 21:10:39 +00:00
$sql = "`d`.`os`=?" ;
2017-06-19 12:49:43 -05:00
$param [] = $query ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'mac' ) {
2018-01-14 23:43:55 +03:00
$join .= " LEFT JOIN `ports` AS p ON d.`device_id` = p.`device_id` LEFT JOIN `ipv4_mac` AS m ON p.`port_id` = m.`port_id` " ;
$sql = "m.`mac_address`=?" ;
$select .= ",p.* " ;
2015-08-23 11:57:56 +00:00
$param [] = $query ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'ipv4' ) {
2018-01-14 23:43:55 +03:00
$join .= " LEFT JOIN `ports` AS p ON d.`device_id` = p.`device_id` LEFT JOIN `ipv4_addresses` AS a ON p.`port_id` = a.`port_id` " ;
$sql = "a.`ipv4_address`=?" ;
$select .= ",p.* " ;
2015-08-23 11:57:56 +00:00
$param [] = $query ;
2016-08-18 20:28:22 -05:00
} elseif ( $type == 'ipv6' ) {
2018-01-14 23:43:55 +03:00
$join .= " LEFT JOIN `ports` AS p ON d.`device_id` = p.`device_id` LEFT JOIN `ipv6_addresses` AS a ON p.`port_id` = a.`port_id` " ;
$sql = "a.`ipv6_address`=? OR a.`ipv6_compressed`=?" ;
$select .= ",p.* " ;
2019-07-29 16:32:37 -05:00
$param = [ $query , $query ];
2016-08-18 20:28:22 -05:00
} else {
2015-07-13 20:10:26 +02:00
$sql = '1' ;
}
2018-01-14 23:43:55 +03:00
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2018-07-09 14:23:38 -05:00
$sql .= " AND `d`.`device_id` IN (SELECT device_id FROM devices_perms WHERE user_id = ?)" ;
2019-07-29 16:32:37 -05:00
$param [] = Auth :: id ();
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
$devices = [];
2018-01-14 23:43:55 +03:00
$dev_query = "SELECT $select FROM `devices` AS d $join WHERE $sql GROUP BY d.`hostname` ORDER BY $order " ;
foreach ( dbFetchRows ( $dev_query , $param ) as $device ) {
2017-01-26 22:38:43 +00:00
$host_id = get_vm_parent_id ( $device );
2016-01-20 18:19:15 +00:00
$device [ 'ip' ] = inet6_ntop ( $device [ 'ip' ]);
2017-01-26 22:38:43 +00:00
if ( is_numeric ( $host_id )) {
$device [ 'parent_id' ] = $host_id ;
}
2015-07-13 20:10:26 +02:00
$devices [] = $device ;
}
2019-07-29 16:32:37 -05:00
return api_success ( $devices , 'devices' );
2014-07-13 21:28:26 +01:00
}
2014-07-16 01:02:55 +01:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function add_device ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// This will add a device using the data passed encoded with json
// FIXME: Execution flow through this function could be improved
2019-07-29 16:32:37 -05:00
$data = json_decode ( $request -> getContent (), true );
2017-11-29 09:42:52 +00:00
2019-07-29 16:32:37 -05:00
$additional = [];
2015-07-13 20:10:26 +02:00
// keep scrutinizer from complaining about snmpver not being set for all execution paths
$snmpver = 'v2c' ;
if ( empty ( $data )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'No information has been provided to add this new device' );
2017-11-29 09:42:52 +00:00
}
if ( empty ( $data [ 'hostname' ])) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Missing the device hostname' );
2015-07-13 20:10:26 +02:00
}
$hostname = $data [ 'hostname' ];
2019-07-29 16:32:37 -05:00
$port = $data [ 'port' ] ?: Config :: get ( 'snmp.port' );
$transport = $data [ 'transport' ] ?: 'udp' ;
$poller_group = $data [ 'poller_group' ] ?: 0 ;
2017-01-06 22:47:00 +01:00
$force_add = $data [ 'force_add' ] ? true : false ;
2017-10-28 05:59:25 +02:00
$snmp_disable = ( $data [ 'snmp_disable' ]);
if ( $snmp_disable ) {
2019-07-29 16:32:37 -05:00
$additional = [
'sysName' => $data [ 'sysName' ] ?: '' ,
'os' => $data [ 'os' ] ?: 'ping' ,
'hardware' => $data [ 'hardware' ] ?: '' ,
2017-10-28 05:59:25 +02:00
'snmp_disable' => 1 ,
2019-07-29 16:32:37 -05:00
];
2017-10-28 05:59:25 +02:00
} elseif ( $data [ 'version' ] == 'v1' || $data [ 'version' ] == 'v2c' ) {
2015-07-13 20:10:26 +02:00
if ( $data [ 'community' ]) {
2019-06-23 00:29:12 -05:00
Config :: set ( 'snmp.community' , [ $data [ 'community' ]]);
2015-07-13 20:10:26 +02:00
}
2019-07-29 16:32:37 -05:00
$snmpver = $data [ 'version' ];
2016-08-18 20:28:22 -05:00
} elseif ( $data [ 'version' ] == 'v3' ) {
2019-07-29 16:32:37 -05:00
$v3 = [
'authlevel' => $data [ 'authlevel' ],
'authname' => $data [ 'authname' ],
'authpass' => $data [ 'authpass' ],
'authalgo' => $data [ 'authalgo' ],
'cryptopass' => $data [ 'cryptopass' ],
'cryptoalgo' => $data [ 'cryptoalgo' ],
];
2015-07-13 20:10:26 +02:00
2019-06-23 00:29:12 -05:00
$v3_config = Config :: get ( 'snmp.v3' );
array_unshift ( $v3_config , $v3 );
Config :: set ( 'snmp.v3' , $v3_config );
2015-07-13 20:10:26 +02:00
$snmpver = 'v3' ;
2016-08-18 20:28:22 -05:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'You haven\'t specified an SNMP version to use' );
2017-11-29 09:42:52 +00:00
}
try {
$device_id = addHost ( $hostname , $snmpver , $port , $transport , $poller_group , $force_add , 'ifIndex' , $additional );
} catch ( Exception $e ) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , $e -> getMessage ());
2015-07-13 20:10:26 +02:00
}
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 201 , "Device $hostname ( $device_id ) has been added successfully" );
2014-07-16 01:02:55 +01:00
}
2014-09-17 21:03:02 +01:00
2019-07-29 16:32:37 -05:00
function del_device ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
// This will add a device using the data passed encoded with json
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-07-13 20:10:26 +02:00
2017-11-29 09:42:52 +00:00
if ( empty ( $hostname )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'No hostname has been provided to delete' );
2017-11-29 09:42:52 +00:00
}
2015-07-13 20:10:26 +02:00
2017-11-29 09:42:52 +00:00
// allow deleting by device_id or hostname
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
$device = null ;
if ( $device_id ) {
// save the current details for returning to the client on successful delete
$device = device_by_id_cache ( $device_id );
2014-09-17 21:03:02 +01:00
}
2014-09-27 16:32:55 +10:00
2018-07-13 17:08:00 -05:00
if ( ! $device ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Device $hostname not found" );
2017-11-29 09:42:52 +00:00
}
$response = delete_device ( $device_id );
if ( empty ( $response )) {
// FIXME: Need to provide better diagnostics out of delete_device
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device deletion failed' );
2017-11-29 09:42:52 +00:00
}
// deletion succeeded - include old device details in response
2019-07-29 16:32:37 -05:00
return api_success ([ $device ], 'devices' , $response );
2014-09-17 21:03:02 +01:00
}
2014-10-01 20:49:34 +01:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_vlans ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2017-11-29 09:42:52 +00:00
2015-07-13 20:10:26 +02:00
if ( empty ( $hostname )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'No hostname has been provided' );
2017-11-29 09:42:52 +00:00
}
2015-07-13 20:10:26 +02:00
2017-11-29 09:42:52 +00:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
$device = null ;
if ( $device_id ) {
// save the current details for returning to the client on successful delete
$device = device_by_id_cache ( $device_id );
2014-10-01 20:49:34 +01:00
}
2015-07-13 20:10:26 +02:00
2017-11-29 09:42:52 +00:00
if ( ! $device ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Device $hostname not found" );
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) {
$vlans = dbFetchRows ( 'SELECT vlan_vlan,vlan_domain,vlan_name,vlan_type,vlan_mtu FROM vlans WHERE `device_id` = ?' , [ $device_id ]);
return api_success ( $vlans , 'vlans' );
});
2014-10-01 20:49:34 +01:00
}
2014-10-09 16:20:04 +00:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function show_endpoints ( \Illuminate\Http\Request $request , Router $router )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$output = [];
$base = str_replace ( 'api/v0' , '' , $request -> url ());
foreach ( $router -> getRoutes () as $route ) {
/** @var \Illuminate\Routing\Route $route */
if ( starts_with ( $route -> getPrefix (), 'api/v0' ) && $route -> getName ()) {
$output [ $route -> getName ()] = $base . $route -> uri ();
}
2014-10-09 16:20:04 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
ksort ( $output );
return response () -> json ( $output , 200 , [], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES );
2014-10-09 16:20:04 +00:00
}
2014-10-26 15:48:51 +00:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function list_bgp ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2015-07-13 20:10:26 +02:00
$sql = '' ;
2019-07-29 16:32:37 -05:00
$sql_params = [];
$hostname = $request -> get ( 'hostname' );
$asn = $request -> get ( 'asn' );
2015-07-13 20:10:26 +02:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
2017-03-13 02:17:09 +00:00
$sql = ' AND `devices`.`device_id` = ?' ;
$sql_params [] = $device_id ;
}
if ( ! empty ( $asn )) {
$sql = ' AND `devices`.`bgpLocalAs` = ?' ;
$sql_params [] = $asn ;
2014-10-26 15:48:51 +00:00
}
2015-07-13 20:10:26 +02:00
2017-03-13 02:17:09 +00:00
$bgp_sessions = dbFetchRows ( "SELECT `bgpPeers`.* FROM `bgpPeers` LEFT JOIN `devices` ON `bgpPeers`.`device_id` = `devices`.`device_id` WHERE `bgpPeerState` IS NOT NULL AND `bgpPeerState` != '' $sql " , $sql_params );
2014-10-26 15:48:51 +00:00
$total_bgp_sessions = count ( $bgp_sessions );
2017-11-29 09:42:52 +00:00
if ( ! is_numeric ( $total_bgp_sessions )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Error retrieving bgpPeers' );
2014-10-29 21:30:35 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
return api_success ( $bgp_sessions , 'bgp_sessions' );
2017-09-07 20:04:36 +01:00
}
2019-07-29 16:32:37 -05:00
function get_bgp ( \Illuminate\Http\Request $request )
2017-11-30 22:51:20 +00:00
{
2019-07-29 16:32:37 -05:00
$bgpPeerId = $request -> route ( 'id' );
2017-11-30 22:51:20 +00:00
if ( ! is_numeric ( $bgpPeerId )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid id has been provided' );
2017-11-30 22:51:20 +00:00
}
2019-07-29 16:32:37 -05:00
$bgp_session = dbFetchRows ( "SELECT * FROM `bgpPeers` WHERE `bgpPeerState` IS NOT NULL AND `bgpPeerState` != '' AND bgpPeer_id = ?" , [ $bgpPeerId ]);
2017-11-30 22:51:20 +00:00
$bgp_session_count = count ( $bgp_session );
if ( ! is_numeric ( $bgp_session_count )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Error retrieving BGP peer' );
2017-11-30 22:51:20 +00:00
}
if ( $bgp_session_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "BGP peer $bgpPeerId does not exist" );
2017-11-30 22:51:20 +00:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $bgp_session , 'bgp_session' );
2017-11-30 22:51:20 +00:00
}
2019-07-29 16:32:37 -05:00
function list_cbgp ( \Illuminate\Http\Request $request )
2018-01-18 18:43:15 +03:00
{
$sql = '' ;
2019-07-29 16:32:37 -05:00
$sql_params = [];
$hostname = $request -> get ( 'hostname' );
2018-01-18 18:43:15 +03:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
$permission = check_device_permission ( $device_id );
if ( $permission !== true ) {
return $permission ; // permission error
}
2018-01-18 18:43:15 +03:00
$sql = " AND `devices`.`device_id` = ?" ;
$sql_params [] = $device_id ;
}
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2018-01-18 18:43:15 +03:00
$sql .= " AND `bgpPeers_cbgp`.`device_id` IN (SELECT device_id FROM devices_perms WHERE user_id = ?)" ;
2019-07-29 16:32:37 -05:00
$sql_params [] = Auth :: id ();
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
$bgp_counters = dbFetchRows ( "SELECT `bgpPeers_cbgp`.* FROM `bgpPeers_cbgp` LEFT JOIN `devices` ON `bgpPeers_cbgp`.`device_id` = `devices`.`device_id` WHERE `bgpPeers_cbgp`.`device_id` IS NOT NULL $sql " , $sql_params );
2018-01-18 18:43:15 +03:00
$total_bgp_counters = count ( $bgp_counters );
if ( $total_bgp_counters == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'BGP counters does not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $bgp_counters , 'bgp_counters' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function list_ospf ( \Illuminate\Http\Request $request )
2017-09-07 20:04:36 +01:00
{
$sql = '' ;
2019-07-29 16:32:37 -05:00
$sql_params = [];
$hostname = $request -> get ( 'hostname' );
2017-09-07 20:04:36 +01:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
$sql = ' AND `device_id`=?' ;
2019-07-29 16:32:37 -05:00
$sql_params = [ $device_id ];
2017-09-07 20:04:36 +01:00
}
$ospf_neighbours = dbFetchRows ( "SELECT * FROM ospf_nbrs WHERE `ospfNbrState` IS NOT NULL AND `ospfNbrState` != '' $sql " , $sql_params );
$total_ospf_neighbours = count ( $ospf_neighbours );
2017-11-29 09:42:52 +00:00
if ( ! is_numeric ( $total_ospf_neighbours )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Error retrieving ospf_nbrs' );
2017-09-07 20:04:36 +01:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $ospf_neighbours , 'ospf_neighbours' );
2014-10-26 15:48:51 +00:00
}
2014-11-12 23:05:47 +00:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_graph_by_portgroup ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$group = $request -> route ( 'group' );
$id = $request -> route ( 'id' );
$vars = [
'output' => $request -> get ( 'output' , 'display' ),
'width' => $request -> get ( 'width' , 1075 ),
'height' => $request -> get ( 'height' , 300 ),
'type' => 'multiport_bits_separate' ,
];
if ( $request -> has ( 'from' )) {
$vars [ 'from' ] = $request -> get ( 'from' );
2015-07-13 20:10:26 +02:00
}
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'to' )) {
$vars [ 'to' ] = $request -> get ( 'to' );
2015-07-13 20:10:26 +02:00
}
2019-07-29 16:32:37 -05:00
if ( empty ( $id )) {
2017-03-13 02:17:09 +00:00
$ports = get_ports_from_type ( explode ( ',' , $group ));
2019-07-29 16:32:37 -05:00
$if_list = implode ( ',' , array_pluck ( $ports , 'port_id' ));
} else {
$if_list = $id ;
2017-03-13 02:17:09 +00:00
}
2019-07-29 16:32:37 -05:00
$vars [ 'id' ] = $if_list ;
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
return api_get_graph ( $vars );
2014-11-12 23:05:47 +00:00
}
2014-11-29 15:43:19 +00:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_components ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-08-15 16:01:43 +10:00
// Do some filtering if the user requests.
2019-07-29 16:32:37 -05:00
$options = [];
// Add the rest of the options with an equals query
foreach ( $request -> all () as $k => $v ) {
$options [ 'filter' ][ $k ] = [ '=' , $v ];
}
2016-01-14 05:22:37 +10:00
// We need to specify the label as this is a LIKE query
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'label' )) {
2015-08-15 16:01:43 +10:00
// set a label like filter
2019-07-29 16:32:37 -05:00
$options [ 'filter' ][ 'label' ] = [ 'LIKE' , $request -> get ( 'label' )];
2015-08-15 16:01:43 +10:00
}
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) use ( $options ) {
2015-08-15 16:01:43 +10:00
2019-07-29 16:32:37 -05:00
$COMPONENT = new LibreNMS\Component ();
$components = $COMPONENT -> getComponents ( $device_id , $options );
return api_success ( $components [ $device_id ], 'components' );
});
2015-08-15 16:01:43 +10:00
}
2019-07-29 16:32:37 -05:00
function add_components ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$ctype = $request -> route ( 'type' );
2016-03-30 16:39:39 +10:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2016-08-21 08:07:14 -05:00
$COMPONENT = new LibreNMS\Component ();
2016-08-18 20:28:22 -05:00
$component = $COMPONENT -> createComponent ( $device_id , $ctype );
2016-03-30 16:39:39 +10:00
2019-07-29 16:32:37 -05:00
return api_success ( $component , 'components' );
2016-03-30 16:39:39 +10:00
}
2019-07-29 16:32:37 -05:00
function edit_components ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$data = json_decode ( $request -> getContent (), true );
2016-03-30 16:39:39 +10:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2016-08-21 08:07:14 -05:00
$COMPONENT = new LibreNMS\Component ();
2016-03-30 16:39:39 +10:00
2017-11-29 09:42:52 +00:00
if ( ! $COMPONENT -> setComponentPrefs ( $device_id , $data )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Components could not be edited.' );
2016-03-30 16:39:39 +10:00
}
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 );
2016-03-30 16:39:39 +10:00
}
2019-07-29 16:32:37 -05:00
function delete_components ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$cid = $request -> route ( 'component' );
2016-03-30 16:39:39 +10:00
2016-08-21 08:07:14 -05:00
$COMPONENT = new LibreNMS\Component ();
2016-03-30 16:39:39 +10:00
if ( $COMPONENT -> deleteComponent ( $cid )) {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 );
2016-08-18 20:28:22 -05:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Components could not be deleted.' );
2016-03-30 16:39:39 +10:00
}
}
2019-07-29 16:32:37 -05:00
function get_graphs ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2014-11-29 15:43:19 +00:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) {
$graphs = [];
$graphs [] = [
'desc' => 'Poller Time' ,
'name' => 'device_poller_perf' ,
];
$graphs [] = [
'desc' => 'Ping Response' ,
'name' => 'device_ping_perf' ,
];
foreach ( dbFetchRows ( 'SELECT * FROM device_graphs WHERE device_id = ? ORDER BY graph' , [ $device_id ]) as $graph ) {
$desc = Config :: get ( "graph_types.device. { $graph [ 'graph' ] } .descr" );
$graphs [] = [
'desc' => $desc ,
'name' => 'device_' . $graph [ 'graph' ],
];
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
return api_success ( $graphs , 'graphs' );
});
2014-11-29 15:43:19 +00:00
}
2014-12-01 20:27:50 +00:00
2019-12-08 22:17:27 +01:00
function trigger_device_discovery ( \Illuminate\Http\Request $request )
{
// return details of a single device
$hostname = $request -> route ( 'hostname' );
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
// find device matching the id
$device = device_by_id_cache ( $device_id );
if ( ! $device ) {
return api_error ( 404 , "Device $hostname does not exist" );
}
$ret = device_discovery_trigger ( $device_id );
return api_success ( $ret , 'result' );
}
2019-07-29 16:32:37 -05:00
function list_available_health_graphs ( \Illuminate\Http\Request $request )
2017-01-19 10:09:20 +00:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2017-01-19 10:09:20 +00:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) use ( $request ) {
$input_type = $request -> route ( 'type' );
if ( $input_type ) {
$type = preg_replace ( '/^device_/' , '' , $input_type );
2017-01-19 10:09:20 +00:00
}
2019-07-29 16:32:37 -05:00
$sensor_id = $request -> route ( 'sensor_id' );
$graphs = [];
2018-05-19 00:36:06 -04:00
2019-07-29 16:32:37 -05:00
if ( isset ( $type )) {
if ( isset ( $sensor_id )) {
$graphs = dbFetchRows ( 'SELECT * FROM `sensors` WHERE `sensor_id` = ?' , [ $sensor_id ]);
} else {
foreach ( dbFetchRows ( 'SELECT `sensor_id`, `sensor_descr` FROM `sensors` WHERE `device_id` = ? AND `sensor_class` = ? AND `sensor_deleted` = 0' , [ $device_id , $type ]) as $graph ) {
$graphs [] = [
'sensor_id' => $graph [ 'sensor_id' ],
'desc' => $graph [ 'sensor_descr' ],
];
}
2018-05-19 00:36:06 -04:00
}
2019-07-29 16:32:37 -05:00
} else {
foreach ( dbFetchRows ( 'SELECT `sensor_class` FROM `sensors` WHERE `device_id` = ? AND `sensor_deleted` = 0 GROUP BY `sensor_class`' , [ $device_id ]) as $graph ) {
$graphs [] = [
'desc' => ucfirst ( $graph [ 'sensor_class' ]),
'name' => 'device_' . $graph [ 'sensor_class' ],
];
2018-05-19 00:36:06 -04:00
}
2019-07-29 16:32:37 -05:00
$device = Device :: find ( $device_id );
if ( $device ) {
if ( $device -> processors () -> count () > 0 ) {
array_push ( $graphs , [
'desc' => 'Processors' ,
'name' => 'device_processor'
]);
}
2018-07-09 14:23:38 -05:00
2019-07-29 16:32:37 -05:00
if ( $device -> storage () -> count () > 0 ) {
array_push ( $graphs , [
'desc' => 'Storage' ,
'name' => 'device_storage'
]);
}
if ( $device -> mempools () -> count () > 0 ) {
array_push ( $graphs , [
'desc' => 'Memory Pools' ,
'name' => 'device_mempool'
]);
}
2018-05-19 00:36:06 -04:00
}
}
2017-01-19 10:09:20 +00:00
2019-07-29 16:32:37 -05:00
return api_success ( $graphs , 'graphs' );
});
2017-01-19 10:09:20 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function list_available_wireless_graphs ( \Illuminate\Http\Request $request )
2017-12-06 22:27:30 +00:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2017-12-06 22:27:30 +00:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) use ( $request ) {
$input_type = $request -> route ( 'type' );
if ( $input_type ) {
list (, , $type ) = explode ( '_' , $input_type );
}
$sensor_id = $request -> route ( 'sensor_id' );
$graphs = [];
2017-12-06 22:27:30 +00:00
2019-07-29 16:32:37 -05:00
if ( isset ( $type )) {
if ( isset ( $sensor_id )) {
$graphs = dbFetchRows ( 'SELECT * FROM `wireless_sensors` WHERE `sensor_id` = ?' , [ $sensor_id ]);
} else {
foreach ( dbFetchRows ( 'SELECT `sensor_id`, `sensor_descr` FROM `wireless_sensors` WHERE `device_id` = ? AND `sensor_class` = ? AND `sensor_deleted` = 0' , [ $device_id , $type ]) as $graph ) {
$graphs [] = [
'sensor_id' => $graph [ 'sensor_id' ],
'desc' => $graph [ 'sensor_descr' ],
];
}
}
2017-12-06 22:27:30 +00:00
} else {
2019-07-29 16:32:37 -05:00
foreach ( dbFetchRows ( 'SELECT `sensor_class` FROM `wireless_sensors` WHERE `device_id` = ? AND `sensor_deleted` = 0 GROUP BY `sensor_class`' , [ $device_id ]) as $graph ) {
$graphs [] = [
'desc' => ucfirst ( $graph [ 'sensor_class' ]),
'name' => 'device_wireless_' . $graph [ 'sensor_class' ],
];
2017-12-06 22:27:30 +00:00
}
}
2019-07-29 16:32:37 -05:00
return api_success ( $graphs , 'graphs' );
});
2017-12-06 22:27:30 +00:00
}
2019-07-29 16:32:37 -05:00
function get_port_graphs ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$columns = $request -> get ( 'columns' , 'ifName' );
if ( $validate = validate_column_list ( $columns , 'ports' ) !== true ) {
return $validate ;
2014-11-30 15:45:10 +00:00
}
// use hostname as device_id if it's all digits
2015-07-13 20:10:26 +02:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2017-11-29 09:42:52 +00:00
$sql = '' ;
2019-07-29 16:32:37 -05:00
$params = [ $device_id ];
2017-11-29 09:42:52 +00:00
if ( ! device_permitted ( $device_id )) {
$sql = 'AND `port_id` IN (select `port_id` from `ports_perms` where `user_id` = ?)' ;
2019-07-29 16:32:37 -05:00
array_push ( $params , Auth :: id ());
2017-11-29 09:42:52 +00:00
}
2017-12-02 16:53:45 -06:00
2019-07-29 16:32:37 -05:00
$ports = dbFetchRows ( "SELECT $columns FROM `ports` WHERE `device_id` = ? AND `deleted` = '0' $sql ORDER BY `ifIndex`" , $params );
return api_success ( $ports , 'ports' );
2014-11-30 15:45:10 +00:00
}
2014-12-02 23:43:11 +00:00
2019-07-29 16:32:37 -05:00
function get_device_ip_addresses ( \Illuminate\Http\Request $request )
2017-02-07 02:46:09 -07:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
return check_device_permission ( $device_id , function ( $device_id ) {
$ipv4 = dbFetchRows ( "SELECT `ipv4_addresses`.* FROM `ipv4_addresses` JOIN `ports` ON `ports`.`port_id`=`ipv4_addresses`.`port_id` WHERE `ports`.`device_id` = ? AND `deleted` = 0" , [ $device_id ]);
$ipv6 = dbFetchRows ( "SELECT `ipv6_addresses`.* FROM `ipv6_addresses` JOIN `ports` ON `ports`.`port_id`=`ipv6_addresses`.`port_id` WHERE `ports`.`device_id` = ? AND `deleted` = 0" , [ $device_id ]);
2018-01-18 18:43:15 +03:00
$ip_addresses_count = count ( array_merge ( $ipv4 , $ipv6 ));
if ( $ip_addresses_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Device $device_id does not have any IP addresses" );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( array_merge ( $ipv4 , $ipv6 ), 'addresses' );
});
}
function get_port_ip_addresses ( \Illuminate\Http\Request $request )
{
$port_id = $request -> route ( 'portid' );
return check_port_permission ( $port_id , null , function ( $port_id ) {
$ipv4 = dbFetchRows ( "SELECT * FROM `ipv4_addresses` WHERE `port_id` = ?" , [ $port_id ]);
$ipv6 = dbFetchRows ( "SELECT * FROM `ipv6_addresses` WHERE `port_id` = ?" , [ $port_id ]);
2018-01-18 18:43:15 +03:00
$ip_addresses_count = count ( array_merge ( $ipv4 , $ipv6 ));
if ( $ip_addresses_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Port $port_id does not have any IP addresses" );
2018-01-18 18:43:15 +03:00
}
2017-02-07 02:46:09 -07:00
2019-07-29 16:32:37 -05:00
return api_success ( array_merge ( $ipv4 , $ipv6 ), 'addresses' );
});
2017-02-07 02:46:09 -07:00
}
2019-07-29 16:32:37 -05:00
function get_network_ip_addresses ( \Illuminate\Http\Request $request )
2017-02-07 02:46:09 -07:00
{
2019-07-29 16:32:37 -05:00
$network_id = $request -> route ( 'id' );
$ipv4 = dbFetchRows ( "SELECT * FROM `ipv4_addresses` WHERE `ipv4_network_id` = ?" , [ $network_id ]);
$ipv6 = dbFetchRows ( "SELECT * FROM `ipv6_addresses` WHERE `ipv6_network_id` = ?" , [ $network_id ]);
$ip_addresses_count = count ( array_merge ( $ipv4 , $ipv6 ));
if ( $ip_addresses_count == 0 ) {
return api_error ( 404 , "IP network $network_id does not exist or is empty" );
}
2017-02-07 02:46:09 -07:00
2019-07-29 16:32:37 -05:00
return api_success ( array_merge ( $ipv4 , $ipv6 ), 'addresses' );
2017-02-07 02:46:09 -07:00
}
2019-07-29 16:32:37 -05:00
function get_port_info ( \Illuminate\Http\Request $request )
2017-02-07 02:46:09 -07:00
{
2019-07-29 16:32:37 -05:00
$port_id = $request -> route ( 'portid' );
return check_port_permission ( $port_id , null , function ( $port_id ) {
// use hostname as device_id if it's all digits
$port = dbFetchRows ( "SELECT * FROM `ports` WHERE `port_id` = ? AND `deleted` = 0" , [ $port_id ]);
return api_success ( $port , 'port' );
});
}
function get_all_ports ( \Illuminate\Http\Request $request )
{
$columns = $request -> get ( 'columns' , 'port_id, ifName' );
if ( $validate = validate_column_list ( $columns , 'ports' ) !== true ) {
return $validate ;
2017-02-07 02:46:09 -07:00
}
2019-07-29 16:32:37 -05:00
$params = [];
2017-11-29 09:42:52 +00:00
$sql = '' ;
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2017-11-29 09:42:52 +00:00
$sql = ' AND (device_id IN (SELECT device_id FROM devices_perms WHERE user_id = ?) OR port_id IN (SELECT port_id FROM ports_perms WHERE user_id = ?))' ;
2019-07-29 16:32:37 -05:00
array_push ( $params , Auth :: id ());
array_push ( $params , Auth :: id ());
2017-11-29 09:42:52 +00:00
}
$ports = dbFetchRows ( "SELECT $columns FROM `ports` WHERE `deleted` = 0 $sql " , $params );
2017-02-07 02:46:09 -07:00
2019-07-29 16:32:37 -05:00
return api_success ( $ports , 'ports' );
2017-02-07 02:46:09 -07:00
}
2019-07-29 16:32:37 -05:00
function get_port_stack ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2016-04-05 13:03:17 -07:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) use ( $request ) {
if ( $request -> get ( 'valid_mappings' )) {
$mappings = dbFetchRows ( "SELECT * FROM `ports_stack` WHERE (`device_id` = ? AND `ifStackStatus` = 'active' AND (`port_id_high` != '0' AND `port_id_low` != '0')) ORDER BY `port_id_high`" , [ $device_id ]);
} else {
$mappings = dbFetchRows ( "SELECT * FROM `ports_stack` WHERE `device_id` = ? AND `ifStackStatus` = 'active' ORDER BY `port_id_high`" , [ $device_id ]);
}
2016-04-05 14:25:45 -07:00
2019-07-29 16:32:37 -05:00
return api_success ( $mappings , 'mappings' );
});
2016-04-05 13:03:17 -07:00
}
2019-07-29 16:32:37 -05:00
function list_alert_rules ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$id = $request -> route ( 'id' );
2015-07-13 20:10:26 +02:00
$sql = '' ;
2019-07-29 16:32:37 -05:00
$param = [];
if ( $id > 0 ) {
2015-07-13 20:10:26 +02:00
$sql = 'WHERE id=?' ;
2019-07-29 16:32:37 -05:00
$param = [ $id ];
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$rules = dbFetchRows ( "SELECT * FROM `alert_rules` $sql " , $param );
return api_success ( $rules , 'rules' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function list_alerts ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$id = $request -> route ( 'id' );
2018-08-26 07:42:21 -05:00
2019-07-29 16:32:37 -05:00
$sql = "SELECT `D`.`hostname`, `A`.*, `R`.`severity` FROM `alerts` AS `A`, `devices` AS `D`, `alert_rules` AS `R` WHERE `D`.`device_id` = `A`.`device_id` AND `A`.`rule_id` = `R`.`id` " ;
$sql .= 'AND `A`.`state` IN ' ;
if ( $request -> has ( 'state' )) {
$param = explode ( ',' , $request -> get ( 'state' ));
2016-08-18 20:28:22 -05:00
} else {
2018-08-26 07:42:21 -05:00
$param = [ 1 ];
2014-12-16 20:39:58 +00:00
}
2018-08-26 07:42:21 -05:00
$sql .= dbGenPlaceholders ( count ( $param ));
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
if ( $id > 0 ) {
$param [] = $id ;
2018-08-26 07:42:21 -05:00
$sql .= 'AND `A`.id=?' ;
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$severity = $request -> get ( 'severity' );
if ( $severity ) {
2018-08-28 18:44:47 +02:00
if ( in_array ( $severity , [ 'ok' , 'warning' , 'critical' ])) {
$param [] = $severity ;
$sql .= ' AND `R`.severity=?' ;
}
}
2019-11-05 15:16:29 -06:00
2019-07-29 16:32:37 -05:00
$order = 'timestamp desc' ;
if ( $request -> has ( 'order' )) {
list ( $sort_column , $sort_order ) = explode ( ' ' , $request -> get ( 'order' ), 2 );
if (( $res = validate_column_list ( $sort_column , 'alerts' )) !== true ) {
return $res ;
}
if ( in_array ( $sort_order , [ 'asc' , 'desc' ])) {
$order = $request -> get ( 'order' );
}
}
2018-08-28 18:44:47 +02:00
$sql .= ' ORDER BY A.' . $order ;
2018-08-26 07:42:21 -05:00
$alerts = dbFetchRows ( $sql , $param );
2019-07-29 16:32:37 -05:00
return api_success ( $alerts , 'alerts' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function add_edit_rule ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$data = json_decode ( $request -> getContent (), true );
if ( json_last_error () || ! is_array ( $data )) {
return api_error ( 500 , "We couldn't parse the provided json" );
2018-09-19 13:47:45 +01:00
}
2014-12-16 20:39:58 +00:00
2019-07-29 16:32:37 -05:00
$rule_id = $data [ 'rule_id' ];
$tmp_devices = ( array ) $data [ 'devices' ];
2018-09-19 13:47:45 +01:00
$groups = ( array ) $data [ 'groups' ];
if ( empty ( $tmp_devices ) && ! isset ( $rule_id )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Missing the devices or global device (-1)' );
2017-11-29 09:42:52 +00:00
}
2017-12-02 16:53:45 -06:00
2018-09-19 13:47:45 +01:00
$devices = [];
foreach ( $tmp_devices as $device ) {
if ( $device == "-1" ) {
continue ;
}
2019-08-20 14:03:40 +02:00
$devices [] = ( ctype_digit ( $device ) || is_int ( $device )) ? $device : getidbyname ( $device );
2014-12-16 20:39:58 +00:00
}
2019-07-29 16:32:37 -05:00
if ( isset ( $data [ 'builder' ])) {
// accept inline json or json as a string
$builder = is_array ( $data [ 'builder' ]) ? json_encode ( $data [ 'builder' ]) : $data [ 'builder' ];
} else {
$builder = $data [ 'rule' ];
}
2018-09-19 13:47:45 +01:00
if ( empty ( $builder )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Missing the alert builder rule' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$name = $data [ 'name' ];
2015-07-01 21:35:37 +01:00
if ( empty ( $name )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Missing the alert rule name' );
2015-07-01 21:35:37 +01:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$severity = $data [ 'severity' ];
$sevs = [
2015-07-13 20:10:26 +02:00
'ok' ,
'warning' ,
'critical' ,
2019-07-29 16:32:37 -05:00
];
2015-07-13 20:10:26 +02:00
if ( ! in_array ( $severity , $sevs )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Missing the severity' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
$disabled = $data [ 'disabled' ];
2015-07-13 20:10:26 +02:00
if ( $disabled != '0' && $disabled != '1' ) {
2014-12-16 20:39:58 +00:00
$disabled = 0 ;
}
2019-07-29 16:32:37 -05:00
$count = $data [ 'count' ];
$mute = $data [ 'mute' ];
$delay = $data [ 'delay' ];
2019-11-14 19:46:11 +01:00
$interval = $data [ 'interval' ];
2018-09-19 13:47:45 +01:00
$override_query = $data [ 'override_query' ];
$adv_query = $data [ 'adv_query' ];
2014-12-16 20:39:58 +00:00
$delay_sec = convert_delay ( $delay );
2019-11-14 19:46:11 +01:00
$interval_sec = convert_delay ( $interval );
2015-07-13 20:10:26 +02:00
if ( $mute == 1 ) {
2014-12-16 20:39:58 +00:00
$mute = true ;
2016-08-18 20:28:22 -05:00
} else {
2014-12-16 20:39:58 +00:00
$mute = false ;
}
2018-09-19 13:47:45 +01:00
$extra = [
2015-07-13 20:10:26 +02:00
'mute' => $mute ,
'count' => $count ,
'delay' => $delay_sec ,
2019-11-14 19:46:11 +01:00
'interval' => $interval_sec ,
2018-09-19 13:47:45 +01:00
'options' =>
[
'override_query' => $override_query
],
];
2014-12-16 20:39:58 +00:00
$extra_json = json_encode ( $extra );
2018-09-19 13:47:45 +01:00
if ( $override_query === 'on' ) {
$query = $adv_query ;
} else {
$query = QueryBuilderParser :: fromJson ( $builder ) -> toSql ();
if ( empty ( $query )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , "We couldn't parse your rule" );
2018-09-19 13:47:45 +01:00
}
}
2016-08-18 20:28:22 -05:00
if ( ! isset ( $rule_id )) {
2019-07-29 16:32:37 -05:00
if ( dbFetchCell ( 'SELECT `name` FROM `alert_rules` WHERE `name`=?' , [ $name ]) == $name ) {
return api_error ( 500 , 'Addition failed : Name has already been used' );
2015-10-16 16:18:18 +02:00
}
2019-07-29 16:32:37 -05:00
} elseif ( dbFetchCell ( "SELECT name FROM alert_rules WHERE name=? AND id !=? " , [ $name , $rule_id ]) == $name ) {
return api_error ( 500 , 'Update failed : Invalid rule id' );
2015-07-01 21:35:37 +01:00
}
2017-11-29 09:42:52 +00:00
if ( is_numeric ( $rule_id )) {
2019-07-29 16:32:37 -05:00
if ( ! ( dbUpdate ([ 'name' => $name , 'builder' => $builder , 'query' => $query , 'severity' => $severity , 'disabled' => $disabled , 'extra' => $extra_json ], 'alert_rules' , 'id=?' , [ $rule_id ]) >= 0 )) {
return api_error ( 500 , 'Failed to update existing alert rule' );
2014-12-16 20:39:58 +00:00
}
2019-07-29 16:32:37 -05:00
} elseif ( ! $rule_id = dbInsert ([ 'name' => $name , 'builder' => $builder , 'query' => $query , 'severity' => $severity , 'disabled' => $disabled , 'extra' => $extra_json ], 'alert_rules' )) {
return api_error ( 500 , 'Failed to create new alert rule' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2018-09-19 13:47:45 +01:00
dbSyncRelationship ( 'alert_device_map' , 'rule_id' , $rule_id , 'device_id' , $devices );
dbSyncRelationship ( 'alert_group_map' , 'rule_id' , $rule_id , 'group_id' , $groups );
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function delete_rule ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$rule_id = $request -> route ( 'id' );
2015-07-13 20:10:26 +02:00
if ( is_numeric ( $rule_id )) {
2019-07-29 16:32:37 -05:00
if ( dbDelete ( 'alert_rules' , '`id` = ? LIMIT 1' , [ $rule_id ])) {
return api_success_noresult ( 200 , 'Alert rule has been removed' );
2016-08-18 20:28:22 -05:00
} else {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'No alert rule by that ID' );
2014-12-16 20:39:58 +00:00
}
}
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid rule id has been provided' );
2014-12-16 20:39:58 +00:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function ack_alert ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$alert_id = $request -> route ( 'id' );
$data = json_decode ( $request -> getContent (), true );
2017-11-29 09:42:52 +00:00
if ( ! is_numeric ( $alert_id )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid alert has been provided' );
2017-11-29 09:42:52 +00:00
}
2018-09-19 23:38:01 +01:00
$alert = dbFetchRow ( 'SELECT note, info FROM alerts WHERE id=?' , [ $alert_id ]);
$note = $alert [ 'note' ];
$info = json_decode ( $alert [ 'info' ], true );
if ( ! empty ( $note )) {
$note .= PHP_EOL ;
}
$note .= date ( Config :: get ( 'dateformat.long' )) . " - Ack (" . Auth :: user () -> username . ") { $data [ 'note' ] } " ;
$info [ 'until_clear' ] = $data [ 'until_clear' ];
$info = json_encode ( $info );
if ( dbUpdate ([ 'state' => 2 , 'note' => $note , 'info' => $info ], 'alerts' , '`id` = ? LIMIT 1' , [ $alert_id ])) {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'Alert has been acknowledged' );
2016-08-18 20:28:22 -05:00
} else {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'No Alert by that ID' );
2014-12-16 20:39:58 +00:00
}
2015-10-08 16:45:36 +02:00
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function unmute_alert ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$alert_id = $request -> route ( 'id' );
$data = json_decode ( $request -> getContent (), true );
2017-11-29 09:42:52 +00:00
if ( ! is_numeric ( $alert_id )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid alert has been provided' );
2018-09-19 23:38:01 +01:00
}
$alert = dbFetchRow ( 'SELECT note, info FROM alerts WHERE id=?' , [ $alert_id ]);
$note = $alert [ 'note' ];
2019-07-29 16:32:37 -05:00
2018-09-19 23:38:01 +01:00
if ( ! empty ( $note )) {
$note .= PHP_EOL ;
2015-10-08 16:45:36 +02:00
}
2018-09-19 23:38:01 +01:00
$note .= date ( Config :: get ( 'dateformat.long' )) . " - Ack (" . Auth :: user () -> username . ") { $data [ 'note' ] } " ;
2015-10-08 16:45:36 +02:00
2018-09-19 23:38:01 +01:00
if ( dbUpdate ([ 'state' => 1 , 'note' => $note ], 'alerts' , '`id` = ? LIMIT 1' , [ $alert_id ])) {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'Alert has been unmuted' );
2017-11-29 09:42:52 +00:00
} else {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'No alert by that ID' );
2017-11-29 09:42:52 +00:00
}
2014-12-16 20:39:58 +00:00
}
2015-03-23 15:15:05 +00:00
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
function get_inventory ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-03-23 15:15:05 +00:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function ( $device_id ) use ( $request ) {
$sql = '' ;
$params = [];
if ( $request -> get ( 'entPhysicalClass' )) {
$sql .= ' AND entPhysicalClass=?' ;
$params [] = $request -> get ( 'entPhysicalClass' );
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
if ( $request -> get ( 'entPhysicalContainedIn' )) {
$sql .= ' AND entPhysicalContainedIn=?' ;
$params [] = $request -> get ( 'entPhysicalContainedIn' );
} else {
$sql .= ' AND entPhysicalContainedIn="0"' ;
}
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
if ( ! is_numeric ( $device_id )) {
return api_error ( 400 , 'Invalid device provided' );
}
$sql .= ' AND `device_id`=?' ;
$params [] = $device_id ;
$inventory = dbFetchRows ( "SELECT * FROM `entPhysical` WHERE 1 $sql " , $params );
2015-07-13 20:10:26 +02:00
2019-07-29 16:32:37 -05:00
return api_success ( $inventory , 'inventory' );
});
2015-03-23 15:15:05 +00:00
}
2015-05-07 00:32:58 +01:00
2015-07-13 20:10:26 +02:00
2019-12-17 13:49:13 +01:00
function get_inventory_for_device ( \Illuminate\Http\Request $request )
{
$hostname = $request -> route ( 'hostname' );
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
return check_device_permission ( $device_id , function ( $device_id ) use ( $request ) {
$params = [];
$sql = 'SELECT * FROM `entPhysical` WHERE device_id = ?' ;
$params [] = $device_id ;
$inventory = dbFetchRows ( $sql , $params );
return api_success ( $inventory , 'inventory' );
});
}
2019-10-17 03:46:44 +01:00
function search_oxidized ( \Illuminate\Http\Request $request )
{
$search_in_conf_textbox = $request -> route ( 'searchstring' );
$result = search_oxidized_config ( $search_in_conf_textbox );
if ( ! $result ) {
return api_error ( 404 , "Received no data from Oxidized" );
} else {
return api_success ( $result , 'nodes' );
}
}
2019-12-08 19:04:53 +00:00
function get_oxidized_config ( \Illuminate\Http\Request $request )
{
$hostname = $request -> route ( 'device_name' );
$result = json_decode ( file_get_contents ( Config :: get ( 'oxidized.url' ) . '/node/fetch/' . $hostname . '?format=json' ), true );
if ( ! $result ) {
return api_error ( 404 , "Received no data from Oxidized" );
} else {
return api_success ( $result , 'config' );
}
}
2019-07-29 16:32:37 -05:00
function list_oxidized ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$devices = [];
2019-06-23 00:29:12 -05:00
$device_types = "'" . implode ( "','" , Config :: get ( 'oxidized.ignore_types' )) . "'" ;
$device_os = "'" . implode ( "','" , Config :: get ( 'oxidized.ignore_os' )) . "'" ;
2017-11-16 21:21:52 +00:00
$sql = '' ;
2019-07-29 16:32:37 -05:00
$params = [];
2017-11-16 21:21:52 +00:00
if ( $hostname ) {
$sql = " AND hostname = ?" ;
2019-07-29 16:32:37 -05:00
$params = [ $hostname ];
2017-11-16 21:21:52 +00:00
}
2018-11-29 13:04:11 -06:00
foreach ( dbFetchRows ( "SELECT hostname,sysname,sysDescr,hardware,os,locations.location,ip AS ip FROM `devices` LEFT JOIN locations ON devices.location_id = locations.id LEFT JOIN devices_attribs AS `DA` ON devices.device_id = DA.device_id AND `DA`.attrib_type='override_Oxidized_disable' WHERE `disabled`='0' AND `ignore` = 0 AND (DA.attrib_value = 'false' OR DA.attrib_value IS NULL) AND (`type` NOT IN ( $device_types ) AND `os` NOT IN ( $device_os )) $sql " , $params ) as $device ) {
2018-05-24 07:00:39 +10:00
// Convert from packed value to human value
$device [ 'ip' ] = inet6_ntop ( $device [ 'ip' ]);
// Pre-populate the group with the default
2019-06-23 00:29:12 -05:00
if ( Config :: get ( 'oxidized.group_support' ) === true && ! empty ( Config :: get ( 'oxidized.default_group' ))) {
$device [ 'group' ] = Config :: get ( 'oxidized.default_group' );
2018-05-24 07:00:39 +10:00
}
2019-06-23 00:29:12 -05:00
foreach ( Config :: get ( 'oxidized.maps' ) as $maps_column => $maps ) {
2018-05-24 07:00:39 +10:00
// Based on Oxidized group support we can apply groups by setting group_support to true
2019-06-23 00:29:12 -05:00
if ( $maps_column == "group" && Config :: get ( 'oxidized.group_support' , true ) !== true ) {
2018-05-24 07:00:39 +10:00
continue ;
2017-10-15 13:37:20 -05:00
}
2018-07-09 14:23:38 -05:00
2018-05-24 07:00:39 +10:00
foreach ( $maps as $field_type => $fields ) {
foreach ( $fields as $field ) {
if ( isset ( $field [ 'regex' ]) && preg_match ( $field [ 'regex' ] . 'i' , $device [ $field_type ])) {
$device [ $maps_column ] = $field [ $maps_column ];
2016-03-05 00:48:51 +00:00
break ;
2018-05-24 07:00:39 +10:00
} elseif ( isset ( $field [ 'match' ]) && $field [ 'match' ] == $device [ $field_type ]) {
$device [ $maps_column ] = $field [ $maps_column ];
2016-01-10 19:45:54 +00:00
break ;
}
}
}
}
2018-05-24 07:00:39 +10:00
2018-05-25 04:08:44 +01:00
// We remap certain device OS' that have different names with Oxidized models
$models = [
'arista_eos' => 'eos' ,
'vyos' => 'vyatta' ,
2019-04-07 15:00:20 +01:00
'slms' => 'zhoneolt' ,
2019-08-05 23:34:28 +02:00
'fireware' => 'firewareos' ,
2019-12-20 18:21:39 +07:00
'fortigate' => 'fortios' ,
2018-05-25 04:08:44 +01:00
];
$device [ 'os' ] = str_replace ( array_keys ( $models ), array_values ( $models ), $device [ 'os' ]);
2016-01-10 19:45:54 +00:00
unset ( $device [ 'location' ]);
2017-10-15 13:37:20 -05:00
unset ( $device [ 'sysname' ]);
2018-07-09 21:25:26 +02:00
unset ( $device [ 'sysDescr' ]);
unset ( $device [ 'hardware' ]);
2015-07-13 20:10:26 +02:00
$devices [] = $device ;
}
2019-07-29 16:32:37 -05:00
return response () -> json ( $devices , 200 , [], JSON_PRETTY_PRINT );
2015-05-07 00:32:58 +01:00
}
2015-07-02 23:19:46 +01:00
2019-07-29 16:32:37 -05:00
function list_bills ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$bills = [];
$bill_id = $request -> route ( 'bill_id' );
$bill_ref = $request -> get ( 'ref' );
$bill_custid = $request -> get ( 'custid' );
$period = $request -> get ( 'period' );
$param = [];
$sql = '' ;
2018-01-21 20:56:57 +01:00
2015-07-02 23:19:46 +01:00
if ( ! empty ( $bill_custid )) {
2017-11-29 09:42:52 +00:00
$sql .= '`bill_custid` = ?' ;
$param [] = $bill_custid ;
2016-08-18 20:28:22 -05:00
} elseif ( ! empty ( $bill_ref )) {
2017-11-29 09:42:52 +00:00
$sql .= '`bill_ref` = ?' ;
$param [] = $bill_ref ;
2016-08-18 20:28:22 -05:00
} elseif ( is_numeric ( $bill_id )) {
2017-11-29 09:42:52 +00:00
$sql .= '`bill_id` = ?' ;
$param [] = $bill_id ;
2017-12-07 22:56:31 +00:00
} else {
$sql = '1' ;
2015-07-02 23:19:46 +01:00
}
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2017-11-29 09:42:52 +00:00
$sql .= ' AND `bill_id` IN (SELECT `bill_id` FROM `bill_perms` WHERE `user_id` = ?)' ;
2019-07-29 16:32:37 -05:00
$param [] = Auth :: id ();
2015-07-02 23:19:46 +01:00
}
2018-03-19 16:40:17 -05:00
2018-02-09 21:14:55 +00:00
if ( $period === 'previous' ) {
$select = "SELECT bills.bill_name, bills.bill_notes, bill_history.*, bill_history.traf_total as total_data, bill_history.traf_in as total_data_in, bill_history.traf_out as total_data_out " ;
$query = 'FROM `bills`
INNER JOIN (SELECT bill_id, MAX(bill_hist_id) AS bill_hist_id FROM bill_history WHERE bill_dateto < NOW() AND bill_dateto > subdate(NOW(), 40) GROUP BY bill_id) qLastBills ON bills.bill_id = qLastBills.bill_id
INNER JOIN bill_history ON qLastBills.bill_hist_id = bill_history.bill_hist_id
' ;
} else {
$select = "SELECT bills.*,
IF(bills.bill_type = 'CDR', bill_cdr, bill_quota) AS bill_allowed
" ;
$query = "FROM `bills` \n " ;
}
2015-07-02 23:19:46 +01:00
2018-02-09 21:14:55 +00:00
foreach ( dbFetchRows ( " $select $query WHERE $sql ORDER BY `bill_name`" , $param ) as $bill ) {
2015-07-02 23:19:46 +01:00
$rate_data = $bill ;
2015-08-04 06:54:58 +00:00
$allowed = '' ;
$used = '' ;
$percent = '' ;
$overuse = '' ;
2015-07-02 23:19:46 +01:00
if ( $bill [ 'bill_type' ] == "cdr" ) {
$allowed = format_si ( $bill [ 'bill_cdr' ]) . "bps" ;
$used = format_si ( $rate_data [ 'rate_95th' ]) . "bps" ;
2016-08-18 20:28:22 -05:00
$percent = round (( $rate_data [ 'rate_95th' ] / $bill [ 'bill_cdr' ]) * 100 , 2 );
2015-07-02 23:19:46 +01:00
$overuse = $rate_data [ 'rate_95th' ] - $bill [ 'bill_cdr' ];
$overuse = (( $overuse <= 0 ) ? "-" : format_si ( $overuse ));
2016-08-18 20:28:22 -05:00
} elseif ( $bill [ 'bill_type' ] == "quota" ) {
2015-07-02 23:19:46 +01:00
$allowed = format_bytes_billing ( $bill [ 'bill_quota' ]);
$used = format_bytes_billing ( $rate_data [ 'total_data' ]);
2016-08-18 20:28:22 -05:00
$percent = round (( $rate_data [ 'total_data' ] / ( $bill [ 'bill_quota' ])) * 100 , 2 );
2015-07-02 23:19:46 +01:00
$overuse = $rate_data [ 'total_data' ] - $bill [ 'bill_quota' ];
2015-08-04 06:54:58 +00:00
$overuse = (( $overuse <= 0 ) ? "-" : format_bytes_billing ( $overuse ));
2015-07-02 23:19:46 +01:00
}
$bill [ 'allowed' ] = $allowed ;
$bill [ 'used' ] = $used ;
$bill [ 'percent' ] = $percent ;
$bill [ 'overuse' ] = $overuse ;
2017-03-04 07:40:15 +11:00
2019-07-29 16:32:37 -05:00
$bill [ 'ports' ] = dbFetchRows ( "SELECT `D`.`device_id`,`P`.`port_id`,`P`.`ifName` FROM `bill_ports` AS `B`, `ports` AS `P`, `devices` AS `D` WHERE `B`.`bill_id` = ? AND `P`.`port_id` = `B`.`port_id` AND `D`.`device_id` = `P`.`device_id`" , [ $bill [ "bill_id" ]]);
2017-03-04 07:40:15 +11:00
2015-07-02 23:19:46 +01:00
$bills [] = $bill ;
}
2019-07-29 16:32:37 -05:00
return api_success ( $bills , 'bills' );
2015-07-02 23:19:46 +01:00
}
2015-12-08 22:53:52 +00:00
2019-07-29 16:32:37 -05:00
function get_bill_graph ( \Illuminate\Http\Request $request )
2018-02-09 21:14:55 +00:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
$graph_type = $request -> route ( 'graph_type' );
2018-02-20 14:57:56 +00:00
if ( $graph_type == 'monthly' ) {
$graph_type = 'historicmonthly' ;
}
2019-07-29 16:32:37 -05:00
$vars = [
'type' => "bill_ $graph_type " ,
'id' => $bill_id ,
'width' => $request -> get ( 'width' , 1075 ),
'height' => $request -> get ( 'height' , 300 ),
];
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
return check_bill_permission ( $bill_id , function () use ( $vars ) {
return api_get_graph ( $vars );
});
2018-02-20 14:57:56 +00:00
}
2019-07-29 16:32:37 -05:00
function get_bill_graphdata ( \Illuminate\Http\Request $request )
2018-02-20 14:57:56 +00:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
return check_bill_permission ( $bill_id , function ( $bill_id ) use ( $request ) {
$graph_type = $request -> route ( 'graph_type' );
if ( $graph_type == 'bits' ) {
$from = $request -> get ( 'from' , time () - 60 * 60 * 24 );
$to = $request -> get ( 'to' , time ());
$reducefactor = $request -> get ( 'reducefactor' );
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
$graph_data = getBillingBitsGraphData ( $bill_id , $from , $to , $reducefactor );
} elseif ( $graph_type == 'monthly' ) {
$graph_data = getHistoricTransferGraphData ( $bill_id );
}
2018-03-19 16:40:17 -05:00
2019-07-29 16:32:37 -05:00
if ( ! isset ( $graph_data )) {
return api_error ( 400 , "Unsupported graph type $graph_type " );
} else {
return api_success ( $graph_data , 'graph_data' );
}
});
2018-02-20 14:57:56 +00:00
}
2019-07-29 16:32:37 -05:00
function get_bill_history ( \Illuminate\Http\Request $request )
2018-02-20 14:57:56 +00:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
return check_bill_permission ( $bill_id , function ( $bill_id ) {
$result = dbFetchRows ( 'SELECT * FROM `bill_history` WHERE `bill_id` = ? ORDER BY `bill_datefrom` DESC LIMIT 24' , [ $bill_id ]);
return api_success ( $result , 'bill_history' );
});
2018-02-09 21:14:55 +00:00
}
2019-07-29 16:32:37 -05:00
function get_bill_history_graph ( \Illuminate\Http\Request $request )
2018-02-20 14:57:56 +00:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
$bill_hist_id = $request -> route ( 'bill_hist_id' );
$graph_type = $request -> route ( 'graph_type' );
2018-03-19 16:40:17 -05:00
2019-07-29 16:32:37 -05:00
$vars = [
'type' => "bill_ $graph_type " ,
'id' => $bill_id ,
'bill_hist_id' => $bill_hist_id ,
'width' => $request -> get ( 'width' , 1075 ),
'height' => $request -> get ( 'height' , 300 ),
];
2018-02-20 14:57:56 +00:00
switch ( $graph_type ) {
case 'bits' :
2019-07-29 16:32:37 -05:00
$vars [ 'type' ] = "bill_historicbits" ;
$vars [ 'reducefactor' ] = $request -> get ( 'reducefactor' );
2018-02-20 14:57:56 +00:00
break ;
2018-03-19 16:40:17 -05:00
2018-02-20 14:57:56 +00:00
case 'day' :
case 'hour' :
$vars [ 'imgtype' ] = $graph_type ;
2019-07-29 16:32:37 -05:00
$vars [ 'type' ] = "bill_historictransfer" ;
2018-02-20 14:57:56 +00:00
break ;
2018-03-19 16:40:17 -05:00
2018-02-20 14:57:56 +00:00
default :
2019-07-29 16:32:37 -05:00
return api_error ( 400 , "Unknown Graph Type $graph_type " );
2018-02-20 14:57:56 +00:00
}
2019-07-29 16:32:37 -05:00
return check_bill_permission ( $bill_id , function () use ( $vars ) {
return api_get_graph ( $vars );
});
2018-02-20 14:57:56 +00:00
}
2019-07-29 16:32:37 -05:00
function get_bill_history_graphdata ( \Illuminate\Http\Request $request )
2018-02-20 14:57:56 +00:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
return check_bill_permission ( $bill_id , function ( $bill_id ) use ( $request ) {
$bill_hist_id = $request -> route ( 'bill_hist_id' );
$graph_type = $request -> route ( 'graph_type' );
2018-03-19 16:40:17 -05:00
2019-07-29 16:32:37 -05:00
switch ( $graph_type ) {
case 'bits' :
$reducefactor = $request -> get ( 'reducefactor' );
2018-02-20 14:57:56 +00:00
2019-07-29 16:32:37 -05:00
$graph_data = getBillingHistoryBitsGraphData ( $bill_id , $bill_hist_id , $reducefactor );
break ;
case 'day' :
case 'hour' :
$graph_data = getBillingBandwidthGraphData ( $bill_id , $bill_hist_id , null , null , $graph_type );
break ;
}
2018-03-19 16:40:17 -05:00
2019-07-29 16:32:37 -05:00
return ! isset ( $graph_data ) ?
api_error ( 400 , "Unsupported graph type $graph_type " ) :
api_success ( $graph_data , 'graph_data' );
});
2018-02-20 14:57:56 +00:00
}
2019-07-29 16:32:37 -05:00
function delete_bill ( \Illuminate\Http\Request $request )
2018-02-27 20:51:29 +01:00
{
2019-07-29 16:32:37 -05:00
$bill_id = $request -> route ( 'bill_id' );
2018-02-27 20:51:29 +01:00
if ( $bill_id < 1 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Could not remove bill with id ' . $bill_id . '. Invalid id' );
2018-02-27 20:51:29 +01:00
}
$res = dbDelete ( 'bills' , '`bill_id` = ? LIMIT 1' , [ $bill_id ]);
if ( $res == 1 ) {
dbDelete ( 'bill_ports' , '`bill_id` = ? ' , [ $bill_id ]);
dbDelete ( 'bill_data' , '`bill_id` = ? ' , [ $bill_id ]);
dbDelete ( 'bill_history' , '`bill_id` = ? ' , [ $bill_id ]);
dbDelete ( 'bill_history' , '`bill_id` = ? ' , [ $bill_id ]);
dbDelete ( 'bill_perms' , '`bill_id` = ? ' , [ $bill_id ]);
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'Bill has been removed' );
2018-02-27 20:51:29 +01:00
}
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Could not remove bill with id ' . $bill_id );
2018-02-27 20:51:29 +01:00
}
function check_bill_key_value ( $bill_key , $bill_value )
{
$bill_types = [ 'quota' , 'cdr' ];
2019-07-29 16:32:37 -05:00
2018-02-27 20:51:29 +01:00
switch ( $bill_key ) {
case "bill_type" :
2019-07-29 16:32:37 -05:00
if ( ! in_array ( $bill_value , $bill_types )) {
return api_error ( 400 , "Invalid value for $bill_key : $bill_value . Allowed: quota,cdr" );
2018-02-27 20:51:29 +01:00
}
break ;
case "bill_cdr" :
2019-07-29 16:32:37 -05:00
if ( ! is_numeric ( $bill_value )) {
return api_error ( 400 , "Invalid value for $bill_key . Must be numeric." );
2018-02-27 20:51:29 +01:00
}
break ;
case "bill_day" :
2019-07-29 16:32:37 -05:00
if ( $bill_value < 1 || $bill_value > 31 ) {
return api_error ( 400 , "Invalid value for $bill_key . range: 1-31" );
2018-02-27 20:51:29 +01:00
}
break ;
case "bill_quota" :
2019-07-29 16:32:37 -05:00
if ( ! is_numeric ( $bill_value )) {
return api_error ( 400 , "Invalid value for $bill_key . Must be numeric" );
2018-02-27 20:51:29 +01:00
}
break ;
default :
}
2019-07-29 16:32:37 -05:00
return true ;
2018-02-27 20:51:29 +01:00
}
2019-07-29 16:32:37 -05:00
function create_edit_bill ( \Illuminate\Http\Request $request )
2018-02-27 20:51:29 +01:00
{
2019-07-29 16:32:37 -05:00
$data = json_decode ( $request -> getContent (), true );
2018-02-27 20:51:29 +01:00
if ( ! $data ) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Invalid JSON data' );
2018-02-27 20:51:29 +01:00
}
//check ports
$ports_add = null ;
if ( array_key_exists ( 'ports' , $data )) {
$ports_add = [];
$ports = $data [ 'ports' ];
foreach ( $ports as $port_id ) {
$result = dbFetchRows ( 'SELECT port_id FROM `ports` WHERE `port_id` = ? LIMIT 1' , [ $port_id ]);
$result = $result [ 0 ];
if ( ! is_array ( $result ) || ! array_key_exists ( 'port_id' , $result )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Port ' . $port_id . ' does not exists' );
2018-02-27 20:51:29 +01:00
}
$ports_add [] = $port_id ;
}
}
$bill = [];
//find existing bill for update
$bill_id = ( int ) $data [ 'bill_id' ];
$bills = dbFetchRows ( "SELECT * FROM `bills` WHERE `bill_id` = $bill_id LIMIT 1" );
// update existing bill
if ( is_array ( $bills ) && count ( $bills ) == 1 ) {
$bill = $bills [ 0 ];
foreach ( $data as $bill_key => $bill_value ) {
2019-07-29 16:32:37 -05:00
$res = check_bill_key_value ( $bill_key , $bill_value );
if ( $res === true ) {
$bill [ $bill_key ] = $bill_value ;
} else {
return $res ;
}
2018-02-27 20:51:29 +01:00
}
$update_data = [
'bill_name' => $bill [ 'bill_name' ],
'bill_type' => $bill [ 'bill_type' ],
'bill_cdr' => $bill [ 'bill_cdr' ],
'bill_day' => $bill [ 'bill_day' ],
'bill_quota' => $bill [ 'bill_quota' ],
'bill_custid' => $bill [ 'bill_custid' ],
'bill_ref' => $bill [ 'bill_ref' ],
'bill_notes' => $bill [ 'bill_notes' ]
];
2019-07-29 16:32:37 -05:00
$update = dbUpdate ( $update_data , 'bills' , 'bill_id=?' , [ $bill_id ]);
2018-02-27 20:51:29 +01:00
if ( $update === false || $update < 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Failed to update existing bill' );
2018-02-27 20:51:29 +01:00
}
} else {
// create new bill
if ( array_key_exists ( 'bill_id' , $data )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Argument bill_id is not allowed on bill create (auto assigned)' );
2018-02-27 20:51:29 +01:00
}
$bill_keys = [
'bill_name' ,
'bill_type' ,
'bill_cdr' ,
'bill_day' ,
'bill_quota' ,
'bill_custid' ,
'bill_ref' ,
'bill_notes'
];
if ( $data [ 'bill_type' ] == 'quota' ) {
$data [ 'bill_cdr' ] = 0 ;
}
if ( $data [ 'bill_type' ] == 'cdr' ) {
$data [ 'bill_quota' ] = 0 ;
}
$missing_keys = '' ;
$missing = array_diff_key ( array_flip ( $bill_keys ), $data );
if ( count ( $missing ) > 0 ) {
foreach ( $missing as $missing_key => $dummy ) {
$missing_keys .= " $missing_key " ;
}
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Missing parameters: ' . $missing_keys );
2018-02-27 20:51:29 +01:00
}
foreach ( $bill_keys as $bill_key ) {
2019-07-29 16:32:37 -05:00
$res = check_bill_key_value ( $bill_key , $data [ $bill_key ]);
if ( $res === true ) {
$bill [ $bill_key ] = $data [ $bill_key ];
} else {
return $res ;
}
2018-02-27 20:51:29 +01:00
}
$bill_id = dbInsert (
[
'bill_name' => $bill [ 'bill_name' ],
'bill_type' => $bill [ 'bill_type' ],
'bill_cdr' => $bill [ 'bill_cdr' ],
'bill_day' => $bill [ 'bill_day' ],
'bill_quota' => $bill [ 'bill_quota' ],
'bill_custid' => $bill [ 'bill_custid' ],
'bill_ref' => $bill [ 'bill_ref' ],
'bill_notes' => $bill [ 'bill_notes' ]
],
'bills'
);
if ( $bill_id === null ) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Failed to create new bill' );
2018-02-27 20:51:29 +01:00
}
}
// set previously checked ports
if ( is_array ( $ports_add )) {
dbDelete ( 'bill_ports' , "`bill_id` = $bill_id " );
if ( count ( $ports_add ) > 0 ) {
foreach ( $ports_add as $port_id ) {
dbInsert ([ 'bill_id' => $bill_id , 'port_id' => $port_id , 'bill_port_autoadded' => 0 ], 'bill_ports' );
}
}
}
2019-07-29 16:32:37 -05:00
return api_success ( $bill_id , 'bill_id' );
2018-02-27 20:51:29 +01:00
}
2019-07-29 16:32:37 -05:00
function update_device ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2015-12-08 22:53:52 +00:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$data = json_decode ( $request -> getContent (), true );
$bad_fields = [ 'device_id' , 'hostname' ];
2015-12-08 22:53:52 +00:00
if ( empty ( $data [ 'field' ])) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Device field to patch has not been supplied' );
2016-08-18 20:28:22 -05:00
} elseif ( in_array ( $data [ 'field' ], $bad_fields )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device field is not allowed to be updated' );
2017-11-29 09:42:52 +00:00
}
if ( is_array ( $data [ 'field' ]) && is_array ( $data [ 'data' ])) {
foreach ( $data [ 'field' ] as $tmp_field ) {
if ( in_array ( $tmp_field , $bad_fields )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device field is not allowed to be updated' );
2016-11-26 20:55:24 +00:00
}
2017-11-29 09:42:52 +00:00
}
if ( count ( $data [ 'field' ]) == count ( $data [ 'data' ])) {
2019-07-29 16:32:37 -05:00
$update = [];
2017-11-29 09:42:52 +00:00
for ( $x = 0 ; $x < count ( $data [ 'field' ]); $x ++ ) {
2019-07-29 16:32:37 -05:00
$update [ $data [ 'field' ][ $x ]] = $data [ 'data' ][ $x ];
2017-11-29 09:42:52 +00:00
}
2019-07-29 16:32:37 -05:00
if ( dbUpdate ( $update , 'devices' , '`device_id`=?' , [ $device_id ]) >= 0 ) {
return api_success_noresult ( 200 , 'Device fields have been updated' );
2017-11-29 09:42:52 +00:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device fields failed to be updated' );
2016-11-26 20:55:24 +00:00
}
2016-08-18 20:28:22 -05:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device fields failed to be updated as the number of fields (' . count ( $data [ 'field' ]) . ') does not match the supplied data (' . count ( $data [ 'data' ]) . ')' );
2015-12-08 22:53:52 +00:00
}
2019-07-29 16:32:37 -05:00
} elseif ( dbUpdate ([ $data [ 'field' ] => $data [ 'data' ]], 'devices' , '`device_id`=?' , [ $device_id ]) >= 0 ) {
return api_success_noresult ( 200 , 'Device ' . $data [ 'field' ] . ' field has been updated' );
2017-11-29 09:42:52 +00:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device ' . $data [ 'field' ] . ' field failed to be updated' );
2015-12-08 22:53:52 +00:00
}
}
2015-12-12 12:58:07 +00:00
2019-07-29 16:32:37 -05:00
function rename_device ( \Illuminate\Http\Request $request )
2017-12-19 09:32:31 +00:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2017-12-19 09:32:31 +00:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$new_hostname = $request -> route ( 'new_hostname' );
2017-12-19 09:32:31 +00:00
$new_device = getidbyname ( $new_hostname );
if ( empty ( $new_hostname )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Missing new hostname' );
2017-12-19 09:32:31 +00:00
} elseif ( $new_device ) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device failed to rename, new hostname already exists' );
2017-12-19 09:32:31 +00:00
} else {
if ( renamehost ( $device_id , $new_hostname , 'api' ) == '' ) {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 200 , 'Device has been renamed' );
2017-12-19 09:32:31 +00:00
} else {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Device failed to be renamed' );
2017-12-19 09:32:31 +00:00
}
}
}
2019-11-08 13:11:56 +00:00
function add_device_group ( \Illuminate\Http\Request $request )
{
$data = json_decode ( $request -> getContent (), true );
if ( json_last_error () || ! is_array ( $data )) {
return api_error ( 400 , "We couldn't parse the provided json. " . json_last_error_msg ());
}
$rules = [
'name' => 'required|string|unique:device_groups' ,
'type' => 'required|in:dynamic,static' ,
'devices' => 'array|required_if:type,static' ,
'devices.*' => 'integer' ,
'rules' => 'json|required_if:type,dynamic' ,
];
$v = Validator :: make ( $data , $rules );
if ( $v -> fails ()) {
return api_error ( 422 , $v -> messages ());
}
// Only use the rules if they are able to be parsed by the QueryBuilder
$query = QueryBuilderParser :: fromJson ( $data [ 'rules' ]) -> toSql ();
if ( empty ( $query )) {
return api_error ( 500 , "We couldn't parse your rule" );
}
$deviceGroup = DeviceGroup :: make ([ 'name' => $data [ 'name' ], 'type' => $data [ 'type' ], 'desc' => $data [ 'desc' ]]);
$deviceGroup -> rules = json_decode ( $data [ 'rules' ]);
$deviceGroup -> save ();
if ( $data [ 'type' ] == 'static' ) {
$deviceGroup -> devices () -> sync ( $data [ 'devices' ]);
}
return api_success ( $deviceGroup -> id , 'id' , 'Device group ' . $deviceGroup -> name . ' created' , 201 );
}
2019-07-29 16:32:37 -05:00
function get_device_groups ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2019-06-19 16:01:53 -05:00
2019-07-29 16:32:37 -05:00
if ( $hostname ) {
$device = ctype_digit ( $hostname ) ? Device :: find ( $hostname ) : Device :: findByHostname ( $hostname );
2019-06-19 16:01:53 -05:00
if ( is_null ( $device )) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Device not found' );
2019-06-19 16:01:53 -05:00
}
$query = $device -> groups ();
2016-08-18 20:28:22 -05:00
} else {
2019-06-19 16:01:53 -05:00
$query = DeviceGroup :: query ();
2015-12-12 12:58:07 +00:00
}
2019-06-19 16:01:53 -05:00
2019-07-29 16:32:37 -05:00
$groups = $query -> hasAccess ( Auth :: user ()) -> orderBy ( 'name' ) -> get ();
2019-06-19 16:01:53 -05:00
if ( $groups -> isEmpty ()) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'No device groups found' );
2015-12-12 12:58:07 +00:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $groups -> makeHidden ( 'pivot' ) -> toArray (), 'groups' , 'Found ' . $groups -> count () . ' device groups' );
2015-12-12 12:58:07 +00:00
}
2015-12-12 13:47:44 +00:00
2019-07-29 16:32:37 -05:00
function get_devices_by_group ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$name = $request -> route ( 'name' );
if ( ! $name ) {
return api_error ( 400 , 'No device group name provided' );
2017-11-29 09:42:52 +00:00
}
2019-06-19 16:01:53 -05:00
$device_group = ctype_digit ( $name ) ? DeviceGroup :: find ( $name ) : DeviceGroup :: where ( 'name' , $name ) -> first ();
if ( empty ( $device_group )) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Device group not found' );
2019-06-19 16:01:53 -05:00
}
2019-07-29 16:32:37 -05:00
$devices = $device_group -> devices () -> get ( $request -> get ( 'full' ) ? [ '*' ] : [ 'devices.device_id' ]);
2019-06-19 16:01:53 -05:00
if ( $devices -> isEmpty ()) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'No devices found in group ' . $name );
2015-12-12 13:47:44 +00:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $devices -> makeHidden ( 'pivot' ) -> toArray (), 'devices' );
2015-12-12 13:47:44 +00:00
}
2016-04-22 13:41:38 +00:00
2018-01-18 18:43:15 +03:00
2019-07-29 16:32:37 -05:00
function list_vrf ( \Illuminate\Http\Request $request )
2018-01-18 18:43:15 +03:00
{
$sql = '' ;
2019-07-29 16:32:37 -05:00
$sql_params = [];
$hostname = $request -> get ( 'hostname' );
$vrfname = $request -> get ( 'vrfname' );
2018-01-18 18:43:15 +03:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
$permission = check_device_permission ( $device_id );
if ( $permission !== true ) {
return $permission ;
}
2018-01-18 18:43:15 +03:00
$sql = " AND `devices`.`device_id`=?" ;
2019-07-29 16:32:37 -05:00
$sql_params = [ $device_id ];
2018-01-18 18:43:15 +03:00
}
if ( ! empty ( $vrfname )) {
$sql = " AND `vrfs`.`vrf_name`=?" ;
2019-07-29 16:32:37 -05:00
$sql_params = [ $vrfname ];
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2018-01-18 18:43:15 +03:00
$sql .= " AND `vrfs`.`device_id` IN (SELECT device_id FROM devices_perms WHERE user_id = ?)" ;
2019-07-29 16:32:37 -05:00
$sql_params [] = Auth :: id ();
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
$vrfs = dbFetchRows ( "SELECT `vrfs`.* FROM `vrfs` LEFT JOIN `devices` ON `vrfs`.`device_id` = `devices`.`device_id` WHERE `vrfs`.`vrf_name` IS NOT NULL $sql " , $sql_params );
2018-01-18 18:43:15 +03:00
$total_vrfs = count ( $vrfs );
if ( $total_vrfs == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'VRFs do not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $vrfs , 'vrfs' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function get_vrf ( \Illuminate\Http\Request $request )
2018-01-18 18:43:15 +03:00
{
2019-07-29 16:32:37 -05:00
$vrfId = $request -> route ( 'id' );
2018-01-18 18:43:15 +03:00
if ( ! is_numeric ( $vrfId )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid id has been provided' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
$vrf = dbFetchRows ( "SELECT * FROM `vrfs` WHERE `vrf_id` IS NOT NULL AND `vrf_id` = ?" , [ $vrfId ]);
2018-01-18 18:43:15 +03:00
$vrf_count = count ( $vrf );
if ( $vrf_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "VRF $vrfId does not exist" );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $vrf , 'vrf' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function list_ipsec ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2016-04-22 13:41:38 +00:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( ! is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , "No valid hostname or device ID provided" );
2016-04-22 13:41:38 +00:00
}
2019-07-29 16:32:37 -05:00
$ipsec = dbFetchRows ( "SELECT `D`.`hostname`, `I`.* FROM `ipsec_tunnels` AS `I`, `devices` AS `D` WHERE `I`.`device_id`=? AND `D`.`device_id` = `I`.`device_id`" , [ $device_id ]);
return api_success ( $ipsec , 'ipsec' );
2016-04-22 13:41:38 +00:00
}
2016-06-27 14:48:07 +01:00
2018-01-18 18:43:15 +03:00
2019-07-29 16:32:37 -05:00
function list_vlans ( \Illuminate\Http\Request $request )
2018-01-18 18:43:15 +03:00
{
$sql = '' ;
2019-07-29 16:32:37 -05:00
$sql_params = [];
$hostname = $request -> get ( 'hostname' );
2018-01-18 18:43:15 +03:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
$permission = check_device_permission ( $device_id );
if ( $permission !== true ) {
return $permission ;
}
2018-01-18 18:43:15 +03:00
$sql = " AND `devices`.`device_id` = ?" ;
$sql_params [] = $device_id ;
}
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2018-01-18 18:43:15 +03:00
$sql .= " AND `vlans`.`device_id` IN (SELECT device_id FROM devices_perms WHERE user_id = ?)" ;
2019-07-29 16:32:37 -05:00
$sql_params [] = Auth :: id ();
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
$vlans = dbFetchRows ( "SELECT `vlans`.* FROM `vlans` LEFT JOIN `devices` ON `vlans`.`device_id` = `devices`.`device_id` WHERE `vlans`.`vlan_vlan` IS NOT NULL $sql " , $sql_params );
2018-01-18 18:43:15 +03:00
$vlans_count = count ( $vlans );
if ( $vlans_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'VLANs do not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $vlans , 'vlans' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function list_links ( \Illuminate\Http\Request $request )
2018-11-19 17:36:23 +03:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
$sql = '' ;
$sql_params = [];
2018-11-19 17:36:23 +03:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
if ( is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
$permission = check_device_permission ( $device_id );
if ( $permission !== true ) {
return $permission ;
}
2018-11-19 17:36:23 +03:00
$sql = " AND `links`.`local_device_id`=?" ;
2019-07-29 16:32:37 -05:00
$sql_params = [ $device_id ];
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
if ( ! Auth :: user () -> hasGlobalRead ()) {
2018-11-19 17:36:23 +03:00
$sql .= " AND `links`.`local_device_id` IN (SELECT device_id FROM devices_perms WHERE user_id = ?)" ;
2019-07-29 16:32:37 -05:00
$sql_params [] = Auth :: id ();
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
$links = dbFetchRows ( "SELECT `links`.* FROM `links` LEFT JOIN `devices` ON `links`.`local_device_id` = `devices`.`device_id` WHERE `links`.`id` IS NOT NULL $sql " , $sql_params );
2018-11-19 17:36:23 +03:00
$total_links = count ( $links );
if ( $total_links == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Links do not exist' );
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $links , 'links' );
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
function get_link ( \Illuminate\Http\Request $request )
2018-11-19 17:36:23 +03:00
{
2019-07-29 16:32:37 -05:00
$linkId = $request -> route ( 'id' );
2018-11-19 17:36:23 +03:00
if ( ! is_numeric ( $linkId )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid id has been provided' );
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
$link = dbFetchRows ( "SELECT * FROM `links` WHERE `id` IS NOT NULL AND `id` = ?" , [ $linkId ]);
2018-11-19 17:36:23 +03:00
$link_count = count ( $link );
if ( $link_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Link $linkId does not exist" );
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $link , 'link' );
2018-11-19 17:36:23 +03:00
}
2019-07-29 16:32:37 -05:00
function get_fdb ( \Illuminate\Http\Request $request )
2019-04-09 08:51:01 -04:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2019-04-09 08:51:01 -04:00
if ( empty ( $hostname )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'No hostname has been provided' );
2019-04-09 08:51:01 -04:00
}
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
$device = null ;
if ( $device_id ) {
// save the current details for returning to the client on successful delete
2019-07-29 16:32:37 -05:00
$device = Device :: find ( $device_id );
2019-04-09 08:51:01 -04:00
}
if ( ! $device ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , "Device $hostname not found" );
2019-04-09 08:51:01 -04:00
}
2019-07-29 16:32:37 -05:00
return check_device_permission ( $device_id , function () use ( $device ) {
if ( $device ) {
$fdb = $device -> portsFdb ;
return api_success ( $fdb , 'ports_fdb' );
}
2019-05-13 08:35:24 -05:00
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Device does not exist' );
});
2019-04-09 08:51:01 -04:00
}
2019-07-29 16:32:37 -05:00
function list_fdb ( \Illuminate\Http\Request $request )
2019-04-09 08:51:01 -04:00
{
2019-07-29 16:32:37 -05:00
$mac = $request -> route ( 'mac' );
2019-04-09 08:51:01 -04:00
2019-07-29 16:32:37 -05:00
$fdb = PortsFdb :: hasAccess ( Auth :: user ())
-> when ( ! empty ( $mac ), function ( Builder $query ) use ( $mac ) {
2019-05-13 08:35:24 -05:00
return $query -> where ( 'mac_address' , $mac );
})
-> get ();
if ( $fdb -> isEmpty ()) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Fdb do not exist' );
2019-04-09 08:51:01 -04:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $fdb , 'ports_fdb' );
2019-04-09 08:51:01 -04:00
}
2019-03-19 09:22:39 -04:00
function list_sensors ()
{
2019-07-29 16:32:37 -05:00
$sensors = Sensor :: hasAccess ( Auth :: user ()) -> get ();
2019-03-19 09:22:39 -04:00
$total_sensors = $sensors -> count ();
if ( $total_sensors == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'Sensors do not exist' );
2019-03-19 09:22:39 -04:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $sensors , 'sensors' );
2019-03-19 09:22:39 -04:00
}
2018-01-18 18:43:15 +03:00
function list_ip_addresses ()
{
$ipv4_addresses = dbFetchRows ( "SELECT * FROM `ipv4_addresses`" );
$ipv6_addresses = dbFetchRows ( "SELECT * FROM `ipv6_addresses`" );
$ip_addresses_count = count ( array_merge ( $ipv4_addresses , $ipv6_addresses ));
if ( $ip_addresses_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'IP addresses do not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( array_merge ( $ipv4_addresses , $ipv6_addresses ), 'ip_addresses' );
2018-01-18 18:43:15 +03:00
}
function list_ip_networks ()
{
$ipv4_networks = dbFetchRows ( "SELECT * FROM `ipv4_networks`" );
$ipv6_networks = dbFetchRows ( "SELECT * FROM `ipv6_networks`" );
$ip_networks_count = count ( array_merge ( $ipv4_networks , $ipv6_networks ));
if ( $ip_networks_count == 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 404 , 'IP networks do not exist' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
return api_success ( array_merge ( $ipv4_networks , $ipv6_networks ), 'ip_networks' );
2018-01-18 18:43:15 +03:00
}
2019-07-29 16:32:37 -05:00
function list_arp ( \Illuminate\Http\Request $request )
2016-08-18 20:28:22 -05:00
{
2019-11-13 02:21:07 +00:00
$query = $request -> route ( 'query' );
2019-11-05 15:16:29 -06:00
$cidr = $request -> route ( 'cidr' );
2019-07-29 16:32:37 -05:00
$hostname = $request -> get ( 'device' );
2019-11-13 02:21:07 +00:00
if ( empty ( $query )) {
return api_error ( 400 , "No valid IP/MAC provided" );
} elseif ( $query === "all" && empty ( $hostname )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , "Device argument is required when requesting all entries" );
2017-11-29 09:42:52 +00:00
}
2019-11-13 02:21:07 +00:00
if ( $query === "all" ) {
2017-11-29 09:42:52 +00:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-04-10 16:33:25 -05:00
$arp = dbFetchRows ( "SELECT `ipv4_mac`.* FROM `ipv4_mac` LEFT JOIN `ports` ON `ipv4_mac`.`port_id` = `ports`.`port_id` WHERE `ports`.`device_id` = ?" , [ $device_id ]);
2019-11-05 15:16:29 -06:00
} elseif ( $cidr ) {
2019-04-10 16:33:25 -05:00
try {
2019-11-13 02:21:07 +00:00
$ip = new IPv4 ( " $query / $cidr " );
2019-04-10 16:33:25 -05:00
$arp = dbFetchRows (
'SELECT * FROM `ipv4_mac` WHERE (inet_aton(`ipv4_address`) & ?) = ?' ,
[ ip2long ( $ip -> getNetmask ()), ip2long ( $ip -> getNetworkAddress ())]
);
} catch ( InvalidIpException $e ) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , "Invalid Network Address" );
2019-04-10 16:33:25 -05:00
}
2019-11-13 02:21:07 +00:00
} elseif ( filter_var ( $query , FILTER_VALIDATE_MAC )) {
$mac = \LibreNMS\Util\Rewrite :: macToHex ( $query );
$arp = dbFetchRows ( "SELECT * FROM `ipv4_mac` WHERE `mac_address`=?" , [ $mac ]);
2016-08-18 20:28:22 -05:00
} else {
2019-11-13 02:21:07 +00:00
$arp = dbFetchRows ( "SELECT * FROM `ipv4_mac` WHERE `ipv4_address`=?" , [ $query ]);
2016-06-27 14:48:07 +01:00
}
2019-07-29 16:32:37 -05:00
return api_success ( $arp , 'arp' );
2016-06-27 14:48:07 +01:00
}
2017-06-28 07:00:46 +01:00
2019-07-29 16:32:37 -05:00
function list_services ( \Illuminate\Http\Request $request )
2016-08-26 09:19:05 +02:00
{
2019-07-29 16:32:37 -05:00
$where = [];
$params = [];
2017-02-07 02:46:09 -07:00
2017-06-28 07:00:46 +01:00
// Filter by State
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'state' )) {
2017-06-28 07:00:46 +01:00
$where [] = '`service_status`=?' ;
2019-07-29 16:32:37 -05:00
$params [] = $request -> get ( 'state' );
2017-06-28 07:00:46 +01:00
$where [] = "`service_disabled`='0'" ;
$where [] = "`service_ignore`='0'" ;
2017-02-07 02:46:09 -07:00
2019-07-29 16:32:37 -05:00
if ( ! is_numeric ( $request -> get ( 'state' ))) {
return api_error ( 400 , "No valid service state provided, valid option is 0=Ok, 1=Warning, 2=Critical" );
2016-08-26 09:26:52 +02:00
}
}
2017-02-07 02:46:09 -07:00
2017-06-28 07:00:46 +01:00
//Filter by Type
2019-07-29 16:32:37 -05:00
if ( $request -> has ( 'type' )) {
2017-06-28 07:00:46 +01:00
$where [] = '`service_type` LIKE ?' ;
2019-07-29 16:32:37 -05:00
$params [] = $request -> get ( 'type' );
2017-06-28 07:00:46 +01:00
}
2017-08-08 14:14:58 -05:00
2017-06-28 07:00:46 +01:00
//GET by Host
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
if ( $hostname ) {
2016-08-26 09:26:52 +02:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2017-06-28 07:00:46 +01:00
$where [] = '`device_id` = ?' ;
$params [] = $device_id ;
2017-02-07 02:46:09 -07:00
2016-08-26 09:26:52 +02:00
if ( ! is_numeric ( $device_id )) {
2019-07-29 16:32:37 -05:00
return api_error ( 500 , "No valid hostname or device id provided" );
2016-08-26 09:26:52 +02:00
}
}
2017-06-28 07:00:46 +01:00
$query = 'SELECT * FROM `services`' ;
2017-02-07 02:46:09 -07:00
2017-06-28 07:00:46 +01:00
if ( ! empty ( $where )) {
$query .= ' WHERE ' . implode ( ' AND ' , $where );
2016-08-26 09:26:52 +02:00
}
2017-06-28 07:00:46 +01:00
$query .= ' ORDER BY `service_ip`' ;
2019-07-29 16:32:37 -05:00
$services = [ dbFetchRows ( $query , $params )]; // double array for backwards compat :(
2017-06-28 07:00:46 +01:00
2019-07-29 16:32:37 -05:00
return api_success ( $services , 'services' );
2016-08-26 09:19:05 +02:00
}
2017-07-27 19:56:38 +01:00
2019-07-29 16:32:37 -05:00
function list_logs ( \Illuminate\Http\Request $request , Router $router )
2017-07-27 19:56:38 +01:00
{
2019-07-29 16:32:37 -05:00
$type = $router -> current () -> getName ();
$hostname = $request -> route ( 'hostname' );
2017-07-27 19:56:38 +01:00
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$count_query = 'SELECT COUNT(*)' ;
$param = [];
2017-07-27 19:56:38 +01:00
if ( $type === 'list_eventlog' ) {
2019-07-29 16:32:37 -05:00
$query = ' FROM eventlog LEFT JOIN `devices` ON `eventlog`.`device_id`=`devices`.`device_id` WHERE 1' ;
$full_query = 'SELECT `devices`.`hostname`, `devices`.`sysName`, `eventlog`.`device_id` as `host`, `eventlog`.*' ; // inject host for backward compat
2017-07-27 19:56:38 +01:00
$timestamp = 'datetime' ;
} elseif ( $type === 'list_syslog' ) {
2019-07-29 16:32:37 -05:00
$query = ' FROM syslog LEFT JOIN `devices` ON `syslog`.`device_id`=`devices`.`device_id` WHERE 1' ;
$full_query = 'SELECT `devices`.`hostname`, `devices`.`sysName`, `syslog`.*' ;
2017-07-27 19:56:38 +01:00
$timestamp = 'timestamp' ;
} elseif ( $type === 'list_alertlog' ) {
2019-07-29 16:32:37 -05:00
$query = ' FROM alert_log LEFT JOIN `devices` ON `alert_log`.`device_id`=`devices`.`device_id` WHERE 1' ;
$full_query = 'SELECT `devices`.`hostname`, `devices`.`sysName`, `alert_log`.*' ;
2017-07-27 19:56:38 +01:00
$timestamp = 'time_logged' ;
} elseif ( $type === 'list_authlog' ) {
2019-07-29 16:32:37 -05:00
$query = ' FROM authlog WHERE 1' ;
$full_query = 'SELECT `authlog`.*' ;
2017-07-27 19:56:38 +01:00
$timestamp = 'datetime' ;
} else {
2019-07-29 16:32:37 -05:00
$query = ' FROM eventlog LEFT JOIN `devices` ON `eventlog`.`device_id`=`devices`.`device_id` WHERE 1' ;
$full_query = 'SELECT `devices`.`hostname`, `devices`.`sysName`, `eventlog`.*' ;
2017-07-27 19:56:38 +01:00
$timestamp = 'datetime' ;
}
2019-07-29 16:32:37 -05:00
$start = ( int ) $request -> get ( 'start' , 0 );
$limit = ( int ) $request -> get ( 'limit' , 50 );
$from = $request -> get ( 'from' );
$to = $request -> get ( 'to' );
2017-07-27 19:56:38 +01:00
if ( is_numeric ( $device_id )) {
$query .= " AND `devices`.`device_id` = ?" ;
$param [] = $device_id ;
}
if ( $from ) {
$query .= " AND $timestamp >= ?" ;
$param [] = $from ;
}
if ( $to ) {
$query .= " AND $timestamp <= ?" ;
$param [] = $to ;
}
$count_query = $count_query . $query ;
$count = dbFetchCell ( $count_query , $param );
$full_query = $full_query . $query . " ORDER BY $timestamp ASC LIMIT $start , $limit " ;
$logs = dbFetchRows ( $full_query , $param );
2019-02-07 09:42:16 -06:00
if ( $type === 'list_alertlog' ) {
foreach ( $logs as $index => $log ) {
$logs [ $index ][ 'details' ] = json_decode ( gzuncompress ( $log [ 'details' ]), true );
}
}
2019-07-29 16:32:37 -05:00
return api_success ( $logs , 'logs' , null , 200 , null , [ 'total' => $count ]);
2017-07-27 19:56:38 +01:00
}
2017-11-14 15:15:12 +00:00
function validate_column_list ( $columns , $tableName )
{
2019-07-29 16:32:37 -05:00
static $schema ;
if ( is_null ( $schema )) {
$schema = new \LibreNMS\DB\Schema ();
}
$column_names = is_array ( $columns ) ? $columns : explode ( ',' , $columns );
$valid_columns = $schema -> getColumns ( $tableName );
2017-11-14 15:15:12 +00:00
$invalid_columns = array_diff ( array_map ( 'trim' , $column_names ), $valid_columns );
if ( count ( $invalid_columns ) > 0 ) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , 'Invalid columns: ' . join ( ',' , $invalid_columns ));
2017-11-14 15:15:12 +00:00
}
2019-07-29 16:32:37 -05:00
return true ;
2017-11-14 15:15:12 +00:00
}
2018-01-21 20:56:57 +01:00
2019-07-29 16:32:37 -05:00
function add_service_for_host ( \Illuminate\Http\Request $request )
2018-01-21 20:56:57 +01:00
{
2019-07-29 16:32:37 -05:00
$hostname = $request -> route ( 'hostname' );
2018-01-21 20:56:57 +01:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2019-07-29 16:32:37 -05:00
$data = json_decode ( $request -> getContent (), true );
$missing_fields = [];
2018-01-21 20:56:57 +01:00
// Check if some required fields are empty
if ( empty ( $data [ 'type' ])) {
$missing_fields [] = 'type' ;
}
if ( empty ( $data [ 'ip' ])) {
$missing_fields [] = 'ip' ;
}
// Print error if required fields are missing
if ( ! empty ( $missing_fields )) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , sprintf ( "Service field%s %s missing: %s." , (( sizeof ( $missing_fields ) > 1 ) ? 's' : '' ), (( sizeof ( $missing_fields ) > 1 ) ? 'are' : 'is' ), implode ( ', ' , $missing_fields )));
2018-01-21 20:56:57 +01:00
}
// Check if service type exists
if ( ! in_array ( $data [ 'type' ], list_available_services ())) {
2019-07-29 16:32:37 -05:00
return api_error ( 400 , "The service " . $data [ 'type' ] . " does not exist. \n Available service types: " . implode ( ', ' , list_available_services ()));
2018-01-21 20:56:57 +01:00
}
// Get parameters
$service_type = $data [ 'type' ];
$service_ip = $data [ 'ip' ];
2019-07-29 16:32:37 -05:00
$service_desc = $data [ 'desc' ] ? $data [ 'desc' ] : '' ;
$service_param = $data [ 'param' ] ? $data [ 'param' ] : '' ;
2018-01-21 20:56:57 +01:00
$service_ignore = $data [ 'ignore' ] ? true : false ; // Default false
// Set the service
$service_id = add_service ( $device_id , $service_type , $service_desc , $service_ip , $service_param , ( int ) $service_ignore );
if ( $service_id != false ) {
2019-07-29 16:32:37 -05:00
return api_success_noresult ( 201 , "Service $service_type has been added to device $hostname (# $service_id )" );
2018-01-21 20:56:57 +01:00
}
2019-07-29 16:32:37 -05:00
return api_error ( 500 , 'Failed to add the service' );
2018-01-21 20:56:57 +01:00
}
2018-05-19 00:36:06 -04:00
/**
* Display Librenms Instance Info
*/
function server_info ()
{
$versions = version_info ();
2019-07-29 16:32:37 -05:00
return api_success ([
2018-05-19 00:36:06 -04:00
$versions
], 'system' );
}