From: John Runyon Date: Mon, 11 Mar 2024 17:09:50 +0000 (-0600) Subject: add oidentd support X-Git-Url: https://jfr.im/git/erebus.git/commitdiff_plain/39fd397aa800fa19cd743e4d87e36eaa3d8e055a add oidentd support --- diff --git a/bot.config.example b/bot.config.example index 933b34b..09b1ac2 100644 --- a/bot.config.example +++ b/bot.config.example @@ -21,6 +21,10 @@ pidfile = pidfile ; Wait for numeric 396 (hidden host) before joining channels? wait_for_hidden_host = 0 +; path to write bot's ident config (~/.oidentd.conf format) into +; empty or not supplied to disable +;oidentd_path = /home/erebus/.oidentd.conf + [autoloads] control = 1 eval = 0 diff --git a/bot.py b/bot.py index 8b58d39..138b2fc 100644 --- a/bot.py +++ b/bot.py @@ -4,7 +4,7 @@ # Erebus IRC bot - Author: John Runyon # "Bot" and "BotConnection" classes (handling a specific "arm") -import os, random, socket, struct, sys, threading, time, traceback +import os, random, socket, struct, sys, threading, time, traceback, fcntl from collections import deque if sys.version_info.major < 3: @@ -553,6 +553,7 @@ class BotConnection(object): self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 0, 0)) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self.socket.bind((self.bind, 0)) + self._write_oidentd() self.socket.connect((self.server, self.port)) return True def register(self): @@ -566,7 +567,9 @@ class BotConnection(object): return True def registered(self, done=False): - if done: self.state = 2 + if done: + self.state = 2 + self._unwrite_oidentd() return self.state == 2 def send(self, line): @@ -606,5 +609,33 @@ class BotConnection(object): return lines + def _format_oidentd(self): + ident = self.parent.user + fport = self.parent.port + from_ = self.bind + lport = self.socket.getsockname()[1] + if from_: + return 'fport %s from %s lport %s { reply "%s" }\n' % (fport, from_, lport, ident) + else: + return 'fport %s lport %s { reply "%s" }\n' % (fport, lport, ident) + def _write_oidentd(self): + path = self.parent.parent.cfg.get('erebus', 'oidentd_path') + if path is not None: + with open(path, 'a') as fh: + fcntl.lockf(fh, fcntl.LOCK_EX) + fh.write(self._format_oidentd()) + fcntl.lockf(fh, fcntl.LOCK_UN) + def _unwrite_oidentd(self): + path = self.parent.parent.cfg.get('erebus', 'oidentd_path') + if path is not None: + with open(path, 'r+') as fh: + fcntl.lockf(fh, fcntl.LOCK_EX) + data = fh.read() + newdata = data.replace(self._format_oidentd(), '') + fh.seek(0) + fh.write(newdata) + fh.truncate() + fcntl.lockf(fh, fcntl.LOCK_UN) + def __str__(self): return self.parent.nick def __repr__(self): return "" % (self.socket.fileno(), self.parent.nick)