mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
Merge pull request #43 from planctechnologies/dev
Download IOS images from Cloud Files to a cloud instance
This commit is contained in:
commit
89e80fd74b
9 files changed
+270
-40
No files matched your search
+15
-3
@@ -26,6 +26,8 @@ import configparser
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
CLOUD_SERVER = 'CLOUD_SERVER'
|
||||
|
||||
|
||||
class Config(object):
|
||||
"""
|
||||
@@ -62,20 +64,30 @@ class Config(object):
|
||||
# 5: server.conf in the current working directory
|
||||
|
||||
home = os.path.expanduser("~")
|
||||
self._cloud_config = os.path.join(home, ".config", appname, "cloud.conf")
|
||||
self._cloud_file = os.path.join(home, ".config", appname, "cloud.conf")
|
||||
filename = "server.conf"
|
||||
self._files = [os.path.join(home, ".config", appname, filename),
|
||||
os.path.join(home, ".config", appname + ".conf"),
|
||||
os.path.join("/etc/xdg", appname, filename),
|
||||
os.path.join("/etc/xdg", appname + ".conf"),
|
||||
filename,
|
||||
self._cloud_config]
|
||||
self._cloud_file]
|
||||
|
||||
self._config = configparser.ConfigParser()
|
||||
self.read_config()
|
||||
self._cloud_config = configparser.ConfigParser()
|
||||
self.read_cloud_config()
|
||||
|
||||
def list_cloud_config_file(self):
|
||||
return self._cloud_config
|
||||
return self._cloud_file
|
||||
|
||||
def read_cloud_config(self):
|
||||
parsed_file = self._cloud_config.read(self._cloud_file)
|
||||
if not self._cloud_config.has_section(CLOUD_SERVER):
|
||||
self._cloud_config.add_section(CLOUD_SERVER)
|
||||
|
||||
def cloud_settings(self):
|
||||
return self._cloud_config[CLOUD_SERVER]
|
||||
|
||||
def read_config(self):
|
||||
"""
|
||||
|
||||
@@ -78,11 +78,15 @@ class LoginHandler(tornado.web.RequestHandler):
|
||||
self.set_secure_cookie("user", "None")
|
||||
auth_status = "failure"
|
||||
|
||||
log.info("Authentication attempt %s: %s" %(auth_status, user))
|
||||
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 = "/"
|
||||
|
||||
self.redirect(redirect_to)
|
||||
if redirect_to is None:
|
||||
self.write({'result': auth_status})
|
||||
else:
|
||||
log.info('Redirecting to {}'.format(redirect_to))
|
||||
self.redirect(redirect_to)
|
||||
@@ -61,6 +61,7 @@ class IModule(multiprocessing.Process):
|
||||
self._current_destination = None
|
||||
self._current_call_id = None
|
||||
self._stopping = False
|
||||
self._cloud_settings = config.cloud_settings()
|
||||
|
||||
def _setup(self):
|
||||
"""
|
||||
|
||||
@@ -19,6 +19,7 @@ import os
|
||||
import base64
|
||||
import time
|
||||
from gns3server.modules import IModule
|
||||
from gns3dms.cloud.rackspace_ctrl import get_provider
|
||||
from ..dynamips_error import DynamipsError
|
||||
|
||||
from ..nodes.c1700 import C1700
|
||||
@@ -140,12 +141,22 @@ class VM(object):
|
||||
chassis = request.get("chassis")
|
||||
router_id = request.get("router_id")
|
||||
|
||||
# Locate the image
|
||||
updated_image_path = os.path.join(self.images_directory, image)
|
||||
if os.path.isfile(updated_image_path):
|
||||
image = updated_image_path
|
||||
else:
|
||||
if not os.path.exists(self.images_directory):
|
||||
os.mkdir(self.images_directory)
|
||||
if request.get("cloud_path", None):
|
||||
# Download the image from cloud files
|
||||
cloud_path = request.get("cloud_path")
|
||||
full_cloud_path = "/".join((cloud_path, image))
|
||||
|
||||
provider = get_provider(self._cloud_settings)
|
||||
provider.download_file(full_cloud_path, updated_image_path)
|
||||
|
||||
try:
|
||||
|
||||
if platform not in PLATFORMS:
|
||||
raise DynamipsError("Unknown router platform: {}".format(platform))
|
||||
|
||||
|
||||
@@ -67,6 +67,10 @@ VM_CREATE_SCHEMA = {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"pattern": "^([0-9a-fA-F]{4}\\.){2}[0-9a-fA-F]{4}$"
|
||||
},
|
||||
"cloud_path": {
|
||||
"description": "Path to the image in the cloud object store",
|
||||
"type": "string",
|
||||
}
|
||||
},
|
||||
"additionalProperties": False,
|
||||
|
||||
@@ -61,6 +61,7 @@ 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 :)
|
||||
|
||||
@@ -79,6 +80,7 @@ def parse_cmd_line(argv):
|
||||
|
||||
short_args = "dvh"
|
||||
long_args = ("debug",
|
||||
"ip=",
|
||||
"verbose",
|
||||
"help",
|
||||
"data=",
|
||||
@@ -105,6 +107,8 @@ def parse_cmd_line(argv):
|
||||
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",):
|
||||
@@ -151,7 +155,7 @@ def set_logging(cmd_options):
|
||||
return log
|
||||
|
||||
|
||||
def _generate_certs():
|
||||
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
|
||||
@@ -159,7 +163,7 @@ def _generate_certs():
|
||||
|
||||
:return: A 2-tuple of strings containing (server_key, server_cert)
|
||||
"""
|
||||
cmd = ["{}/cert_utils/create_cert.sh".format(SCRIPT_PATH)]
|
||||
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)
|
||||
@@ -176,9 +180,9 @@ def _start_gns3server():
|
||||
|
||||
:return: None
|
||||
"""
|
||||
cmd = ['gns3server', '--quiet']
|
||||
cmd = 'gns3server --quiet > /tmp/gns3.log 2>&1 &'
|
||||
log.info("Starting gns3server with cmd {}".format(cmd))
|
||||
subprocess.Popen(cmd, shell=False)
|
||||
os.system(cmd)
|
||||
|
||||
|
||||
def main():
|
||||
@@ -211,7 +215,7 @@ def main():
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
||||
(server_key, server_crt) = _generate_certs()
|
||||
(server_key, server_crt) = _generate_certs(options)
|
||||
|
||||
cloud_config = configparser.ConfigParser()
|
||||
cloud_config['CLOUD_SERVER'] = {}
|
||||
@@ -221,15 +225,13 @@ def main():
|
||||
|
||||
cloud_config['CLOUD_SERVER']['SSL_KEY'] = server_key
|
||||
cloud_config['CLOUD_SERVER']['SSL_CRT'] = server_crt
|
||||
cloud_config['CLOUD_SERVER']['SSL_ENABLED'] = 'yes'
|
||||
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)
|
||||
|
||||
cloud_config_file.close()
|
||||
|
||||
_start_gns3server()
|
||||
|
||||
with open(server_crt, 'r') as cert_file:
|
||||
|
||||
Reference in new issue
Block a user