diff --git a/gns3server/handlers/auth_handler.py b/gns3server/handlers/auth_handler.py deleted file mode 100644 index b479e533..00000000 --- a/gns3server/handlers/auth_handler.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2014 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -""" -Simple file upload & listing handler. -""" - - -import os -import tornado.web -import tornado.websocket - -import logging -log = logging.getLogger(__name__) - - -class GNS3BaseHandler(tornado.web.RequestHandler): - - def get_current_user(self): - if 'required_user' not in self.settings: - return "FakeUser" - - user = self.get_secure_cookie("user") - if not user: - return None - - if self.settings['required_user'] == user.decode("utf-8"): - return user - - -class GNS3WebSocketBaseHandler(tornado.websocket.WebSocketHandler): - - def get_current_user(self): - if 'required_user' not in self.settings: - return "FakeUser" - - user = self.get_secure_cookie("user") - if not user: - return None - - if self.settings['required_user'] == user.decode("utf-8"): - return user - - -class LoginHandler(tornado.web.RequestHandler): - - def get(self): - self.write('
' - 'Name: ' - 'Password: ' - '' - '
') - - try: - redirect_to = self.get_argument("next") - self.set_secure_cookie("login_success_redirect_to", redirect_to) - except tornado.web.MissingArgumentError: - pass - - def post(self): - - user = self.get_argument("name") - password = self.get_argument("password") - - if self.settings['required_user'] == user and self.settings['required_pass'] == password: - self.set_secure_cookie("user", user) - auth_status = "successful" - else: - self.set_secure_cookie("user", "None") - auth_status = "failure" - - log.info("Authentication attempt {}: {}, {}".format(auth_status, user, password)) - - try: - redirect_to = self.get_secure_cookie("login_success_redirect_to") - except tornado.web.MissingArgumentError: - redirect_to = "/" - - if redirect_to is None: - self.write({'result': auth_status}) - else: - log.info('Redirecting to {}'.format(redirect_to)) - self.redirect(redirect_to) diff --git a/gns3server/handlers/file_upload_handler.py b/gns3server/handlers/file_upload_handler.py deleted file mode 100644 index 7c8fd862..00000000 --- a/gns3server/handlers/file_upload_handler.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2014 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -""" -Simple file upload & listing handler. -""" - -# TODO: file upload with aiohttp - - -import os -import stat -import tornado.web -from .auth_handler import GNS3BaseHandler -from ..version import __version__ -from ..config import Config - -import logging -log = logging.getLogger(__name__) - - -class FileUploadHandler(GNS3BaseHandler): - - """ - File upload handler. - - :param application: Tornado Application instance - :param request: Tornado Request instance - """ - - def __init__(self, application, request, **kwargs): - - super().__init__(application, request, **kwargs) - config = Config.instance() - server_config = config.get_default_section() - self._upload_dir = os.path.expandvars( - os.path.expanduser(server_config.get("upload_directory", "~/GNS3/images"))) - self._host = request.host - try: - os.makedirs(self._upload_dir) - log.info("upload directory '{}' created".format(self._upload_dir)) - except FileExistsError: - pass - except OSError as e: - log.error("could not create the upload directory {}: {}".format(self._upload_dir, e)) - - @tornado.web.authenticated - def get(self): - """ - Invoked on GET request. - """ - - items = [] - path = self._upload_dir - for filename in os.listdir(path): - items.append(filename) - - self.render("upload.html", - version=__version__, - host=self._host, - path=path, - items=items) - - @tornado.web.authenticated - def post(self): - """ - Invoked on POST request. - """ - - if "file" in self.request.files: - fileinfo = self.request.files["file"][0] - destination_path = os.path.join(self._upload_dir, fileinfo['filename']) - try: - with open(destination_path, 'wb') as f: - f.write(fileinfo['body']) - except OSError as e: - self.write("Could not upload {}: {}".format(fileinfo['filename'], e)) - return - st = os.stat(destination_path) - os.chmod(destination_path, st.st_mode | stat.S_IXUSR) - self.redirect("/upload") diff --git a/gns3server/start_server.py b/gns3server/start_server.py deleted file mode 100644 index c603a2b9..00000000 --- a/gns3server/start_server.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2015 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# __version__ is a human-readable version number. - -# __version_info__ is a four-tuple for programmatic comparison. The first -# three numbers are the components of the version number. The fourth -# is zero for an official release, positive for a development branch, -# or negative for a release candidate or beta (after the base version -# number has been incremented) - -""" -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 sys -import configparser -import getopt -import datetime -import signal -from logging.handlers import * -from os.path import expanduser -from gns3server.config import Config -import ast -import subprocess -import uuid - -SCRIPT_NAME = os.path.basename(__file__) - -# This is the full path when used as an import -SCRIPT_PATH = os.path.dirname(__file__) - -if not SCRIPT_PATH: - SCRIPT_PATH = os.path.join(os.path.dirname(os.path.abspath( - sys.argv[0]))) - - -LOG_NAME = "gns3-startup" -log = None - -usage = """ -USAGE: %s - -Options: - - -d, --debug Enable debugging - -i --ip The ip address of the server, for cert generation - -v, --verbose Enable verbose logging - -h, --help Display this menu :) - - --data Python dict of data to be written to the config file: - " { 'gns3' : 'Is AWESOME' } " - -""" % (SCRIPT_NAME) - - -def parse_cmd_line(argv): - """ - Parse command line arguments - - argv: Passed in sys.argv - """ - - short_args = "dvh" - long_args = ("debug", - "ip=", - "verbose", - "help", - "data=", - ) - try: - opts, extra_opts = getopt.getopt(argv[1:], short_args, long_args) - except getopt.GetoptError as e: - print("Unrecognized command line option or missing required argument: %s" % (e)) - print(usage) - sys.exit(2) - - cmd_line_option_list = {'debug': False, 'verbose': True, 'data': None} - - if sys.platform == "linux": - cmd_line_option_list['syslog'] = "/dev/log" - elif sys.platform == "osx": - cmd_line_option_list['syslog'] = "/var/run/syslog" - else: - cmd_line_option_list['syslog'] = ('localhost', 514) - - for opt, val in opts: - if opt in ("-h", "--help"): - print(usage) - sys.exit(0) - elif opt in ("-d", "--debug"): - cmd_line_option_list["debug"] = True - elif opt in ("--ip",): - cmd_line_option_list["ip"] = val - elif opt in ("-v", "--verbose"): - cmd_line_option_list["verbose"] = True - elif opt in ("--data",): - cmd_line_option_list["data"] = ast.literal_eval(val) - - return cmd_line_option_list - - -def set_logging(cmd_options): - """ - Setup logging and format output for console and syslog - - Syslog is using the KERN facility - """ - log = logging.getLogger("%s" % (LOG_NAME)) - log_level = logging.INFO - log_level_console = logging.WARNING - - if cmd_options['verbose'] is True: - log_level_console = logging.INFO - - if cmd_options['debug'] is True: - log_level_console = logging.DEBUG - log_level = logging.DEBUG - - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - sys_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s') - - console_log = logging.StreamHandler() - console_log.setLevel(log_level_console) - console_log.setFormatter(formatter) - - syslog_handler = SysLogHandler( - address=cmd_options['syslog'], - facility=SysLogHandler.LOG_KERN - ) - - syslog_handler.setFormatter(sys_formatter) - - log.setLevel(log_level) - log.addHandler(console_log) - log.addHandler(syslog_handler) - - return log - - -def _generate_certs(options): - """ - 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), options['ip']] - log.debug("Generating certs with cmd: {}".format(' '.join(cmd))) - output_raw = subprocess.check_output(cmd, shell=False, - stderr=subprocess.STDOUT) - - output_str = output_raw.decode("utf-8") - output = output_str.strip().split("\n") - log.debug(output) - return (output[-2], output[-1]) - - -def _start_gns3server(): - """ - Start up the gns3 server. - - :return: None - """ - cmd = 'gns3server --quiet > /tmp/gns3.log 2>&1 &' - log.info("Starting gns3server with cmd {}".format(cmd)) - os.system(cmd) - - -def main(): - - global log - options = parse_cmd_line(sys.argv) - log = set_logging(options) - - def _shutdown(signalnum=None, frame=None): - """ - Handles the SIGINT and SIGTERM event, inside of main so it has access to - the log vars. - """ - - log.info("Received shutdown signal") - sys.exit(0) - - # Setup signal to catch Control-C / SIGINT and SIGTERM - signal.signal(signal.SIGINT, _shutdown) - signal.signal(signal.SIGTERM, _shutdown) - - client_data = {} - - config = Config.instance() - cfg = config.list_cloud_config_file() - cfg_path = os.path.dirname(cfg) - - try: - os.makedirs(cfg_path) - except FileExistsError: - pass - - (server_key, server_crt) = _generate_certs(options) - - cloud_config = configparser.ConfigParser() - cloud_config['CLOUD_SERVER'] = {} - - if options['data']: - cloud_config['CLOUD_SERVER'] = options['data'] - - cloud_config['CLOUD_SERVER']['SSL_KEY'] = server_key - cloud_config['CLOUD_SERVER']['SSL_CRT'] = server_crt - cloud_config['CLOUD_SERVER']['SSL_ENABLED'] = 'no' - cloud_config['CLOUD_SERVER']['WEB_USERNAME'] = str(uuid.uuid4()).upper()[0:8] - cloud_config['CLOUD_SERVER']['WEB_PASSWORD'] = str(uuid.uuid4()).upper()[0:8] - - with open(cfg, 'w') as cloud_config_file: - cloud_config.write(cloud_config_file) - - _start_gns3server() - - with open(server_crt, 'r') as cert_file: - cert_data = cert_file.readlines() - - 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'] = cert_data - client_data['WEB_USERNAME'] = cloud_config['CLOUD_SERVER']['WEB_USERNAME'] - client_data['WEB_PASSWORD'] = cloud_config['CLOUD_SERVER']['WEB_PASSWORD'] - print(client_data) - return 0 - - -if __name__ == "__main__": - result = main() - sys.exit(result)