Allow gaps in relay numbering

This commit is contained in:
2022-08-11 19:22:09 +01:00
parent a3fe92bea9
commit c983a8e3b6
8 changed files with 86 additions and 40 deletions

0
modules/__init__.py Normal file
View File

View File

@@ -9,10 +9,19 @@ from utils.logging.debug import debug
from utils.logging.log import error, log, warn
def getActiveRelays(net):
activeRelays = [x for x in main.network[net].relays.keys() if main.network[net].relays[x]["enabled"]]
return activeRelays
def allRelaysActive(net):
relayNum = len(main.network[net].relays.keys())
"""
Check if all enabled relays are active and authenticated.
"""
activeRelays = getActiveRelays(net)
relayNum = len(activeRelays) + 1
existNum = 0
for i in main.network[net].relays.keys():
for i in activeRelays:
name = net + str(i)
if name in main.IRCPool.keys():
if main.IRCPool[name].authenticated:
@@ -34,7 +43,7 @@ def getChanFree(net, new):
"""
chanfree = {}
chanlimits = set()
for i in main.network[net].relays.keys():
for i in getActiveRelays(net):
if i in new:
continue
name = net + str(i)
@@ -60,9 +69,8 @@ def emptyChanAllocate(net, flist, relay, new):
toalloc = len(flist)
if toalloc > sum(chanfree[0].values()):
correction = round(toalloc - sum(chanfree[0].values()) / chanfree[1])
# print("correction", correction)
warn("Ran out of channel spaces, provisioning additional %i relays for %s" % (correction, net))
# newNums = modules.provision.provisionMultipleRelays(net, correction)
modules.provision.provisionMultipleRelays(net, correction)
return False
for i in chanfree[0].keys():
for x in range(chanfree[0][i]):
@@ -88,7 +96,7 @@ def populateChans(net, clist, relay, new):
def notifyJoin(net):
for i in main.network[net].relays.keys():
for i in getActiveRelays(net):
name = net + str(i)
if name in main.IRCPool.keys():
main.IRCPool[name].checkChannels()
@@ -98,7 +106,7 @@ def minifyChans(net, listinfo):
if not allRelaysActive(net):
error("All relays for %s are not active, cannot minify list" % net)
return False
for i in main.network[net].relays.keys():
for i in getActiveRelays(net):
name = net + str(i)
for x in main.IRCPool[name].channels:
for y in listinfo:
@@ -122,12 +130,12 @@ def keepChannels(net, listinfo, mean, sigrelay, relay):
error("Network %s is too big to cover: %i relays required" % (net, sigrelay))
return
if coverAll:
needed = relay - len(main.network[net].relays.keys())
needed = relay - len(getActiveRelays(net))
newNums = modules.provision.provisionMultipleRelays(net, needed)
flist = [i[0] for i in listinfo]
populateChans(net, flist, relay, newNums)
else:
needed = sigrelay - len(main.network[net].relays.keys())
needed = sigrelay - len(getActiveRelays(net))
newNums = modules.provision.provisionMultipleRelays(net, needed)
siglist = [i[0] for i in listinfo if int(i[1]) > mean]
populateChans(net, siglist, sigrelay, newNums)
@@ -156,7 +164,7 @@ def partSingle(net, channel):
:return:
"""
parted = []
for i in main.network[net].relays.keys():
for i in getActiveRelays(net):
name = f"{net}{i}"
if name in main.IRCPool.keys():
if channel in main.IRCPool[name].channels:

35
modules/helpers.py Normal file
View File

@@ -0,0 +1,35 @@
import main
from modules import chankeep
def get_first_relay(net):
"""
Get the first relay in the network.
:param net: the network
:param num: number or relay
:return: IRCPool instance for the IRC bot
"""
cur_relay = 0
max_relay = len(main.network[net].relays.keys())+1
activeRelays = chankeep.getActiveRelays(net)
while cur_relay != max_relay:
cur_relay += 1
if cur_relay not in activeRelays:
continue
name = net + str(cur_relay)
if name in main.IRCPool.keys():
return main.IRCPool[name]
return None
def is_first_relay(net, num):
"""
Determine if we are the first relay for the network.
:param net: the network
:param num: number or relay
:return: True if we are the first relay, False otherwise
"""
cur_relay = 0
max_relay = len(main.network[net].relays.keys())
while cur_relay > max_relay:
name = net + str(cur_relay)
if name in main.IRCPool.keys():
return cur_relay == num

View File

@@ -3,6 +3,7 @@ from twisted.internet import reactor
import main
import modules.regproc
from utils.deliver_relay_commands import deliverRelayCommands
from utils.logging.log import warn
def provisionUserNetworkData(
@@ -72,13 +73,16 @@ def provisionRelay(num, network): # provision user and network data
main.network[network].port,
main.network[network].security,
main.network[network].auth,
main.network[network].aliases[num]["password"]
main.network[network].aliases[num]["password"],
)
if main.config["ConnectOnCreate"]:
reactor.callLater(10, main.network[network].start_bot, num)
def provisionMultipleRelays(net, relaysNeeded):
if not main.config["ChanKeep"]["Provision"]:
warn(f"Asked to create {relaysNeeded} relays for {net}, but provisioning is disabled")
return 0
numsProvisioned = []
for i in range(relaysNeeded):
num, alias = main.network[net].add_relay()