#!/usr/bin/perl $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)$/; 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(defined $mid and $midnum =~ /^\#(\d+)/) { $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 "