Merge branch 'qvarforth:main' into add_docker
This commit is contained in:
commit
da0178119c
10
README.md
10
README.md
|
|
@ -242,11 +242,11 @@ Note that the collector and wsserver shell scripts can be scheduled to start onc
|
||||||
|
|
||||||
Crontab example
|
Crontab example
|
||||||
```
|
```
|
||||||
10 * * * * ~/trackdirect/server/scripts/heatmapcreator.sh trackdirect.ini ~/trackdirect/htdocs/public/heatmaps
|
10 * * * * ~/trackdirect/server/scripts/heatmapcreator.sh trackdirect.ini ~/trackdirect/htdocs/public/heatmaps 2>&1 &
|
||||||
40 * * * * ~/trackdirect/server/scripts/remover.sh trackdirect.ini
|
40 * * * * ~/trackdirect/server/scripts/remover.sh trackdirect.ini 2>&1 &
|
||||||
0 * * * * ~/trackdirect/server/scripts/ogn_devices_install.sh trackdirect 5432
|
0 * * * * ~/trackdirect/server/scripts/ogn_devices_install.sh trackdirect 5432 2>&1 &
|
||||||
* * * * * ~/trackdirect/server/scripts/wsserver.sh trackdirect.ini
|
* * * * * ~/trackdirect/server/scripts/wsserver.sh trackdirect.ini 2>&1 &
|
||||||
* * * * * ~/trackdirect/server/scripts/collector.sh trackdirect.ini 0
|
* * * * * ~/trackdirect/server/scripts/collector.sh trackdirect.ini 0 2>&1 &
|
||||||
```
|
```
|
||||||
|
|
||||||
### Server Requirements
|
### Server Requirements
|
||||||
|
|
|
||||||
|
|
@ -25,11 +25,14 @@ save_ogn_stations_with_missing_identity="0"
|
||||||
[websocket_server]
|
[websocket_server]
|
||||||
|
|
||||||
;; Websocket server host
|
;; Websocket server host
|
||||||
host="localhost"
|
host="0.0.0.0"
|
||||||
|
|
||||||
;; Websocket server port (must be same as port specified in index.php)
|
;; Websocket server port, must be same as port specified in index.php (if not using a reverse proxy)
|
||||||
port="9000"
|
port="9000"
|
||||||
|
|
||||||
|
;; If you are using a reverse proxy you need to play with the "external_port" setting, otherwise it should be the same as "port"
|
||||||
|
external_port="9000"
|
||||||
|
|
||||||
;; Websocket server log output
|
;; Websocket server log output
|
||||||
error_log="~/trackdirect/server/log/wsserver_aprs.log"
|
error_log="~/trackdirect/server/log/wsserver_aprs.log"
|
||||||
|
|
||||||
|
|
@ -60,7 +63,7 @@ aprs_source_id1="1"
|
||||||
|
|
||||||
;; Allow time travel
|
;; Allow time travel
|
||||||
;; Use this settings to disable/enable data requests with a time interval (this must be disabled for the OGN network)
|
;; Use this settings to disable/enable data requests with a time interval (this must be disabled for the OGN network)
|
||||||
allow_time_travel="1"
|
allow_time_travel="0"
|
||||||
|
|
||||||
;; Max default time in minutes (how old packets that will be included in the response)
|
;; Max default time in minutes (how old packets that will be included in the response)
|
||||||
;; This setting should be no more than 1440 for for the OGN network.
|
;; This setting should be no more than 1440 for for the OGN network.
|
||||||
|
|
|
||||||
|
|
@ -20,31 +20,35 @@ if __name__ == '__main__':
|
||||||
config = trackdirect.TrackDirectConfig()
|
config = trackdirect.TrackDirectConfig()
|
||||||
config.populate(sys.argv[1])
|
config.populate(sys.argv[1])
|
||||||
|
|
||||||
if (len(sys.argv) < 3) :
|
if (len(sys.argv) < 3):
|
||||||
collectorNumber = 0
|
collectorNumber = 0
|
||||||
else :
|
else:
|
||||||
collectorNumber = int(sys.argv[2])
|
collectorNumber = int(sys.argv[2])
|
||||||
collectorOptions = config.collector[collectorNumber]
|
collectorOptions = config.collector[collectorNumber]
|
||||||
|
|
||||||
saveOgnStationsWithMissingIdentity = False
|
saveOgnStationsWithMissingIdentity = False
|
||||||
if (config.saveOgnStationsWithMissingIdentity) :
|
if (config.saveOgnStationsWithMissingIdentity):
|
||||||
saveOgnStationsWithMissingIdentity = True
|
saveOgnStationsWithMissingIdentity = True
|
||||||
|
|
||||||
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
collectorOptions['error_log']), mode='a', maxBytes=1000000, backupCount=10)
|
collectorOptions['error_log']), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
fh.setLevel(logging.WARNING)
|
|
||||||
|
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
|
|
||||||
|
consoleHandler = logging.StreamHandler()
|
||||||
|
consoleHandler.setFormatter(formatter)
|
||||||
|
|
||||||
trackDirectLogger = logging.getLogger('trackdirect')
|
trackDirectLogger = logging.getLogger('trackdirect')
|
||||||
trackDirectLogger.addHandler(fh)
|
trackDirectLogger.addHandler(fh)
|
||||||
trackDirectLogger.setLevel(logging.WARNING)
|
trackDirectLogger.addHandler(consoleHandler)
|
||||||
|
trackDirectLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
aprslibLogger = logging.getLogger('aprslib.IS')
|
aprslibLogger = logging.getLogger('aprslib.IS')
|
||||||
aprslibLogger.addHandler(fh)
|
aprslibLogger.addHandler(fh)
|
||||||
aprslibLogger.setLevel(logging.WARNING)
|
aprslibLogger.addHandler(consoleHandler)
|
||||||
|
aprslibLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
trackDirectLogger.warning("Starting (Collecting from " + collectorOptions['host'] + ":" + str(
|
trackDirectLogger.warning("Starting (Collecting from " + collectorOptions['host'] + ":" + str(
|
||||||
collectorOptions['port_full']) + " using " + collectorOptions['callsign'] + " and " + str(collectorOptions['passcode']) + ")")
|
collectorOptions['port_full']) + " using " + collectorOptions['callsign'] + " and " + str(collectorOptions['passcode']) + ")")
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,17 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
'~/trackdirect/server/log/heatmap.log'), mode='a', maxBytes=1000000, backupCount=10)
|
'~/trackdirect/server/log/heatmap.log'), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
fh.setLevel(logging.INFO)
|
|
||||||
|
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
|
|
||||||
|
consoleHandler = logging.StreamHandler()
|
||||||
|
consoleHandler.setFormatter(formatter)
|
||||||
|
|
||||||
trackDirectLogger = logging.getLogger('trackdirect')
|
trackDirectLogger = logging.getLogger('trackdirect')
|
||||||
trackDirectLogger.addHandler(fh)
|
trackDirectLogger.addHandler(fh)
|
||||||
|
trackDirectLogger.addHandler(consoleHandler)
|
||||||
trackDirectLogger.setLevel(logging.INFO)
|
trackDirectLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
trackDirectLogger.info("Starting (output directory: " + sys.argv[2] + ")")
|
trackDirectLogger.info("Starting (output directory: " + sys.argv[2] + ")")
|
||||||
|
|
|
||||||
|
|
@ -37,14 +37,17 @@ if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
'~/trackdirect/server/log/remover_' + config.dbName + '.log'), mode='a', maxBytes=1000000, backupCount=10)
|
'~/trackdirect/server/log/remover_' + config.dbName + '.log'), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
fh.setLevel(logging.INFO)
|
|
||||||
|
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
|
|
||||||
|
consoleHandler = logging.StreamHandler()
|
||||||
|
consoleHandler.setFormatter(formatter)
|
||||||
|
|
||||||
trackDirectLogger = logging.getLogger('trackdirect')
|
trackDirectLogger = logging.getLogger('trackdirect')
|
||||||
trackDirectLogger.addHandler(fh)
|
trackDirectLogger.addHandler(fh)
|
||||||
|
trackDirectLogger.addHandler(consoleHandler)
|
||||||
trackDirectLogger.setLevel(logging.INFO)
|
trackDirectLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
trackDirectLogger.info("Starting")
|
trackDirectLogger.info("Starting")
|
||||||
|
|
@ -230,7 +233,6 @@ if __name__ == '__main__':
|
||||||
if (deletedRows > 0):
|
if (deletedRows > 0):
|
||||||
trackDirectLogger.info("Deleted %s stations" % (deletedRows))
|
trackDirectLogger.info("Deleted %s stations" % (deletedRows))
|
||||||
|
|
||||||
|
|
||||||
cursor.execute("""VACUUM ANALYZE station""")
|
cursor.execute("""VACUUM ANALYZE station""")
|
||||||
cursor.execute("""REINDEX TABLE station""")
|
cursor.execute("""REINDEX TABLE station""")
|
||||||
cursor.execute("""VACUUM ANALYZE sender""")
|
cursor.execute("""VACUUM ANALYZE sender""")
|
||||||
|
|
|
||||||
|
|
@ -33,14 +33,17 @@ if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
'~/trackdirect/server/log/stationremover.log'), mode='a', maxBytes=1000000, backupCount=10)
|
'~/trackdirect/server/log/stationremover.log'), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
fh.setLevel(logging.INFO)
|
|
||||||
|
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
|
|
||||||
|
consoleHandler = logging.StreamHandler()
|
||||||
|
consoleHandler.setFormatter(formatter)
|
||||||
|
|
||||||
trackDirectLogger = logging.getLogger('trackdirect')
|
trackDirectLogger = logging.getLogger('trackdirect')
|
||||||
trackDirectLogger.addHandler(fh)
|
trackDirectLogger.addHandler(fh)
|
||||||
|
trackDirectLogger.addHandler(consoleHandler)
|
||||||
trackDirectLogger.setLevel(logging.INFO)
|
trackDirectLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
trackDirectLogger.info("Starting")
|
trackDirectLogger.info("Starting")
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,8 @@ def master(options, trackDirectLogger):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
factory = WebSocketServerFactory(
|
factory = WebSocketServerFactory(
|
||||||
"ws://" + config.websocketHostname + ":" + str(config.websocketPort))
|
"ws://" + config.websocketHostname + ":" + str(config.websocketPort),
|
||||||
|
externalPort = config.websocketExternalPort)
|
||||||
factory.protocol = trackdirect.TrackDirectWebsocketServer
|
factory.protocol = trackdirect.TrackDirectWebsocketServer
|
||||||
|
|
||||||
resource = WebSocketResource(factory)
|
resource = WebSocketResource(factory)
|
||||||
|
|
@ -35,9 +36,8 @@ def master(options, trackDirectLogger):
|
||||||
site = Site(root)
|
site = Site(root)
|
||||||
|
|
||||||
port = reactor.listenTCP(config.websocketPort, site)
|
port = reactor.listenTCP(config.websocketPort, site)
|
||||||
port.stopReading()
|
|
||||||
|
|
||||||
for i in range(options.workers):
|
for i in range(options.workers - 1):
|
||||||
args = [sys.executable, "-u", __file__]
|
args = [sys.executable, "-u", __file__]
|
||||||
args.extend(sys.argv[1:])
|
args.extend(sys.argv[1:])
|
||||||
args.extend(["--fd", str(port.fileno()), "--cpuid", str(i)])
|
args.extend(["--fd", str(port.fileno()), "--cpuid", str(i)])
|
||||||
|
|
@ -67,7 +67,8 @@ def worker(options, trackDirectLogger):
|
||||||
trackDirectLogger.warning("Starting worker with PID " + str(workerPid))
|
trackDirectLogger.warning("Starting worker with PID " + str(workerPid))
|
||||||
|
|
||||||
factory = WebSocketServerFactory(
|
factory = WebSocketServerFactory(
|
||||||
"ws://" + config.websocketHostname + ":" + str(config.websocketPort))
|
"ws://" + config.websocketHostname + ":" + str(config.websocketPort),
|
||||||
|
externalPort = config.websocketExternalPort)
|
||||||
factory.protocol = trackdirect.TrackDirectWebsocketServer
|
factory.protocol = trackdirect.TrackDirectWebsocketServer
|
||||||
|
|
||||||
# Enable WebSocket extension "permessage-deflate".
|
# Enable WebSocket extension "permessage-deflate".
|
||||||
|
|
@ -99,7 +100,7 @@ if __name__ == '__main__':
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Track Direct WebSocket Server')
|
description='Track Direct WebSocket Server')
|
||||||
parser.add_argument('--config', dest='config', type=str, default=None,
|
parser.add_argument('--config', dest='config', type=str, default=None,
|
||||||
help='The Track Direct config file, e.g. aprsdirect.ini')
|
help='The Track Direct config file, e.g. trackdirect.ini')
|
||||||
parser.add_argument('--workers', dest='workers', type=int, default=DEFAULT_WORKERS,
|
parser.add_argument('--workers', dest='workers', type=int, default=DEFAULT_WORKERS,
|
||||||
help='Number of workers to spawn - should fit the number of (physical) CPU cores.')
|
help='Number of workers to spawn - should fit the number of (physical) CPU cores.')
|
||||||
parser.add_argument('--fd', dest='fd', type=int, default=None,
|
parser.add_argument('--fd', dest='fd', type=int, default=None,
|
||||||
|
|
@ -116,20 +117,25 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
config.errorLog), mode='a', maxBytes=1000000, backupCount=10)
|
config.errorLog), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
fh.setLevel(logging.WARNING)
|
|
||||||
fh.setFormatter(formatter)
|
fh.setFormatter(formatter)
|
||||||
|
|
||||||
|
consoleHandler = logging.StreamHandler()
|
||||||
|
consoleHandler.setFormatter(formatter)
|
||||||
|
|
||||||
trackDirectLogger = logging.getLogger('trackdirect')
|
trackDirectLogger = logging.getLogger('trackdirect')
|
||||||
trackDirectLogger.addHandler(fh)
|
trackDirectLogger.addHandler(fh)
|
||||||
|
trackDirectLogger.addHandler(consoleHandler)
|
||||||
|
trackDirectLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
fh2 = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
fh2 = logging.handlers.RotatingFileHandler(filename=os.path.expanduser(
|
||||||
config.errorLog), mode='a', maxBytes=1000000, backupCount=10)
|
config.errorLog), mode='a', maxBytes=1000000, backupCount=10)
|
||||||
# aprslib is logging non important "socket error on ..." using ERROR-level
|
# aprslib is logging non important "socket error on ..." using ERROR-level
|
||||||
fh2.setLevel(logging.CRITICAL)
|
|
||||||
fh2.setFormatter(formatter)
|
fh2.setFormatter(formatter)
|
||||||
|
|
||||||
aprslibLogger = logging.getLogger('aprslib.IS')
|
aprslibLogger = logging.getLogger('aprslib.IS')
|
||||||
aprslibLogger.addHandler(fh2)
|
aprslibLogger.addHandler(fh2)
|
||||||
|
aprslibLogger.addHandler(consoleHandler)
|
||||||
|
aprslibLogger.setLevel(logging.INFO)
|
||||||
|
|
||||||
if options.fd is not None:
|
if options.fd is not None:
|
||||||
worker(options, trackDirectLogger)
|
worker(options, trackDirectLogger)
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,14 @@ class TrackDirectConfig(Singleton):
|
||||||
'websocket_server', 'host').strip('"')
|
'websocket_server', 'host').strip('"')
|
||||||
self.websocketPort = int(configParser.get(
|
self.websocketPort = int(configParser.get(
|
||||||
'websocket_server', 'port').strip('"'))
|
'websocket_server', 'port').strip('"'))
|
||||||
|
|
||||||
|
self.websocketExternalPort = self.websocketPort
|
||||||
|
try :
|
||||||
|
self.websocketExternalPort = int(configParser.get(
|
||||||
|
'websocket_server', 'external_port').strip('"'))
|
||||||
|
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
|
||||||
|
pass
|
||||||
|
|
||||||
self.errorLog = configParser.get(
|
self.errorLog = configParser.get(
|
||||||
'websocket_server', 'error_log').strip('"')
|
'websocket_server', 'error_log').strip('"')
|
||||||
self.websocketFrequencyLimit = configParser.get(
|
self.websocketFrequencyLimit = configParser.get(
|
||||||
|
|
|
||||||
|
|
@ -435,4 +435,4 @@ class TrackDirectWebsocketServer(WebSocketServerProtocol):
|
||||||
self.connectionState.setLatestMinutes(request["minutes"], None)
|
self.connectionState.setLatestMinutes(request["minutes"], None)
|
||||||
|
|
||||||
if ("noRealTime" in request):
|
if ("noRealTime" in request):
|
||||||
self.connectionState.disableRealTime()
|
self.connectionState.disableRealTime()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue