1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-24 17:28:08 +00:00

Merge pull request #39 from planctechnologies/dev

Improve logging, PEP8 cleanup
This commit is contained in:
Jeremy Grossmann 2014-10-28 16:39:58 -06:00
commit 8c47522a18
4 changed files with 63 additions and 43 deletions

3
.gitignore vendored
View File

@ -35,5 +35,8 @@ nosetests.xml
.pydevproject .pydevproject
.settings .settings
# Pycharm
.idea
# Gedit Backup Files # Gedit Backup Files
*~ *~

View File

@ -34,6 +34,7 @@ define("host", default="0.0.0.0", help="run on the given host/IP address", type=
define("port", default=8000, help="run on the given port", type=int) define("port", default=8000, help="run on the given port", type=int)
define("ipc", default=False, help="use IPC for module communication", type=bool) define("ipc", default=False, help="use IPC for module communication", type=bool)
define("version", default=False, help="show the version", type=bool) define("version", default=False, help="show the version", type=bool)
define("quiet", default=False, help="do not show output on stdout", type=bool)
def locale_check(): def locale_check():
@ -96,17 +97,25 @@ def main():
raise SystemExit raise SystemExit
current_year = datetime.date.today().year current_year = datetime.date.today().year
print("GNS3 server version {}".format(__version__))
print("Copyright (c) 2007-{} GNS3 Technologies Inc.".format(current_year)) user_log = logging.getLogger('user_facing')
if not options.quiet:
# Send user facing messages to stdout.
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.addFilter(logging.Filter(name='user_facing'))
user_log.addHandler(stream_handler)
user_log.propagate = False
user_log.info("GNS3 server version {}".format(__version__))
user_log.info("Copyright (c) 2007-{} GNS3 Technologies Inc.".format(current_year))
# we only support Python 3 version >= 3.3 # we only support Python 3 version >= 3.3
if sys.version_info < (3, 3): if sys.version_info < (3, 3):
raise RuntimeError("Python 3.3 or higher is required") raise RuntimeError("Python 3.3 or higher is required")
print("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(
minor=sys.version_info[1], major=sys.version_info[0], minor=sys.version_info[1],
micro=sys.version_info[2], micro=sys.version_info[2], pid=os.getpid()))
pid=os.getpid()))
# check for the correct locale # check for the correct locale
# (UNIX/Linux only) # (UNIX/Linux only)
@ -118,9 +127,7 @@ def main():
log.critical("the current working directory doesn't exist") log.critical("the current working directory doesn't exist")
return return
server = Server(options.host, server = Server(options.host, options.port, options.ipc)
options.port,
ipc=options.ipc)
server.load_modules() server.load_modules()
server.run() server.run()

View File

@ -50,6 +50,7 @@ from .modules import MODULES
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Server(object): class Server(object):
# built-in handlers # built-in handlers
@ -57,7 +58,7 @@ class Server(object):
(r"/upload", FileUploadHandler), (r"/upload", FileUploadHandler),
(r"/login", LoginHandler)] (r"/login", LoginHandler)]
def __init__(self, host, port, ipc=False): def __init__(self, host, port, ipc):
self._host = host self._host = host
self._port = port self._port = port
@ -188,11 +189,10 @@ class Server(object):
**settings) # FIXME: debug mode! **settings) # FIXME: debug mode!
try: try:
print("Starting server on {}:{} (Tornado v{}, PyZMQ v{}, ZMQ v{})".format(self._host, user_log = logging.getLogger('user_facing')
self._port, user_log.info("Starting server on {}:{} (Tornado v{}, PyZMQ v{}, ZMQ v{})".format(
tornado.version, self._host, self._port, tornado.version, zmq.__version__, zmq.zmq_version()))
zmq.__version__,
zmq.zmq_version()))
kwargs = {"address": self._host} kwargs = {"address": self._host}
if ssl_options: if ssl_options:
@ -230,7 +230,7 @@ class Server(object):
try: try:
ioloop.start() ioloop.start()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
print("\nExiting...") log.info("\nExiting...")
self._cleanup() self._cleanup()
def _create_zmq_router(self): def _create_zmq_router(self):

View File

@ -24,7 +24,9 @@
# number has been incremented) # number has been incremented)
""" """
Startup script for GNS3 Server Cloud Instance Startup script for a GNS3 Server Cloud Instance. It generates certificates,
config files and usernames before finally starting the gns3server process
on the instance.
""" """
import os import os
@ -67,12 +69,12 @@ Options:
""" % (SCRIPT_NAME) """ % (SCRIPT_NAME)
# Parse cmd line options
def parse_cmd_line(argv): def parse_cmd_line(argv):
""" """
Parse command line arguments Parse command line arguments
argv: Pass in cmd line arguments argv: Passed in sys.argv
""" """
short_args = "dvh" short_args = "dvh"
@ -88,10 +90,7 @@ def parse_cmd_line(argv):
print(usage) print(usage)
sys.exit(2) sys.exit(2)
cmd_line_option_list = {} cmd_line_option_list = {'debug': False, 'verbose': True, 'data': None}
cmd_line_option_list["debug"] = False
cmd_line_option_list["verbose"] = True
cmd_line_option_list["data"] = None
if sys.platform == "linux": if sys.platform == "linux":
cmd_line_option_list['syslog'] = "/dev/log" cmd_line_option_list['syslog'] = "/dev/log"
@ -101,14 +100,14 @@ def parse_cmd_line(argv):
cmd_line_option_list['syslog'] = ('localhost',514) cmd_line_option_list['syslog'] = ('localhost',514)
for opt, val in opts: for opt, val in opts:
if (opt in ("-h", "--help")): if opt in ("-h", "--help"):
print(usage) print(usage)
sys.exit(0) sys.exit(0)
elif (opt in ("-d", "--debug")): elif opt in ("-d", "--debug"):
cmd_line_option_list["debug"] = True cmd_line_option_list["debug"] = True
elif (opt in ("-v", "--verbose")): elif opt in ("-v", "--verbose"):
cmd_line_option_list["verbose"] = True cmd_line_option_list["verbose"] = True
elif (opt in ("--data")): elif opt in ("--data",):
cmd_line_option_list["data"] = ast.literal_eval(val) cmd_line_option_list["data"] = ast.literal_eval(val)
return cmd_line_option_list return cmd_line_option_list
@ -124,10 +123,10 @@ def set_logging(cmd_options):
log_level = logging.INFO log_level = logging.INFO
log_level_console = logging.WARNING log_level_console = logging.WARNING
if cmd_options['verbose'] == True: if cmd_options['verbose'] is True:
log_level_console = logging.INFO log_level_console = logging.INFO
if cmd_options['debug'] == True: if cmd_options['debug'] is True:
log_level_console = logging.DEBUG log_level_console = logging.DEBUG
log_level = logging.DEBUG log_level = logging.DEBUG
@ -138,37 +137,47 @@ def set_logging(cmd_options):
console_log.setLevel(log_level_console) console_log.setLevel(log_level_console)
console_log.setFormatter(formatter) console_log.setFormatter(formatter)
syslog_hndlr = SysLogHandler( syslog_handler = SysLogHandler(
address=cmd_options['syslog'], address=cmd_options['syslog'],
facility=SysLogHandler.LOG_KERN facility=SysLogHandler.LOG_KERN
) )
syslog_hndlr.setFormatter(sys_formatter) syslog_handler.setFormatter(sys_formatter)
log.setLevel(log_level) log.setLevel(log_level)
log.addHandler(console_log) log.addHandler(console_log)
log.addHandler(syslog_hndlr) log.addHandler(syslog_handler)
return log return log
def _generate_certs():
cmd = []
cmd.append("%s/cert_utils/create_cert.sh" % (SCRIPT_PATH))
log.debug("Generating certs ...") def _generate_certs():
"""
Generate a self-signed certificate for SSL-enabling the WebSocket
connection. The certificate is sent back to the client so it can
verify the authenticity of the server.
:return: A 2-tuple of strings containing (server_key, server_cert)
"""
cmd = ["{}/cert_utils/create_cert.sh".format(SCRIPT_PATH)]
log.debug("Generating certs with cmd: {}".format(' '.join(cmd)))
output_raw = subprocess.check_output(cmd, shell=False, output_raw = subprocess.check_output(cmd, shell=False,
stderr=subprocess.STDOUT) stderr=subprocess.STDOUT)
output_str = output_raw.decode("utf-8") output_str = output_raw.decode("utf-8")
output = output_str.strip().split("\n") output = output_str.strip().split("\n")
log.debug(output) log.debug(output)
return (output[-2], output[-1]) return (output[-2], output[-1])
def _start_gns3server():
cmd = []
cmd.append("gns3server")
log.info("Starting gns3server ...") def _start_gns3server():
"""
Start up the gns3 server.
:return: None
"""
cmd = ['gns3server', '--quiet']
log.info("Starting gns3server with cmd {}".format(cmd))
subprocess.Popen(cmd, shell=False) subprocess.Popen(cmd, shell=False)
@ -187,7 +196,6 @@ def main():
log.info("Received shutdown signal") log.info("Received shutdown signal")
sys.exit(0) sys.exit(0)
# Setup signal to catch Control-C / SIGINT and SIGTERM # Setup signal to catch Control-C / SIGINT and SIGTERM
signal.signal(signal.SIGINT, _shutdown) signal.signal(signal.SIGINT, _shutdown)
signal.signal(signal.SIGTERM, _shutdown) signal.signal(signal.SIGTERM, _shutdown)
@ -229,12 +237,14 @@ def main():
cert_file.close() cert_file.close()
# Return a stringified dictionary on stdout. The gui captures this to get
# things like the server cert.
client_data['SSL_CRT_FILE'] = server_crt client_data['SSL_CRT_FILE'] = server_crt
client_data['SSL_CRT'] = cert_data client_data['SSL_CRT'] = cert_data
client_data['WEB_USERNAME'] = cloud_config['CLOUD_SERVER']['WEB_USERNAME'] client_data['WEB_USERNAME'] = cloud_config['CLOUD_SERVER']['WEB_USERNAME']
client_data['WEB_PASSWORD'] = cloud_config['CLOUD_SERVER']['WEB_PASSWORD'] client_data['WEB_PASSWORD'] = cloud_config['CLOUD_SERVER']['WEB_PASSWORD']
print(client_data) print(client_data)
return 0
if __name__ == "__main__": if __name__ == "__main__":