Support normal auth in gerritbot

This is a partial revert of 57a669d35d
which added SASL auth support but in the process removed normal auth. In
order to support OFTC which doesn't currentl do SASL we add back in
normal auth support while keeping SASL for OFTC should they add the
functionality.

Change-Id: I191ced962e91226d196e6fae728484d8cd7233e2
This commit is contained in:
Clark Boylan 2021-05-28 12:38:02 -07:00
parent 5f67ba2410
commit 6f78d6e52b
2 changed files with 82 additions and 22 deletions

View File

@ -15,8 +15,10 @@ when starting the bot. It should look like::
[ircbot] [ircbot]
nick=NICKNAME nick=NICKNAME
pass=PASSWORD pass=PASSWORD
server=irc.freenode.net use_sasl=False
server=irc.oftc.net
port=6697 port=6697
server_password=SERVERPASS
channel_config=/path/to/yaml/config (See below) channel_config=/path/to/yaml/config (See below)
[gerrit] [gerrit]

View File

@ -46,8 +46,10 @@ except Exception:
[ircbot] [ircbot]
nick=NICKNAME nick=NICKNAME
pass=PASSWORD pass=PASSWORD
server=irc.freenode.net use_sasl=True or False (Defaults to False)
server=irc.oftc.net
port=6697 port=6697
server_password=SERVERPASS
channel_config=/path/to/yaml/config channel_config=/path/to/yaml/config
pid=/path/to/pid_file pid=/path/to/pid_file
use_mqtt=True use_mqtt=True
@ -98,21 +100,7 @@ class Channel(object):
self.last_used = time.time() self.last_used = time.time()
class GerritBot(SASL, SSL, irc.bot.SingleServerIRCBot): class BaseGerritBot(SSL, irc.bot.SingleServerIRCBot):
def __init__(self, channels, nickname, password, server, port=6697):
super(GerritBot, self).__init__(
server_list=[(server, port)],
nickname=nickname,
realname=nickname,
ident_password=password)
self.all_channels = {}
for name in channels:
self.all_channels[name] = Channel(name)
self.joined_channels = {}
self.nickname = nickname
self.password = password
self.log = logging.getLogger('gerritbot')
def send(self, channel_name, msg): def send(self, channel_name, msg):
self.log.info('Sending "%s" to %s' % (msg, channel_name)) self.log.info('Sending "%s" to %s' % (msg, channel_name))
if channel_name not in self.joined_channels: if channel_name not in self.joined_channels:
@ -148,6 +136,58 @@ class GerritBot(SASL, SSL, irc.bot.SingleServerIRCBot):
self.connection.reconnect() self.connection.reconnect()
class NoSASLGerritBot(BaseGerritBot):
def __init__(self, channels, nickname, password, server, port=6697,
server_password=None):
super(NoSASLGerritBot, self).__init__(
server_list=[(server, port, server_password)],
nickname=nickname,
realname=nickname)
self.all_channels = {}
for name in channels:
self.all_channels[name] = Channel(name)
self.joined_channels = {}
self.nickname = nickname
self.password = password
self.log = logging.getLogger('gerritbot')
def on_nicknameinuse(self, connection, event):
self.log.info('Nick previously in use, recovering.')
connection.nick(connection.get_nickname() + "_")
connection.privmsg("nickserv", "identify %s " % self.password)
connection.privmsg("nickserv", "ghost %s %s" % (self.nickname,
self.password))
connection.privmsg("nickserv", "release %s %s" % (self.nickname,
self.password))
time.sleep(1)
connection.nick(self.nickname)
self.log.info('Nick previously in use, recovered.')
def on_welcome(self, connection, event):
self.log.info('Identifying with IRC server.')
connection.privmsg("nickserv", "identify %s " % self.password)
self.log.info('Identified with IRC server.')
self.joined_channels = {}
class SASLGerritBot(SASL, BaseGerritBot):
def __init__(self, channels, nickname, password, server, port=6697,
server_password=None):
super(SASLGerritBot, self).__init__(
channels=channels,
server_list=[(server, port)],
nickname=nickname,
realname=nickname,
ident_password=password)
self.all_channels = {}
for name in channels:
self.all_channels[name] = Channel(name)
self.joined_channels = {}
self.nickname = nickname
self.password = password
self.log = logging.getLogger('gerritbot')
class Gerrit(threading.Thread): class Gerrit(threading.Thread):
def __init__(self, ircbot, channel_config, server, def __init__(self, ircbot, channel_config, server,
username, port=29418, keyfile=None): username, port=29418, keyfile=None):
@ -455,11 +495,29 @@ def _main(config):
log.exception("Syntax error in chanel config file") log.exception("Syntax error in chanel config file")
raise raise
bot = GerritBot(channel_config.channels, if config.has_option('ircbot', 'use_sasl'):
use_sasl = config.getboolean('ircbot', 'use_sasl')
else:
use_sasl = False
if config.has_option('ircbot', 'server_password'):
server_password = config.get('ircbot', 'server_password')
else:
server_password = None
if use_sasl:
bot = SASLGerritBot(channel_config.channels,
config.get('ircbot', 'nick'), config.get('ircbot', 'nick'),
config.get('ircbot', 'pass'), config.get('ircbot', 'pass'),
config.get('ircbot', 'server'), config.get('ircbot', 'server'),
config.getint('ircbot', 'port')) config.getint('ircbot', 'port'),
server_password)
else:
bot = NoSASLGerritBot(channel_config.channels,
config.get('ircbot', 'nick'),
config.get('ircbot', 'pass'),
config.get('ircbot', 'server'),
config.getint('ircbot', 'port'),
server_password)
if config.has_option('ircbot', 'use_mqtt'): if config.has_option('ircbot', 'use_mqtt'):
use_mqtt = config.getboolean('ircbot', 'use_mqtt') use_mqtt = config.getboolean('ircbot', 'use_mqtt')
else: else: