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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (hide annotations)
Sat Apr 11 10:03:04 2009 UTC (14 years, 11 months ago) by dpavlin
File size: 2458 byte(s)
cleanup, insert version
1 dpavlin 1 #!/usr/bin/perl
2    
3     use warnings;
4     use strict;
5    
6     use IO::Socket;
7     use Data::Dump qw/dump/;
8 dpavlin 3 use DBI;
9 dpavlin 6 use Getopt::Long;
10 dpavlin 1
11     my $port = 514;
12    
13     my $MAXLEN = 1524;
14    
15 dpavlin 6 my $dsn = 'DBI:Pg:dbname=syslog;host=llin.lan';
16     my $user = 'dpavlin';
17     my $debug = 0;
18     my $schema = 0;
19     my $log = '/tmp/sysplog.log';
20 dpavlin 3
21 dpavlin 6 GetOptions(
22     'debug+' => \$debug,
23     'schema!' => \$schema,
24     'log=s' => \$log,
25     ) || die "usage: $0 --debug --schema\n";
26    
27 dpavlin 9 our $VERSION = '0.00';
28 dpavlin 1
29 dpavlin 6 my $sql_schema = q{
30    
31     CREATE TABLE facilities (
32     id serial,
33     name text,
34    
35     PRIMARY KEY(name)
36     );
37    
38     CREATE TABLE log (
39     id serial,
40     timestamp timestamp default now(),
41     ip inet not null,
42     hostname text not null,
43     message text,
44     level int,
45     facility int,
46     program text,
47     pid int,
48    
49     PRIMARY KEY (id)
50     );
51    
52     };
53    
54    
55     my $dbh = DBI->connect( $dsn, $user, '', { RaiseError => 1 } ) || die $DBI::errstr;
56    
57     if ( $schema ) {
58     $dbh->begin_work;
59    
60     $dbh->do( $_ ) foreach split(/;/, $sql_schema);
61    
62     my $sth = $dbh->prepare( q{
63     insert into facilities (name) values (?)
64     });
65    
66     $sth->execute( $_ ) foreach ( qw/
67     kernel user mail system security internal
68     printer news uucp clock
69     security2
70     ftp ntp
71     audit alert
72     clock2
73     local0 local1 local2 local3 local4 local5 local6 local7
74     / );
75    
76     warn "# created sql schema\n";
77    
78     $dbh->commit;
79     }
80    
81     my $sth_log_full = $dbh->prepare(qq{
82     insert into log
83     (ip,hostname,message,level,facility,program,pid)
84     values (?,?,?,?,?,?,?)
85     });
86    
87     my $sth_log_unparsed = $dbh->prepare(qq{
88     insert into log (ip,hostname,messsage) values (?,?,?)
89     });
90    
91    
92 dpavlin 1 my $sock = IO::Socket::INET->new(
93     LocalPort => $port,
94     Proto => 'udp'
95     # ReuseAddr => 1,
96     ) || die "can't listen to $port: $!";
97    
98 dpavlin 6 open(my $log_fh, '>>', $log) || die "can't open log $log: $!";
99     $log_fh->autoflush(1);
100     sub _log {
101     warn 'LOG ',dump( @_ ), $/ if $debug;
102     print $log_fh time() . '|' . join('|', @_), $/;
103     }
104 dpavlin 3
105 dpavlin 8 _log "INFO: listen on $port";
106    
107 dpavlin 1 my $rin = '';
108     my $buf;
109     while(1) {
110     $sock->recv($buf, $MAXLEN);
111     my ($port, $ipaddr) = sockaddr_in($sock->peername);
112     my $hostname = gethostbyaddr($ipaddr, AF_INET);
113     my $ip = join('.', unpack('C4',$ipaddr));
114 dpavlin 6 my @values = ( $ip, $hostname, $buf );
115 dpavlin 2
116 dpavlin 5 if ( $buf =~ /<(\d+)>\s*(\S*)\s*:\s*(.*)/ ) {
117 dpavlin 6 $values[2] = $3;
118     my $level = $1 % 8;
119     my $facility = ( $1-$level ) / 8;
120     my $program = $2;
121     my $pid = $1 if $program =~ s/\[(\d+)\]$//;
122     push @values, ( $level, $facility, $program, $pid );
123     $sth_log_full->execute( @values );
124 dpavlin 5 } else {
125 dpavlin 6 $sth_log_unparsed->execute( @values );
126 dpavlin 1 }
127 dpavlin 6 _log( @values );
128 dpavlin 1 }

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26