/[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

Annotation of /lib/PXElator/syslogd.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 363 - (hide annotations)
Sun Aug 30 11:20:18 2009 UTC (14 years, 7 months ago) by dpavlin
File size: 1839 byte(s)
send local syslog messages to pxelator

1 dpavlin 230 package syslogd;
2    
3     use warnings;
4     use strict;
5    
6     use IO::Socket;
7     use Data::Dump qw/dump/;
8     use CouchDB;
9 dpavlin 363 use File::Slurp;
10 dpavlin 230
11 dpavlin 238 use server;
12    
13 dpavlin 230 our $port = 514;
14     our $MAXLEN = 1524;
15    
16 dpavlin 239 sub message {
17     my $sock = shift;
18 dpavlin 230
19     my $buf;
20 dpavlin 239 $sock->recv($buf, $MAXLEN);
21 dpavlin 238
22 dpavlin 239 next unless $buf;
23 dpavlin 238
24 dpavlin 239 my ($port, $ipaddr) = sockaddr_in($sock->peername);
25     my $log = {
26     ip => join('.', unpack('C4',$ipaddr)),
27     buf => $buf,
28     };
29 dpavlin 230
30 dpavlin 239 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 dpavlin 230
36 dpavlin 239 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 dpavlin 238 }
44 dpavlin 230
45 dpavlin 239 if ( $log->{tag} =~ s/\[(\d+)\]$// ) {
46     $log->{pid} = $1;
47     } elsif ( $buf =~ s/^(\d+):\s*// ) {
48     $log->{pid} = $1;
49 dpavlin 238 }
50 dpavlin 239 }
51 dpavlin 238
52 dpavlin 275 $log->{tag} =~ s{^/.+/([^/]+)$}{$1};
53    
54 dpavlin 239 if ( $log->{tag} =~ m{CRON}i && $buf =~ m{^\((\w+)\) (.+) \((.+)\)$} ) {
55     $log->{cron} = {
56     user => $1,
57     command => $2,
58     argument => $3,
59     };
60 dpavlin 230 }
61    
62 dpavlin 247 if ( $buf =~ m{(init|error|mount|smart|usb|fs)}i ) {
63     $log->{category} = $1;
64     }
65    
66 dpavlin 239 $log->{message} = $buf;
67     }
68 dpavlin 238
69 dpavlin 239 warn "log ",dump( $log );
70 dpavlin 275 CouchDB::audit( $log->{tag}, $log );
71 dpavlin 239 }
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     CouchDB::audit('start', { port => $port });
82    
83     while(1) {
84     message($sock);
85 dpavlin 238 server->refresh;
86 dpavlin 230 }
87     }
88    
89 dpavlin 363 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 dpavlin 230 1;

  ViewVC Help
Powered by ViewVC 1.1.26