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 .
*/
2014-10-02 20:17:45 +01:00
require_once ( " ../includes/functions.php " );
2014-07-16 23:10:18 +01:00
2014-07-07 00:15:04 +01:00
function authToken ( \Slim\Route $route )
{
$app = \Slim\Slim :: getInstance ();
2014-07-08 19:26:17 +01:00
$token = $app -> request -> headers -> get ( 'X-Auth-Token' );
2014-07-07 00:15:04 +01:00
if ( isset ( $token ) && ! empty ( $token ))
{
$username = dbFetchCell ( " SELECT `U`.`username` FROM `api_tokens` AS AT JOIN `users` AS U ON `AT`.`user_id`=`U`.`user_id` WHERE `AT`.`token_hash`=? " , array ( $token ));
if ( ! empty ( $username ))
{
$authenticated = true ;
}
else
{
$authenticated = false ;
}
}
else
{
$authenticated = false ;
}
if ( $authenticated === false )
{
2014-10-07 23:53:26 +00:00
$app -> response -> setStatus ( 401 );
2014-09-27 14:48:08 +10:00
$output = array ( " status " => " error " , " message " => " API Token is missing or invalid; please supply a valid token " );
2014-07-16 23:10:18 +01:00
echo _json_encode ( $output );
2014-07-07 00:15:04 +01:00
$app -> stop ();
}
}
2014-07-08 14:39:19 +01:00
function get_graph_by_port_hostname ()
{
// This will return a graph for a given port by the ifName
global $config ;
$app = \Slim\Slim :: getInstance ();
$router = $app -> router () -> getCurrentRoute () -> getParams ();
$hostname = $router [ 'hostname' ];
2014-07-17 20:43:13 +01:00
$vars = array ();
2014-09-30 21:30:22 +01:00
$vars [ 'port' ] = urldecode ( $router [ 'ifname' ]);
2014-07-08 14:39:19 +01:00
$vars [ 'type' ] = $router [ 'type' ] ? : 'port_bits' ;
2014-09-16 22:09:42 +01:00
if ( ! empty ( $_GET [ 'from' ]))
2014-07-08 14:39:19 +01:00
{
2014-09-16 22:09:42 +01:00
$vars [ 'from' ] = $_GET [ 'from' ];
2014-07-08 14:39:19 +01:00
}
2014-09-16 22:09:42 +01:00
if ( ! empty ( $_GET [ 'to' ]))
2014-07-08 14:39:19 +01:00
{
2014-09-16 22:09:42 +01:00
$vars [ 'to' ] = $_GET [ 'to' ];
2014-07-08 14:39:19 +01:00
}
2014-09-16 22:09:42 +01:00
$vars [ 'width' ] = $_GET [ 'width' ] ? : 1075 ;
$vars [ 'height' ] = $_GET [ 'height' ] ? : 300 ;
2014-07-08 14:39:19 +01:00
$auth = " 1 " ;
$vars [ 'id' ] = dbFetchCell ( " SELECT `P`.`port_id` FROM `ports` AS `P` JOIN `devices` AS `D` ON `P`.`device_id` = `D`.`device_id` WHERE `D`.`hostname`=? AND `P`.`ifName`=? " , array ( $hostname , $vars [ 'port' ]));
$app -> response -> headers -> set ( 'Content-Type' , 'image/png' );
require ( " includes/graphs/graph.inc.php " );
}
2014-09-16 22:09:42 +01:00
function get_port_stats_by_port_hostname ()
2014-07-07 00:15:04 +01:00
{
2014-09-16 22:09:42 +01:00
// This will return port stats based on a devices hostname and ifName
2014-07-07 00:15:04 +01:00
global $config ;
$app = \Slim\Slim :: getInstance ();
$router = $app -> router () -> getCurrentRoute () -> getParams ();
2014-09-30 21:30:22 +01:00
$ifName = urldecode ( $router [ 'ifname' ]);
2014-09-16 22:09:42 +01:00
$stats = dbFetchRow ( " SELECT * FROM `ports` WHERE `ifName`=? " , array ( $ifName ));
2014-07-07 00:15:04 +01:00
$output = array ( " status " => " ok " , " port " => $stats );
2014-07-08 14:39:19 +01:00
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
2014-07-16 23:10:18 +01:00
echo _json_encode ( $output );
2014-07-07 00:15:04 +01:00
}
2014-07-08 14:39:19 +01:00
function get_graph_generic_by_hostname ()
{
// This will return a graph type given a device id.
global $config ;
$app = \Slim\Slim :: getInstance ();
$router = $app -> router () -> getCurrentRoute () -> getParams ();
$hostname = $router [ 'hostname' ];
2014-07-17 20:43:13 +01:00
$vars = array ();
2014-09-16 22:09:42 +01:00
$vars [ 'type' ] = $router [ 'type' ] ? : 'device_uptime' ;
if ( ! empty ( $_GET [ 'from' ]))
2014-07-08 14:39:19 +01:00
{
2014-09-16 22:09:42 +01:00
$vars [ 'from' ] = $_GET [ 'from' ];
2014-07-08 14:39:19 +01:00
}
2014-09-16 22:09:42 +01:00
if ( ! empty ( $_GET [ 'to' ]))
2014-07-08 14:39:19 +01:00
{
2014-09-16 22:09:42 +01:00
$vars [ 'to' ] = $_GET [ 'to' ];
2014-07-08 14:39:19 +01:00
}
2014-09-16 22:09:42 +01:00
$vars [ 'width' ] = $_GET [ 'width' ] ? : 1075 ;
$vars [ 'height' ] = $_GET [ 'height' ] ? : 300 ;
2014-07-08 14:39:19 +01:00
$auth = " 1 " ;
$vars [ 'device' ] = dbFetchCell ( " SELECT `D`.`device_id` FROM `devices` AS `D` WHERE `D`.`hostname`=? " , array ( $hostname ));
$app -> response -> headers -> set ( 'Content-Type' , 'image/png' );
require ( " includes/graphs/graph.inc.php " );
}
2014-07-13 21:28:26 +01:00
2014-09-27 15:25:43 +10:00
function get_device ()
{
// return details of a single device
$app = \Slim\Slim :: getInstance ();
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
$router = $app -> router () -> getCurrentRoute () -> getParams ();
$hostname = $router [ 'hostname' ];
2014-09-27 16:34:36 +10:00
// use hostname as device_id if it's all digits
$device_id = ctype_digit ( $hostname ) ? $hostname : getidbyname ( $hostname );
2014-09-27 15:25:43 +10:00
2014-09-27 16:34:36 +10:00
// find device matching the id
$device = device_by_id_cache ( $device_id );
if ( ! $device ) {
2014-09-27 15:25:43 +10:00
$app -> response -> setStatus ( 404 );
$output = array ( " status " => " error " , " message " => " Device $hostname does not exist " );
echo _json_encode ( $output );
$app -> stop ();
}
else {
2014-09-27 16:34:36 +10:00
$output = array ( " status " => " ok " , " devices " => array ( $device ));
2014-09-27 15:25:43 +10:00
echo _json_encode ( $output );
}
}
2014-07-13 21:28:26 +01:00
function list_devices ()
{
// This will return a list of devices
global $config ;
$app = \Slim\Slim :: getInstance ();
2014-09-16 22:09:42 +01:00
$order = $_GET [ 'order' ];
$type = $_GET [ 'type' ];
2014-07-13 21:28:26 +01:00
if ( empty ( $order ))
{
$order = " hostname " ;
}
if ( stristr ( $order , ' desc' ) === FALSE && stristr ( $order , ' asc' ) === FALSE )
{
$order .= ' ASC' ;
}
if ( $type == 'all' || empty ( $type ))
{
$sql = " 1 " ;
}
elseif ( $type == 'ignored' )
{
$sql = " ignore='1' AND disabled='0' " ;
}
elseif ( $type == 'up' )
{
$sql = " status='1' AND ignore='0' AND disabled='0' " ;
}
elseif ( $type == 'down' )
{
$sql = " status='0' AND ignore='0' AND disabled='0' " ;
}
elseif ( $type == 'disabled' )
{
$sql = " disabled='1' " ;
}
2014-07-17 20:43:13 +01:00
else
{
$sql = " 1 " ;
}
$devices = array ();
2014-07-13 21:28:26 +01:00
foreach ( dbFetchRows ( " SELECT * FROM `devices` WHERE $sql ORDER by $order " ) as $device )
{
$devices [] = $device ;
}
$output = array ( " status " => " ok " , " devices " => $devices );
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
2014-07-16 23:10:18 +01:00
echo _json_encode ( $output );
2014-07-13 21:28:26 +01:00
}
2014-07-16 01:02:55 +01:00
function add_device ()
{
// This will add a device using the data passed encoded with json
2014-09-27 18:34:23 +10:00
// FIXME: Execution flow through this function could be improved
2014-07-16 01:02:55 +01:00
global $config ;
$app = \Slim\Slim :: getInstance ();
$data = json_decode ( file_get_contents ( 'php://input' ), true );
2014-09-28 09:30:36 +10:00
// Default status & code to error and change it if we need to.
2014-07-16 01:02:55 +01:00
$status = " error " ;
2014-09-28 09:30:36 +10:00
$code = 500 ;
2014-09-27 18:27:45 +10:00
// keep scrutinizer from complaining about snmpver not being set for all execution paths
$snmpver = " v2c " ;
2014-07-16 01:02:55 +01:00
if ( empty ( $data ))
{
$message = " No information has been provided to add this new device " ;
}
elseif ( empty ( $data [ " hostname " ]))
{
$message = " Missing the device hostname " ;
}
$hostname = $data [ 'hostname' ];
2014-09-28 09:30:18 +10:00
$port = $data [ 'port' ] ? mres ( $data [ 'port' ]) : $config [ 'snmp' ][ 'port' ];
2014-09-28 09:56:33 +10:00
$transport = $data [ 'transport' ] ? mres ( $data [ 'transport' ]) : " udp " ;
2014-07-16 01:02:55 +01:00
if ( $data [ 'version' ] == " v1 " || $data [ 'version' ] == " v2c " )
{
if ( $data [ 'community' ])
{
$config [ 'snmp' ][ 'community' ] = array ( $data [ 'community' ]);
}
$snmpver = mres ( $data [ 'version' ]);
}
elseif ( $data [ 'version' ] == 'v3' )
{
$v3 = array (
'authlevel' => mres ( $data [ 'authlevel' ]),
'authname' => mres ( $data [ 'authname' ]),
'authpass' => mres ( $data [ 'authpass' ]),
'authalgo' => mres ( $data [ 'authalgo' ]),
'cryptopass' => mres ( $data [ 'cryptopass' ]),
'cryptoalgo' => mres ( $data [ 'cryptoalgo' ]),
);
array_push ( $config [ 'snmp' ][ 'v3' ], $v3 );
$snmpver = " v3 " ;
}
else
{
2014-09-27 18:34:23 +10:00
$code = 400 ;
$status = " error " ;
2014-07-16 01:02:55 +01:00
$message = " You haven't specified an SNMP version to use " ;
}
if ( empty ( $message ))
{
$result = addHost ( $hostname , $snmpver , $port , $transport , 1 );
if ( $result )
{
2014-09-27 18:34:23 +10:00
$code = 201 ;
2014-09-27 15:23:32 +10:00
$status = " ok " ;
$message = " Device $hostname has been added successfully " ;
2014-07-16 01:02:55 +01:00
}
else
{
2014-07-17 20:43:13 +01:00
$message = " Failed adding $hostname " ;
2014-07-16 01:02:55 +01:00
}
}
2014-09-27 15:23:32 +10:00
$app -> response -> setStatus ( $code );
2014-07-16 01:02:55 +01:00
$output = array ( " status " => $status , " message " => $message );
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
2014-07-16 23:10:18 +01:00
echo _json_encode ( $output );
2014-07-16 01:02:55 +01:00
}
2014-09-17 21:03:02 +01:00
function del_device ()
{
// This will add a device using the data passed encoded with json
global $config ;
$app = \Slim\Slim :: getInstance ();
$router = $app -> router () -> getCurrentRoute () -> getParams ();
$hostname = $router [ 'hostname' ];
// Default status to error and change it if we need to.
$status = " error " ;
2014-09-27 16:32:55 +10:00
$code = 500 ;
2014-09-17 21:03:02 +01:00
if ( empty ( $hostname ))
{
2014-09-27 16:32:55 +10:00
$message = " No hostname has been provided to delete " ;
$output = array ( " status " => $status , " message " => $message );
2014-09-17 21:03:02 +01:00
}
2014-09-27 16:32:55 +10:00
else
2014-09-17 21:03:02 +01:00
{
2014-09-27 16:32:55 +10: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
if ( $device ) {
$response = delete_device ( $device_id );
if ( empty ( $response )) {
// FIXME: Need to provide better diagnostics out of delete_device
$output = array ( " status " => $status , " message " => " Device deletion failed " );
}
else {
// deletion succeeded - include old device details in response
$code = 200 ;
$status = " ok " ;
$output = array ( " status " => $status , " message " => $response , " devices " => array ( $device ));
}
}
else {
// no device matching the name
$code = 404 ;
$output = array ( " status " => $status , " message " => " Device $hostname not found " );
2014-09-17 21:03:02 +01:00
}
}
2014-09-27 16:32:55 +10:00
$app -> response -> setStatus ( $code );
2014-09-17 21:03:02 +01:00
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
echo _json_encode ( $output );
}
2014-10-01 20:49:34 +01:00
function get_vlans () {
2014-10-01 20:53:15 +01:00
// This will list all vlans for a given device
global $config ;
$app = \Slim\Slim :: getInstance ();
$router = $app -> router () -> getCurrentRoute () -> getParams ();
$hostname = $router [ 'hostname' ];
$code = 500 ;
if ( empty ( $hostname )) {
$output = $output = array ( " status " => " error " , " message " => " No hostname has been provided " );
2014-10-01 20:49:34 +01:00
} else {
2014-10-01 20:53:15 +01:00
require_once ( " ../includes/functions.php " );
$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 );
}
if ( $device ) {
$vlans = dbFetchRows ( " SELECT vlan_vlan,vlan_domain,vlan_name,vlan_type,vlan_mtu FROM vlans WHERE `device_id` = ? " , array ( $device_id ));
$total_vlans = count ( $vlans );
2014-10-09 16:14:06 +00:00
$code = 200 ;
2014-10-01 21:00:07 +01:00
$output = array ( " status " => " ok " , " count " => $total_vlans , " vlans " => $vlans );
2014-10-01 20:53:15 +01:00
} else {
$code = 404 ;
$output = array ( " status " => " error " , " Device $hostname not found " );
}
2014-10-01 20:49:34 +01:00
}
2014-10-01 21:12:21 +01:00
$app -> response -> setStatus ( $code );
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
2014-10-01 20:53:15 +01:00
echo _json_encode ( $output );
2014-10-01 20:49:34 +01:00
}
2014-10-09 16:20:04 +00:00
function show_endpoints () {
global $config ;
$app = \Slim\Slim :: getInstance ();
$routes = $app -> router () -> getNamedRoutes ();
2014-10-09 16:47:11 +00:00
$output = array ();
2014-10-09 16:20:04 +00:00
foreach ( $routes as $route ) {
$output [ $route -> getName ()] = $config [ 'base_url' ] . $route -> getPattern ();
}
$app -> response -> setStatus ( '200' );
$app -> response -> headers -> set ( 'Content-Type' , 'application/json' );
echo _json_encode ( $output );
}