Implement indexing into Apache Druid #1

Closed
m wants to merge 263 commits from druid into master
59 changed files with 538 additions and 198 deletions
Showing only changes of commit 8b9ad05089 - Show all commits

View File

@ -2,12 +2,11 @@ import functools
from json import JSONDecodeError, dumps, loads from json import JSONDecodeError, dumps, loads
from string import digits from string import digits
from klein import Klein
from twisted.web.server import Request
import main import main
from klein import Klein
from modules import chankeep, helpers, provision, regproc, userinfo from modules import chankeep, helpers, provision, regproc, userinfo
from modules.network import Network from modules.network import Network
from twisted.web.server import Request
from utils.logging.log import warn from utils.logging.log import warn
@ -217,7 +216,12 @@ class API(object):
for net_name in nets: for net_name in nets:
conns = helpers.get_connected_relays(net_name) conns = helpers.get_connected_relays(net_name)
if not conns: if not conns:
return dumps({"success": False, "reason": f"failed to get instances for {net_name}."}) return dumps(
{
"success": False,
"reason": f"failed to get instances for {net_name}.",
}
)
if func == "recheckauth": if func == "recheckauth":
for conn in conns: for conn in conns:
conn.regPing(reset=True) conn.regPing(reset=True)
@ -279,18 +283,24 @@ class API(object):
elif item == "last": elif item == "last":
last = data[item][0] last = data[item][0]
if not last.isdigit(): if not last.isdigit():
return dumps({"success": False, "reason": "invalid last: not a number."}) return dumps(
{"success": False, "reason": "invalid last: not a number."}
)
elif item == "port": elif item == "port":
port = data[item][0] port = data[item][0]
if not port.isdigit(): if not port.isdigit():
return dumps({"success": False, "reason": "invalid port: not a number."}) return dumps(
{"success": False, "reason": "invalid port: not a number."}
)
port = int(port) port = int(port)
elif item == "chanlimit": elif item == "chanlimit":
chanlimit = data[item][0] chanlimit = data[item][0]
if chanlimit == "None": if chanlimit == "None":
chanlimit = None chanlimit = None
elif not chanlimit.isdigit(): elif not chanlimit.isdigit():
return dumps({"success": False, "reason": "invalid chanlimit: not a number."}) return dumps(
{"success": False, "reason": "invalid chanlimit: not a number."}
)
else: else:
chanlimit = int(chanlimit) chanlimit = int(chanlimit)
online_relays = helpers.get_connected_relays(net) online_relays = helpers.get_connected_relays(net)
@ -324,9 +334,16 @@ class API(object):
if item == "net": if item == "net":
net = data[item] net = data[item]
if net in main.network.keys(): if net in main.network.keys():
return dumps({"success": False, "reason": "network already exists."}) return dumps(
{"success": False, "reason": "network already exists."}
)
if set(net).intersection(set(digits)): if set(net).intersection(set(digits)):
return dumps({"success": False, "reason": "network name cannot contain numbers."}) return dumps(
{
"success": False,
"reason": "network name cannot contain numbers.",
}
)
elif item == "auth": elif item == "auth":
auth = data[item] auth = data[item]
if auth not in ["sasl", "ns", "none"]: if auth not in ["sasl", "ns", "none"]:
@ -336,7 +353,9 @@ class API(object):
elif item == "port": elif item == "port":
port = data[item] port = data[item]
if not port.isdigit(): if not port.isdigit():
return dumps({"success": False, "reason": "invalid port: not a number."}) return dumps(
{"success": False, "reason": "invalid port: not a number."}
)
port = int(port) port = int(port)
elif item == "security": elif item == "security":
security = data[item] security = data[item]
@ -408,7 +427,9 @@ class API(object):
num = int(num) num = int(num)
net_inst = main.network[net] net_inst = main.network[net]
if num in net_inst.relays: if num in net_inst.relays:
return dumps({"success": False, "reason": "network already has this relay."}) return dumps(
{"success": False, "reason": "network already has this relay."}
)
id, alias = net_inst.add_relay(num) id, alias = net_inst.add_relay(num)
main.saveConf("network") main.saveConf("network")
return dumps({"success": True, "id": id, "alias": alias}) return dumps({"success": True, "id": id, "alias": alias})
@ -433,7 +454,9 @@ class API(object):
num = int(num) num = int(num)
net_inst = main.network[net] net_inst = main.network[net]
if num not in net_inst.relays: if num not in net_inst.relays:
return dumps({"success": False, "reason": "network does not have this relay."}) return dumps(
{"success": False, "reason": "network does not have this relay."}
)
net_inst.delete_relay(num) net_inst.delete_relay(num)
main.saveConf("network") main.saveConf("network")
return dumps({"success": True}) return dumps({"success": True})
@ -448,7 +471,9 @@ class API(object):
num = int(num) num = int(num)
net_inst = main.network[net] net_inst = main.network[net]
if num not in net_inst.relays: if num not in net_inst.relays:
return dumps({"success": False, "reason": "network does not have this relay."}) return dumps(
{"success": False, "reason": "network does not have this relay."}
)
provision.provisionRelay(num, net) provision.provisionRelay(num, net)
return dumps({"success": True}) return dumps({"success": True})
@ -465,7 +490,11 @@ class API(object):
net_chans = main.IRCPool[name].channels net_chans = main.IRCPool[name].channels
channels_annotated = userinfo.getUserNum(net, net_chans) channels_annotated = userinfo.getUserNum(net, net_chans)
for channel in net_chans: for channel in net_chans:
channel_inst = {"name": channel, "users": channels_annotated[channel], "num": num} channel_inst = {
"name": channel,
"users": channels_annotated[channel],
"num": num,
}
channels.append(channel_inst) channels.append(channel_inst)
# channels[channel] = channels_annotated[channel] # channels[channel] = channels_annotated[channel]
@ -504,7 +533,9 @@ class API(object):
return dumps({"success": False, "reason": "no such net."}) return dumps({"success": False, "reason": "no such net."})
joined = chankeep.joinSingle(net, channel) joined = chankeep.joinSingle(net, channel)
if not joined: if not joined:
return dumps({"success": False, "reason": "could not allocate channel to relay."}) return dumps(
{"success": False, "reason": "could not allocate channel to relay."}
)
return dumps({"success": True, "relays": joined}) return dumps({"success": True, "relays": joined})
@app.route("/irc/network/<net>/channel/<channel>/", methods=["PUT"]) @app.route("/irc/network/<net>/channel/<channel>/", methods=["PUT"])
@ -514,7 +545,9 @@ class API(object):
return dumps({"success": False, "reason": "no such net."}) return dumps({"success": False, "reason": "no such net."})
joined = chankeep.joinSingle(net, channel) joined = chankeep.joinSingle(net, channel)
if not joined: if not joined:
return dumps({"success": False, "reason": "could not allocate channel to relay."}) return dumps(
{"success": False, "reason": "could not allocate channel to relay."}
)
return dumps({"success": True, "relays": joined}) return dumps({"success": True, "relays": joined})
@app.route("/aliases/", methods=["GET"]) @app.route("/aliases/", methods=["GET"])
@ -563,7 +596,12 @@ class API(object):
provision.provisionRelay(num, net) provision.provisionRelay(num, net)
main.saveConf("network") main.saveConf("network")
return dumps({"success": True, "message": f"created relay {num} with alias {alias} on {net}"}) return dumps(
{
"success": True,
"message": f"created relay {num} with alias {alias} on {net}",
}
)
@app.route("/irc/list/<net>/", methods=["POST"]) @app.route("/irc/list/<net>/", methods=["POST"])
@login_required @login_required
@ -572,9 +610,16 @@ class API(object):
return dumps({"success": False, "reason": "no such net."}) return dumps({"success": False, "reason": "no such net."})
first_relay = helpers.get_first_relay(net) first_relay = helpers.get_first_relay(net)
if not first_relay: if not first_relay:
return dumps({"success": False, "reason": f"could not get first relay for {net}"}) return dumps(
{"success": False, "reason": f"could not get first relay for {net}"}
)
first_relay.list() first_relay.list()
return dumps({"success": True, "message": f"requested list with instance {first_relay.num} of {net}"}) return dumps(
{
"success": True,
"message": f"requested list with instance {first_relay.num} of {net}",
}
)
@app.route("/irc/list/<net>/", methods=["GET"]) @app.route("/irc/list/<net>/", methods=["GET"])
@login_required @login_required
@ -623,7 +668,9 @@ class API(object):
main.IRCPool[name].sendmsg(nick, msg, in_query=in_query) main.IRCPool[name].sendmsg(nick, msg, in_query=in_query)
else: else:
main.IRCPool[name].sendmsg(channel, msg, in_query=in_query) main.IRCPool[name].sendmsg(channel, msg, in_query=in_query)
return dumps({"success": True, "message": f"sent message to {channel} on {name}"}) return dumps(
{"success": True, "message": f"sent message to {channel} on {name}"}
)
@app.route("/irc/nick/<net>/<num>/", methods=["GET"]) @app.route("/irc/nick/<net>/<num>/", methods=["GET"])
@login_required @login_required

View File

@ -6,7 +6,9 @@ class AdmallCommand:
def __init__(self, *args): def __init__(self, *args):
self.admall(*args) self.admall(*args)
def admall(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def admall(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length > 2: if length > 2:
for i in main.network.keys(): for i in main.network.keys():

View File

@ -1,14 +1,15 @@
from yaml import dump
import main import main
from modules import alias from modules import alias
from yaml import dump
class AliasCommand: class AliasCommand:
def __init__(self, *args): def __init__(self, *args):
self.alias(*args) self.alias(*args)
def alias(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def alias(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
info(dump(main.alias)) info(dump(main.alias))

View File

@ -6,7 +6,9 @@ class AllCommand:
def __init__(self, *args): def __init__(self, *args):
self.all(*args) self.all(*args)
def all(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def all(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length > 2: if length > 2:
for i in main.network.keys(): for i in main.network.keys():
@ -15,7 +17,10 @@ class AllCommand:
net = main.network[i].relays[x]["net"] net = main.network[i].relays[x]["net"]
alias = main.alias[x]["nick"] alias = main.alias[x]["nick"]
commands = {spl[1]: [" ".join(spl[2:])]} commands = {spl[1]: [" ".join(spl[2:])]}
success("Sending commands to relay %s as user %s" % (num, alias + "/" + net)) success(
"Sending commands to relay %s as user %s"
% (num, alias + "/" + net)
)
deliverRelayCommands(num, commands, user=alias + "/" + net) deliverRelayCommands(num, commands, user=alias + "/" + net)
return return
else: else:

View File

@ -6,7 +6,9 @@ class AllcCommand:
def __init__(self, *args): def __init__(self, *args):
self.allc(*args) self.allc(*args)
def allc(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def allc(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length > 4: if length > 4:
targets = [] targets = []
@ -20,7 +22,8 @@ class AllcCommand:
[ [
targets.append((i, x)) targets.append((i, x))
for x in main.alias.keys() for x in main.alias.keys()
if main.alias[x]["nick"] == spl[2] and x in main.network[i].aliases.keys() if main.alias[x]["nick"] == spl[2]
and x in main.network[i].aliases.keys()
] ]
else: else:
incUsage("allc") incUsage("allc")
@ -33,7 +36,10 @@ class AllcCommand:
num = i[1] num = i[1]
alias = main.alias[num]["nick"] alias = main.alias[num]["nick"]
commands = {spl[3]: [" ".join(spl[4:])]} commands = {spl[3]: [" ".join(spl[4:])]}
success("Sending commands to relay %i as user %s" % (num, alias + "/" + net)) success(
"Sending commands to relay %i as user %s"
% (num, alias + "/" + net)
)
deliverRelayCommands(num, commands, user=alias + "/" + net) deliverRelayCommands(num, commands, user=alias + "/" + net)
return return
else: else:

View File

@ -5,7 +5,9 @@ class AuthcheckCommand:
def __init__(self, *args): def __init__(self, *args):
self.authcheck(*args) self.authcheck(*args)
def authcheck(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def authcheck(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
results = [] results = []
@ -13,7 +15,9 @@ class AuthcheckCommand:
num = main.IRCPool[i].num num = main.IRCPool[i].num
net = main.IRCPool[i].net net = main.IRCPool[i].net
if not main.IRCPool[i].authenticated: if not main.IRCPool[i].authenticated:
results.append("%s - %s: %s" % (net, num, main.alias[num]["nick"])) results.append(
"%s - %s: %s" % (net, num, main.alias[num]["nick"])
)
info("\n".join(results)) info("\n".join(results))
return return
elif length == 2: elif length == 2:
@ -27,7 +31,9 @@ class AuthcheckCommand:
if not net == spl[1]: if not net == spl[1]:
continue continue
if not main.IRCPool[i].authenticated: if not main.IRCPool[i].authenticated:
results.append("%s - %s: %s" % (net, num, main.alias[num]["nick"])) results.append(
"%s - %s: %s" % (net, num, main.alias[num]["nick"])
)
info("\n".join(results)) info("\n".join(results))
return return
else: else:

View File

@ -6,7 +6,9 @@ class AutoCommand:
def __init__(self, *args): def __init__(self, *args):
self.auto(*args) self.auto(*args)
def auto(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def auto(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
for i in main.network.keys(): for i in main.network.keys():
@ -14,9 +16,15 @@ class AutoCommand:
info("Skipping %s - first relay exists" % i) info("Skipping %s - first relay exists" % i)
else: else:
num, alias = main.network[i].add_relay(1) num, alias = main.network[i].add_relay(1)
success("Successfully created first relay on network %s with alias %s" % (i, alias)) success(
"Successfully created first relay on network %s with alias %s"
% (i, alias)
)
provision.provisionRelay(num, i) provision.provisionRelay(num, i)
success("Started provisioning network %s on first relay for alias %s" % (i, alias)) success(
"Started provisioning network %s on first relay for alias %s"
% (i, alias)
)
main.saveConf("network") main.saveConf("network")
return return
elif length == 2: elif length == 2:
@ -27,9 +35,15 @@ class AutoCommand:
failure("First relay exists on %s" % spl[1]) failure("First relay exists on %s" % spl[1])
return return
num, alias = main.network[spl[1]].add_relay(1) num, alias = main.network[spl[1]].add_relay(1)
success("Successfully created relay %i on network %s with alias %s" % (num, spl[1], alias)) success(
"Successfully created relay %i on network %s with alias %s"
% (num, spl[1], alias)
)
provision.provisionRelay(num, spl[1]) provision.provisionRelay(num, spl[1])
success("Started provisioning network %s on relay %s for alias %s" % (spl[1], num, alias)) success(
"Started provisioning network %s on relay %s for alias %s"
% (spl[1], num, alias)
)
main.saveConf("network") main.saveConf("network")
return return
else: else:

View File

@ -1,13 +1,14 @@
from yaml import dump
import main import main
from yaml import dump
class BlacklistCommand: class BlacklistCommand:
def __init__(self, *args): def __init__(self, *args):
self.blacklist(*args) self.blacklist(*args)
def blacklist(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def blacklist(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
info(dump(main.blacklist)) info(dump(main.blacklist))

View File

@ -5,7 +5,9 @@ class ChansCommand:
def __init__(self, *args): def __init__(self, *args):
self.chans(*args) self.chans(*args)
def chans(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def chans(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if len(spl) < 2: if len(spl) < 2:
incUsage("chans") incUsage("chans")

View File

@ -5,7 +5,9 @@ class CmdCommand:
def __init__(self, *args): def __init__(self, *args):
self.cmd(*args) self.cmd(*args)
def cmd(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def cmd(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length > 4: if length > 4:
if not spl[1].isdigit(): if not spl[1].isdigit():

View File

@ -6,7 +6,9 @@ class ConfirmCommand:
def __init__(self, *args): def __init__(self, *args):
self.confirm(*args) self.confirm(*args)
def confirm(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def confirm(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 4: if length == 4:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():
@ -19,7 +21,10 @@ class ConfirmCommand:
failure("No such relay on %s: %s" % (spl[1], spl[2])) failure("No such relay on %s: %s" % (spl[1], spl[2]))
return return
regproc.confirmAccount(spl[1], int(spl[2]), spl[3]) regproc.confirmAccount(spl[1], int(spl[2]), spl[3])
success("Requested confirmation on %s - %s with token %s" % (spl[1], spl[2], spl[3])) success(
"Requested confirmation on %s - %s with token %s"
% (spl[1], spl[2], spl[3])
)
return return
else: else:
incUsage("confirm") incUsage("confirm")

View File

@ -8,7 +8,9 @@ class DedupCommand:
def __init__(self, *args): def __init__(self, *args):
self.dedup(*args) self.dedup(*args)
def dedup(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def dedup(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
dupes = chankeep.getDuplicateChannels() dupes = chankeep.getDuplicateChannels()

View File

@ -6,7 +6,9 @@ class DisableCommand:
def __init__(self, *args): def __init__(self, *args):
self.disable(*args) self.disable(*args)
def disable(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def disable(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 3: if length == 3:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -7,7 +7,9 @@ class DistCommand:
def __init__(self, *args): def __init__(self, *args):
self.dist(*args) self.dist(*args)
def dist(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def dist(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if main.config["Dist"]["Enabled"]: if main.config["Dist"]["Enabled"]:
rtrn = run([main.config["Dist"]["File"]], shell=True, stdout=PIPE) rtrn = run([main.config["Dist"]["File"]], shell=True, stdout=PIPE)

View File

@ -1,13 +1,14 @@
from yaml import dump
import main import main
from yaml import dump
class EmailCommand: class EmailCommand:
def __init__(self, *args): def __init__(self, *args):
self.email(*args) self.email(*args)
def email(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def email(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 4: if length == 4:
if spl[1] == "add": if spl[1] == "add":
@ -19,10 +20,15 @@ class EmailCommand:
if not spl[3] in main.alias[num]["emails"]: if not spl[3] in main.alias[num]["emails"]:
main.alias[num]["emails"].append(spl[3]) main.alias[num]["emails"].append(spl[3])
main.saveConf("alias") main.saveConf("alias")
success("Successfully added email %s to alias %i" % (spl[3], num)) success(
"Successfully added email %s to alias %i"
% (spl[3], num)
)
return return
else: else:
failure("Email already exists in alias %i: %s" % (num, spl[3])) failure(
"Email already exists in alias %i: %s" % (num, spl[3])
)
return return
else: else:
failure("Must be a number, not %s" % spl[2]) failure("Must be a number, not %s" % spl[2])
@ -33,10 +39,16 @@ class EmailCommand:
return return
if domain not in main.irc["_"]["domains"]: if domain not in main.irc["_"]["domains"]:
main.irc["_"]["domains"].append(domain) main.irc["_"]["domains"].append(domain)
success("Successfully added domain %s to default config" % domain) success(
"Successfully added domain %s to default config"
% domain
)
main.saveConf("irc") main.saveConf("irc")
else: else:
failure("Domain already exists in default config: %s" % domain) failure(
"Domain already exists in default config: %s"
% domain
)
return return
elif spl[1] == "del": elif spl[1] == "del":
@ -47,10 +59,16 @@ class EmailCommand:
if domain in main.irc["_"]["domains"]: if domain in main.irc["_"]["domains"]:
main.irc["_"]["domains"].remove(domain) main.irc["_"]["domains"].remove(domain)
success("Successfully removed domain %s to default config" % domain) success(
"Successfully removed domain %s to default config"
% domain
)
main.saveConf("irc") main.saveConf("irc")
else: else:
failure("Domain does not exist in default config: %s" % domain) failure(
"Domain does not exist in default config: %s"
% domain
)
return return
elif spl[1] == "del": elif spl[1] == "del":
@ -60,10 +78,15 @@ class EmailCommand:
if spl[3] in main.alias[num]["emails"]: if spl[3] in main.alias[num]["emails"]:
main.alias[num]["emails"].remove(spl[3]) main.alias[num]["emails"].remove(spl[3])
main.saveConf("alias") main.saveConf("alias")
success("Successfully removed email %s from alias %i" % (spl[3], num)) success(
"Successfully removed email %s from alias %i"
% (spl[3], num)
)
return return
else: else:
failure("Email does not exist in alias %i: %s" % (spl[3], num)) failure(
"Email does not exist in alias %i: %s" % (spl[3], num)
)
return return
elif length == 2: elif length == 2:
if spl[1] == "list": if spl[1] == "list":
@ -76,7 +99,10 @@ class EmailCommand:
if spl[1] == "list": if spl[1] == "list":
if spl[2] == "domain": if spl[2] == "domain":
filtered = { filtered = {
f"{k}:{k2}": v2 for k, v in main.irc.items() for k2, v2 in v.items() if k2 == "domains" f"{k}:{k2}": v2
for k, v in main.irc.items()
for k2, v2 in v.items()
if k2 == "domains"
} }
info(dump(filtered)) info(dump(filtered))
return return

View File

@ -6,7 +6,9 @@ class EnableCommand:
def __init__(self, *args): def __init__(self, *args):
self.enable(*args) self.enable(*args)
def enable(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def enable(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 3: if length == 3:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -2,7 +2,9 @@ class ExecCommand:
def __init__(self, *args): def __init__(self, *args):
self.exec(*args) self.exec(*args)
def exec(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def exec(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length > 1: if length > 1:
try: try:

View File

@ -6,7 +6,9 @@ class GetstrCommand:
def __init__(self, *args): def __init__(self, *args):
self.getstr(*args) self.getstr(*args)
def getstr(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def getstr(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 3: if length == 3:
net = spl[1] net = spl[1]

View File

@ -5,7 +5,9 @@ class HelpCommand:
def __init__(self, *args): def __init__(self, *args):
self.help(*args) self.help(*args)
def help(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def help(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
helpMap = [] helpMap = []
for i in main.help.keys(): for i in main.help.keys():

View File

@ -6,7 +6,9 @@ class JoinCommand:
def __init__(self, *args): def __init__(self, *args):
self.join(*args) self.join(*args)
def join(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def join(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 3: if length == 3:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -6,7 +6,9 @@ class ListCommand:
def __init__(self, *args): def __init__(self, *args):
self.list(*args) self.list(*args)
def list(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def list(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
for i in main.network.keys(): for i in main.network.keys():

View File

@ -5,7 +5,9 @@ class LoadCommand:
def __init__(self, *args): def __init__(self, *args):
self.load(*args) self.load(*args)
def load(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def load(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
if spl[1] in main.filemap.keys(): if spl[1] in main.filemap.keys():

View File

@ -5,7 +5,9 @@ class LoadmodCommand:
def __init__(self, *args): def __init__(self, *args):
self.loadmod(*args) self.loadmod(*args)
def loadmod(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def loadmod(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
rtrn = loadSingle(spl[1]) rtrn = loadSingle(spl[1])

View File

@ -2,7 +2,9 @@ class LogoutCommand:
def __init__(self, *args): def __init__(self, *args):
self.logout(*args) self.logout(*args)
def logout(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def logout(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
obj.authed = False obj.authed = False
success("Logged out") success("Logged out")

View File

@ -6,7 +6,9 @@ class ModCommand:
def __init__(self, *args): def __init__(self, *args):
self.mod(*args) self.mod(*args)
def mod(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def mod(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 4: if length == 4:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():
@ -20,7 +22,9 @@ class ModCommand:
return return
main.saveConf("network") main.saveConf("network")
success("Successfully set key %s to %s on %s" % (spl[2], spl[3], spl[1])) success(
"Successfully set key %s to %s on %s" % (spl[2], spl[3], spl[1])
)
return return
# Find a better way to do this # Find a better way to do this
# elif length == 6: # elif length == 6:

View File

@ -5,7 +5,9 @@ class MsgCommand:
def __init__(self, *args): def __init__(self, *args):
self.msg(*args) self.msg(*args)
def msg(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def msg(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length >= 5: if length >= 5:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():
@ -20,7 +22,10 @@ class MsgCommand:
if not spl[3] in main.IRCPool[spl[1] + spl[2]].channels: if not spl[3] in main.IRCPool[spl[1] + spl[2]].channels:
info("Bot not on channel: %s" % spl[3]) info("Bot not on channel: %s" % spl[3])
main.IRCPool[spl[1] + spl[2]].msg(spl[3], " ".join(spl[4:])) main.IRCPool[spl[1] + spl[2]].msg(spl[3], " ".join(spl[4:]))
success("Sent %s to %s on relay %s on network %s" % (" ".join(spl[4:]), spl[3], spl[2], spl[1])) success(
"Sent %s to %s on relay %s on network %s"
% (" ".join(spl[4:]), spl[3], spl[2], spl[1])
)
return return
else: else:
incUsage("msg") incUsage("msg")

View File

@ -1,16 +1,17 @@
from string import digits from string import digits
from yaml import dump
import main import main
from modules.network import Network from modules.network import Network
from yaml import dump
class NetworkCommand: class NetworkCommand:
def __init__(self, *args): def __init__(self, *args):
self.network(*args) self.network(*args)
def network(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def network(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 7: if length == 7:
if spl[1] == "add": if spl[1] == "add":
@ -30,7 +31,9 @@ class NetworkCommand:
failure("Auth must be sasl, ns or none, not %s" % spl[5]) failure("Auth must be sasl, ns or none, not %s" % spl[5])
return return
else: else:
main.network[spl[2]] = Network(spl[2], spl[3], int(spl[4]), spl[5].lower(), spl[6].lower()) main.network[spl[2]] = Network(
spl[2], spl[3], int(spl[4]), spl[5].lower(), spl[6].lower()
)
success("Successfully created network: %s" % spl[2]) success("Successfully created network: %s" % spl[2])
main.saveConf("network") main.saveConf("network")
return return

View File

@ -5,7 +5,9 @@ class PartCommand:
def __init__(self, *args): def __init__(self, *args):
self.part(*args) self.part(*args)
def part(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def part(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 4: if length == 4:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -5,7 +5,9 @@ class PassCommand:
def __init__(self, *args): def __init__(self, *args):
self.password(*args) self.password(*args)
def password(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def password(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
info("You are already authenticated") info("You are already authenticated")
return return

View File

@ -5,14 +5,19 @@ class PendingCommand:
def __init__(self, *args): def __init__(self, *args):
self.pending(*args) self.pending(*args)
def pending(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def pending(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
results = [] results = []
for i in main.network.keys(): for i in main.network.keys():
for x in main.network[i].relays.keys(): for x in main.network[i].relays.keys():
if not main.network[i].relays[x]["registered"]: if not main.network[i].relays[x]["registered"]:
results.append("%s: confirm %s %s [code]" % (main.alias[x]["nick"], i, x)) results.append(
"%s: confirm %s %s [code]"
% (main.alias[x]["nick"], i, x)
)
info("\n".join(results)) info("\n".join(results))
return return
elif length == 2: elif length == 2:
@ -22,7 +27,10 @@ class PendingCommand:
results = [] results = []
for x in main.network[spl[1]].relays.keys(): for x in main.network[spl[1]].relays.keys():
if not main.network[spl[1]].relays[x]["registered"]: if not main.network[spl[1]].relays[x]["registered"]:
results.append("%s: confirm %s %s [code]" % (main.alias[x]["nick"], spl[1], x)) results.append(
"%s: confirm %s %s [code]"
% (main.alias[x]["nick"], spl[1], x)
)
info("\n".join(results)) info("\n".join(results))
return return
else: else:

View File

@ -5,7 +5,9 @@ class RecheckauthCommand:
def __init__(self, *args): def __init__(self, *args):
self.recheckauth(*args) self.recheckauth(*args)
def recheckauth(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def recheckauth(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
for i in main.IRCPool.keys(): for i in main.IRCPool.keys():

View File

@ -6,7 +6,9 @@ class RegCommand:
def __init__(self, *args): def __init__(self, *args):
self.reg(*args) self.reg(*args)
def reg(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def reg(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -1,19 +1,23 @@
from yaml import dump
import main import main
from yaml import dump
class RelayCommand: class RelayCommand:
def __init__(self, *args): def __init__(self, *args):
self.relay(*args) self.relay(*args)
def relay(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def relay(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 3: if length == 3:
if spl[1] == "add": if spl[1] == "add":
if spl[2] in main.network.keys(): if spl[2] in main.network.keys():
id, alias = main.network[spl[2]].add_relay() id, alias = main.network[spl[2]].add_relay()
success("Successfully created relay %s on network %s with alias %s" % (str(id), spl[2], alias)) success(
"Successfully created relay %s on network %s with alias %s"
% (str(id), spl[2], alias)
)
main.saveConf("network") main.saveConf("network")
return return
else: else:
@ -36,7 +40,10 @@ class RelayCommand:
failure("Must be a number, not %s" % spl[3]) failure("Must be a number, not %s" % spl[3])
return return
id, alias = main.network[spl[2]].add_relay(int(spl[3])) id, alias = main.network[spl[2]].add_relay(int(spl[3]))
success("Successfully created relay %s on network %s with alias %s" % (str(id), spl[2], alias)) success(
"Successfully created relay %s on network %s with alias %s"
% (str(id), spl[2], alias)
)
main.saveConf("network") main.saveConf("network")
return return
else: else:
@ -53,7 +60,9 @@ class RelayCommand:
failure("No such relay: %s on network %s" % (spl[3], spl[2])) failure("No such relay: %s on network %s" % (spl[3], spl[2]))
return return
main.network[spl[2]].delete_relay(int(spl[3])) main.network[spl[2]].delete_relay(int(spl[3]))
success("Successfully deleted relay %s on network %s" % (spl[3], spl[2])) success(
"Successfully deleted relay %s on network %s" % (spl[3], spl[2])
)
main.saveConf("network") main.saveConf("network")
return return
else: else:

View File

@ -5,7 +5,9 @@ class SaveCommand:
def __init__(self, *args): def __init__(self, *args):
self.save(*args) self.save(*args)
def save(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def save(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
if spl[1] in main.filemap.keys(): if spl[1] in main.filemap.keys():

View File

@ -9,7 +9,9 @@ class StatsCommand:
def __init__(self, *args): def __init__(self, *args):
self.stats(*args) self.stats(*args)
def stats(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def stats(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 1: if length == 1:
stats = [] stats = []

View File

@ -5,7 +5,9 @@ class SwhoCommand:
def __init__(self, *args): def __init__(self, *args):
self.swho(*args) self.swho(*args)
def swho(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def swho(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
if not spl[1] in main.network.keys(): if not spl[1] in main.network.keys():

View File

@ -1,15 +1,16 @@
from uuid import uuid4 from uuid import uuid4
from yaml import dump
import main import main
from yaml import dump
class TokenCommand: class TokenCommand:
def __init__(self, *args): def __init__(self, *args):
self.token(*args) self.token(*args)
def token(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def token(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
if spl[1] == "list": if spl[1] == "list":

View File

@ -5,7 +5,9 @@ class UsersCommand:
def __init__(self, *args): def __init__(self, *args):
self.users(*args) self.users(*args)
def users(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def users(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if len(spl) < 2: if len(spl) < 2:
incUsage("users") incUsage("users")

View File

@ -5,7 +5,9 @@ class WhoCommand:
def __init__(self, *args): def __init__(self, *args):
self.who(*args) self.who(*args)
def who(self, addr, authed, data, obj, spl, success, failure, info, incUsage, length): def who(
self, addr, authed, data, obj, spl, success, failure, info, incUsage, length
):
if authed: if authed:
if length == 2: if length == 2:
result = userinfo.getWho(spl[1]) result = userinfo.getWho(spl[1])

View File

@ -3,6 +3,9 @@ from copy import deepcopy
from datetime import datetime from datetime import datetime
from random import randint from random import randint
import main
from core.relay import sendRelayNotification
from modules import chankeep, counters, helpers, monitor, regproc, userinfo
from twisted.internet import reactor from twisted.internet import reactor
from twisted.internet.defer import Deferred from twisted.internet.defer import Deferred
from twisted.internet.protocol import ReconnectingClientFactory from twisted.internet.protocol import ReconnectingClientFactory
@ -13,10 +16,6 @@ from twisted.words.protocols.irc import (
lowDequote, lowDequote,
numeric_to_symbolic, numeric_to_symbolic,
) )
import main
from core.relay import sendRelayNotification
from modules import chankeep, counters, helpers, monitor, regproc, userinfo
from utils.dedup import dedup from utils.dedup import dedup
from utils.logging.debug import debug, trace from utils.logging.debug import debug, trace
from utils.logging.log import error, log, warn from utils.logging.log import error, log, warn
@ -83,7 +82,9 @@ class IRCBot(IRCClient):
self.listAttempted = False # we asked for a list self.listAttempted = False # we asked for a list
self.listSimple = False # after asking again we got the list, so use the simple self.listSimple = False # after asking again we got the list, so use the simple
# syntax from now on # syntax from now on
self.wantList = False # we want to send a LIST, but not all relays are active yet self.wantList = (
False # we want to send a LIST, but not all relays are active yet
)
self.chanlimit = 0 self.chanlimit = 0
self.prefix = {} self.prefix = {}
self.servername = None self.servername = None
@ -115,9 +116,14 @@ class IRCBot(IRCClient):
if i not in self.channels: if i not in self.channels:
if self.net in main.blacklist.keys(): if self.net in main.blacklist.keys():
if i in main.blacklist[self.net]: if i in main.blacklist[self.net]:
debug("Not joining blacklisted channel %s on %s - %i" % (i, self.net, self.num)) debug(
"Not joining blacklisted channel %s on %s - %i"
% (i, self.net, self.num)
)
continue continue
trace(self.net, "-", self.num, ": joining", i, "in", sleeptime, "seconds") trace(
self.net, "-", self.num, ": joining", i, "in", sleeptime, "seconds"
)
reactor.callLater(sleeptime, self.join, i) reactor.callLater(sleeptime, self.join, i)
sleeptime += increment sleeptime += increment
if sleeptime == 10: if sleeptime == 10:
@ -125,13 +131,19 @@ class IRCBot(IRCClient):
increment = 0.7 increment = 0.7
increment += 0.1 increment += 0.1
else: else:
error("%s - Cannot join channel we are already on: %s - %i" % (i, self.net, self.num)) error(
"%s - Cannot join channel we are already on: %s - %i"
% (i, self.net, self.num)
)
def checkChannels(self): def checkChannels(self):
if chankeep.allRelaysActive(self.net): if chankeep.allRelaysActive(self.net):
debug(f"checkChannels() all relays active for {self.net}") debug(f"checkChannels() all relays active for {self.net}")
else: else:
debug("checkChannels() skipping channel check as we have inactive relays: %s - %i" % (self.net, self.num)) debug(
"checkChannels() skipping channel check as we have inactive relays: %s - %i"
% (self.net, self.num)
)
return return
if self.net in main.TempChan.keys(): if self.net in main.TempChan.keys():
if self.num in main.TempChan[self.net].keys(): if self.num in main.TempChan[self.net].keys():
@ -145,7 +157,9 @@ class IRCBot(IRCClient):
cast["ts"] = str(datetime.now().isoformat()) cast["ts"] = str(datetime.now().isoformat())
# remove odd stuff # remove odd stuff
for i in list(cast.keys()): # Make a copy of the .keys() as Python 3 cannot handle iterating over for i in list(
cast.keys()
): # Make a copy of the .keys() as Python 3 cannot handle iterating over
if cast[i] == "": # a dictionary that changes length with each iteration if cast[i] == "": # a dictionary that changes length with each iteration
del cast[i] del cast[i]
# remove server stuff # remove server stuff
@ -201,7 +215,9 @@ class IRCBot(IRCClient):
castDup["type"] = "highlight" castDup["type"] = "highlight"
self.event(**castDup) self.event(**castDup)
else: else:
if cast["channel"].lower() == self.nickname.lower() or not cast["channel"].startswith("#"): if cast["channel"].lower() == self.nickname.lower() or not cast[
"channel"
].startswith("#"):
cast["mtype"] = cast["type"] cast["mtype"] = cast["type"]
cast["type"] = "query" cast["type"] = "query"
# self.event(**castDup) # self.event(**castDup)
@ -277,10 +293,33 @@ class IRCBot(IRCClient):
nick, ident, host = parsen(hostmask) nick, ident, host = parsen(hostmask)
# We sent someone a query reply # We sent someone a query reply
if in_query: if in_query:
self.event(type="self", mtype="msg", channel=self.nickname, nick=channel, ident=ident, host=host, msg=msg) self.event(
type="self",
mtype="msg",
channel=self.nickname,
nick=channel,
ident=ident,
host=host,
msg=msg,
)
else: else:
self.event(type="self", mtype="msg", channel=channel, nick=self.nickname, ident=ident, host=host, msg=msg) self.event(
self.event(type="msg", channel=channel, nick=self.nickname, ident=ident, host=host, msg=msg) type="self",
mtype="msg",
channel=channel,
nick=self.nickname,
ident=ident,
host=host,
msg=msg,
)
self.event(
type="msg",
channel=channel,
nick=self.nickname,
ident=ident,
host=host,
msg=msg,
)
self.msg(channel, msg) self.msg(channel, msg)
def get(self, var): def get(self, var):
@ -309,7 +348,9 @@ class IRCBot(IRCClient):
def irc_ERR_PASSWDMISMATCH(self, prefix, params): def irc_ERR_PASSWDMISMATCH(self, prefix, params):
log("%s - %i: password mismatch as %s" % (self.net, self.num, self.username)) log("%s - %i: password mismatch as %s" % (self.net, self.num, self.username))
sendAll("%s - %i: password mismatch as %s" % (self.net, self.num, self.username)) sendAll(
"%s - %i: password mismatch as %s" % (self.net, self.num, self.username)
)
def _who(self, channel): def _who(self, channel):
d = Deferred() d = Deferred()
@ -424,12 +465,17 @@ class IRCBot(IRCClient):
debug("Will not send LIST, unauthenticated: %s - %i" % (self.net, self.num)) debug("Will not send LIST, unauthenticated: %s - %i" % (self.net, self.num))
return return
if self.listAttempted: if self.listAttempted:
debug("List request dropped, already asked for LIST - %s - %i" % (self.net, self.num)) debug(
"List request dropped, already asked for LIST - %s - %i"
% (self.net, self.num)
)
return return
else: else:
self.listAttempted = True self.listAttempted = True
if self.listOngoing: if self.listOngoing:
debug("LIST request dropped, already ongoing - %s - %i" % (self.net, self.num)) debug(
"LIST request dropped, already ongoing - %s - %i" % (self.net, self.num)
)
return return
else: else:
if nocheck: if nocheck:
@ -454,7 +500,9 @@ class IRCBot(IRCClient):
self._tempList[1].append([channel, users, topic]) self._tempList[1].append([channel, users, topic])
def irc_RPL_LISTEND(self, prefix, params): def irc_RPL_LISTEND(self, prefix, params):
if not len(self._tempList[0]) > 0: # there are no callbacks, can't do anything there if (
not len(self._tempList[0]) > 0
): # there are no callbacks, can't do anything there
debug("We didn't ask for this LIST, discarding") debug("We didn't ask for this LIST, discarding")
self._tempList[0].clear() self._tempList[0].clear()
self._tempList[1].clear() self._tempList[1].clear()
@ -479,7 +527,10 @@ class IRCBot(IRCClient):
else: else:
if self.listRetried: if self.listRetried:
self.listRetried = False self.listRetried = False
debug("List received after retry - defaulting to simple list syntax: %s - %i" % (self.net, self.num)) debug(
"List received after retry - defaulting to simple list syntax: %s - %i"
% (self.net, self.num)
)
self.listSimple = True self.listSimple = True
def got_list(self, listinfo): def got_list(self, listinfo):
@ -500,9 +551,13 @@ class IRCBot(IRCClient):
if first_relay: if first_relay:
if first_relay.wantList is True: if first_relay.wantList is True:
first_relay.list(nocheck=True) first_relay.list(nocheck=True)
debug(f"recheckList() asking for a list for {self.net} after final relay {self.num} connected") debug(
f"recheckList() asking for a list for {self.net} after final relay {self.num} connected"
)
else: else:
debug(f"recheckList() first relay wantList is False for {self.net} ({first_relay.num})") debug(
f"recheckList() first relay wantList is False for {self.net} ({first_relay.num})"
)
# name = self.net + "1" # name = self.net + "1"
# if self.num == 1: # Only one instance should do a list # if self.num == 1: # Only one instance should do a list
@ -511,7 +566,9 @@ class IRCBot(IRCClient):
if self.chanlimit: if self.chanlimit:
if allRelays: if allRelays:
self.list() self.list()
debug(f"recheckList() requested a list for {self.net} from {self.num}") debug(
f"recheckList() requested a list for {self.net} from {self.num}"
)
else: else:
debug(f"recheckList() not all relays active for {self.net}") debug(f"recheckList() not all relays active for {self.net}")
self.wantList = True self.wantList = True
@ -525,7 +582,9 @@ class IRCBot(IRCClient):
]: # TODO: add check for register request sent, only send it once ]: # TODO: add check for register request sent, only send it once
if main.config["AutoReg"]: if main.config["AutoReg"]:
if not self.authenticated: if not self.authenticated:
self._regAttempt = reactor.callLater(5, regproc.registerAccount, self.net, self.num) self._regAttempt = reactor.callLater(
5, regproc.registerAccount, self.net, self.num
)
# regproc.registerAccount(self.net, self.num) # regproc.registerAccount(self.net, self.num)
try: try:
self.chanlimit = int(chanlimit) self.chanlimit = int(chanlimit)
@ -539,7 +598,9 @@ class IRCBot(IRCClient):
self.chanlimit = net_inst_chanlimit self.chanlimit = net_inst_chanlimit
# warn(f"Chanlimit on {self.net} too high, setting to {self.chanlimit}") # warn(f"Chanlimit on {self.net} too high, setting to {self.chanlimit}")
if not regproc.needToRegister(self.net): # if we need to register, only recheck on auth confirmation if not regproc.needToRegister(
self.net
): # if we need to register, only recheck on auth confirmation
if main.config["ChanKeep"]["Enabled"]: if main.config["ChanKeep"]["Enabled"]:
self.recheckList() self.recheckList()
@ -642,7 +703,9 @@ class IRCBot(IRCClient):
if reset: if reset:
self._negativePass = None self._negativePass = None
debug(f"regPing() {self.net} - {self.num}: _negativePass:{self._negativePass} negativepass:{negativepass}") debug(
f"regPing() {self.net} - {self.num}: _negativePass:{self._negativePass} negativepass:{negativepass}"
)
if self._negativePass is None: if self._negativePass is None:
# We have failed, the blacklisted message has been found # We have failed, the blacklisted message has been found
if negativepass is False: if negativepass is False:
@ -665,7 +728,9 @@ class IRCBot(IRCClient):
) )
) )
else: else:
debug(f"regPing() {self.net}: negative registration check - {self.num}") debug(
f"regPing() {self.net}: negative registration check - {self.num}"
)
return return
else: else:
if sinst["negative"]: if sinst["negative"]:
@ -678,14 +743,18 @@ class IRCBot(IRCClient):
) )
return return
else: else:
self._negativePass = True # if it's disabled, we still want the next block to run self._negativePass = (
True # if it's disabled, we still want the next block to run
)
# Only run if negativepass has completed, or exempted as above # Only run if negativepass has completed, or exempted as above
if self._negativePass: if self._negativePass:
if sinst["check"]: if sinst["check"]:
if sinst["ping"]: if sinst["ping"]:
self.msg(sinst["entity"], sinst["pingmsg"]) self.msg(sinst["entity"], sinst["pingmsg"])
debug(f"regPing() {self.net}: sent ping '{sinst['pingmsg']}' to {sinst['entity']} - {self.num}") debug(
f"regPing() {self.net}: sent ping '{sinst['pingmsg']}' to {sinst['entity']} - {self.num}"
)
return return
else: else:
self.authenticated = True self.authenticated = True
@ -719,7 +788,11 @@ class IRCBot(IRCClient):
self.channels.append(channel) self.channels.append(channel)
self.names(channel).addCallback(self.got_names) self.names(channel).addCallback(self.got_names)
if main.config["Toggles"]["Who"]: if main.config["Toggles"]["Who"]:
reactor.callLater(main.config["Tweaks"]["Delays"]["WhoDelay"], self.setup_who_loop, channel) reactor.callLater(
main.config["Tweaks"]["Delays"]["WhoDelay"],
self.setup_who_loop,
channel,
)
# lc = LoopingCall(self.who, channel) # lc = LoopingCall(self.who, channel)
# self._getWho[channel] = lc # self._getWho[channel] = lc
# intrange = main.config["Tweaks"]["Delays"]["WhoRange"] # intrange = main.config["Tweaks"]["Delays"]["WhoRange"]
@ -734,7 +807,9 @@ class IRCBot(IRCClient):
lc = self._getWho[channel] lc = self._getWho[channel]
lc.stop() lc.stop()
del self._getWho[channel] del self._getWho[channel]
userinfo.delChannels(self.net, [channel]) # < we do not need to deduplicate this userinfo.delChannels(
self.net, [channel]
) # < we do not need to deduplicate this
# log("Can no longer cover %s, removing records" % channel)# as it will only be matched once -- # log("Can no longer cover %s, removing records" % channel)# as it will only be matched once --
# other bots have different nicknames so # other bots have different nicknames so

View File

@ -2,7 +2,6 @@ import logging
from json import dumps from json import dumps
import logstash import logstash
import main import main
logger = None logger = None

View File

@ -19,7 +19,9 @@ def parseCommand(addr, authed, data):
incUsage = lambda mode: incorrectUsage(addr, mode) # noqa: E731 incUsage = lambda mode: incorrectUsage(addr, mode) # noqa: E731
length = len(spl) length = len(spl)
if spl[0] in main.CommandMap.keys(): if spl[0] in main.CommandMap.keys():
main.CommandMap[spl[0]](addr, authed, data, obj, spl, success, failure, info, incUsage, length) main.CommandMap[spl[0]](
addr, authed, data, obj, spl, success, failure, info, incUsage, length
)
return return
incUsage(None) incUsage(None)
return return

View File

@ -1,8 +1,7 @@
from json import dumps, loads from json import dumps, loads
from twisted.internet.protocol import Factory, Protocol
import main import main
from twisted.internet.protocol import Factory, Protocol
from utils.logging.log import log, warn from utils.logging.log import log, warn
validTypes = [ validTypes = [
@ -118,7 +117,9 @@ class Relay(Protocol):
parsed["hello"] == main.tokens[parsed["key"]]["hello"] parsed["hello"] == main.tokens[parsed["key"]]["hello"]
and main.tokens[parsed["key"]]["usage"] == "relay" and main.tokens[parsed["key"]]["usage"] == "relay"
): ):
self.sendMsg({"type": "hello", "hello": main.tokens[parsed["key"]]["counter"]}) self.sendMsg(
{"type": "hello", "hello": main.tokens[parsed["key"]]["counter"]}
)
self.authed = True self.authed = True
else: else:
self.transport.loseConnection() self.transport.loseConnection()
@ -133,7 +134,10 @@ class Relay(Protocol):
def connectionLost(self, reason): def connectionLost(self, reason):
self.authed = False self.authed = False
log("Relay connection lost from %s:%s -- %s" % (self.addr.host, self.addr.port, reason.getErrorMessage())) log(
"Relay connection lost from %s:%s -- %s"
% (self.addr.host, self.addr.port, reason.getErrorMessage())
)
if self.addr in main.relayConnections.keys(): if self.addr in main.relayConnections.keys():
del main.relayConnections[self.addr] del main.relayConnections[self.addr]
else: else:

View File

@ -1,7 +1,6 @@
from twisted.internet.protocol import Factory, Protocol
import main import main
from core.parser import parseCommand from core.parser import parseCommand
from twisted.internet.protocol import Factory, Protocol
from utils.logging.log import log, warn from utils.logging.log import log, warn
@ -34,7 +33,10 @@ class Server(Protocol):
def connectionLost(self, reason): def connectionLost(self, reason):
self.authed = False self.authed = False
log("Connection lost from %s:%s -- %s" % (self.addr.host, self.addr.port, reason.getErrorMessage())) log(
"Connection lost from %s:%s -- %s"
% (self.addr.host, self.addr.port, reason.getErrorMessage())
)
if self.addr in main.connections.keys(): if self.addr in main.connections.keys():
del main.connections[self.addr] del main.connections[self.addr]
else: else:

View File

@ -126,4 +126,6 @@ def initMain():
r = StrictRedis( r = StrictRedis(
unix_socket_path=config["RedisSocket"], db=config["RedisDBEphemeral"] # noqa unix_socket_path=config["RedisSocket"], db=config["RedisDBEphemeral"] # noqa
) # Ephemeral - flushed on quit ) # Ephemeral - flushed on quit
g = StrictRedis(unix_socket_path=config["RedisSocket"], db=config["RedisDBPersistent"]) # noqa g = StrictRedis(
unix_socket_path=config["RedisSocket"], db=config["RedisDBPersistent"]
) # noqa

View File

@ -1,10 +1,9 @@
from copy import deepcopy from copy import deepcopy
from math import ceil from math import ceil
from twisted.internet.threads import deferToThread
import main import main
from modules import helpers from modules import helpers
from twisted.internet.threads import deferToThread
from utils.logging.debug import debug, trace from utils.logging.debug import debug, trace
from utils.logging.log import error, log, warn from utils.logging.log import error, log, warn
@ -95,7 +94,11 @@ def getEnabledRelays(net):
:rtype: list of int :rtype: list of int
:return: list of enabled relay numbers :return: list of enabled relay numbers
""" """
enabledRelays = [x for x in main.network[net].relays.keys() if main.network[net].relays[x]["enabled"]] enabledRelays = [
x
for x in main.network[net].relays.keys()
if main.network[net].relays[x]["enabled"]
]
# debug(f"getEnabledRelays() {net}: {enabledRelays}") # debug(f"getEnabledRelays() {net}: {enabledRelays}")
return enabledRelays return enabledRelays
@ -259,7 +262,9 @@ def emptyChanAllocate(net, flist):
chan_slots_used = getTotalChans(net) chan_slots_used = getTotalChans(net)
max_chans = getSumChanlimit(net) - chan_slots_used max_chans = getSumChanlimit(net) - chan_slots_used
trunc_list = newlist[:max_chans] trunc_list = newlist[:max_chans]
debug(f"emptyChanAllocate() {net}: newlist:{len(newlist)} trunc_list:{len(trunc_list)}") debug(
f"emptyChanAllocate() {net}: newlist:{len(newlist)} trunc_list:{len(trunc_list)}"
)
for i in chanfree.keys(): for i in chanfree.keys():
for x in range(chanfree[i]): for x in range(chanfree[i]):
@ -359,9 +364,13 @@ def keepChannels(net, listinfo, mean, sigrelay, relay):
listinfo = minifyChans(net, listinfo) listinfo = minifyChans(net, listinfo)
if not listinfo: if not listinfo:
return return
if relay <= main.config["ChanKeep"]["SigSwitch"]: # we can cover all of the channels if (
relay <= main.config["ChanKeep"]["SigSwitch"]
): # we can cover all of the channels
coverAll = True coverAll = True
elif relay > main.config["ChanKeep"]["SigSwitch"]: # we cannot cover all of the channels elif (
relay > main.config["ChanKeep"]["SigSwitch"]
): # we cannot cover all of the channels
coverAll = False coverAll = False
# if not sigrelay <= main.config["ChanKeep"]["MaxRelay"]: # if not sigrelay <= main.config["ChanKeep"]["MaxRelay"]:
# error("Network %s is too big to cover: %i relays required" % (net, sigrelay)) # error("Network %s is too big to cover: %i relays required" % (net, sigrelay))
@ -389,7 +398,9 @@ def keepChannels(net, listinfo, mean, sigrelay, relay):
flist = [i[0] for i in listinfo_sort] flist = [i[0] for i in listinfo_sort]
flist = flist[:max_chans] flist = flist[:max_chans]
debug(f"keepChannels() {net}: joining {len(flist)}/{len(listinfo_sort)} channels") debug(
f"keepChannels() {net}: joining {len(flist)}/{len(listinfo_sort)} channels"
)
trace(f"keepChannels() {net}: joining:{flist}") trace(f"keepChannels() {net}: joining:{flist}")
populateChans(net, flist) populateChans(net, flist)
else: else:
@ -411,8 +422,12 @@ def keepChannels(net, listinfo, mean, sigrelay, relay):
siglist = siglist[:max_chans] siglist = siglist[:max_chans]
trace(f"keepChannels() {net}: truncated siglist:{siglist}") trace(f"keepChannels() {net}: truncated siglist:{siglist}")
trace(f"keepChannels() {net}: siglist:{siglist} max_chans:{max_chans} len_sig:{len(listinfo_sort)}") trace(
debug(f"keepChannels() {net}: joining {len(siglist)}/{len(listinfo_sort)} channels") f"keepChannels() {net}: siglist:{siglist} max_chans:{max_chans} len_sig:{len(listinfo_sort)}"
)
debug(
f"keepChannels() {net}: joining {len(siglist)}/{len(listinfo_sort)} channels"
)
trace(f"keepChannels() {net}: joining:{siglist}") trace(f"keepChannels() {net}: joining:{siglist}")
populateChans(net, siglist) populateChans(net, siglist)
notifyJoin(net) notifyJoin(net)

View File

@ -1,6 +1,5 @@
from twisted.internet.task import LoopingCall
import main import main
from twisted.internet.task import LoopingCall
def event(name, eventType): def event(name, eventType):

View File

@ -64,7 +64,9 @@ def parsemeta(numName, c):
) )
def event(numName, c): # yes I'm using a short variable because otherwise it goes off the screen def event(
numName, c
): # yes I'm using a short variable because otherwise it goes off the screen
if dedup(numName, c): if dedup(numName, c):
return return

View File

@ -1,14 +1,13 @@
from copy import deepcopy from copy import deepcopy
from twisted.internet import reactor
from twisted.internet.ssl import DefaultOpenSSLContextFactory
import main import main
from core.bot import IRCBotFactory from core.bot import IRCBotFactory
from modules import alias from modules import alias
from modules.chankeep import nukeNetwork from modules.chankeep import nukeNetwork
from modules.provision import provisionRelay from modules.provision import provisionRelay
from modules.regproc import needToRegister from modules.regproc import needToRegister
from twisted.internet import reactor
from twisted.internet.ssl import DefaultOpenSSLContextFactory
from utils.deliver_relay_commands import deliverRelayCommands from utils.deliver_relay_commands import deliverRelayCommands
from utils.get import getRelay from utils.get import getRelay
from utils.logging.log import log from utils.logging.log import log

View File

@ -1,28 +1,37 @@
from twisted.internet import reactor
import main import main
import modules.regproc import modules.regproc
from twisted.internet import reactor
from utils.deliver_relay_commands import deliverRelayCommands from utils.deliver_relay_commands import deliverRelayCommands
from utils.logging.log import warn from utils.logging.log import warn
def provisionUserNetworkData(num, nick, altnick, ident, realname, network, host, port, security): def provisionUserNetworkData(
num, nick, altnick, ident, realname, network, host, port, security
):
commands = {} commands = {}
stage2commands = {} stage2commands = {}
stage2commands["status"] = [] stage2commands["status"] = []
commands["controlpanel"] = [] commands["controlpanel"] = []
user = nick.lower() user = nick.lower()
commands["controlpanel"].append("AddUser %s %s" % (user, main.config["Relay"]["Password"])) commands["controlpanel"].append(
"AddUser %s %s" % (user, main.config["Relay"]["Password"])
)
commands["controlpanel"].append("AddNetwork %s %s" % (user, network)) commands["controlpanel"].append("AddNetwork %s %s" % (user, network))
commands["controlpanel"].append("Set Nick %s %s" % (user, nick)) commands["controlpanel"].append("Set Nick %s %s" % (user, nick))
commands["controlpanel"].append("Set Altnick %s %s" % (user, altnick)) commands["controlpanel"].append("Set Altnick %s %s" % (user, altnick))
commands["controlpanel"].append("Set Ident %s %s" % (user, ident)) commands["controlpanel"].append("Set Ident %s %s" % (user, ident))
commands["controlpanel"].append("Set RealName %s %s" % (user, realname)) commands["controlpanel"].append("Set RealName %s %s" % (user, realname))
if security == "ssl": if security == "ssl":
commands["controlpanel"].append("SetNetwork TrustAllCerts %s %s true" % (user, network)) # Don't judge me commands["controlpanel"].append(
commands["controlpanel"].append("AddServer %s %s %s +%s" % (user, network, host, port)) "SetNetwork TrustAllCerts %s %s true" % (user, network)
) # Don't judge me
commands["controlpanel"].append(
"AddServer %s %s %s +%s" % (user, network, host, port)
)
elif security == "plain": elif security == "plain":
commands["controlpanel"].append("AddServer %s %s %s %s" % (user, network, host, port)) commands["controlpanel"].append(
"AddServer %s %s %s %s" % (user, network, host, port)
)
if not main.config["ConnectOnCreate"]: if not main.config["ConnectOnCreate"]:
stage2commands["status"].append("Disconnect") stage2commands["status"].append("Disconnect")
if main.config["Toggles"]["CycleChans"]: if main.config["Toggles"]["CycleChans"]:
@ -84,7 +93,9 @@ def provisionMultipleRelays(net, relaysNeeded):
if not relaysNeeded: if not relaysNeeded:
return [] return []
if not main.config["ChanKeep"]["Provision"]: if not main.config["ChanKeep"]["Provision"]:
warn(f"Asked to create {relaysNeeded} relays for {net}, but provisioning is disabled") warn(
f"Asked to create {relaysNeeded} relays for {net}, but provisioning is disabled"
)
return [] return []
numsProvisioned = [] numsProvisioned = []
for i in range(relaysNeeded): for i in range(relaysNeeded):

View File

@ -145,9 +145,13 @@ def enableAuthentication(net, num, jump=True, run_now=False):
return return
# uname = main.alias[num]["nick"] + "/" + net # uname = main.alias[num]["nick"] + "/" + net
password = main.network[net].aliases[num]["password"] password = main.network[net].aliases[num]["password"]
provision.provisionAuthenticationData(num, nick, net, auth, password) # Set up for auth provision.provisionAuthenticationData(
num, nick, net, auth, password
) # Set up for auth
if jump: if jump:
main.IRCPool[name].msg(main.config["Tweaks"]["ZNC"]["Prefix"] + "status", "Jump") main.IRCPool[name].msg(
main.config["Tweaks"]["ZNC"]["Prefix"] + "status", "Jump"
)
if run_now: if run_now:
attemptManualAuthentication(net, num) attemptManualAuthentication(net, num)
if selectInst(net)["check"] is False: if selectInst(net)["check"] is False:

View File

@ -1,7 +1,6 @@
from twisted.internet.threads import deferToThread
import main import main
from modules import chankeep from modules import chankeep
from twisted.internet.threads import deferToThread
from utils.logging.debug import debug, trace from utils.logging.debug import debug, trace
from utils.logging.log import warn from utils.logging.log import warn
from utils.parsing import parsen from utils.parsing import parsen
@ -175,7 +174,9 @@ def delUser(name, channel, nick, user):
p.srem(namespace, nick) p.srem(namespace, nick)
if channels == {channel.encode()}: # can we only see them on this channel? if channels == {channel.encode()}: # can we only see them on this channel?
p.delete(chanspace) # remove channel tracking entry p.delete(chanspace) # remove channel tracking entry
p.hdel("live.prefix." + name + "." + channel, nick) # remove prefix tracking entry p.hdel(
"live.prefix." + name + "." + channel, nick
) # remove prefix tracking entry
p.hdel(mapspace, nick) # remove nick mapping entry p.hdel(mapspace, nick) # remove nick mapping entry
if user: if user:
p.srem(gnamespace, user) # remove global userinfo entry p.srem(gnamespace, user) # remove global userinfo entry
@ -200,7 +201,10 @@ def getUserByNick(name, nick):
if main.r.hexists(mapspace, nick): if main.r.hexists(mapspace, nick):
return main.r.hget(mapspace, nick) return main.r.hget(mapspace, nick)
else: else:
warn("Entry doesn't exist: %s on %s - attempting auxiliary lookup" % (nick, mapspace)) warn(
"Entry doesn't exist: %s on %s - attempting auxiliary lookup"
% (nick, mapspace)
)
# return False # return False
# legacy code below - remove when map is reliable # legacy code below - remove when map is reliable
usermatch = main.r.sscan(gnamespace, match=escape(nick) + "!*", count=999999999) usermatch = main.r.sscan(gnamespace, match=escape(nick) + "!*", count=999999999)
@ -230,10 +234,18 @@ def renameUser(name, oldnick, olduser, newnick, newuser):
p.sadd("live.who." + name + "." + i, newnick) p.sadd("live.who." + name + "." + i, newnick)
p.hdel(mapspace, oldnick) p.hdel(mapspace, oldnick)
p.hset(mapspace, newnick, newuser) p.hset(mapspace, newnick, newuser)
if main.r.exists("live.prefix." + name + "." + i): # if there's a prefix entry for the channel if main.r.exists(
if main.r.hexists("live.prefix." + name + "." + i, oldnick): # if the old nick is in it "live.prefix." + name + "." + i
mode = main.r.hget("live.prefix." + name + "." + i, oldnick) # retrieve old modes ): # if there's a prefix entry for the channel
p.hset("live.prefix." + name + "." + i, newnick, mode) # set old modes to new nickname if main.r.hexists(
"live.prefix." + name + "." + i, oldnick
): # if the old nick is in it
mode = main.r.hget(
"live.prefix." + name + "." + i, oldnick
) # retrieve old modes
p.hset(
"live.prefix." + name + "." + i, newnick, mode
) # set old modes to new nickname
if main.r.exists(chanspace): if main.r.exists(chanspace):
p.rename(chanspace, newchanspace) p.rename(chanspace, newchanspace)
else: else:
@ -299,6 +311,8 @@ def delChannels(net, channels): # we have left a channel
if channel in dupes[net]: if channel in dupes[net]:
if dupes[net][channel] != 0: if dupes[net][channel] != 0:
channels.remove(channel) channels.remove(channel)
debug(f"Not removing channel {channel} as {net} has {dupes[net][channel]} other relays covering it") debug(
f"Not removing channel {channel} as {net} has {dupes[net][channel]} other relays covering it"
)
deferToThread(_delChannels, net, channels) deferToThread(_delChannels, net, channels)
# d.addCallback(testCallback) # d.addCallback(testCallback)

View File

@ -49,7 +49,9 @@ class TestChanKeep(TestCase):
instances = 1 instances = 1
chanlimit = 5 chanlimit = 5
max_chans = instances * chanlimit max_chans = instances * chanlimit
listinfo = self.generate_listinfo(ranges=[[1000, 1, 2], [200, 400, 800], [10, 1000, 2000]]) listinfo = self.generate_listinfo(
ranges=[[1000, 1, 2], [200, 400, 800], [10, 1000, 2000]]
)
# listinfo_num = [x[1] for x in listinfo] # listinfo_num = [x[1] for x in listinfo]
listlength = len(listinfo) listlength = len(listinfo)

View File

@ -5,18 +5,17 @@ from os import getenv
from signal import SIGINT, signal from signal import SIGINT, signal
from sys import stderr, stdout from sys import stderr, stdout
from twisted.internet import reactor
# Webapp stuff
from twisted.internet.protocol import Factory
from twisted.internet.ssl import DefaultOpenSSLContextFactory
import core.logstash import core.logstash
import main import main
import modules.counters import modules.counters
from api.views import API from api.views import API
from core.relay import RelayFactory from core.relay import RelayFactory
from core.server import ServerFactory from core.server import ServerFactory
from twisted.internet import reactor
# Webapp stuff
from twisted.internet.protocol import Factory
from twisted.internet.ssl import DefaultOpenSSLContextFactory
from utils.cleanup import handler from utils.cleanup import handler
from utils.loaders.command_loader import loadCommands from utils.loaders.command_loader import loadCommands
from utils.logging.log import log from utils.logging.log import log
@ -48,10 +47,14 @@ trues = ("true", "1", "t", True)
# Main listener # Main listener
listener_address = getenv("THRESHOLD_LISTENER_HOST", main.config["Listener"]["Address"]) listener_address = getenv("THRESHOLD_LISTENER_HOST", main.config["Listener"]["Address"])
listener_port = int(getenv("THRESHOLD_LISTENER_PORT", main.config["Listener"]["Port"])) listener_port = int(getenv("THRESHOLD_LISTENER_PORT", main.config["Listener"]["Port"]))
listener_ssl = getenv("THRESHOLD_LISTENER_SSL", main.config["Listener"]["UseSSL"]) in trues listener_ssl = (
getenv("THRESHOLD_LISTENER_SSL", main.config["Listener"]["UseSSL"]) in trues
)
# RelayAPI # RelayAPI
relay_enabled = getenv("THRESHOLD_RELAY_ENABLED", main.config["RelayAPI"]["Enabled"]) in trues relay_enabled = (
getenv("THRESHOLD_RELAY_ENABLED", main.config["RelayAPI"]["Enabled"]) in trues
)
relay_address = getenv("THRESHOLD_RELAY_HOST", main.config["RelayAPI"]["Address"]) relay_address = getenv("THRESHOLD_RELAY_HOST", main.config["RelayAPI"]["Address"])
relay_port = int(getenv("THRESHOLD_RELAY_PORT", main.config["RelayAPI"]["Port"])) relay_port = int(getenv("THRESHOLD_RELAY_PORT", main.config["RelayAPI"]["Port"]))
relay_ssl = getenv("THRESHOLD_RELAY_SSL", main.config["RelayAPI"]["UseSSL"]) in trues relay_ssl = getenv("THRESHOLD_RELAY_SSL", main.config["RelayAPI"]["UseSSL"]) in trues
@ -102,7 +105,10 @@ if __name__ == "__main__":
), ),
interface=relay_address, interface=relay_address,
) )
log("Threshold relay running with SSL on %s:%s" % (relay_address, relay_port)) log(
"Threshold relay running with SSL on %s:%s"
% (relay_address, relay_port)
)
else: else:
reactor.listenTCP( reactor.listenTCP(
relay_port, relay_port,

View File

@ -1,6 +1,5 @@
from twisted.internet import reactor
import main import main
from twisted.internet import reactor
from utils.logging.debug import debug from utils.logging.debug import debug
from utils.logging.log import log from utils.logging.log import log

View File

@ -2,9 +2,8 @@ from copy import deepcopy
from datetime import datetime from datetime import datetime
from json import dumps from json import dumps
from siphashc import siphash
import main import main
from siphashc import siphash
from utils.logging.debug import debug from utils.logging.debug import debug
@ -12,16 +11,24 @@ def dedup(numName, b):
c = deepcopy(b) c = deepcopy(b)
if "ts" in c.keys(): if "ts" in c.keys():
del c["ts"] del c["ts"]
c["approxtime"] = str(datetime.utcnow().timestamp())[: main.config["Tweaks"]["DedupPrecision"]] c["approxtime"] = str(datetime.utcnow().timestamp())[
: main.config["Tweaks"]["DedupPrecision"]
]
castHash = siphash(main.hashKey, dumps(c, sort_keys=True)) castHash = siphash(main.hashKey, dumps(c, sort_keys=True))
del c["approxtime"] del c["approxtime"]
isDuplicate = any(castHash in main.lastEvents[x] for x in main.lastEvents.keys() if not x == numName) isDuplicate = any(
castHash in main.lastEvents[x]
for x in main.lastEvents.keys()
if not x == numName
)
if isDuplicate: if isDuplicate:
debug("Duplicate: %s" % (c)) debug("Duplicate: %s" % (c))
return True return True
if numName in main.lastEvents.keys(): if numName in main.lastEvents.keys():
main.lastEvents[numName].insert(0, castHash) main.lastEvents[numName].insert(0, castHash)
main.lastEvents[numName] = main.lastEvents[numName][0 : main.config["Tweaks"]["MaxHash"]] # noqa main.lastEvents[numName] = main.lastEvents[numName][
0 : main.config["Tweaks"]["MaxHash"]
] # noqa
else: else:
main.lastEvents[numName] = [castHash] main.lastEvents[numName] = [castHash]
return False return False

View File

@ -1,13 +1,12 @@
from datetime import datetime from datetime import datetime
from twisted.internet import reactor
from twisted.internet.protocol import ReconnectingClientFactory
from twisted.internet.ssl import DefaultOpenSSLContextFactory
from twisted.words.protocols.irc import IRCClient
import main import main
from core.relay import sendRelayNotification from core.relay import sendRelayNotification
from modules import userinfo from modules import userinfo
from twisted.internet import reactor
from twisted.internet.protocol import ReconnectingClientFactory
from twisted.internet.ssl import DefaultOpenSSLContextFactory
from twisted.words.protocols.irc import IRCClient
from utils.get import getRelay from utils.get import getRelay
from utils.logging.log import error, log from utils.logging.log import error, log
from utils.logging.send import sendAll from utils.logging.send import sendAll
@ -157,7 +156,11 @@ class IRCRelayFactory(ReconnectingClientFactory):
def deliverRelayCommands(num, relayCommands, user=None, stage2=None): def deliverRelayCommands(num, relayCommands, user=None, stage2=None):
keyFN = main.certPath + main.config["Key"] keyFN = main.certPath + main.config["Key"]
certFN = main.certPath + main.config["Certificate"] certFN = main.certPath + main.config["Certificate"]
contextFactory = DefaultOpenSSLContextFactory(keyFN.encode("utf-8", "replace"), certFN.encode("utf-8", "replace")) contextFactory = DefaultOpenSSLContextFactory(
bot = IRCRelayFactory(net=None, num=num, relayCommands=relayCommands, user=user, stage2=stage2) keyFN.encode("utf-8", "replace"), certFN.encode("utf-8", "replace")
)
bot = IRCRelayFactory(
net=None, num=num, relayCommands=relayCommands, user=user, stage2=stage2
)
host, port = getRelay(num) host, port = getRelay(num)
reactor.connectSSL(host, port, bot, contextFactory) reactor.connectSSL(host, port, bot, contextFactory)

View File

@ -13,11 +13,15 @@ def loadCommands(allowDup=False):
# try: # try:
module = __import__("commands.%s" % commandName) module = __import__("commands.%s" % commandName)
if commandName not in CommandMap: if commandName not in CommandMap:
CommandMap[commandName] = getattr(getattr(module, commandName), className) CommandMap[commandName] = getattr(
getattr(module, commandName), className
)
debug("Registered command: %s" % commandName) debug("Registered command: %s" % commandName)
else: else:
if allowDup: if allowDup:
CommandMap[commandName] = getattr(getattr(module, commandName), className) CommandMap[commandName] = getattr(
getattr(module, commandName), className
)
debug("Registered command: %s" % commandName) debug("Registered command: %s" % commandName)
error("Duplicate command: %s" % (commandName)) error("Duplicate command: %s" % (commandName))

View File

@ -12,7 +12,9 @@ def loadSingle(commandName):
try: try:
if commandName in CommandMap.keys(): if commandName in CommandMap.keys():
reload(sys.modules["commands." + commandName]) reload(sys.modules["commands." + commandName])
CommandMap[commandName] = getattr(sys.modules["commands." + commandName], className) CommandMap[commandName] = getattr(
sys.modules["commands." + commandName], className
)
debug("Reloaded command: %s" % commandName) debug("Reloaded command: %s" % commandName)
return "RELOAD" return "RELOAD"
module = __import__("commands.%s" % commandName) module = __import__("commands.%s" % commandName)