Skip to content

Commit 2b446dd

Browse files
committed
Add basic Syslog UDP collector bot
Extremely basic, probably too slow, but simple and working Syslog collector over UDP.
1 parent 9bee232 commit 2b446dd

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

intelmq/bots/BOTS

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,17 @@
178178
"rsync_path": "<path>"
179179
}
180180
},
181+
"Syslog": {
182+
"description": "Receive Syslog messages.",
183+
"module": "intelmq.bots.collectors.syslog.collector",
184+
"parameters": {
185+
"ip": "0.0.0.0",
186+
"name": "Syslog",
187+
"port": 514,
188+
"protocol": "udp",
189+
"provider": "Syslog"
190+
}
191+
},
181192
"TCP": {
182193
"description": "Receive events by opening a TCP port (ex: from TCP Output of another IntelMQ instance).",
183194
"module": "intelmq.bots.collectors.tcp.collector",

intelmq/bots/collectors/syslog/__init__.py

Whitespace-only changes.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# -*- coding: utf-8 -*-
2+
"""Import Syslog messages
3+
4+
SPDX-FileCopyrightText: 2020 Linköping University <https://liu.se/>
5+
SPDX-License-Identifier: AGPL-3.0-or-later
6+
7+
One IntelMQ event per Syslog line. Multi-line Syslog messages are not
8+
supported.
9+
10+
Parameters:
11+
12+
ip: string, optional, bind IP (or wildcard, if not set)
13+
14+
name: string, optional, feed name, default "Syslog"
15+
16+
port: integer, optional, listen port, default 514
17+
18+
protocol: string, optional, default "udp". Only UDP is implemented
19+
currently.
20+
21+
provider: string, optional, feed provider name, default "Syslog"
22+
23+
"""
24+
25+
from intelmq.lib.bot import CollectorBot
26+
from intelmq.lib.exceptions import ConfigurationError
27+
28+
import socketserver
29+
30+
31+
class SyslogCollectorBot(CollectorBot):
32+
33+
def init(self):
34+
self.ip = getattr(self.parameters, 'ip', '0.0.0.0')
35+
self.name = getattr(self.parameters, 'name', 'Syslog')
36+
self.port = int(getattr(self.parameters, 'port', 514))
37+
self.protocol = getattr(self.parameters, 'protocol', 'udp').lower()
38+
if self.protocol not in ['udp']:
39+
raise ConfigurationError('Listen port',
40+
'Invalid protocol %s' % self.protocol)
41+
self.provider = getattr(self.parameters, 'provider', 'Syslog')
42+
43+
if self.protocol == 'udp':
44+
self.server = socketserver.UDPServer((self.ip, self.port), SyslogUDP)
45+
self.server.logger = self.logger
46+
self.server.send_message = self.send_message
47+
self.server.new_report = self.new_report
48+
self.logger.info("Listening on %s:%d/%s",
49+
self.ip, self.port, self.protocol)
50+
51+
def process(self):
52+
self.server.serve_forever()
53+
54+
55+
class SyslogUDP(socketserver.BaseRequestHandler):
56+
def handle(self):
57+
line = self.request[0].strip()
58+
self.server.logger.debug("Received event from %s", self.client_address)
59+
report = self.server.new_report()
60+
report.add('raw', line)
61+
self.server.send_message(report)
62+
self.finish()
63+
64+
65+
BOT = SyslogCollectorBot

0 commit comments

Comments
 (0)