2017-12-20 17:17:52 +03:00
< ? php
/*
* LibreNMS
*
* Copyright ( c ) 2017 Aldemir Akpinar < https :// github . com / aldemira />
*
* 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 .
*/
2018-04-07 15:55:28 -05:00
2019-08-05 14:16:05 -05:00
if ( ! Auth :: user () -> hasGlobalAdmin ()) {
2017-12-20 17:17:52 +03:00
$status = [ 'status' => 1 , 'message' => 'You need to be admin' ];
} else {
if ( isset ( $_POST [ 'viewtype' ])) {
if ( $_POST [ 'viewtype' ] == 'fulllist' ) {
2018-05-17 04:55:00 +03:00
$deps_query = 'SELECT a.device_id as id, a.hostname as hostname, a.sysName as sysName, GROUP_CONCAT(b.hostname) as parent, GROUP_CONCAT(b.device_id) as parentid FROM devices as a LEFT JOIN device_relationships a1 ON a.device_id=a1.child_device_id LEFT JOIN devices b ON b.device_id = a1.parent_device_id GROUP BY a.device_id, a.hostname, a.sysName' ;
2017-12-20 17:17:52 +03:00
2018-05-17 04:55:00 +03:00
if ( isset ( $_POST [ 'searchPhrase' ]) && ! empty ( $_POST [ 'searchPhrase' ])) {
$deps_query .= ' HAVING parent LIKE ? OR hostname LIKE ? OR sysName LIKE ? ' ;
$count_query = 'SELECT COUNT(*) FROM (' . $deps_query . ') AS rowcount' ;
} else {
$count_query = 'SELECT COUNT(device_id) AS rowcount FROM devices' ;
}
2017-12-20 17:17:52 +03:00
2018-05-17 04:55:00 +03:00
// if format is set we're trying to pull the Bootgrid table data
2017-12-20 17:17:52 +03:00
if ( isset ( $_POST [ 'format' ])) {
2018-05-17 04:55:00 +03:00
$order_by = '' ;
if ( isset ( $_POST [ 'sort' ]) && is_array ( $_REQUEST [ 'sort' ])) {
foreach ( $_REQUEST [ 'sort' ] as $key => $value ) {
2022-03-24 03:39:24 +01:00
$key = preg_replace ( '/[^A-Za-z0-9_]/' , '' , $key ); // only allow plain columns
$value = strtolower ( $value ) == 'desc' ? 'DESC' : 'ASC' ;
2018-05-17 04:55:00 +03:00
$order_by .= " $key $value " ;
}
2017-12-20 17:17:52 +03:00
} else {
2018-05-17 04:55:00 +03:00
$order_by = ' a.hostname' ;
2017-12-20 17:17:52 +03:00
}
2018-05-17 04:55:00 +03:00
$deps_query .= ' ORDER BY ' . $order_by ;
2017-12-20 17:17:52 +03:00
if ( is_numeric ( $_POST [ 'rowCount' ]) && is_numeric ( $_POST [ 'current' ])) {
$rows = $_POST [ 'rowCount' ];
$current = $_POST [ 'current' ];
2020-11-21 03:58:08 +01:00
if ( $rows > 0 ) {
$deps_query .= ' LIMIT ' . $rows * ( $current - 1 ) . ', ' . $rows ;
}
2017-12-20 17:17:52 +03:00
}
} else {
$deps_query .= ' ORDER BY a.hostname' ;
}
if ( isset ( $_POST [ 'format' ]) && ! empty ( $_POST [ 'searchPhrase' ])) {
2021-03-28 17:25:30 -05:00
$searchphrase = '%' . $_POST [ 'searchPhrase' ] . '%' ;
2018-05-17 04:55:00 +03:00
$search_arr = [ $searchphrase , $searchphrase , $searchphrase ];
$device_deps = dbFetchRows ( $deps_query , $search_arr );
$rec_count = dbFetchCell ( $count_query , $search_arr );
2017-12-20 17:17:52 +03:00
} else {
$device_deps = dbFetchRows ( $deps_query );
$rec_count = dbFetchCell ( $count_query );
}
if ( isset ( $_POST [ 'format' ])) {
$res_arr = [];
foreach ( $device_deps as $myrow ) {
2018-05-17 04:55:00 +03:00
if ( $myrow [ 'parent' ] == null || $myrow [ 'parent' ] == '' ) {
2017-12-20 17:17:52 +03:00
$parent = 'None' ;
} else {
2018-05-17 04:55:00 +03:00
$parent = $myrow [ 'parent' ];
2017-12-20 17:17:52 +03:00
}
2018-09-11 07:51:35 -05:00
2020-03-23 19:39:46 +01:00
$hostname = format_hostname ( $myrow );
2023-08-02 09:51:31 -05:00
$sysname = htmlspecialchars (( $hostname == $myrow [ 'sysName' ]) ? $myrow [ 'hostname' ] : $myrow [ 'sysName' ]);
2020-03-23 19:39:46 +01:00
array_push ( $res_arr , [ 'deviceid' => $myrow [ 'id' ], 'hostname' => $hostname , 'sysname' => $sysname , 'parent' => $parent , 'parentid' => $myrow [ 'parentid' ]]);
2017-12-20 17:17:52 +03:00
}
$status = [ 'current' => $_POST [ 'current' ], 'rowCount' => $_POST [ 'rowCount' ], 'rows' => $res_arr , 'total' => $rec_count ];
} else {
$status = [ 'status' => 0 , 'deps' => $device_deps ];
}
} else {
// Get childs from parent id(s)
if ( $_POST [ 'viewtype' ] == 'fromparent' ) {
if ( $_POST [ 'parent_ids' ] == 0 ) {
$device_deps = dbFetchRows ( 'SELECT `device_id`,`hostname` from `devices` as a LEFT JOIN `device_relationships` as b ON b.`child_device_id` = a.`device_id` WHERE b.`child_device_id` is null ORDER BY `hostname`' );
} else {
$parents = implode ( ',' , $_POST [ 'parent_ids' ]);
2018-05-17 04:55:00 +03:00
$device_deps = dbFetchRows ( 'SELECT a.device_id as device_id, a.hostname as hostname, GROUP_CONCAT(b.hostname) as parent, GROUP_CONCAT(b.device_id) as parentid FROM devices as a LEFT JOIN device_relationships a1 ON a.device_id=a1.child_device_id LEFT JOIN devices b ON b.device_id=a1.parent_device_id GROUP BY a.device_id, a.hostname HAVING parentid = ?' , [ $parents ]);
2017-12-20 17:17:52 +03:00
}
$status = [ 'status' => 0 , 'deps' => $device_deps ];
}
}
} else {
// Find devices by child.
if ( ! is_numeric ( $_POST [ 'device_id' ])) {
$status = [ 'status' => 1 , 'message' => 'Wrong device id!' ];
} else {
$deps_query = 'SELECT `device_id`, `hostname` FROM `devices` AS a INNER JOIN `device_relationships` AS b ON a.`device_id` = b.`parent_device_id` WHERE ' ;
// device_id == 0 is the case where we have no parents.
if ( $_POST [ 'device_id' ] == 0 ) {
$device_deps = dbFetchRows ( $deps_query . ' b.`parent_device_id` is null OR b.`parent_device_id` = 0 ' );
} else {
$device_deps = dbFetchRows ( $deps_query . ' b.`child_device_id` = ?' , [ $_POST [ 'device_id' ]]);
}
$status = [ 'status' => 0 , 'deps' => $device_deps ];
}
}
}
2018-09-11 07:51:35 -05:00
2017-12-20 17:17:52 +03:00
header ( 'Content-Type: application/json' );
2021-03-04 07:55:41 -06:00
echo json_encode ( $status , JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );