aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Lyngstol <kristian@bohemians.org>2015-04-05 10:11:35 +0200
committerKristian Lyngstol <kristian@bohemians.org>2015-04-05 10:11:35 +0200
commit325d236acec7747fa202d94440462c887230a9c8 (patch)
tree92027c6ee5bf8cd541d6dce0376f2bd4489a39ff
parentee6b4ccbd44c3a85e2a1d6c8a1873aafa89c3d33 (diff)
tg15: Clean up other unused things
-rwxr-xr-xclients/accesspoints.pl59
-rwxr-xr-xclients/ipv6-dns.pl138
-rw-r--r--clients/ipv6-stats.pl98
-rwxr-xr-xclients/snmpfetch.pl256
-rwxr-xr-xclients/update-public-nms.sh16
-rwxr-xr-xclients/update-public-speedometer.pl37
6 files changed, 0 insertions, 604 deletions
diff --git a/clients/accesspoints.pl b/clients/accesspoints.pl
deleted file mode 100755
index 85a32c2..0000000
--- a/clients/accesspoints.pl
+++ /dev/null
@@ -1,59 +0,0 @@
-#! /usr/bin/perl
-use strict;
-use warnings;
-use BER;
-use DBI;
-use POSIX;
-use Time::HiRes;
-use Net::Ping;
-
-use lib '../include';
-use nms;
-use threads;
-
-poll_loop();
-
-sub poll_loop {
- my $dbh = nms::db_connect();
- my $qcores = $dbh->prepare('SELECT DISTINCT coreswitches.sysname, coreswitches.switch, coreswitches.ip, coreswitches.community FROM uplinks JOIN switches AS coreswitches ON (uplinks.coreswitch = coreswitches.switch)');
- my $qaps = $dbh->prepare("SELECT switches.sysname, switches.switch, uplinks.blade, uplinks.port FROM uplinks NATURAL JOIN switches WHERE uplinks.coreswitch = ?");
- my $qpoll = $dbh->prepare("UPDATE ap_poll SET model=?, last_poll=now() WHERE switch = ?");
-
- while (1) {
- $qcores->execute();
- my $cores = $qcores->fetchall_hashref("sysname");
-
- foreach my $core (keys %$cores) {
- my $ip = $cores->{$core}{'ip'};
- my $community = $cores->{$core}{'community'};
- printf "Polling %s (%s)\n", $core, $ip;
- eval {
- my $session = nms::snmp_open_session($ip, $community);
- $qaps->execute($cores->{$core}{'switch'});
- while (my $aps = $qaps->fetchrow_hashref()) {
- my $sysname = $aps->{'sysname'};
- my $blade = $aps->{'blade'};
- my $port = $aps->{'port'};
- my $oid = "1.3.6.1.2.1.105.1.1.1.9.$blade.$port"; # POWER-ETHERNET-MIB...pethPsePortType
- my $mode = $session->get($oid);
- $qpoll->execute($mode, $aps->{'switch'});
- printf "%s (%s:%s/%s): %s\n", $sysname, $core, $blade, $port, $mode;
- }
- };
- if ($@) {
- mylog("ERROR: $@ (during poll of $ip)");
- $dbh->rollback;
- }
- }
- sleep 2;
- }
-}
-
-sub mylog {
- my $msg = shift;
- my $time = POSIX::ctime(time);
- $time =~ s/\n.*$//;
- printf STDERR "[%s] %s\n", $time, $msg;
-}
-
-
diff --git a/clients/ipv6-dns.pl b/clients/ipv6-dns.pl
deleted file mode 100755
index dcb059d..0000000
--- a/clients/ipv6-dns.pl
+++ /dev/null
@@ -1,138 +0,0 @@
-#! /usr/bin/perl
-use DBI;
-use Net::DNS;
-use Net::IP;
-use lib '../include';
-use nms;
-use strict;
-use warnings;
-
-BEGIN {
-require "../include/config.pm";
- eval {
- require "../include/config.local.pm";
- };
-}
-
-my $dbh = nms::db_connect() or die "Can't connect to database";
-my $res = Net::DNS::Resolver->new;
-
-$res->nameservers("$nms::config::pri_hostname.$nms::config::tgname.gathering.org");
-
-my $kname = 'DHCP_UPDATER';
-
-sub get_reverse {
- my ($ip) = shift;
- $ip = new Net::IP($ip) or return 0;
- my $a = $res->query($ip->reverse_ip, 'PTR') or return 0;
- foreach my $n ($a->answer) {
- return $n->{'ptrdname'}; # Return first element, ignore the rest (=
- }
- return 0;
-}
-
-sub any_quad_a {
- my ($host) = shift;
- my $a = $res->query($host, 'AAAA') or return 0;
- foreach my $n ($a->answer) {
- return 1 if ($n->{'type'} eq 'AAAA');
- }
- return 0;
-}
-
-print "Running automagic IPv6 DNS updates\n";
-while (1) {
-
- # Fetch visible IPv6 addresses from the last three minutes
- #my $q = $dbh->prepare("SELECT DISTINCT ON (ipv6.mac) ipv6.address AS v6, ipv6.mac, ipv4.address AS v4, ipv6.time - ipv6.age*'1 second'::interval FROM ipv6 LEFT JOIN ipv4 ON ipv4.mac = ipv6.mac WHERE ipv6.time > NOW()-'3 min'::interval ORDER BY ipv6.mac, ipv6.time DESC, mac")
- my $q = $dbh->prepare(
-"SELECT DISTINCT ON (v6) v6, ipv6.mac, ipv6.seen, v4
-FROM (SELECT DISTINCT ON (address) address AS v6, mac, seen FROM seen_mac WHERE family(address) = 6 AND seen > CURRENT_TIMESTAMP - '3 min'::interval) ipv6
-LEFT JOIN (SELECT DISTINCT ON (address) address AS v4, mac, seen FROM seen_mac WHERE family(address) = 4 AND seen > CURRENT_TIMESTAMP - '3 min'::interval) ipv4 ON ipv4.mac = ipv6.mac
-ORDER BY v6, ipv6.seen DESC, mac")
- or die "Can't prepare query";
- $q->execute() or die "Can't execute query";
-
- my $aaaas = 0;
- my $aaaa_errors = 0;
- my $ptrs = 0;
- my $ptr_errors = 0;
- my $update;
- my $v6;
- while (my $ref = $q->fetchrow_hashref()) {
- my $hostname = get_reverse($ref->{'v4'});
- if ($hostname) {
- $v6 = $ref->{'v6'};
- my @parts = split('\.', $hostname);
- my $hostname = shift @parts;
- my $domain = join('.', @parts);
- my $v6arpa = (new Net::IP($v6))->reverse_ip;
-
- # Don't add records for nets we don't control
- next if not $v6arpa =~ m/$nms::config::ipv6zone/;
-
- # Add IPv6 reverse
- if (!get_reverse($ref->{'v6'})) {
- $update = Net::DNS::Update->new($nms::config::ipv6zone);
- $update->push(pre => nxrrset("$v6arpa IN PTR")); # Only update if the RR is nonexistent
- $update->push(update => rr_add("$v6arpa IN PTR $hostname.$domain."));
- $update->sign_tsig($kname, $nms::config::ddns_key);
- my $reply = $res->send($update);
- if ($reply->header->rcode eq 'NOERROR') {
- $ptrs++;
- } else {
- $ptr_errors++;
- }
- }
-
- # Add IPv6 forward
- if (!any_quad_a("$hostname.$domain")) {
- $update = Net::DNS::Update->new($domain);
- $update->push(pre => nxrrset("$hostname.$domain. IN AAAA $v6")); # Only update if the RR is nonexistent
- $update->push(update => rr_add("$hostname.$domain. IN AAAA $v6"));
- $update->sign_tsig($kname, $nms::config::ddns_key);
- my $reply = $res->send($update);
- if ($reply->header->rcode eq 'NOERROR') {
- $aaaas++;
- } else {
- $aaaa_errors++;
- }
- }
- }
- }
- print "Added $ptrs PTR records. $ptr_errors errors occured.\n";
- print "Added $aaaas AAAA records. $aaaa_errors errors occured.\n";
-
-
- # Remove old PTR records, that is, for hosts we haven't seen the last four
- # hours, but not older than four and a half hours, as it would take forever to
- # try to delete everything. FIXME: Query the zone file and diff against the
- # database, to avoid running as many NS-updates as tuples in the result set.
-
- $q = $dbh->prepare("SELECT DISTINCT address AS v6 FROM seen_mac WHERE seen BETWEEN CURRENT_TIMESTAMP - '4 hours'::interval AND CURRENT_TIMESTAMP - '4 hours 30 minutes'::interval")
- or die "Can't prepare query";
- $q->execute() or die "Can't execute query";
-
- my $i = 0;
- my $errors = 0;
- while (my $ref = $q->fetchrow_hashref()) {
- $v6 = $ref->{'v6'};
- if (get_reverse($v6)) {
- my $v6arpa = (new Net::IP($v6))->reverse_ip;
- my $update = Net::DNS::Update->new($nms::config::ipv6zone);
- $update->push(pre => yxrrset("$v6arpa PTR")); # Only update if the RR exists
- $update->push(update => rr_del("$v6arpa IN PTR"));
- $update->sign_tsig($kname, $nms::config::ddns_key);
- my $reply = $res->send($update);
- if ($reply->header->rcode eq 'NOERROR') {
- $i++;
- } else {
- $errors++;
- }
- }
- }
-
- print "Deleted $i old PTR records. $errors errors occured.\n";
- print "Sleeping for two minutes.\n";
- sleep(120);
-}
diff --git a/clients/ipv6-stats.pl b/clients/ipv6-stats.pl
deleted file mode 100644
index ab76cc9..0000000
--- a/clients/ipv6-stats.pl
+++ /dev/null
@@ -1,98 +0,0 @@
-#! /usr/bin/perl
-use strict;
-use warnings;
-use lib '../include';
-use nms;
-use Data::Validate::IP qw(is_public_ipv6 is_public_ipv4 is_private_ipv4);
-use Net::MAC qw(mac_is_unicast);
-
-my $dbh = nms::db_connect();
-$dbh->{AutoCommit} = 0;
-
-while (1) {
- my $coregws = $dbh->prepare("SELECT ip, community, sysname FROM switches WHERE switchtype <> 'dlink3100'")
- or die "Can't prepare query: $!";
- $coregws->execute;
-
- my %seen = ();
- my $num_v4 = 0;
- my $num_v6 = 0;
- while (my $ref = $coregws->fetchrow_hashref) {
- print STDERR "Querying ".$ref->{'sysname'}." ...\n";
- my $snmp;
- eval {
- $snmp = nms::snmp_open_session($ref->{'ip'}, $ref->{'community'});
- };
- warn $@ if $@;
- next if not $snmp;
-
- # Pull in old media table that does not support ipv6.
- my $ip_phys_table = fetch($snmp, ('ipNetToMediaNetAddress', 'ipNetToMediaPhysAddress'));
- for my $entry (values %$ip_phys_table) {
- my $ip_addr = $entry->{'ipNetToMediaNetAddress'};
- my $mac = Net::MAC->new(
- mac => nms::convert_mac($entry->{'ipNetToMediaPhysAddress'}),
- die => 0,
- );
-
- next if $mac->get_base() != 16 || $mac->get_mac() eq ''; # We only support base 16 addresses
- next if (!is_public_ipv4($ip_addr) && !is_private_ipv4($ip_addr)); # We consider RFC1918 public
-
- $seen{$ip_addr} = $mac->get_mac();
- $num_v4++;
- }
-
- # Pull in new media table with IPv6 support
- $ip_phys_table = $snmp->gettable('ipNetToPhysicalTable');
- for my $entry (values %$ip_phys_table) {
- my $type = $entry->{'ipNetToPhysicalNetAddressType'};
- my $ip_addr = undef;
- my $mac = Net::MAC->new(
- mac => nms::convert_mac($entry->{'ipNetToPhysicalPhysAddress'}),
- die => 0,
- );
-
- if ($type != 2) {
- warn "$ip_addr is of unexpected type $type (should be 2)! Tell Berge.\n";
- next;
- }
-
- $ip_addr = nms::convert_ipv6($entry->{'ipNetToPhysicalNetAddress'});
-
- next if $mac->get_base() != 16 || $mac->get_mac() eq ''; # We only support base 16 addresses
- next if not is_public_ipv6($ip_addr);
-
- $seen{$ip_addr} = $mac->get_mac();
- $num_v6++;
- }
-
- }
-
- # Populate database
- my $i = 0;
- foreach my $ip_addr (keys %seen) {
- $i++;
- my $q = $dbh->do('INSERT INTO seen_mac (address, mac) VALUES (?, ?)', undef, $ip_addr, $seen{$ip_addr})
- or die "Can't execute query: $!";
- }
-
- $dbh->commit;
- print "Collected $num_v6 IPv6 addresses and $num_v4 IPv4 addresses. $i unique addresses.\n";
- print "Sleeping for 60 seconds ...\n";
- sleep(60);
-}
-
-
-# Fetch provided fields from a single table returning {iid => {tag => val}}
-sub fetch {
- my $session = shift;
- my @vars = map { new SNMP::Varbind([$_]) } @_;
- my $data = {};
- foreach my $result (@{$session->bulkwalk(0, 8, new SNMP::VarList(@vars))}) {
- foreach my $entry (@$result) {
- $data->{$entry->iid}->{$entry->tag} = $entry->val;
- }
- }
- return $data;
-}
-
diff --git a/clients/snmpfetch.pl b/clients/snmpfetch.pl
deleted file mode 100755
index a13ef3f..0000000
--- a/clients/snmpfetch.pl
+++ /dev/null
@@ -1,256 +0,0 @@
-#! /usr/bin/perl
-use DBI;
-use POSIX;
-use Time::HiRes;
-use Net::Telnet;
-use strict;
-use warnings;
-
-use lib '../include';
-use nms;
-use threads;
-
-our $running = 0;
-
-our $dbh = nms::db_connect();
-$dbh->{AutoCommit} = 0;
-$dbh->{RaiseError} = 1;
-
-# normal mode: fetch switches from the database
-# instant mode: poll the switches specified on the command line
-my $instant = defined($ARGV[0]);
-
-my $qualification;
-if ($instant) {
- $qualification = "sysname LIKE ?";
-} else {
- $qualification = <<"EOF";
-(last_updated IS NULL OR now() - last_updated > poll_frequency)
-AND (locked='f' OR now() - last_updated > '5 minutes'::interval)
-AND ip is not null
-EOF
-}
-
-our $qswitch = $dbh->prepare(<<"EOF")
-SELECT
- *,
- DATE_TRUNC('second', now() - last_updated - poll_frequency) AS overdue
-FROM
- switches
- NATURAL LEFT JOIN switchtypes
-WHERE $qualification
-ORDER BY
- priority DESC,
- overdue DESC
-LIMIT 1
-FOR UPDATE OF switches
-EOF
- or die "Couldn't prepare qswitch";
-our $qlock = $dbh->prepare("UPDATE switches SET locked='t', last_updated=now() WHERE switch=?")
- or die "Couldn't prepare qlock";
-our $qunlock = $dbh->prepare("UPDATE switches SET locked='f', last_updated=now() WHERE switch=?")
- or die "Couldn't prepare qunlock";
-our $qpoll = $dbh->prepare("INSERT INTO polls (time, switch, port, bytes_in, bytes_out, errors_in, errors_out, official_port,operstatus,ifdescr) VALUES (timeofday()::timestamp,?,?,?,?,?,?,true,?,?)")
- or die "Couldn't prepare qpoll";
-
-poll_loop(@ARGV);
-while ($running > 0) {
- SNMP::MainLoop(0.1);
-}
-
-sub poll_loop {
- my @switches = @_;
- my $instant = (scalar @switches > 0);
- my $timeout = 15;
-
- while (1) {
- my $sysname;
- if ($instant) {
- $sysname = shift @ARGV;
- return if (!defined($sysname));
- $qswitch->execute('%'.$sysname.'%')
- or die "Couldn't get switch";
- } else {
- # Find a switch to grab
- $qswitch->execute()
- or die "Couldn't get switch";
- }
- my $switch = $qswitch->fetchrow_hashref();
-
- if (!defined($switch)) {
- $dbh->commit;
-
- if ($instant) {
- mylog("No such switch $sysname available, quitting.");
- return;
- } else {
- mylog("No available switches in pool, sleeping.");
- SNMP::MainLoop(1.0);
- next;
- }
- }
-
- $qlock->execute($switch->{'switch'})
- or die "Couldn't lock switch";
- $dbh->commit;
-
- if ($switch->{'locked'}) {
- mylog("WARNING: Lock timed out on $switch->{'ip'}, breaking lock");
- }
-
- my $msg;
- if (defined($switch->{'overdue'})) {
- $msg = sprintf "Polling ports %s on %s (%s), %s overdue.",
- $switch->{'ports'}, $switch->{'ip'}, $switch->{'sysname'}, $switch->{'overdue'};
- } else {
- $msg = sprintf "Polling ports %s on %s (%s), never polled before.",
- $switch->{'ports'}, $switch->{'ip'}, $switch->{'sysname'};
- }
- mylog($msg);
-
- my $ip = $switch->{'ip'};
- if ($ip eq '127.0.0.1') {
- mylog("Polling disabled for this switch, skipping.");
- $qunlock->execute($switch->{'switch'})
- or die "Couldn't unlock switch";
- $dbh->commit;
- next;
- }
-
- my $community = $switch->{'community'};
- my $start = [Time::HiRes::gettimeofday];
- my $session;
- eval {
- $session = nms::snmp_open_session($ip, $community, 1);
- };
- if ($@) {
- warn "Couldn't open session (even an async one!) to $ip: $!";
- $qunlock->execute($switch->{'switch'})
- or die "Couldn't unlock switch";
- $dbh->commit;
- next;
- };
- my @ports = expand_ports($switch->{'ports'});
-
- my $switch_status = {
- session => $session,
- ip => $switch->{'ip'},
- sysname => $switch->{'sysname'},
- switch => $switch->{'switch'},
- num_ports => scalar @ports,
- num_done => 0,
- start => $start,
- };
-
- for my $port (@ports) {
- my @vars = ();
- push @vars, ["ifInOctets", $port];
- push @vars, ["ifOutOctets", $port];
- push @vars, ["ifInErrors", $port];
- push @vars, ["ifDescr", $port];
- push @vars, ["ifOutErrors", $port];
- push @vars, ["ifOperStatus", $port];
- my $varlist = SNMP::VarList->new(@vars);
- $session->get($varlist, [ \&callback, $switch_status, $port ]);
- }
- $running++;
-
- $dbh->rollback;
- }
-}
-
-sub expand_ports {
- my $in = shift;
- my @ranges = split /,/, $in;
- my @ret = ();
-
- for my $range (@ranges) {
- if ($range =~ /^\d+$/) {
- push @ret, $range;
- } elsif ($range =~ /^(\d+)-(\d+)$/) {
- for my $i ($1..$2) {
- push @ret, $i;
- }
- } else {
- die "Couldn't understand '$range' in ports";
- }
- }
-
- return (sort { $a <=> $b } @ret);
-}
-
-sub mylog {
- my $msg = shift;
- my $time = POSIX::ctime(time);
- $time =~ s/\n.*$//;
- printf STDERR "[%s] %s\n", $time, $msg;
-}
-
-sub callback {
- my ($switch, $port, $vars) = @_;
-
- my ($in, $out, $ine, $oute) = (undef, undef, undef, undef);
- my $operstatus = 2;
- my $ifdescr = undef;
-
- for my $var (@$vars) {
- if ($port != $var->[1]) {
- die "Response for unknown OID $var->[0].$var->[1] (expected port $port)";
- }
- if ($var->[0] eq 'ifInOctets') {
- $in = $var->[2];
- } elsif ($var->[0] eq 'ifOutOctets') {
- $out = $var->[2];
- } elsif ($var->[0] eq 'ifInErrors') {
- $ine = $var->[2];
- } elsif ($var->[0] eq 'ifOutErrors') {
- $oute = $var->[2];
- } elsif ($var->[0] eq 'ifOperStatus') {
- $operstatus = $var->[2];
- } elsif ($var->[0] eq 'ifDescr') {
- $ifdescr = $var->[2];
- } else {
- die "Response for unknown OID $var->[0].$var->[1]";
- }
- }
-
- my $ok = 1;
- if (!defined($in) || $in !~ /^\d+$/) {
- if (defined($ine)) {
- warn $switch->{'sysname'}.":$port: failed reading in ($ine)" . (defined($in) ? ": $in" : "");
- }
- $ok = 0;
- }
- if (!defined($out) || $out !~ /^\d+$/) {
- if (defined($oute)) {
- warn $switch->{'sysname'}.":$port: failed reading out ($oute)" . (defined($out) ? ": $out" : "");
- }
- $ok = 0;
- }
- if (!defined($ifdescr)) {
- warn $switch->{'sysname'}.":$port: failed reading ifdescr";
- $ok = 0;
- } elsif ($ifdescr =~ m/\./) {
- # Skip virtual ports
- $ok = 0;
- }
-
- if ($ok) {
- $qpoll->execute($switch->{'switch'}, $port, $in, $out, $ine, $oute,$operstatus,$ifdescr) || die "%s:%s: %s\n", $switch->{'switch'}, $port, $in;
- $dbh->commit;
- } else {
- warn $switch->{'sysname'} . " failed to OK.";
- }
-
- if (++$switch->{'num_done'} == $switch->{'num_ports'}) {
- --$running;
-
- my $elapsed = Time::HiRes::tv_interval($switch->{'start'});
- my $msg = sprintf "Polled $switch->{'ip'} in %5.3f seconds.", $elapsed;
- mylog($msg);
-
- $qunlock->execute($switch->{'switch'})
- or warn "Couldn't unlock switch";
- $dbh->commit;
- }
-}
diff --git a/clients/update-public-nms.sh b/clients/update-public-nms.sh
deleted file mode 100755
index 8d56251..0000000
--- a/clients/update-public-nms.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-YEAR=15
-TGMANAGE=/root/tgmanage
-DIR=/srv/www/nms-public.tg${YEAR}.gathering.org
-set -x
-mkdir -p $DIR
-
-wget -qO$DIR/nettkart-dhcp.png.new http://nms.tg${YEAR}.gathering.org/dhcpkart.pl
-wget -qO$DIR/led.txt.new http://nms.tg${YEAR}.gathering.org/led.pl
-mv $DIR/nettkart-dhcp.png.new $DIR/nettkart-dhcp.png
-mv $DIR/led.txt.new $DIR/led.txt
-/usr/bin/perl $TGMANAGE/clients/update-public-speedometer.pl > $DIR/speedometer.json.tmp
-mv $DIR/speedometer.json.tmp $DIR/speedometer.json
-
-/usr/bin/perl -i -pe 'use POSIX qw(strftime); my $timestamp = strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())); s/Sist oppdatert:.*/Sist oppdatert: $timestamp/g;' $DIR/dhcp.html
-/usr/bin/perl -i -pe 'use POSIX qw(strftime); my $timestamp = strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())); s/Sist oppdatert:.*/Sist oppdatert: $timestamp/g;' $DIR/trafikk.html
diff --git a/clients/update-public-speedometer.pl b/clients/update-public-speedometer.pl
deleted file mode 100755
index 7fd17df..0000000
--- a/clients/update-public-speedometer.pl
+++ /dev/null
@@ -1,37 +0,0 @@
-#! /usr/bin/perl -I/root/tgmanage/include
-use strict;
-use warnings;
-use lib 'include';
-use nms;
-use Data::Dumper::Simple;
-
-my $dbh = nms::db_connect();
-$dbh->{AutoCommit} = 0;
-
-# D-Links
-my $sth = $dbh->prepare("select sum(bytes_in) * 8 / 1048576.0 / 1024.0 as traffic_in, sum(bytes_out) * 8 / 1048576.0 / 1024.0 as traffic_out from get_current_datarate() natural join switches where switchtype like 'dlink3100%' and port < 45")
- or die "Can't prepare query: $!";
-$sth->execute();
-my $total_traffic_dlink = $sth->fetchrow_hashref();
-$sth->finish();
-
-# TeleGW
-$sth = $dbh->prepare("select sum(bytes_in) * 8 / 1048576.0 / 1024.0 as traffic_in, sum(bytes_out) * 8 / 1048576.0 / 1024.0 as traffic_out from get_current_datarate() natural join switches where sysname like '%TeleGW%' and (port=64 or port=65 or port=69 or port=70)")
- or die "Can't prepare query: $!";
-$sth->execute();
-my $total_traffic_telegw = $sth->fetchrow_hashref();
-$sth->finish();
-
-$dbh->disconnect();
-
-my $total = $total_traffic_dlink->{'traffic_in'} + $total_traffic_dlink->{'traffic_out'};
-$total += $total_traffic_telegw->{'traffic_in'} + $total_traffic_telegw->{'traffic_out'};
-
-# Now we have summarized in+out for clients and in+out for internet-traffic
-# We divide by two to get an average
-$total = $total / 2;
-my $nicetotal = sprintf ("%.2f", $total);
-
-# {"speed":19.12}
-print qq({"speed":$nicetotal});
-exit 0