/[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 230 by dpavlin, Sun Aug 16 22:23:55 2009 UTC revision 363 by dpavlin, Sun Aug 30 11:20:18 2009 UTC
# Line 6  use strict; Line 6  use strict;
6  use IO::Socket;  use IO::Socket;
7  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
8  use CouchDB;  use CouchDB;
9    use File::Slurp;
10    
11    use server;
12    
13  our $port = 514;  our $port = 514;
14  our $MAXLEN = 1524;  our $MAXLEN = 1524;
15    
16    sub message {
17            my $sock = shift;
18    
19            my $buf;
20            $sock->recv($buf, $MAXLEN);
21    
22            next unless $buf;
23    
24            my ($port, $ipaddr) = sockaddr_in($sock->peername);
25            my $log = {
26                    ip => join('.', unpack('C4',$ipaddr)),
27                    buf => $buf,
28            };
29    
30            if ( $buf =~ s/<(\d+)>// ) {
31                    $log->{pri}    = $1 % 8;
32                    $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
35    
36                    if ( $buf =~ s/^([^:]+)\s*:\s*// ) {
37                            my $tag = $1;
38                            if ( $tag =~ m{^(\S+)\s(\S+)} ) {
39                                    $log->{tag} = $2;
40                                    $log->{hostname} = $1;
41                            } else {
42                                    $log->{tag} = $tag;
43                            }
44    
45                            if ( $log->{tag} =~ s/\[(\d+)\]$// ) {
46                                    $log->{pid} = $1;
47                            } elsif ( $buf =~ s/^(\d+):\s*// ) {
48                                    $log->{pid} = $1;
49                            }
50                    }
51    
52                    $log->{tag} =~ s{^/.+/([^/]+)$}{$1};
53    
54                    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                    if ( $buf =~ m{(init|error|mount|smart|usb|fs)}i ) {
63                            $log->{category} = $1;
64                    }
65    
66                    $log->{message} = $buf;
67            }
68    
69            warn "log ",dump( $log );
70            CouchDB::audit( $log->{tag}, $log );
71    }
72    
73  sub start {  sub start {
74    
75          my $sock = IO::Socket::INET->new(          my $sock = IO::Socket::INET->new(
# Line 20  sub start { Line 80  sub start {
80    
81          CouchDB::audit('start', { port => $port });          CouchDB::audit('start', { port => $port });
82    
         my $buf;  
83          while(1) {          while(1) {
84                  $sock->recv($buf, $MAXLEN);                  message($sock);
85                  my ($port, $ipaddr) = sockaddr_in($sock->peername);                  server->refresh;
                 my $log = {  
                         ip => join('.', unpack('C4',$ipaddr)),  
                         hostname => gethostbyaddr($ipaddr, AF_INET),  
                         message => $buf,  
                 };  
   
                 if ( $buf =~ /<(\d+)>\s*(\S*)\s*:\s*(.*)/ ) {  
                         my $level = $1 % 8;  
   
                         my $overlay = {  
                                 message => $3,  
                                 level   => $level,  
                                 facility => ( $1-$level ) / 8,  
                                 program  => $2,  
                         };  
   
                         $log->{$_} = $overlay->{$_} foreach keys %$overlay;  
   
                         $log->{pid} = $1 if $log->{program} =~ s/\[(\d+)\]$//;  
                 }  
   
                 warn "log ",dump( $log );  
                 CouchDB::audit( 'syslog', $log );  
86          }          }
87    }
88    
89    sub install_local {
90            warn "# redirect local syslog to pxelator";
91            my $rsyslog = '/etc/rsyslog.d/pxelator.conf';
92            write_file $rsyslog, "*.*\t\@$server::ip\n";
93            system "( /etc/init.d/rsyslog stop ; sleep 2 ; /etc/init.d/rsyslog start ; rm $rsyslog ) &";
94  }  }
95    
96  1;  1;

Legend:
Removed from v.230  
changed lines
  Added in v.363

  ViewVC Help
Powered by ViewVC 1.1.26