Advertisement
cmptrwz

OSRF Nagios Service Check

May 22nd, 2012
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.80 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Getopt::Long;
  6. use OpenSRF::System;
  7. use OpenSRF::AppSession;
  8. use OpenSRF::Utils::JSON;
  9. use OpenSRF::EX qw(:try);
  10.  
  11. my $opt_osrf_config = '/openils/conf/opensrf_core.xml';
  12. my @services;
  13. my @routers;
  14.  
  15. GetOptions(
  16.     'osrf-config=s' => \$opt_osrf_config,
  17. );
  18.  
  19. try {
  20.     OpenSRF::System->bootstrap_client(config_file => $opt_osrf_config);
  21. } otherwise {
  22.     print "Bootstrap failed\n";
  23.     exit 2;
  24. };
  25.  
  26. sub prep_service_list {
  27.     my $session = OpenSRF::AppSession->create('opensrf.settings');
  28.     try {
  29.         $session->connect;
  30.     } otherwise {
  31.         print "Settings Connect Failed\n";
  32.         exit 2;
  33.     };
  34.     my $req = $session->request('opensrf.settings.xpath.get', '//activeapps/appname');
  35.     my $list = $req->recv;
  36.  
  37.     if(UNIVERSAL::isa($list,"Error")) {
  38.         print "Active Apps List Failed\n";
  39.         exit 2;
  40.     }
  41.  
  42.     $req->finish;
  43.     my %u_list = map { ($_ => 1) } @{$list->content};
  44.     @services = keys(%u_list);
  45.  
  46.     $session->finish;
  47.     $session->disconnect;
  48. }
  49.  
  50. sub prep_routers_list {
  51.     my $config = OpenSRF::Utils::Config->current;
  52.     foreach(@{$config->bootstrap->routers}) {
  53.         my $router = {};
  54.         $router->{name} = $_->{name};
  55.         $router->{domain} = $_->{domain};
  56.         $router->{services} = \@services unless $_->{services};
  57.         $router->{services} = $_->{services}->{service} if $_->{services};
  58.         push @routers, $router;
  59.     }
  60. }
  61.  
  62. sub check_routers {
  63.     my $conf = OpenSRF::Utils::Config->current;
  64.     foreach my $router (@routers) {
  65.         $conf->bootstrap->router_name($router->{name});
  66.         $conf->bootstrap->domain($router->{domain});
  67.         my $failed = 1;
  68.         # First, check the router to see what it claims to have active services-wise
  69.         my $session = OpenSRF::AppSession->create('router');
  70.         try {
  71.             $failed = 0 if $session->connect;
  72.         } otherwise {
  73.             $failed = 1;
  74.         };
  75.         if($session->state != $session->CONNECTED || $failed) {
  76.             $router->{online} = 0;
  77.             next;
  78.         }
  79.         my $req = $session->request('opensrf.router.info.class.list');
  80.         my $class_list = $req->recv;
  81.         $req->finish;
  82.  
  83.         if(UNIVERSAL::isa($class_list,"Error")) {
  84.             $session->finish;
  85.             $session->disconnect;
  86.             $router->{online} = 0;
  87.             next;
  88.         }
  89.         $router->{online} = 1;
  90.         $router->{checked} = 0;
  91.         $router->{pass} = 0;
  92.         $router->{failed} = [];
  93.         my %online_services = map { ($_ => 1) } @{$class_list->content};
  94.         foreach my $service (@{$router->{services}}) {
  95.             next unless grep { $service eq $_ } @services; # Skip services we aren't trying to run
  96.             my $passed = 0;
  97.             $router->{checked} += 1;
  98.             if($online_services{$service}) {
  99.                 my $session2 = OpenSRF::AppSession->create($service);
  100.                 try {
  101.                     $session2->connect;
  102.                 };
  103.                 if($session2->state == $session2->CONNECTED) {
  104.                     my $req2 = $session2->request('opensrf.system.echo.atomic','Test');
  105.                     my $testresult = $req2->recv;
  106.                     $req2->finish;
  107.                     $session2->finish;
  108.                     $session2->disconnect;
  109.                     $passed = 1 if @{$testresult->content}[0] eq 'Test';
  110.                 }
  111.             }
  112.             if($passed) {
  113.                 $router->{pass} += 1;
  114.             } else {
  115.                 push @{$router->{failed}}, $service;
  116.             }
  117.         }
  118.         $session->finish;
  119.         $session->disconnect;
  120.     }
  121. }
  122.  
  123. sub output_result {
  124.     my $checked_services = 0;
  125.     my $up_services = 0;
  126.     my @down_services;
  127.     my @down_routers;
  128.     my $retcode = 0;
  129.     foreach my $router (@routers) {
  130.         if(!$router->{online}) {
  131.             push @down_routers, $router->{domain};
  132.             next;
  133.         }
  134.         $checked_services += $router->{checked};
  135.         $up_services += $router->{pass};
  136.         foreach (@{$router->{failed}}) {
  137.             push @down_services, $router->{domain} . ':' . $_;
  138.         }
  139.     }
  140.     if(@down_routers) {
  141.         print "Router(s) Offline: " . join(', ', @down_routers) . "\n";
  142.         $retcode = 2;
  143.     } elsif ($checked_services != $up_services) {
  144.         print "Service(s) not responding\n";
  145.         $retcode = 2;
  146.     } else {
  147.         print "Routers/Services OK\n";
  148.     }
  149.     print "$_\n" foreach (@down_services);
  150.     exit $retcode;
  151. }
  152.  
  153. # CHEAT - We need SettingsClient to have cached stuff
  154. try {
  155.     OpenSRF::Utils::SettingsClient->new()->config_value('none');
  156. } otherwise {
  157.     print "Settings Fetch Failed\n";
  158.     exit 2;
  159. };
  160. prep_service_list();
  161. prep_routers_list();
  162. check_routers();
  163. output_result();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement