kannel.monitor
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:12k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. #!/usr/bin/perl
  2. #
  3. # This program is free software; you can redistribute it and/or
  4. # modify it under the terms of the GNU General Public License as
  5. # published by the Free Software Foundation; either version 2 of the
  6. # License, or (at your option) any later version.
  7. # This program is distributed in the hope that it will be useful,
  8. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. # General Public License for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with this program; if not, write to the Free Software
  13. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  14. # USA #
  15. #
  16. # Revision $Id: kannel.monitor,v 1.2 2002/08/06 09:03:50 stolj Exp $
  17. #
  18. # Ingo Brombach <brombach@wapme-systems.de>
  19. #use warnings;
  20. use LWP::UserAgent; 
  21. use XML::Parser;
  22. use Sys::Hostname;
  23. use Getopt::Std;
  24. getopts('P:s:p:f:n:ivhS',%opts);
  25. my $p = new XML::Parser(ErrorContext  => 2,
  26.                         Namespaces    => 1,
  27.                         ParseParamEnt => 1,
  28.                         Handlers      => {Start => &sthndl,
  29.                                           Char  => &chrhndl
  30.                                          }
  31.                         );
  32. local $scount=0; # SMS-Level - Counter
  33. local $bcount=0; # Box-Level - Counter 
  34. local $kannel_status;
  35. local $status_file='/tmp/kannel_monitor.status';
  36. local $qlimit=1; # Maximum Number of queued messages per minute
  37. local $port = ($opts{p}) ? $opts{p} : "13000";
  38. local $statussheet = ($opts{s}) ? $opts{s} : "status.xml";
  39. local $password = ($opts{P}) ? $opts{P} : "";
  40. local $http = ($opts{S}) ? "https" : "http";
  41. local @failures;
  42. &usage if ($opts{h}|| !($opts{f} || @ARGV));
  43. if ($opts{f}){
  44.     my $file=$opts{f};
  45.     die "Can磘 find '$file' : $!n" unless -f $file;
  46.     $p->parsefile ($file);
  47.     &show if $opts{i};
  48.     @failures=@{&analyze()};
  49. }
  50. else{
  51.     foreach $host (@ARGV){
  52. $url=$http."://".$host.":".$port."/".$statussheet."?password=".$password;
  53.          &info("# GET URL $url ... n");
  54.         my $ua = LWP::UserAgent->new(env_proxy => 1,
  55.                                   keep_alive => 1,
  56.                                   timeout => 10,
  57.                                   );
  58.         my $response=$ua->get($url)||
  59.         do { &err($host);&info("GET request to $host failed n");next};
  60.         &info("OKn");
  61.         if ((%{$response}->{'_content'})){
  62.             my $doc=%{$response}->{'_content'};
  63.             $p->parse($doc);
  64.         } # end if
  65.         else{do { &err($host);&info("GET request to $host failed n");next}}
  66.         &show if $opts{i};
  67.         push @failures, @{&analyze()};
  68.     }
  69.         
  70. } # end else
  71. if (@failures == 0) {
  72.     exit 0;
  73. }
  74. print "@failuresn" unless $opts{v};
  75. exit 1;
  76. ################
  77. ## End main
  78. ################
  79. sub usage{
  80.     $0 =~ s,.*/,,g;
  81.     my $program=$0;
  82.     printf("n");
  83. print <<"EOU";
  84. $program  --  Kannel monitoring module for 'mon'
  85.   This Perl script is a custom monitoring module for mon, the system monitoring
  86.   tool, see http://www.kernel.org/pub/software/admin/mon/. The module watchs for
  87.   availibility of the Kannel SMS gateway, basicaly it checks the state of the 
  88.   connected SMSC links. In case of an error it will returns the affected SMSC IDs
  89.   of the links.
  90.   2002-07-31 Ingo Brombach, <brombach@wapme-systems.de>
  91. USAGE:  $program [options] hosts...
  92.     
  93.   where options can be any of:
  94.   -h                this help message
  95.   -n "smsc-ids..."  a list of smsc-ids that should be ignored by the test
  96.   -s URI            the URI on the hosts containing the status-document (default: $statussheet)
  97.   -p port           the port to connect to (default: $port)
  98.   -S                use https:// scheme to access the URI (via SSLv3) (default: http://)
  99.   -P password       the status-password (default: $password)
  100.   -f file           local XML file to read (mainly for testing)
  101.   -v                verbose output
  102.   -i                info mode, displays the whole information to stdout
  103.   Examples: 
  104.     $program -i -v -n "smpp_foo smpp_bar" kannel.foobar.com
  105.     Checks out the status page status.xml (default) on kannel.foobar.com, 
  106.     port 13000 (default) without password. It lookes for the general 
  107.     status as well as for the status of the smsc-connections but ignores 
  108.     error on the smsc-ids smpp_foo and smpp_bar. The whole status is displayed. 
  109.     The failure messages are verbose.
  110.     $program -i -v -f status.xml -n "smpp_foo smpp_bar"
  111.     The same as above, but reading from a local status.xml file
  112.     $program -p 13001 -P secret kannel.foobar.com
  113.           
  114.     Looking for status on port 13001 with password "secret". Only failing 
  115.     smsc-ids are displayed.
  116.          
  117.     
  118. EOU
  119.     exit 1;
  120. }
  121. sub info { print STDERR @_ if $opts{v}; }     # Output Verbose-Modus
  122. sub err {
  123.     my $host=$_[0];
  124.     push @failures, $host;
  125. }
  126. sub pushall{
  127.     my @failures;
  128.     for ($count=1;$count>=0;$count++){
  129.         last unless (exists ${"smsc".$count}{id});
  130.         push @failures, ${"smsc".$count}{id};
  131.     } # end for
  132.     return @failures;
  133. }
  134. sub analyze{
  135.     my @failures;
  136.     # Bearerbox does not run:
  137.     #==============================
  138.     if (! $kannel_status || (split /,/,$kannel_status)[0] ne 'running'){
  139.         info "bearerbox is not runningn";
  140.         return &pushall; 
  141.     } # end if (Bearerbox)
  142.     # SMS-or WAPBox does not run:
  143.     #==============================
  144.     for ($count=1;$count>=0;$count++){
  145. if ($count==1 && ! %{"box".$count}->{'status'}){
  146.          info "No SMS- or WAP-Box is running!!n";
  147.     push @failures, "No SMS- or WAP-Box is running!!n";
  148. } #end if
  149. elsif ((%{"box".$count}->{'status'}
  150.        &&(split /s+/,%{"box".$count}->{'status'})[0] ne 'on-line')){
  151.     info %{"box".$count}->{'type'}." is not running!!n";
  152.     push @failures, hostname().": ".%{"box".$count}->{'type'}." is not running!!n";
  153. } # end elsif
  154.      last unless (%{"box".$count}->{'type'}
  155.      &&((%{"box".$count}->{'type'} eq 'smsbox')
  156.      || (%{"box".$count}->{'type'} eq 'wapbox')));
  157.     } # end for count (SMS-Box)
  158.     
  159.     # SMSC does not run:
  160.     #==============================    
  161.     for ($count=1;$count>=0;$count++){
  162.         last unless (exists ${"smsc".$count}{id});
  163.         if (${"smsc".$count}{id}){          
  164.             %exists->{${"smsc".$count}{id}}=1;
  165.             if ((split /s+/,${"smsc".$count}{status})[0] ne 'online'){
  166.             local $smsc_not;
  167.                 if ($opts{n}){
  168.                     foreach $smsc (split /s+/, $opts{n}){
  169.                         $smsc_not=1 if $smsc eq ${"smsc".$count}{id};
  170.                     } # end foreach smsc
  171.                 } # end if $opts{n}
  172.                 unless ($smsc_not){
  173.                     info "SMSC  ".${"smsc".$count}{id}.
  174.                         " is in status "".
  175.                         (split /s+/,${"smsc".$count}{status})[0].""n";
  176.                     push @failures, ${"smsc".$count}{id};
  177.                 } #end unless $smsc_not
  178.             } # end if split
  179.         } # end if smsc
  180.     } # end for count
  181.     # SMSC does not exist:
  182.     #==============================
  183.     if ($opts{n}){
  184.         foreach $arg (split /s+/, $opts{n}){
  185.             unless (exists %exists->{$arg}){
  186.                 info "$arg does not existn";
  187.                 push @failures, $arg;
  188.             } #end unless
  189.         } # end foreaceh
  190.     } # end of $opts{n} 
  191.             
  192.     # Kannel is queueing:
  193.     #==============================
  194.     open (STATUSFILE,"<$status_file") or
  195.         push @failures, hostname().": Could not open $status_file: $!";
  196.     local $warncount=0;
  197.     while (<STATUSFILE>){
  198.         my ($field,$value,$time,$diffmin);
  199.         ($field,$value,$time)=split /|/, $_,3;
  200.         $diffmin=(time - $time)/60;
  201.         
  202.         if ((%{"sms"}->{$field} - $value)/$diffmin >= $qlimit){
  203.             $warncount+=1;
  204.         } # end if
  205.     } # end while STATUSFILE
  206.     
  207.     if ($warncount){
  208.         return &pushall;
  209.         info "Kannel is queueing - please take a lookn";
  210.     }
  211.     close(STATUSFILE);
  212.     
  213.     open (STATUSFILE,">$status_file") or
  214.     push @failures, hostname().": Could not open $status_file: $!";    
  215.      foreach $field (keys %{"sms"}){
  216.          if ((split /_/,$field)[1]
  217.              &&(split /_/,$field)[1] eq 'queued'){
  218.              printf(STATUSFILE "%s|%s|%dn", 
  219.                     $field,%{"sms"}->{$field},time);
  220.          } # end if
  221.      } # end foreach
  222.     close(STATUSFILE);
  223.     return @failures;
  224. }
  225. sub show{
  226.      my $count=1;
  227.      my $bcount=1;
  228.     if ($kannel_status){
  229.         printf("============== Status ===================n");
  230.         printf("%sn", $kannel_status);
  231.         printf("=========================================n");
  232.     } # end elsif
  233.      printf("============SMS Overall==================n");
  234.      foreach $field (keys %{"sms"}){
  235.          printf("%s -> %sn", $field,%{"sms"}->{$field});
  236.      }
  237.      printf("=========================================n");
  238.      printf("=================BOXES===================n") 
  239.          if (exists ${"box".$bcount}{type});
  240.     while (exists ${"box".$bcount}{type}){
  241.         foreach $field (keys %{"box".$bcount}){
  242.             printf("%s -> %sn", $field,%{"box".$bcount}->{$field});
  243.         } # end foreach
  244.         ++$bcount;
  245.         printf("=========================================n");
  246.     } # end while
  247.     if (exists ${"smsc".$count}{id}){
  248.          printf("n================SMSC磗===================n");
  249.          printf("=========================================n") ;
  250.     }
  251.     while (exists ${"smsc".$count}{id}){
  252.         foreach $field (keys %{"smsc".$count}){
  253.             printf("%s -> %sn", $field,%{"smsc".$count}->{$field});
  254.         } # end foreach
  255.         printf("=========================================n");
  256.         ++$count;
  257.     } # end while
  258. } # End show
  259. sub sthndl {
  260.   my $xp = shift;
  261.   my $el = shift;
  262.   my $nm = $xp->namespace($el) ? "n1:$el" : $el;
  263.   $parent{$nm}=$xp->current_element;
  264. }  # End sthndl
  265. sub chrhndl {
  266.   my ($xp, $data) = @_;
  267.   my (@level);
  268.   my $value= sprintf("%sn",$xp->xml_escape($data, '>', "xD"));
  269.   my $level = $xp->current_element;
  270.   chomp $value;
  271.   if ($value!~/^s+$/){
  272.         while($level=%parent->{$level}){
  273.             unshift @level, $level;
  274.         }
  275.            
  276.         push @level, $xp->current_element;              
  277.        if (($level[0] eq 'gateway') && ($level[1] eq 'smscs') 
  278.            && ($level[2] eq 'smsc')&& ($level[3])){
  279.               ++$scount if $level[3] eq 'name';
  280.               ${"smsc".$scount}{$level[3]}=$value;
  281.           } # end if
  282.     
  283.         elsif (($level[0] eq 'gateway') && ($level[1] eq 'status')){
  284.             $kannel_status=$value;
  285.         } # end elsif
  286.         elsif (($level[0] eq 'gateway') && ($level[1] eq 'boxes')
  287.                && ($level[2] eq 'box')&& ($level[3])){
  288.               ++$bcount if $level[3] eq 'type';
  289.               ${"box".$bcount}{$level[3]}=$value;           
  290.         } # end elsif   
  291.         elsif (($level[0] eq 'gateway') && ($level[1] eq 'sms')){
  292.             if (($level[2] eq 'sent'||$level[2] eq 'received') && $level[3]){
  293.                 ${'sms'}{$level[2].'_'.$level[3]}=$value;
  294.             } # end if 
  295.             else{
  296.                 ${'sms'}{$level[2]}=$value;
  297.             } # end else
  298.         } # end elsif   
  299.     }
  300. }  # End chrhndl
  301. # Tell emacs that this is really a perl script
  302. #Local Variables:
  303. #Mode: perl
  304. #End: