mirror of
https://github.com/librenms/librenms.git
synced 2024-09-22 02:48:37 +00:00
add a tool for working with JSON apps (#9084)
* add initial work on script for working with json apps * finish the code portion * -h now done * rename it to be slightly more accurate * make hash key strings * exit if -a is not present * now exit after checking the file if -s or -t is given * now properly add the applications key
This commit is contained in:
parent
a143452e5d
commit
e4ac31890e
189
scripts/json-app-tool.php
Executable file
189
scripts/json-app-tool.php
Executable file
@ -0,0 +1,189 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
// Pulled from includes/polling/functions.inc.php
|
||||
function data_flatten($array, $prefix = '', $joiner = '_')
|
||||
{
|
||||
$return = array();
|
||||
foreach ($array as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
if (strcmp($prefix, '')) {
|
||||
$key=$prefix.$joiner.$key;
|
||||
}
|
||||
$return = array_merge($return, data_flatten($value, $key, $joiner));
|
||||
} else {
|
||||
if (strcmp($prefix, '')) {
|
||||
$key=$prefix.$joiner.$key;
|
||||
}
|
||||
$return[$key] = $value;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
// Pulled from includes/snmp.inc.php
|
||||
function string_to_oid($string)
|
||||
{
|
||||
$oid = strlen($string);
|
||||
for ($i = 0; $i != strlen($string); $i++) {
|
||||
$oid .= '.'.ord($string[$i]);
|
||||
}
|
||||
|
||||
return $oid;
|
||||
}//end string_to_oid()
|
||||
|
||||
|
||||
// Options!
|
||||
$short_opts='sktmlhj:a:';
|
||||
$options = getopt($short_opts);
|
||||
|
||||
// print the help
|
||||
if (isset($options['h'])) {
|
||||
echo "LibreNMS JSON App tool
|
||||
-j The file containing the JSON to use for the test.
|
||||
-s Print the SNMPrec data.
|
||||
-t Print the JSON test data file.
|
||||
-l Just load and lint the JSON file.
|
||||
-m Extract and print metric variables from the JSON file.
|
||||
-k If m is specified, just print the keys in tested order.
|
||||
-a The application name for use with -s and -t.
|
||||
-h Show this help text.
|
||||
|
||||
-j must always be specified.
|
||||
|
||||
-a must always be given with -s and -t.
|
||||
|
||||
-l if specified will override any others. If none of the others are
|
||||
specified and just -j is given, then the file is loaded and then
|
||||
linted if needed. For linting jsonlint needs to be installed.
|
||||
|
||||
-m is handy if you want to grab a list of metrics a JSON app is returning
|
||||
and how they data is flattned as well for when writing alert rules. -k
|
||||
prints it in a slightly neater manner and in a manner and in tested
|
||||
order.
|
||||
";
|
||||
exit();
|
||||
}
|
||||
|
||||
// make sure we have a JSON file to work with
|
||||
if (!isset($options['j'])) {
|
||||
echo "Nothing JSON file specified via -j.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
//read in the file
|
||||
$raw_json=file_get_contents($options['j']);
|
||||
if ($raw_json === false) {
|
||||
exit(2);
|
||||
}
|
||||
|
||||
// parse the read file
|
||||
$json=json_decode(stripslashes($raw_json), true);
|
||||
|
||||
// check json_decode() for any errors
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
echo "Parsing '".$options['j']."' failed. Running jsonlint...\n\n";
|
||||
system('jsonlint '.escapeshellarg($options['j']));
|
||||
exit(3);
|
||||
}
|
||||
|
||||
//make sure the JSON actually contains something
|
||||
if (empty($json)) {
|
||||
echo "'".$options['j']."' is a blank JSON file.\n";
|
||||
exit(4);
|
||||
}
|
||||
|
||||
//make sure it has all the required keys
|
||||
if (!isset($json['error'], $json['data'], $json['errorString'], $json['version'])) {
|
||||
echo "'".$options['j']."' is missing one or more of the keys 'error', 'errorString', 'version', or 'data'.\n";
|
||||
exit(5);
|
||||
}
|
||||
|
||||
//successfully loaded and tested the file, just exit now if asked to
|
||||
if (isset($options['l'])) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//pulls out the metrics
|
||||
$data=$json['data'];
|
||||
$metrics=data_flatten($data);
|
||||
$metrics_keys=array_keys($metrics);
|
||||
usort($metrics_keys, "strcasecmp"); //orders them in the manner in which the test script compares them
|
||||
//print metrics if needed
|
||||
if (isset($options['m'])) {
|
||||
if (isset($options['k'])) {
|
||||
foreach ($metrics_keys as $key) {
|
||||
print $key."\n";
|
||||
}
|
||||
} else {
|
||||
foreach ($metrics_keys as $key) {
|
||||
print $key."=".$metrics[$key]."\n";
|
||||
}
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
# exit if -s or -t is not requested
|
||||
if ((!isset($options['s']))&&(!isset($options['t']))) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// For anything past here, we need -a given
|
||||
if (!isset($options['a'])) {
|
||||
echo "Nothing specified via -a\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Output snmprec data for snmpsim for use with testing.
|
||||
if (isset($options['s'])) {
|
||||
$oid=string_to_oid($options['a']);
|
||||
echo "1.3.6.1.2.1.1.1.0|4|Linux server 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64\n".
|
||||
"1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.8072.3.2.10\n".
|
||||
"1.3.6.1.2.1.1.3.0|67|77550514\n".
|
||||
"1.3.6.1.2.1.1.4.0|4|<private>\n".
|
||||
"1.3.6.1.2.1.1.5.0|4|<private>\n".
|
||||
"1.3.6.1.2.1.1.6.0|4|<private>\n".
|
||||
"1.3.6.1.2.1.25.1.1.0|67|77552962\n".
|
||||
"1.3.6.1.4.1.8072.1.3.2.2.1.21.6.100.105.115.116.114.111|2|1\n".
|
||||
"1.3.6.1.4.1.8072.1.3.2.2.1.21.".$oid."|2|1\n".
|
||||
"1.3.6.1.4.1.8072.1.3.2.3.1.2.".$oid."|4x|".bin2hex($raw_json)."\n";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// prints the json test data file if asked to
|
||||
if (isset($options['j'])) {
|
||||
$test_data=array(
|
||||
'applications' => array (
|
||||
"discovery" => array(
|
||||
"applications" => array(
|
||||
"app_type" => $options['a'],
|
||||
"app_state" => "UNKNOWN",
|
||||
"discovered" => "1",
|
||||
"app_state_prev" => null,
|
||||
"app_status" => "",
|
||||
"app_instance" => "",),
|
||||
"application_metrics" => array(),
|
||||
),
|
||||
"poller" => array(
|
||||
"applications" => array(
|
||||
"app_type" => $options['a'],
|
||||
"app_state" => "OK",
|
||||
"discovered" => "1",
|
||||
"app_state_prev" => "UNKNOWN",
|
||||
"app_status" => "",
|
||||
"app_instance" => "",),
|
||||
"application_metrics" => array(),
|
||||
),
|
||||
),
|
||||
);
|
||||
foreach ($metrics_keys as $key) {
|
||||
$test_data[poller][application_metrics][]=array(
|
||||
"metric" => $key,
|
||||
"value" => $metrics[$key],
|
||||
"value_prev" => null,
|
||||
"app_type" => $options['a'],
|
||||
);
|
||||
}
|
||||
echo json_encode($test_data, JSON_PRETTY_PRINT)."\n";
|
||||
exit(0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user