store poll.* runtime data in redis
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 19 Mar 2011 20:45:00 +0000 (21:45 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 19 Mar 2011 21:09:59 +0000 (22:09 +0100)
Makefile.PL
bin/debian-install.sh
lib/APKPM/Davolink.pm
lib/APKPM/Poll.pm

index 527f888..bda893d 100644 (file)
@@ -11,6 +11,7 @@ WriteMakefile(
                'Mojolicious'  => 0.9003,
                'DBD::Pg' => 0,
                'Regexp::Common' => 0,
+               'Redis' => 0,
        },
        AUTHOR       => 'Dobrica Pavlinusic <dpavlin@rot13.org>',
 #      ABSTRACT_FROM => 'lib/APKPM.pm',
index 78ea2d7..5a294ea 100755 (executable)
@@ -6,5 +6,6 @@ sudo apt-get install \
        libdata-dump-perl \
        libregexp-common-perl \
        postgresql libdbd-pg-perl \
-       gnuplot-nox
+       gnuplot-nox \
+       redis-server libredis-perl
 
index 7e1dafa..b43f2b9 100644 (file)
@@ -23,7 +23,7 @@ sub info : Job : MinProcesses(1) : MaxProcesses(30) : Decode(d_array) : Encode(e
        return { error => "invalid workload", expected => 'cpe.ip username (uptime|adsl|wan|routes)', workload => $workload } unless $cpeip && $username;
 
        my $cpeconnect=H1::Davolink->new($cpeip,$self->config('iadusername'),$self->config('iadpasswd'));
-       $cpeconnect->connect();
+       $cpeconnect->connect() || return { error => "can't connect to $cpeip" };
        my $ret = { ip => $cpeip, username => $username };
        foreach my $param ( @$workload ) {
                if ( $param =~ m/uptime/i ) {
@@ -31,6 +31,8 @@ sub info : Job : MinProcesses(1) : MaxProcesses(30) : Decode(d_array) : Encode(e
                } elsif ( $param =~ m/adsl/i ) {
                        $ret->{ADSL} = { $cpeconnect->adsl_info };
                        $self->do_background_json( 'Store_ADSL', $ret );
+                       my $redis = Redis->new;
+                       $redis->sadd( 'poll.adsl.ok' => $cpeip );
                } elsif ( $param =~ m/wan/i ) {
                        $ret->{WAN} = [ $cpeconnect->wan_info ];
                } elsif ( $param =~ m/route/i ) {
@@ -39,6 +41,7 @@ sub info : Job : MinProcesses(1) : MaxProcesses(30) : Decode(d_array) : Encode(e
                        die "unknown param $param";
                }
        };
+
        return $ret;
 }
 
index e6f017a..040c726 100644 (file)
@@ -4,6 +4,7 @@ use base qw(Gearman::Driver::Worker);
 use Moose;
 use Time::HiRes;
 use Data::Dump qw(dump);
+use Redis;
 
 with 'APKPM::Gearman::Client';
 with 'APKPM::Gearman';
@@ -20,12 +21,16 @@ sub by_prefix : Job : MinProcesses(1) : MaxProcesses(1) : Encode(e_json) {
                $ip_username->{ $entry->{cn} } = $1 if $entry->{dhcpStatements} =~ m/fixed-address\s+(\S+)/;
        }
 
+       my $redis = Redis->new;
+       $redis->del( $_ ) foreach $redis->keys('poll.*');
+
        my $taskset = $self->gc->new_task_set;
        my $results;
        while (my ($username,$ip) = each %$ip_username) {
                $taskset->add_task('poll_ip_username', "$ip $username", {
                        on_complete => sub { push @$results, ${$_[0]} }
                });
+               $redis->sadd('poll.queued' => $ip);
        }
 
        warn "# wait";
@@ -42,8 +47,14 @@ sub ip_username : Job : MinProcesses(1) : MaxProcesses(25) : Decode(d_array) : E
        return { error => "invalid workload", expected => "ip username" } unless $ip && $username;
        my $ping = $self->do('ping', $ip);
 
+       my $redis = Redis->new;
+
        if ( exists $ping->{error} ) {
+warn "XXX error: $ip";
+               $redis->sadd( 'poll.ping.error' => $ip );
                return $ping;
+       } else {
+               $redis->sadd( 'poll.ping.ok' => $ip );
        }
 
        $ping->{username} = $username;