source: trunk/server/fedora/config/etc/syslog-ng/d_zroot.pl @ 1239

Last change on this file since 1239 was 1239, checked in by ezyang, 13 years ago
Have zroot also look in /mit/scripts/.ssh/authorized_keys. This is a temporary stopgap to get rid of scary UNKNOWN KEY spew when we push Xen configuration from a host.
  • Property svn:executable set to *
File size: 4.3 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5use Sys::Hostname;
6use Time::HiRes qw(ualarm);
7use File::Temp;
8
9our $ZCLASS = "scripts-auto";
10our @USERS = qw/root logview/;
11my $k5login;
12open $k5login, '/root/.k5login';
13our @RECIPIENTS = map {chomp; m|([^/@]*)| && $1} <$k5login>;
14close $k5login;
15
16our %USERS;
17@USERS{@USERS} = undef;
18
19sub zwrite($;$$@) {
20    my ($message, $class, $instance, @recipients) = @_;
21    $class ||= $ZCLASS;
22    $instance ||= 'root.'.hostname;
23    open(ZWRITE, "|-", qw|/usr/bin/zwrite -d -n -O log -c|, $class, '-i', $instance, '-s', hostname, @recipients) or die "Couldn't open zwrite";
24    print ZWRITE $message;
25    close(ZWRITE);
26}
27
28my %toclass;
29
30my %sshkeys;
31
32my %ips;
33
34sub buildKeyMap($) {
35    my ($file) = @_;
36    open (KEYS, $file) or warn "Couldn't open $file: $!";
37    while (<KEYS>) {
38        chomp;
39        my ($fingerprint, $comment) = parseKey($_);
40        $sshkeys{$fingerprint} = $comment;
41    }
42    close(KEYS);
43}
44
45sub parseKey($) {
46    my ($key) = @_;
47    my $tmp = new File::Temp;
48    print $tmp $key;
49    close $tmp;
50    open (KEYGEN, "-|", qw(/usr/bin/ssh-keygen -l -f), $tmp) or die "Couldn't call ssh-keygen: $!";
51    my ($line) = <KEYGEN>;
52    close(KEYGEN);
53    my (undef, $fingerprint, undef) = split(' ', $line, 3);
54    my (undef, undef, $comment) = split(' ', $key, 3);
55    #print "$fingerprint $comment";
56    return ($fingerprint, $comment);
57}
58
59buildKeyMap("/root/.ssh/authorized_keys");
60buildKeyMap("/root/.ssh/authorized_keys2");
61buildKeyMap("/mit/scripts/.ssh/authorized_keys");
62
63while (1) {
64    my @message = scalar(<>);
65    eval {
66        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
67        ualarm(500*1000);
68        while (<>) { push @message, $_; }
69    };
70    chomp @message;
71    map { s/^(.*?): // } @message;
72    %toclass = ();
73    foreach my $message (@message) {
74        sub sendmsg ($;$) {
75            my ($message, $class) = @_;
76            $class ||= $ZCLASS;
77            $toclass{$class} .= $message."\n";
78        }
79        if ($message =~ m|Accepted (\S+) for (\S+)|) {
80            sendmsg($message) if exists $USERS{$2}
81        } elsif ($message =~ m|Authorized to (\S+),|) {
82            sendmsg($message) if exists $USERS{$1};
83        } elsif ($message =~ m|Root (\S+) shell|) {
84            sendmsg($message);
85        } elsif ($message =~ m|session \S+ for user (\S+)|) {
86            sendmsg($message) if exists $USERS{$1};
87        } elsif ($message =~ m|^Found matching (\w+) key: (\S+)|) {
88            if ($sshkeys{$2}) {
89                sendmsg($message." (".$sshkeys{$2}.")");
90            } else {
91                sendmsg($message." (UNKNOWN KEY)");
92            }
93        } elsif ($message =~ m|^Failed keyboard-interactive/pam for root from ([^ ]*)|) {
94            my $count = ++$ips{$1};
95            if ($count % 10 == 0 or $1 =~ /^18\./) {
96                sendmsg($message." (repeated $count times)", "scripts-spew");
97            }
98        } elsif ($message =~ m|^Out of memory:|) {
99            sendmsg($message);
100        } elsif ($message =~ m|^giving \S+ admin rights|) {
101            sendmsg($message);
102        } elsif ($message =~ m|^Connection closed|) {
103            # Do nothing
104        } elsif ($message =~ m|^Closing connection to |) {
105        } elsif ($message =~ m|^Connection from (\S+) port (\S+)|) {
106        } elsif ($message =~ m|^Invalid user|) {
107        } elsif ($message =~ m|^input_userauth_request: invalid user|) {
108        } elsif ($message =~ m|^Received disconnect from|) {
109        } elsif ($message =~ m|^Postponed keyboard-interactive|) {
110        } elsif ($message =~ m|^fatal: Read from socket failed: Connection reset by peer$|) {
111        } elsif ($message =~ m|^reverse mapping checking getaddrinfo|) {
112        } elsif ($message =~ m|^pam_succeed_if\(sshd\:auth\)\:|) {
113        } elsif ($message =~ m|^error: PAM: Authentication failure|) {
114        } elsif ($message =~ m|^pam_unix\(sshd:auth\): authentication failure|) {
115        } elsif ($message =~ m|^Postponed keyboard-interactive for invalid user |) {
116        } elsif ($message =~ m|^Failed keyboard-interactive/pam for invalid user |) {
117        } elsif ($message =~ m|^Postponed gssapi-with-mic for |) {
118        } elsif ($message =~ m|^Address \S+ maps to \S+, but this does not map back to the address|) {
119        } elsif ($message =~ m|^User child is on pid \d+$|) {
120        } elsif ($message =~ m|^Transferred: sent \d+, received \d+ bytes$|) {
121        } elsif ($message =~ m|^Setting tty modes failed: Invalid argument$|) {
122        } else {
123            sendmsg($message, "scripts-spew");
124        }
125    }
126
127    foreach my $class (keys %toclass) {
128        if ($class eq "scripts-auto") {
129            zwrite($toclass{$class}, $class);
130        } else {
131            zwrite($toclass{$class}, $class, undef, @RECIPIENTS);
132        }
133    }
134}
Note: See TracBrowser for help on using the repository browser.