Add ability to specify a rules file on the CLI
This commit is contained in:
parent
96b029a927
commit
3878c82513
30
bridge.py
30
bridge.py
@ -34,7 +34,7 @@ This program currently only works with group voice calls.
|
|||||||
import sys
|
import sys
|
||||||
from bitarray import bitarray
|
from bitarray import bitarray
|
||||||
from time import time
|
from time import time
|
||||||
from importlib import import_module
|
import importlib.util
|
||||||
|
|
||||||
# Twisted is pretty important, so I keep it separate
|
# Twisted is pretty important, so I keep it separate
|
||||||
from twisted.internet.protocol import Factory, Protocol
|
from twisted.internet.protocol import Factory, Protocol
|
||||||
@ -94,16 +94,10 @@ def config_reports(_config, _factory):
|
|||||||
# configuration file and listed as "active". It can be empty,
|
# configuration file and listed as "active". It can be empty,
|
||||||
# but it has to exist.
|
# but it has to exist.
|
||||||
def make_bridges(_rules):
|
def make_bridges(_rules):
|
||||||
try:
|
|
||||||
bridge_file = import_module(_rules)
|
|
||||||
logger.info('(ROUTER) Routing bridges file found and bridges imported')
|
|
||||||
except ImportError:
|
|
||||||
sys.exit('(ROUTER) TERMINATING: Routing bridges file not found or invalid')
|
|
||||||
|
|
||||||
# Convert integer GROUP ID numbers from the config into hex strings
|
# Convert integer GROUP ID numbers from the config into hex strings
|
||||||
# we need to send in the actual data packets.
|
# we need to send in the actual data packets.
|
||||||
for _bridge in bridge_file.BRIDGES:
|
for _bridge in _rules:
|
||||||
for _system in bridge_file.BRIDGES[_bridge]:
|
for _system in _rules[_bridge]:
|
||||||
if _system['SYSTEM'] not in CONFIG['SYSTEMS']:
|
if _system['SYSTEM'] not in CONFIG['SYSTEMS']:
|
||||||
sys.exit('ERROR: Conference bridge "{}" references a system named "{}" that is not enabled in the main configuration'.format(_bridge, _system['SYSTEM']))
|
sys.exit('ERROR: Conference bridge "{}" references a system named "{}" that is not enabled in the main configuration'.format(_bridge, _system['SYSTEM']))
|
||||||
|
|
||||||
@ -117,7 +111,7 @@ def make_bridges(_rules):
|
|||||||
_system['TIMER'] = time() + _system['TIMEOUT']
|
_system['TIMER'] = time() + _system['TIMEOUT']
|
||||||
else:
|
else:
|
||||||
_system['TIMER'] = time()
|
_system['TIMER'] = time()
|
||||||
return bridge_file.BRIDGES
|
return _rules
|
||||||
|
|
||||||
|
|
||||||
# Run this every minute for rule timer updates
|
# Run this every minute for rule timer updates
|
||||||
@ -741,6 +735,7 @@ if __name__ == '__main__':
|
|||||||
# CLI argument parser - handles picking up the config file from the command line, and sending a "help" message
|
# CLI argument parser - handles picking up the config file from the command line, and sending a "help" message
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('-c', '--config', action='store', dest='CONFIG_FILE', help='/full/path/to/config.file (usually hblink.cfg)')
|
parser.add_argument('-c', '--config', action='store', dest='CONFIG_FILE', help='/full/path/to/config.file (usually hblink.cfg)')
|
||||||
|
parser.add_argument('-r', '--rules', action='store', dest='RULES_FILE', help='/full/path/to/rules.file (usually rules.py)')
|
||||||
parser.add_argument('-l', '--logging', action='store', dest='LOG_LEVEL', help='Override config file logging level.')
|
parser.add_argument('-l', '--logging', action='store', dest='LOG_LEVEL', help='Override config file logging level.')
|
||||||
cli_args = parser.parse_args()
|
cli_args = parser.parse_args()
|
||||||
|
|
||||||
@ -751,6 +746,10 @@ if __name__ == '__main__':
|
|||||||
# Call the external routine to build the configuration dictionary
|
# Call the external routine to build the configuration dictionary
|
||||||
CONFIG = config.build_config(cli_args.CONFIG_FILE)
|
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)
|
||||||
|
if not cli_args.RULES_FILE:
|
||||||
|
cli_args.RULES_FILE = os.path.dirname(os.path.abspath(__file__))+'/rules.py'
|
||||||
|
|
||||||
# Start the system logger
|
# Start the system logger
|
||||||
if cli_args.LOG_LEVEL:
|
if cli_args.LOG_LEVEL:
|
||||||
CONFIG['LOGGER']['LOG_LEVEL'] = cli_args.LOG_LEVEL
|
CONFIG['LOGGER']['LOG_LEVEL'] = cli_args.LOG_LEVEL
|
||||||
@ -772,8 +771,17 @@ if __name__ == '__main__':
|
|||||||
# Create the name-number mapping dictionaries
|
# Create the name-number mapping dictionaries
|
||||||
peer_ids, subscriber_ids, talkgroup_ids = mk_aliases(CONFIG)
|
peer_ids, subscriber_ids, talkgroup_ids = mk_aliases(CONFIG)
|
||||||
|
|
||||||
|
# Import the ruiles file as a module, and create BRIDGES from it
|
||||||
|
spec = importlib.util.spec_from_file_location("module.name", cli_args.RULES_FILE)
|
||||||
|
rules_module = importlib.util.module_from_spec(spec)
|
||||||
|
try:
|
||||||
|
spec.loader.exec_module(rules_module)
|
||||||
|
logger.info('(ROUTER) Routing bridges file found and bridges imported: %s', cli_args.RULES_FILE)
|
||||||
|
except (ImportError, FileNotFoundError):
|
||||||
|
sys.exit('(ROUTER) TERMINATING: Routing bridges file not found or invalid: {}'.format(cli_args.RULES_FILE))
|
||||||
|
|
||||||
# Build the routing rules file
|
# Build the routing rules file
|
||||||
BRIDGES = make_bridges('rules')
|
BRIDGES = make_bridges(rules_module.BRIDGES)
|
||||||
|
|
||||||
# INITIALIZE THE REPORTING LOOP
|
# INITIALIZE THE REPORTING LOOP
|
||||||
if CONFIG['REPORTS']['REPORT']:
|
if CONFIG['REPORTS']['REPORT']:
|
||||||
|
Loading…
Reference in New Issue
Block a user