If bridge_master.py is killed with HUP:

write config and bridge state to disk.

If, when started again, state files are less that 25 seconds old
load these instead of parsing freedmr.cfg and rules.py

This means, it's possible to effect a seamless restart, without causing
systems to have to re-login.
key
Simon 4 years ago
parent 77e2dd04da
commit 19a656c88b
No known key found for this signature in database
GPG Key ID: 6ACF11630B5D8F82

@ -4,7 +4,13 @@
# - how often the Master maintenance loop runs # - how often the Master maintenance loop runs
# MAX_MISSED - how many pings are missed before we give up and re-register # MAX_MISSED - how many pings are missed before we give up and re-register
# - number of times the master maintenance loop runs before de-registering a peer # - number of times the master maintenance loop runs before de-registering a peer
# You should not need to change this from the default.
# #
# GEN_STAT_BRIDGES - Generate static bridges to forward traffic to other connected servers.
# Generally this should be left True, unless you are building a hidden server
# Which does not participate in the mesh network
#
# ALLOW_NULL_PASSPHRASE
# ACLs: # ACLs:
# #
# Access Control Lists are a very powerful tool for administering your system. # Access Control Lists are a very powerful tool for administering your system.
@ -45,7 +51,7 @@ REG_ACL: PERMIT:ALL
SUB_ACL: DENY:1 SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL TGID_TS2_ACL: PERMIT:ALL
GEN_STAT_BRIDGES: False GEN_STAT_BRIDGES: True
ALLOW_NULL_PASSPHRASE: True ALLOW_NULL_PASSPHRASE: True
ANNOUNCEMENT_LANGUAGES: ANNOUNCEMENT_LANGUAGES:
SERVER_ID: 0000 SERVER_ID: 0000

@ -409,6 +409,24 @@ def subMapWrite():
except: except:
logger.warning('(SUBSCRIBER) Cannot write SUB_MAP to file') logger.warning('(SUBSCRIBER) Cannot write SUB_MAP to file')
def configPickle():
try:
_fh = open('config.pkl','wb')
pickle.dump(CONFIG,_fh)
_fh.close()
logger.info('(GLOBAL) Writing CONFIG to disk')
except:
logger.warning('(GLOBAL) Cannot write config.pkl')
def bridgePickle():
try:
_fh = open('bridge.pkl','wb')
pickle.dump(BRIDGES,_fh)
_fh.close()
logger.info('(GLOBAL) Writing BRIDGES to disk')
except:
logger.warning('(GLOBAL) Cannot write bridge.pkl')
#Subscriber Map trimmer loop #Subscriber Map trimmer loop
def SubMapTrimmer(): def SubMapTrimmer():
logger.debug('(SUBSCRIBER) Subscriber Map trimmer loop started') logger.debug('(SUBSCRIBER) Subscriber Map trimmer loop started')
@ -2828,8 +2846,20 @@ if __name__ == '__main__':
if not cli_args.CONFIG_FILE: if not cli_args.CONFIG_FILE:
cli_args.CONFIG_FILE = os.path.dirname(os.path.abspath(__file__))+'/hblink.cfg' cli_args.CONFIG_FILE = os.path.dirname(os.path.abspath(__file__))+'/hblink.cfg'
# Call the external routine to build the configuration dictionary file_exists = os.path.isfile('config.pkl') == True
CONFIG = config.build_config(cli_args.CONFIG_FILE) if file_exists:
if os.path.getmtime('config.pkl') > (time() - 25):
try:
with open('config.pkl','rb') as _fh:
CONFIG = pickle.load(_fh)
print('(CONFIG) loaded config .pkl from previous shutdown')
except:
print('(CONFIG) Cannot load config.pkl file')
CONFIG = config.build_config(cli_args.CONFIG_FILE)
else:
os.unlink("config.pkl")
else:
CONFIG = config.build_config(cli_args.CONFIG_FILE)
# Ensure we have a path for the rules file, if one wasn't specified, then use the default (top of file) # Ensure we have a path for the rules file, if one wasn't specified, then use the default (top of file)
if not cli_args.RULES_FILE: if not cli_args.RULES_FILE:
@ -2883,9 +2913,13 @@ if __name__ == '__main__':
reactor.stop() reactor.stop()
if CONFIG['ALIASES']['SUB_MAP_FILE']: if CONFIG['ALIASES']['SUB_MAP_FILE']:
subMapWrite() subMapWrite()
if _signal == signal.SIGHUP:
configPickle()
bridgePickle()
# Set signal handers so that we can gracefully exit if need be # Set signal handers so that we can gracefully exit if need be
for sig in [signal.SIGINT, signal.SIGTERM]: for sig in [signal.SIGINT, signal.SIGTERM, signal.SIGHUP]:
signal.signal(sig, sig_handler) signal.signal(sig, sig_handler)
# Create the name-number mapping dictionaries # Create the name-number mapping dictionaries
@ -2911,8 +2945,22 @@ if __name__ == '__main__':
except (ImportError, FileNotFoundError): except (ImportError, FileNotFoundError):
sys.exit('(ROUTER) TERMINATING: Routing bridges file not found or invalid: {}'.format(cli_args.RULES_FILE)) sys.exit('(ROUTER) TERMINATING: Routing bridges file not found or invalid: {}'.format(cli_args.RULES_FILE))
# Build the routing rules file #Load pickle of bridges if it's less than 25 seconds old
BRIDGES = make_bridges(rules_module.BRIDGES) if os.path.isfile('bridge.pkl'):
if os.path.getmtime('config.pkl') > (time() - 25):
try:
with open('bridge.pkl','rb') as _fh:
BRIDGES = pickle.load(_fh)
logger.info('(BRIDGE) loaded bridge.pkl from previous shutdown')
except:
logger.warning('(BRIDGE) Cannot load bridge.pkl file')
BRIDGES = make_bridges(rules_module.BRIDGES)
else:
BRIDGES = make_bridges(rules_module.BRIDGES)
os.unlink("bridge.pkl")
else:
BRIDGES = make_bridges(rules_module.BRIDGES)
#Subscriber map for unit calls - complete with test entry #Subscriber map for unit calls - complete with test entry
#SUB_MAP = {bytes_3(73578):('REP-1',1,time())} #SUB_MAP = {bytes_3(73578):('REP-1',1,time())}

Loading…
Cancel
Save

Powered by TurnKey Linux.