/[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 275 - (hide annotations)
Thu Aug 20 17:35:44 2009 UTC (14 years, 8 months ago) by dpavlin
File size: 1567 byte(s)
use tag as identifier in url and strip path from it
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    
10 dpavlin 238 use server;
11    
12 dpavlin 230 our $port = 514;
13     our $MAXLEN = 1524;
14    
15 dpavlin 239 sub message {
16     my $sock = shift;
17 dpavlin 230
18     my $buf;
19 dpavlin 239 $sock->recv($buf, $MAXLEN);
20 dpavlin 238
21 dpavlin 239 next unless $buf;
22 dpavlin 238
23 dpavlin 239 my ($port, $ipaddr) = sockaddr_in($sock->peername);
24     my $log = {
25     ip => join('.', unpack('C4',$ipaddr)),
26     buf => $buf,
27     };
28 dpavlin 230
29 dpavlin 239 if ( $buf =~ s/<(\d+)>// ) {
30     $log->{pri} = $1 % 8;
31     $log->{facility} = ( $1 - $log->{pri} ) / 8;
32    
33     $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
34 dpavlin 230
35 dpavlin 239 if ( $buf =~ s/^([^:]+)\s*:\s*// ) {
36     my $tag = $1;
37     if ( $tag =~ m{^(\S+)\s(\S+)} ) {
38     $log->{tag} = $2;
39     $log->{hostname} = $1;
40     } else {
41     $log->{tag} = $tag;
42 dpavlin 238 }
43 dpavlin 230
44 dpavlin 239 if ( $log->{tag} =~ s/\[(\d+)\]$// ) {
45     $log->{pid} = $1;
46     } elsif ( $buf =~ s/^(\d+):\s*// ) {
47     $log->{pid} = $1;
48 dpavlin 238 }
49 dpavlin 239 }
50 dpavlin 238
51 dpavlin 275 $log->{tag} =~ s{^/.+/([^/]+)$}{$1};
52    
53 dpavlin 239 if ( $log->{tag} =~ m{CRON}i && $buf =~ m{^\((\w+)\) (.+) \((.+)\)$} ) {
54     $log->{cron} = {
55     user => $1,
56     command => $2,
57     argument => $3,
58     };
59 dpavlin 230 }
60    
61 dpavlin 247 if ( $buf =~ m{(init|error|mount|smart|usb|fs)}i ) {
62     $log->{category} = $1;
63     }
64    
65 dpavlin 239 $log->{message} = $buf;
66     }
67 dpavlin 238
68 dpavlin 239 warn "log ",dump( $log );
69 dpavlin 275 CouchDB::audit( $log->{tag}, $log );
70 dpavlin 239 }
71    
72     sub start {
73    
74     my $sock = IO::Socket::INET->new(
75     LocalPort => $port,
76     Proto => 'udp',
77     ReuseAddr => 1,
78     ) || die "can't listen to $port: $!";
79    
80     CouchDB::audit('start', { port => $port });
81    
82     while(1) {
83     message($sock);
84 dpavlin 238 server->refresh;
85 dpavlin 230 }
86     }
87    
88     1;

  ViewVC Help
Powered by ViewVC 1.1.26