100 lines
3.3 KiB
Python
Executable File
100 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import sys
|
|
import socket
|
|
import argparse
|
|
|
|
import cherrypy
|
|
|
|
import nilmdb.server
|
|
|
|
|
|
def main():
|
|
"""Main entry point for the 'nilmdb-server' command line script"""
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description='Run the NilmDB server',
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
|
|
parser.add_argument("-v", "--version", action="version",
|
|
version=nilmdb.__version__)
|
|
|
|
group = parser.add_argument_group("Standard options")
|
|
group.add_argument('-a', '--address',
|
|
help='Only listen on the given address',
|
|
default='0.0.0.0')
|
|
group.add_argument('-p', '--port', help='Listen on the given port',
|
|
type=int, default=12380)
|
|
group.add_argument('-d', '--database', help='Database directory',
|
|
default="./db")
|
|
group.add_argument('-q', '--quiet', help='Silence output',
|
|
action='store_true')
|
|
group.add_argument('-t', '--traceback',
|
|
help='Provide tracebacks in client errors',
|
|
action='store_true', default=False)
|
|
|
|
group = parser.add_argument_group("Debug options")
|
|
group.add_argument('-y', '--yappi', help='Run under yappi profiler and '
|
|
'invoke interactive shell afterwards',
|
|
action='store_true')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Create database object. Needs to be serialized before passing
|
|
# to the Server.
|
|
db = nilmdb.utils.serializer_proxy(nilmdb.server.NilmDB)(args.database)
|
|
|
|
# Configure the server
|
|
if not args.quiet:
|
|
cherrypy._cpconfig.environments['embedded']['log.screen'] = True
|
|
|
|
server = nilmdb.server.Server(db,
|
|
host=args.address,
|
|
port=args.port,
|
|
force_traceback=args.traceback)
|
|
|
|
# Print info
|
|
if not args.quiet:
|
|
print("Version: %s" % nilmdb.__version__)
|
|
print("Database: %s" % (os.path.realpath(args.database)))
|
|
if args.address == '0.0.0.0' or args.address == '::':
|
|
host = socket.getfqdn()
|
|
else:
|
|
host = args.address
|
|
print("Server URL: http://%s:%d/" % (host, args.port))
|
|
print("----")
|
|
|
|
# Run it
|
|
try:
|
|
if args.yappi:
|
|
print("Running in yappi")
|
|
try:
|
|
import yappi
|
|
yappi.start()
|
|
server.start(blocking=True)
|
|
finally:
|
|
yappi.stop()
|
|
stats = yappi.get_func_stats()
|
|
stats.sort("ttot")
|
|
stats.print_all()
|
|
try:
|
|
from IPython import embed
|
|
embed(header="Use the `yappi` or `stats` object to "
|
|
"explore further, `quit` to exit")
|
|
except ModuleNotFoundError:
|
|
print("\nInstall ipython to explore further")
|
|
else:
|
|
server.start(blocking=True)
|
|
except nilmdb.server.serverutil.CherryPyExit:
|
|
print("Exiting due to CherryPy error", file=sys.stderr)
|
|
raise
|
|
finally:
|
|
if not args.quiet:
|
|
print("Closing database")
|
|
db.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|