librenms-librenms/html/includes/forms/get-host-dependencies.inc.php
Aldemir Akpinar 56561aa4dc feature: Added support for Host dependencies (#7332)
* First draft of the modals and the config interfaces

* GUI part done

* Backend code and db schema addition

* Documentation added, fixed alerting bug

* Fix typos

* Do not try to push an older db_schame.yaml

* Small db fix

* More db fixes

* Travis CI fixes

* missed a line in the travis error

* Fixed dependency clearing bug, Manage Host dependencies button now shows current selections

* Removed unnecessary index

* Correct faulty query

* Fixed sql query as requested, and renamed sql file

* Added requested changes

* Removed debug code

* Renamed sql file

* More fixes as requested

* Trying to fix db_schema.yaml

* adding laf's diff

* Corrected a small bug

* Try to resolve scrutinizer issue

* Main page bootgrid ajax modifications

* Also corrected travis ci errors

* Added select2 for pull downs, removed a redundant debug output. Changed parent_id to text

* Add missing class in the device settings page

* Fix bug where a link wasn't added after save

* Better parent down detection

* Add missing comma

* Behold the multi-parent code

* Added lookup table

* Ready for testing

* Trying to fix documentation conflicts

* Fix copy paste errors, and possible sql injection

* indentation problems

* Modified db_schema.yaml as well

* Typos, typos

* This should correct alerts

* Try to fix travis ci error

* Fix the typo in index.php

* Changed to Tony's query

* function explanation text changed

* Updated db_schema.yaml

* Trying to make automated tests happy

* Changes as requested

* Added acknowledgment for select2

* Added laf's patch

* dbBulkInsert when adding parents
2017-12-20 14:17:52 +00:00

103 lines
5.0 KiB
PHP

<?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.
*/
if (is_admin() === false) {
$status = array('status' => 1, 'message' => 'You need to be admin');
} else {
if (isset($_POST['viewtype'])) {
if ($_POST['viewtype'] == 'fulllist') {
$count_query = "SELECT count(device_id) from devices";
$deps_query = "SELECT a.device_id as id, a.hostname as hostname, GROUP_CONCAT(b.hostname) as parents, 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";
if (isset($_POST['format'])) {
if (isset($_POST['searchPhrase']) && !empty($_POST['searchPhrase'])) {
#This is a bit ugly
$deps_query = "SELECT * FROM (".$deps_query;
$deps_query .= " ) as t WHERE t.hostname LIKE ? OR t.parents LIKE ? ";
$deps_query .= " ORDER BY t.hostname";
} else {
$deps_query .= " ORDER BY a.hostname";
}
if (is_numeric($_POST['rowCount']) && is_numeric($_POST['current'])) {
$rows = $_POST['rowCount'];
$current = $_POST['current'];
$deps_query .= " LIMIT ".$rows * ($current - 1).", ".$rows;
}
} else {
$deps_query .= " ORDER BY a.hostname";
}
if (isset($_POST['format']) && !empty($_POST['searchPhrase'])) {
$searchphrase = '%'.mres($_POST['searchPhrase']).'%';
$device_deps = dbFetchRows($deps_query, array($searchphrase, $searchphrase));
} else {
$device_deps = dbFetchRows($deps_query);
}
if (isset($_POST['searchPhrase']) && !empty($_POST['searchPhrase'])) {
$rec_count = count($device_deps);
} else {
$rec_count = dbFetchCell($count_query);
}
if (isset($_POST['format'])) {
$res_arr = array();
foreach ($device_deps as $myrow) {
if ($myrow['parents'] == null || $myrow['parents'] == '') {
$parent = 'None';
} else {
$parent = $myrow['parents'];
}
array_push($res_arr, array( "deviceid" => $myrow['id'], "hostname" => $myrow['hostname'], "parent" => $parent, "parentid" => $myrow['parentid'] ));
}
$status = array('current' => $_POST['current'], 'rowCount' => $_POST['rowCount'], 'rows' => $res_arr, 'total' => $rec_count);
} else {
$status = array('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']);
$device_deps = dbFetchRows("SELECT a.device_id as device_id, a.hostname as hostname, GROUP_CONCAT(b.hostname) as parents, 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 = ?", array($parents));
}
$status = array('status' => 0, 'deps' => $device_deps);
}
}
} else {
// Find devices by child.
if (!is_numeric($_POST['device_id'])) {
$status = array('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` = ?', array($_POST['device_id']));
}
$status = array('status' => 0, 'deps' => $device_deps);
}
}
}
header('Content-Type: application/json');
echo _json_encode($status);