]> git.sesse.net Git - nms/blobdiff - mbd/mbd.pl
Put the survey data into SQL.
[nms] / mbd / mbd.pl
index 6a7b767ca184053cec8f58ae0cecebc1855957ce..4b73ac9b4e1e484a1b20b28cc4d288664e657b6b 100644 (file)
@@ -9,6 +9,12 @@ require './access_list.pl';
 require './nets.pl';
 require './survey.pl';
 require './mbd.pm';
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+
+my ($dbh, $q);
 
 sub fhbits {
        my $bits = 0;
@@ -49,7 +55,7 @@ sub cache_cidrrange {
 
 open LOG, ">>", "mbd.log";
 
-my @ports = ( mbd::find_all_ports() , $Config::survey_port_low, $Config::survey_port_high );
+my @ports = ( mbd::find_all_ports() , $Config::survey_port_low .. $Config::survey_port_high );
 
 # Open a socket for each port
 my @socks = ();
@@ -78,8 +84,16 @@ while (1) {
                my $age = Time::HiRes::tv_interval($active_surveys{$sport}{start}, $now);
                if ($age > $Config::survey_time && $active_surveys{$sport}{active}) {
                        print "Survey for '" . $Config::access_list[$active_surveys{$sport}{entry}]->{name} . "'/" .
-                               $active_surveys{$sport}{dport} . ": " .  $active_surveys{$sport}{num} . " active servers.\n";
+                               $active_surveys{$sport}{dport} . ": " . $active_surveys{$sport}{num} . " active servers.\n";
                        $active_surveys{$sport}{active} = 0;
+       
+                       # (re)connect to the database if needed 
+                       if (!defined($dbh) || !$dbh->ping) {
+                               $dbh = nms::db_connect();
+                               $q = $dbh->prepare("INSERT INTO mbd_log (ts,game,port,description,active_servers) VALUES (CURRENT_TIMESTAMP,?,?,?,?)")
+                                       or die "Couldn't prepare query";
+                       }
+                       $q->execute($active_surveys{$sport}{entry}, $active_surveys{$sport}{dport}, $Config::access_list[$active_surveys{$sport}{entry}]->{name}, $active_surveys{$sport}{num});
                }
                if ($age > $Config::survey_time * 3.0) {
                        delete $active_surveys{$sport};
@@ -94,7 +108,7 @@ while (1) {
                my ($sport, $saddr) = sockaddr_in($addr);
                my ($dport, $daddr) = sockaddr_in(getsockname($sock));
                my $size = length($data);
-
+       
                # Check if this is a survey reply
                if ($dport >= $Config::survey_port_low && $dport <= $Config::survey_port_high) {
                        if (!exists($active_surveys{$dport})) {
@@ -110,17 +124,17 @@ while (1) {
 
                        next;
                }
-
+               
                # Rate limiting
                if (exists($last_sent{$saddr}{$dport})) {
                        my $elapsed = Time::HiRes::tv_interval($last_sent{$saddr}{$dport}, $now);
                        if ($elapsed < 1.0) {
                                print LOG "$dport $size 2\n";
                                print inet_ntoa($saddr), ", $dport, $size bytes => rate-limited ($elapsed secs since last)\n";
+                               next;
                        }
-                       next;
                }
-
+               
                # We don't get the packet's destination address, but I guess this should do...
                # Check against the ACL.
                my $pass = 0;