device => appliance

This commit is contained in:
Julien Duponchelle 2015-08-06 15:05:14 +02:00
parent 2ed07bcfe1
commit 3e1a1fafbe
11 changed files with 60 additions and 55 deletions

View File

@ -2,7 +2,13 @@ GNS3-registry
================
This is the GNS3 devices registry.
This is the GNS3 registry.
Add a new appliance
###################
Copy paste a JSON from the appliances directory and send a pull request.
Build website
#############
@ -20,4 +26,3 @@ Run website
python server.py

View File

@ -41,7 +41,7 @@ if os.path.exists('build'):
os.remove(os.path.join('build', file))
else:
os.mkdir('build')
os.mkdir(os.path.join('build', 'devices'))
os.mkdir(os.path.join('build', 'appliances'))
os.mkdir(os.path.join('build', 'images'))
@ -54,18 +54,18 @@ def render(template_file, out, **kwargs):
template.stream(**kwargs).dump(os.path.join('build', out))
def keep_only_version_with_device(md5sum, device):
def keep_only_version_with_appliance(md5sum, appliance):
"""
Filter device version in order to keep only the
Filter appliance version in order to keep only the
version where the image is present.
:param md5sum: Md5sum of the image
:param device: Device hash
:param appliance: Device hash
:returns: List of version
"""
new_versions = []
for version in device["versions"]:
for version in appliance["versions"]:
found = False
for image in version["images"].values():
if image["md5sum"] == md5sum:
@ -81,39 +81,39 @@ render('chat.html', 'chat.html')
render('downloads.html', 'downloads.html')
devices = []
for device_file in os.listdir('devices'):
log.info("Process " + device_file)
out_filename = device_file[:-5]
with open(os.path.join('devices', device_file)) as f:
device = json.load(f)
device['id'] = out_filename
appliances = []
for appliance_file in os.listdir('appliances'):
log.info("Process " + appliance_file)
out_filename = appliance_file[:-5]
with open(os.path.join('appliances', appliance_file)) as f:
appliance = json.load(f)
appliance['id'] = out_filename
# Resolve version image to the corresponding file
for version in device['versions']:
for version in appliance['versions']:
for image_type, filename in version['images'].items():
found = False
for file in device['images']:
for file in appliance['images']:
if file['filename'] == filename:
version['images'][image_type] = copy.copy(file)
version['images'][image_type]["type"] = image_type
found = True
break
if not found:
log.critical('Image for {} {} with filename {} is missing'.format(device["name"], version["name"], file['filename']))
log.critical('Image for {} {} with filename {} is missing'.format(appliance["name"], version["name"], file['filename']))
sys.exit(1)
render('device.html', os.path.join('devices', out_filename + '.html'), device=device)
devices.append(device)
render('appliance.html', os.path.join('appliances', out_filename + '.html'), appliance=appliance)
appliances.append(appliance)
# Build a page named with the md5sum of each file of the device
# it's allow to get the device informations via HTTP with just an md5sum
# Build a page named with the md5sum of each file of the appliance
# it's allow to get the appliance informations via HTTP with just an md5sum
# it's what powered the import feature
for image in device['images']:
for image in appliance['images']:
# We keep only version with this image in the page
image_device = copy.copy(device)
image_device['versions'] = keep_only_version_with_device(image['md5sum'], device)
render('device.html', os.path.join('images', image['md5sum'] + '.html'), device=image_device)
image_appliance = copy.copy(appliance)
image_appliance['versions'] = keep_only_version_with_appliance(image['md5sum'], appliance)
render('appliance.html', os.path.join('images', image['md5sum'] + '.html'), appliance=image_appliance)
render('devices.html', os.path.join('devices', 'index.html'), devices=devices)
render('appliances.html', os.path.join('appliances', 'index.html'), appliances=appliances)

View File

@ -2,9 +2,9 @@
{% block script %}
function download(device, md5sum) {
function download(appliance, md5sum) {
if (gns3_button(function() {
return gns3.download(device, md5sum)
return gns3.download(appliance, md5sum)
})) {
gns3_notif("success", "You can see the download progress in the <a href=\"/downloads.html\">Downloads</a> section");
return true;
@ -16,16 +16,16 @@ function download(device, md5sum) {
{% block body %}
<div class="jumbotron">
<h1>{{ device["name"] }}</h1>
Category {{ device["category"] }}<br />
Product: <a href="{{ device["product_url"] }}">{{ device["product_name"] }}</a><br />
Vendor: <a href="{{ device["vendor_url"] }}">{{ device["vendor_name"] }}</a><br />
Documentation: <a href="{{ device["documentation_url"] }}">{{ device["documentation_url"] }}</a><br />
Status: {{ device["status"] }}<br />
Maintainer: <a href="mailto:{{ device["maintainer_email"] }}">{{ device["maintainer"] }}</a>
<h1>{{ appliance["name"] }}</h1>
Category {{ appliance["category"] }}<br />
Product: <a href="{{ appliance["product_url"] }}">{{ appliance["product_name"] }}</a><br />
Vendor: <a href="{{ appliance["vendor_url"] }}">{{ appliance["vendor_name"] }}</a><br />
Documentation: <a href="{{ appliance["documentation_url"] }}">{{ appliance["documentation_url"] }}</a><br />
Status: {{ appliance["status"] }}<br />
Maintainer: <a href="mailto:{{ appliance["maintainer_email"] }}">{{ appliance["maintainer"] }}</a>
</div>
{% if device["status"] == "broken" %}
{% if appliance["status"] == "broken" %}
<div class="alert alert-danger" role="alert">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
@ -33,15 +33,15 @@ function download(device, md5sum) {
</div>
{% endif %}
{% if "qemu" in device %}
{% if "qemu" in appliance %}
<h2>Qemu settings</h2>
{% for key in device["qemu"] %}
{{ key }}: {{ device["qemu"][key] }}<br />
{% for key in appliance["qemu"] %}
{{ key }}: {{ appliance["qemu"][key] }}<br />
{% endfor %}
{% endif %}
{% for version in device["versions"] | reverse %}
<h2>{{ device["name"] }} {{version["name"]}}</h2>
<button class="btn btn-primary btn-lg" type="button" onclick='gns3_button(function() { return gns3.install("{{device|jsonify|b64encode}}", "{{version["name"]}}") })'>Install</button>
{% for version in appliance["versions"] | reverse %}
<h2>{{ appliance["name"] }} {{version["name"]}}</h2>
<button class="btn btn-primary btn-lg" type="button" onclick='gns3_button(function() { return gns3.install("{{appliance|jsonify|b64encode}}", "{{version["name"]}}") })'>Install</button>
<h3>Require files</h3>
{% for image in version.images.values() %}
<h4>{{image["filename"]}}</h4>
@ -51,7 +51,7 @@ function download(device, md5sum) {
Download url: <a href="{{image["download_url"]}}">{{image["download_url"]}}</a><br />
{% if "direct_download_url" in image %}
Direct download url: <a href="{{image["direct_download_url"]}}">{{image["direct_download_url"]}}</a><br />
<button class="btn btn-primary btn-lg" type="button" onclick='return download("{{device|jsonify|b64encode}}", "{{image["md5sum"]}}")'>Download</button>
<button class="btn btn-primary btn-lg" type="button" onclick='return download("{{appliance|jsonify|b64encode}}", "{{image["md5sum"]}}")'>Download</button>
{% endif %}
<hr />
{% endfor %}

View File

@ -0,0 +1,8 @@
{% extends "layout/default.html" %}
{% block body %}
<ul>
{% for appliance in appliances %}
<li><a href="/appliances/{{appliance["id"]}}.html">{{appliance["name"]}}</a></li>
{% endfor %}
</ul>
{% endblock %}

View File

@ -1,8 +0,0 @@
{% extends "layout/default.html" %}
{% block body %}
<ul>
{% for device in devices %}
<li><a href="/devices/{{device["id"]}}.html">{{device["name"]}}</a></li>
{% endfor %}
</ul>
{% endblock %}

View File

@ -13,7 +13,7 @@ function importDevice() {
<a href="http://www.spiceworks.com/gns3/download-free-tftp-server-for-network-configuration-management/?utm_function=acq&utm_channel=aff&medium=aff&utm_source=150158&utm_campaign=&utm_content=tftp-cobrand-980x324"><img src="http://adn.impactradius.com/display-ad/2435-216679"></a>
</div
<p>
<a class="btn btn-primary btn-lg" href="/devices" role="button">Show devices</a>
<a class="btn btn-primary btn-lg" href="#" role="button" onclick="return importDevice()">Import device</a>
<a class="btn btn-primary btn-lg" href="/appliances" role="button">Show appliances</a>
<a class="btn btn-primary btn-lg" href="#" role="button" onclick="return importDevice()">Import appliance</a>
</p>
{% endblock %}

View File

@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=appliance-width, initial-scale=1">
<title></title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
@ -69,7 +69,7 @@
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/devices">Devices</a></li>
<li><a href="/appliances">Devices</a></li>
<li><a href="/downloads.html">Downloads</a></li>
<li><a href="/chat.html">Chat</a></li>
<li><a href="https://community.gns3.com">Community</a></li>