Add error checking in places, set up automatic relay provisioning and fix starting bots

This commit is contained in:
2019-08-25 21:29:11 +01:00
parent ff74968ff8
commit 2d70d5af11
19 changed files with 242 additions and 262 deletions

View File

@@ -14,6 +14,7 @@ from modules import monitor
from core.relay import sendRelayNotification
from utils.dedup import dedup
from utils.getrelay import getRelay
import main
from utils.logging.log import *
@@ -21,33 +22,34 @@ from utils.logging.send import *
from twisted.internet.ssl import DefaultOpenSSLContextFactory
def deliverRelayCommands(relay, relayCommands, user=None, stage2=None):
def deliverRelayCommands(num, relayCommands, user=None, stage2=None):
# where relay is a dictionary extracted from the Network object
keyFN = main.certPath+main.config["Key"]
certFN = main.certPath+main.config["Certificate"]
contextFactory = DefaultOpenSSLContextFactory(keyFN.encode("utf-8", "replace"),
certFN.encode("utf-8", "replace"))
bot = IRCBotFactory(None, relay, relayCommands, user, stage2)
rct = reactor.connectSSL(relay["host"],
int(relay["port"]),
bot = IRCBotFactory(net=None, num=num, relayCommands=relayCommands, user=user, stage2=stage2)
host, port = getRelay(num)
rct = reactor.connectSSL(host,
port,
bot, contextFactory)
class IRCRelay(IRCClient):
def __init__(self, relay, relayCommands, user, stage2):
def __init__(self, num, relayCommands, user, stage2):
self.connected = False
self.buffer = ""
if user == None:
self.user = relay["user"]
self.user = main.config["Relay"]["User"]
else:
self.user = user
password = relay["password"]
self.nickname = self.user
self.realname = self.user
password = main.config["Relay"]["Password"]
self.nickname = "relay"
self.realname = "relay"
self.username = self.user
self.password = self.user+":"+password
self.relayCommands = relayCommands
self.relay = relay
self.num = num
self.stage2 = stage2
def parsen(self, user):
@@ -67,15 +69,16 @@ class IRCRelay(IRCClient):
if nick[0] == main.config["Tweaks"]["ZNC"]["Prefix"]:
nick = nick[1:]
if nick in self.relayCommands.keys():
sendAll("[%s] %s -> %s" % (self.relay, nick, msg))
sendAll("[%s] %s -> %s" % (self.num, nick, msg))
def irc_ERR_PASSWDMISMATCH(self, prefix, params):
log("%s: relay password mismatch" % self.relay)
sendAll("%s: relay password mismatch" % self.relay)
print(', '.join("%s: %s" % item for item in vars(self).items()))
log("%s: relay password mismatch" % self.num)
sendAll("%s: relay password mismatch" % self.num)
def signedOn(self):
self.connected = True
log("signed on as a relay: %s" % self.relay)
log("signed on as a relay: %s" % self.num)
#sendRelayNotification("Relay", {"type": "conn", "status": "connected"}) nobody actually cares
for i in self.relayCommands.keys():
for x in self.relayCommands[i]:
@@ -85,25 +88,24 @@ class IRCRelay(IRCClient):
user = self.stage2[0].pop(0)
commands = self.stage2[0].pop(0)
del self.stage2[0]
deliverRelayCommands(self.relay, commands, user, self.stage2)
deliverRelayCommands(self.num, commands, user, self.stage2)
deferLater(reactor, 1, self.transport.loseConnection)
return
class IRCBot(IRCClient):
def __init__(self, name, relay):
def __init__(self, net, num):
self.connected = False
self.channels = []
self.net = "".join([x for x in name if not x in digits])
if self.net == "":
error("Network with all numbers: %s" % name)
self.net = net
self.num = num
self.buffer = ""
self.name = name
alias = relay["alias"]
self.name = net + str(num)
alias = main.network[self.net].aliases[num]
relay = main.network[self.net].relays[num]
self.nickname = alias["nick"]
self.realname = alias["realname"]
self.username = alias["nick"]+"/"+relay["net"]
self.password = relay["password"]
self.password = main.config["Relay"]["Password"]
self.userinfo = None
self.fingerReply = None
self.versionName = None
@@ -445,26 +447,30 @@ class IRCBot(IRCClient):
self.event(type="mode", muser=user, target=channel, modes=m, status=toset, modeargs=a)
class IRCBotFactory(ReconnectingClientFactory):
def __init__(self, name, relay=None, relayCommands=None, user=None, stage2=None):
if not name == None:
self.name = name
self.net = "".join([x for x in self.name if not x in digits])
def __init__(self, net, num=None, relayCommands=None, user=None, stage2=None):
if net == None:
self.num = num
self.name = "Relay to %i" % num
self.relay = True
else:
self.name = "Relay to "+relay["net"]+relay["id"]
self.name = net + str(num)
self.num = num
self.net = net
self.relay = False
self.client = None
self.maxDelay = main.config["Tweaks"]["Delays"]["MaxDelay"]
self.initialDelay = main.config["Tweaks"]["Delays"]["InitialDelay"]
self.factor = main.config["Tweaks"]["Delays"]["Factor"]
self.jitter = main.config["Tweaks"]["Delays"]["Jitter"]
self.relay, self.relayCommands, self.user, self.stage2 = relay, relayCommands, user, stage2
self.relayCommands, self.user, self.stage2 = relayCommands, user, stage2
def buildProtocol(self, addr):
if self.relay == None:
entry = IRCBot(self.name, self.relay)
main.IRCPool[self.name] = entry
if self.net == None:
entry = IRCRelay(self.num, self.relayCommands, self.user, self.stage2)
else:
entry = IRCRelay(self.relay, self.relayCommands, self.user, self.stage2)
entry = IRCBot(self.net, self.num)
main.IRCPool[self.name] = entry
self.client = entry
return entry

View File

@@ -108,7 +108,7 @@ class Relay(Protocol):
return
def connectionMade(self):
log("Connection from %s:%s" % (self.addr.host, self.addr.port))
log("Relay connection from %s:%s" % (self.addr.host, self.addr.port))
#self.send("Greetings.")
def connectionLost(self, reason):