/[pxelator]/lib/PXElator/syslogd.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/PXElator/syslogd.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 238 by dpavlin, Mon Aug 17 00:45:41 2009 UTC revision 482 by dpavlin, Sat Jan 23 18:31:14 2010 UTC
# Line 5  use strict; Line 5  use strict;
5    
6  use IO::Socket;  use IO::Socket;
7  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
8  use CouchDB;  use store;
9    use File::Slurp;
10    
11  use server;  use server;
12    
13  our $port = 514;  our $port = 514;
14  our $MAXLEN = 1524;  our $MAXLEN = 1524;
15    
16  sub start {  sub message {
17            my $sock = shift;
         my $sock = IO::Socket::INET->new(  
                 LocalPort => $port,  
                 Proto => 'udp',  
                 ReuseAddr => 1,  
         ) || die "can't listen to $port: $!";  
   
         CouchDB::audit('start', { port => $port });  
18    
19          my $buf;          my $buf;
20          while(1) {          $sock->recv($buf, $MAXLEN);
                 $sock->recv($buf, $MAXLEN);  
21    
22                  next unless $buf;          next unless $buf;
23    
24                  my ($port, $ipaddr) = sockaddr_in($sock->peername);          my ($port, $ipaddr) = sockaddr_in($sock->peername);
25                  my $log = {          my $log = {
26                          ip => join('.', unpack('C4',$ipaddr)),                  ip => join('.', unpack('C4',$ipaddr)),
27                          buf => $buf,                  buf => $buf,
28                  };          };
29    
30                  if ( $buf =~ s/<(\d+)>// ) {          if ( $buf =~ s/<(\d+)>// ) {
31                          $log->{pri}    = $1 % 8;                  $log->{pri}    = $1 % 8;
32                          $log->{facility} = ( $1 - $log->{pri} ) / 8;                  $log->{facility} = ( $1 - $log->{pri} ) / 8;
33                            
34                          $log->{timestamp} = $1 if $buf =~ s/^(\w\w\w\s+\d+\s+\d\d:\d\d:\d\d)\s*//;      # strip timestamp which some syslog servers insert here                  $log->{timestamp} = $1 if $buf =~ s/^(\w\w\w\s+\d+\s+\d\d:\d\d:\d\d)\s*//;      # strip timestamp which some syslog servers insert here
35    
36                          if ( $buf =~ s/^([^:]+)\s*:\s*// ) {                  if ( $buf =~ s/^([^:]+)\s*:\s*// ) {
37                                  my $tag = $1;                          my $tag = $1;
38                                  if ( $tag =~ m{^(\S+)\s(\S+)} ) {                          if ( $tag =~ m{^(\S+)\s(\S+)} ) {
39                                          $log->{tag} = $2;                                  $log->{tag} = $2;
40                                          $log->{hostname} = $1;                                  $log->{hostname} = $1;
41                                  } else {                          } else {
42                                          $log->{tag} = $tag;                                  $log->{tag} = $tag;
                                 }  
   
                                 if ( $log->{tag} =~ s/\[(\d+)\]$// ) {  
                                         $log->{pid} = $1;  
                                 } elsif ( $buf =~ s/^(\d+):\s*// ) {  
                                         $log->{pid} = $1;  
                                 }  
43                          }                          }
44    
45                          if ( $log->{tag} =~ m{CRON}i && $buf =~ m{^\((\w+)\) (.+) \((.+)\)$} ) {                          if ( $log->{tag} =~ s/\[(\d+)\]$// ) {
46                                  $log->{cron} = {                                  $log->{pid} = $1;
47                                          user => $1,                          } elsif ( $buf =~ s/^(\d+):\s*// ) {
48                                          command => $2,                                  $log->{pid} = $1;
                                         argument => $3,  
                                 };  
49                          }                          }
50                    }
51    
52                    $log->{tag} =~ s{^/.+/([^/]+)$}{$1};
53    
54                          $log->{message} = $buf;                  if ( $log->{tag} =~ m{CRON}i && $buf =~ m{^\((\w+)\) (.+) \((.+)\)$} ) {
55                            $log->{cron} = {
56                                    user => $1,
57                                    command => $2,
58                                    argument => $3,
59                            };
60                  }                  }
61    
62                  warn "log ",dump( $log );                  if ( $buf =~ m{(init|error|mount|smart|usb|fs)}i ) {
63                  CouchDB::audit( 'syslog', $log );                          $log->{category} = $1;
64                    }
65    
66                    $log->{message} = $buf;
67            }
68    
69            warn "log ",dump( $log );
70            store::audit( $log->{tag}, $log );
71    }
72    
73    sub start {
74    
75            my $sock = IO::Socket::INET->new(
76                    LocalPort => $port,
77                    Proto => 'udp',
78                    ReuseAddr => 1,
79            ) || die "can't listen to $port: $!";
80    
81            store::audit('start', { port => $port });
82    
83            while(1) {
84                    message($sock);
85                  server->refresh;                  server->refresh;
86          }          }
87    }
88    
89    sub install_local {
90            my $rsyslog = '/etc/rsyslog.d';
91            return unless -d $rsyslog;
92            $rsyslog .= '/pxelator.conf';
93            warn "# redirect local syslog to pxelator using $rsyslog";
94            write_file $rsyslog, "*.*\t\@$server::ip\n";
95            system "( /etc/init.d/rsyslog stop ; sleep 2 ; /etc/init.d/rsyslog start ; rm $rsyslog ) &";
96  }  }
97    
98  1;  1;

Legend:
Removed from v.238  
changed lines
  Added in v.482

  ViewVC Help
Powered by ViewVC 1.1.26