From 8e1da4766acdc834a4e602815b9e432be1be587f Mon Sep 17 00:00:00 2001 From: Darryl Quinn Date: Fri, 10 Jul 2015 21:51:18 -0500 Subject: [PATCH] feature: add sysinfo.json for programmatic lightweight management interface --- files/www/cgi-bin/sysinfo.json | 184 +++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100755 files/www/cgi-bin/sysinfo.json diff --git a/files/www/cgi-bin/sysinfo.json b/files/www/cgi-bin/sysinfo.json new file mode 100755 index 00000000..ee5d9fa4 --- /dev/null +++ b/files/www/cgi-bin/sysinfo.json @@ -0,0 +1,184 @@ +#!/usr/bin/perl +=for comment + + Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks + Copyright (C) 2015 Darryl Quinn + See Contributors file for additional contributors + + 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 version 3 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Additional Terms: + + Additional use restrictions exist on the AREDN(TM) trademark and logo. + See AREDNLicense.txt for more info. + + Attributions to the AREDN Project must be retained in the source code. + If importing this code into a new or existing project attribution + to the AREDN project must be added to the source code. + + You must not misrepresent the origin of the material conained within. + + Modified versions must be modified to attribute to the original source + and be marked in reasonable ways as differentiate it from the original + version. + +=cut + +BEGIN {push @INC, '/www/cgi-bin'}; +use perlfunc; + +read_query_string(); +&json_header(); + + +my %info; +$info{"json_version"}="1.0"; + +# ============ GENERATE INFO HASH ========= +$node=nvram_get("node"); +chomp($node); +$info{"node"}=$node; + +$model=`/usr/local/bin/get_model`; +chomp($model); +$info{"model"}=$model; + +# ------- Firmware Manufacturer +if (-e "/www/AREDN.png") +{ + $fw_mfg="AREDN"; +} else { + $fw_mfg = "Other"; +} +$info{"firmware_mfg"}=$fw_mfg; + +$fwver=`cat /etc/mesh-release`; +chomp($fwver); +$info{"firmware_version"}=$fwver; + +# ------- Tunnel Installed +if (-e "/usr/sbin/vtund") +{ + $tunnel_installed="YES"; +} else { + $tunnel_installed="NO"; +} +$info{"tunnel_installed"}=$tunnel_installed; + +# ------- SSID +$line = `grep ssid /etc/config/wireless | tail -1`; +$line =~ /['"](.*-(5|10|20)-v[3456])/; +$myssid = $1; +$myssid =~ /(.*)-(5|10|20)-v[3456]/; +$info{"ssid"}=$myssid; + +# ------- ACTIVE TUNNELS +$active_tunnel_count=`ifconfig|grep tun|wc -l`; +chomp($active_tunnel_count); +$info{"active_tunnel_count"}=$active_tunnel_count; + +# ------- LAT/LON +$lat=`head -1 /etc/latlon 2>/dev/null`; +chomp($lat); +$info{"lat"}=$lat; + +$lon=`tail -1 /etc/latlon 2>/dev/null`; +chomp($lon); +$info{"lon"}=$lon; + + +# ----------- GENERATE THE JSON ------------ +print "{"; +foreach $ik (keys %info) +{ + print "\"$ik\":\"",$info{$ik},"\","; +} + +############## INTERFACES +print "\"interfaces\":{"; +$mystr=""; +foreach(`ifconfig -a`) +{ + next unless /^(\S+) .*HWaddr (\S+)/; + $mystr .= sprintf "\"%s\":{", $1; + ($ip, $mask, $bcast, $net, $cidr) = &get_my_ip($1); + $mystr .= sprintf "\"ip\":\"%s\",",$ip; + $mystr .= sprintf "\"mac\":\"%s\"",$2; + $mystr .= sprintf "},"; +} +chop($mystr); +print $mystr; +print "}"; +############## INTERFACES + +if($parms{"hosts"} ) +{ + # Get a list of services, so we can remove them from the host list + foreach(`cat /var/run/services_olsr`) + { + $line = $_; + if ($line =~ /http:\/\/(.*):([0-9]*)\/.*$/ ) + { + if ( $2 > 0 ) # don't filter nodes with a gateway attached + { + $services{$1} = 1; + } + } + } + + print ",\"hosts\":{"; + $mystr=""; + foreach(`cat /var/run/hosts_olsr`) + { + $line = $_; + next unless /^(\d+\.\d+\.\d+\.\d+)\s*(\S+)/; + if ( not $services{$2} and $line !~ /dtdlink|mid1\./ ) { + #if ( not $services{$2} and $line !~ /dtdlink/ ) { + $mystr .= sprintf "\"%s\":\"%s\",",$2,$1; + } + } + + chop($mystr); + print $mystr; + print "}"; + ############## HOSTS +} + +print "}"; # ROOT + +############################## + + + +sub json_header +{ + # THIS MUST BE ONE LINE! + # otherwise an intermittent busybox bug will incorrectly "fix" the generated output + # print "HTTP/1.0 200 OK\r\n"; # Not needed under Uhttpd + print "Content-type: application/json\r\n"; + print "Cache-Control: no-store\r\n"; + print "\r\n"; +} + +sub get_my_ip +{ + my($ip); + foreach(`ifconfig $_[0]`) + { + next unless /inet addr:([\d\.]+)/; + $ip = $1; + last; + } + return ("none") unless defined $ip; + return $ip; +} \ No newline at end of file