#!/usr/bin/perl
=for commnet
Part of BBHN Mesh -- Used for creating Amateur Radio friendly mesh networks
Copyright (C) 2015 Conrad Lara
See Contributors file for additional contributors
Copyright (c) 2013 David Rivenburg et al. BroadBand-HamNet
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 .
=cut
$debug = 0;
BEGIN {push @INC, '/www/cgi-bin'};
use perlfunc;
# collect some variables
$node = nvram_get("node");
$node = "NOCALL" if $node eq "";
$tactical = nvram_get("tactical");
$config = nvram_get("config");
$config = "not set" if $config eq "" or not -d "/etc/config.$config";
($my_ip) = get_ip4_network("wlan0");
read_postdata();
system "mkdir -p /tmp/web";
system "touch /tmp/web/automesh" if $parms{auto};
system "rm -f /tmp/web/automesh" if $parms{stop};
# parse the txtinfo output
$table = "none";
chomp($tmperr = `mktemp /tmp/web/nc.XXXXXX`);
foreach(`echo /all | nc 127.0.0.1 2006 2>$tmperr`)
{
if(/^Table: (\w+)/)
{
$table = $1;
next;
}
next if /^\s*$/ or /^\D/;
if($table eq "Links")
{
($junk, $ip, $junk, $lq) = split /\s+/, $_;
$links{$ip} = $lq;
}
elsif($table eq "Neighbors")
{
}
elsif($table eq "Topology")
{
}
elsif($table eq "HNA")
{
}
elsif($table eq "MID")
{
}
elsif($table eq "Routes")
{
($ip, $junk, $junk, $etx) = split /\s+/, $_;
($net, $cidr) = split /\//, $ip;
$routes{$net}{cidr} = $cidr;
$routes{$net}{etx} = $etx;
$routes{$net}{value} = ip2decimal($net);
$routes{$net}{mask} = 0xffffffff - ((1 << (32 - $cidr)) - 1);
}
}
# stat and -s do not work in microperl
@parts = split /\s+/, `ls -l $tmperr`;
$txtinfo_err = $parts[4];
unlink $tmperr;
# load the local hosts file
foreach(`cat /etc/hosts`)
{
next unless /^10[.]/;
chomp;
($ip, $name, $tactical) = split /\s+/, $_;
next if $name =~ /^(localhost|localnode|localap|dtdlink\..*)$/;
if($ip eq $my_ip)
{
$tactical = "" unless $tactical;
$localhosts{$ip}{tactical} = $tactical;
$localhosts{$ip}{name} = $name;
}
else
{
push @{$localhosts{$my_ip}{hosts}}, $name;
}
}
# load the olsr hosts file
foreach(`cat /var/run/hosts_olsr 2>/dev/null`)
{
next unless /^\d/;
chomp;
($ip, $name, $junk, $originator, $mid, $midnum) = split /\s+/, $_;
next unless $originator;
next if $originator eq "myself";
if ( $name =~ /^dtdlink\..*$/ )
{
$hosts{$ip}{name} = $name;
next;
}
if(defined $mid and $midnum =~ /^\#(\d+)/)
{
if ( !exists $hosts{$ip}{name} )
{
$hosts{$ip}{name} = $name;
}
$hosts{$ip}{hide} = 1;
$hosts{$originator}{mid} = $1;
}
elsif($ip eq $originator)
{
if($hosts{$ip}{name}) { $hosts{$ip}{tactical} = $name }
else { $hosts{$ip}{name} = $name }
}
else
{
push @{$hosts{$originator}{hosts}}, $name;
}
}
# load the olsr services file
foreach(`cat /var/run/services_olsr 2>/dev/null`)
{
next unless /^\w/;
chomp;
($url, $junk, $name) = split /\|/, $_;
next unless defined $name;
($host, $port) = $url =~ /^\w+:\/\/([\w\-\.]+):(\d+)/;
($name, $originator) = split /\#/, $name;
$name =~ s/\s+$//;
#$host = $originator eq " my own service" ? $node : $hosts{$originator}{name};
# attempt to work around olsr never forgetting defunct services
# assume that the first entry in the file by this name is the most recent, ignore the rest
next if $services{$host}{$name};
$services{$host}{$name} = $port ? "$name" : $name;
}
# load the node history
foreach(`cat /tmp/node.history 2>/dev/null`)
{
chomp;
($ip, $age, $host) = split / /, $_;
next unless $age;
$host = "" unless $host;
$host =~ s|/| / |;
$history{$ip}{age} = $age;
$history{$ip}{host} = $host;
}
#delete $hosts{"127.0.0.1"};
# generate the page
http_header();
html_header("$node mesh status", 0);
print "\n" if -f "/tmp/web/automesh";
print "\n";
print "