-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsyslog-stdout.py
executable file
·107 lines (95 loc) · 2.17 KB
/
syslog-stdout.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env python3
import sys
import socket
import os
bufsiz=2048
LOG_PRIMASK = 0x07
PRIMASK = {
0 : "emerg",
1 : "alert",
2 : "crit",
3 : "err",
4 : "warning",
5 : "notice",
6 : "info",
7 : "debug"
}
FACILITYMASK = {
0 : "kern",
1 : "user",
2 : "mail",
3 : "daemon",
4 : "auth",
5 : "syslog",
6 : "lpr",
7 : "news",
8 : "uucp",
9 : "cron",
10 : "authpriv",
11 : "ftp",
12 : "ntp",
13 : "security",
14 : "console",
15 : "mark",
16 : "local0",
17 : "local1",
18 : "local2",
19 : "local3",
20 : "local4",
21 : "local5",
22 : "local6",
23 : "local7",
}
def bit2string(number):
try:
return "%s.%s"%(FACILITYMASK[number>>3] , PRIMASK[number & LOG_PRIMASK])
except:
return "unknown.unknown"
class SyslogListener(object):
def datagramReceived(self,data):
"""strip priority tag"""
if data[2] == ">":
pri=bit2string(int(data[1]))
msg=data[3:]
elif data[3] == ">":
pri=bit2string(int(data[1:3]))
msg=data[4:]
else:
pri=None
msg=data
msg=msg.strip()
print("%s:%s"%(pri,msg))
sys.stdout.flush()
def listen(self):
try:
os.remove('/dev/log')
except:
pass
try:
sock = socket.socket( socket.AF_UNIX, socket.SOCK_DGRAM )
sock.bind("/dev/log")
self.sock=sock
except:
print("Socket error: (%s) %s" % ( sys.exc_info()[1][0], sys.exc_info()[1][1] ))
sys.exit(1)
while 1:
try:
data,addr=sock.recvfrom(bufsiz)
self.datagramReceived(data)
except KeyboardInterrupt:
self.shutdown()
return
except socket.error:
pass
def shutdown(self):
try:
self.sock.close()
except:
pass
try:
os.remove('/dev/log')
except:
pass
if __name__=='__main__':
lst = SyslogListener()
lst.listen()