remove vdc
This commit is contained in:
parent
5d7ab60c62
commit
9fe3f87749
19 changed files with 27 additions and 719 deletions
|
@ -65,21 +65,6 @@ app.register_blueprint(admin_blueprint, url_prefix='/' + app.config['ADMIN_PREFI
|
|||
from .settings import settings as settings_blueprint
|
||||
app.register_blueprint(settings_blueprint, url_prefix='/settings')
|
||||
|
||||
|
||||
class CustomJSONEncoder(JSONEncoder):
|
||||
"""This class adds support for lazy translation texts to Flask's
|
||||
JSON encoder. This is necessary when flashing translated texts."""
|
||||
def default(self, obj):
|
||||
from speaklater import is_lazy_string
|
||||
if is_lazy_string(obj):
|
||||
try:
|
||||
return unicode(obj) # python 2
|
||||
except NameError:
|
||||
return str(obj) # python 3
|
||||
return super(CustomJSONEncoder, self).default(obj)
|
||||
|
||||
#app.json_encoder = CustomJSONEncoder
|
||||
|
||||
@app.errorhandler(403)
|
||||
def forbidden(e):
|
||||
if request.accept_mimetypes.accept_json and \
|
||||
|
@ -120,11 +105,6 @@ def service_unavailable(e):
|
|||
def handle_csrf_error(e):
|
||||
return render_template('errors/csrf_error.html', reason=e.description), 400
|
||||
|
||||
#@app.before_request
|
||||
#def before_request():
|
||||
# g.request_start_time = time.time()
|
||||
# g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time)
|
||||
# g.pjax = 'X-PJAX' in request.headers
|
||||
|
||||
if not app.config['DEBUG'] == 1 and app.config['MAIL_SERVER'] != '':
|
||||
import logging
|
||||
|
|
|
@ -2,7 +2,7 @@ from flask_wtf import FlaskForm, RecaptchaField
|
|||
|
||||
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField
|
||||
from wtforms import validators, ValidationError
|
||||
from wtforms.fields.html5 import EmailField
|
||||
from wtforms.fields import EmailField
|
||||
from ..models import User
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
# FAT MODEL
|
||||
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
|
||||
|
||||
|
@ -75,9 +73,6 @@ class User(db.Model, UserMixin):
|
|||
phone = db.Column(db.String)
|
||||
|
||||
group = db.Column(db.String, default='User')
|
||||
language = db.Column(db.String, default='BG')
|
||||
wallet = db.Column(db.Float)
|
||||
currency = db.Column(db.String, default='BGN')
|
||||
|
||||
inv_items = db.relationship('Item', backref='owner', lazy='dynamic')
|
||||
|
||||
|
@ -206,6 +201,6 @@ class Item(db.Model):
|
|||
__tablename__ = 'items'
|
||||
id = db.Column(db.Integer, primary_key=True) #PK
|
||||
user_id = db.Column(db.ForeignKey('users.id')) #FK
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
key = db.Column(db.Integer, defaults=0)
|
||||
description = db.Column(db.Unicode)
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
|
@ -1,27 +0,0 @@
|
|||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField
|
||||
from flask_pagedown.fields import PageDownField
|
||||
from wtforms import validators, ValidationError
|
||||
from wtforms.fields.html5 import EmailField, DecimalRangeField
|
||||
|
||||
from .. import db
|
||||
|
||||
class OrderForm(FlaskForm):
|
||||
region_choices = [(1, 'Plovdiv, Bulgaria'), (2, 'International Space Station')]
|
||||
region = SelectField('Region:', choices=region_choices, coerce=int)
|
||||
|
||||
recipe_choices = [(1, 'RootVPS')]
|
||||
recipe = SelectField('Type:', choices=recipe_choices, coerce=int)
|
||||
|
||||
cpu = DecimalRangeField('Processor Cores', default=2)
|
||||
memory = DecimalRangeField('Memory', default=2048)
|
||||
storage = DecimalRangeField('Storage', default=20)
|
||||
|
||||
alias = StringField('Name:', [validators.Regexp(message='ex.: myservice1.com, myservice2.local', regex='^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$'), validators.Length(6,64)])
|
||||
|
||||
submit = SubmitField('DEPLOY')
|
||||
|
||||
class MessageForm(FlaskForm):
|
||||
line = PageDownField('Enter your message...', validators=[validators.DataRequired()])
|
||||
submit = SubmitField('Submit')
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
<form name=lookup
|
||||
method="post" action="http://client.datapoint.bg//domain-registration/index.php"></p>
|
||||
<input type="hidden" name="action" value="check_availability">
|
||||
<p><em><input type="hidden" name="showrelated" value="true"></em></p>
|
||||
<tr>
|
||||
<td colspan="4" rowspan="3">
|
||||
<input name="txtDomainName" type="text" class="inputbox" size="22" maxlength="55">
|
||||
|
||||
<b>.</b>
|
||||
<select name="tld[]">
|
||||
<option value="com" selected>com</option>
|
||||
<option value="net">net</option>
|
||||
<option value="org">org</option>
|
||||
<option value="biz">biz</option>
|
||||
<option value="name">name</option>
|
||||
<option value="us">us</option>
|
||||
<option value="info">info</option>
|
||||
<option value="in">in</option>
|
||||
<option value="co.in">co.in</option>
|
||||
<option value="net.in">net.in</option>
|
||||
<option value="org.in">org.in</option>
|
||||
<option value="firm.in">firm.in</option>
|
||||
<option value="gen.in">gen.in</option>
|
||||
<option value="ind.in">ind.in</option>
|
||||
<option value="eu">eu</option>
|
||||
<option value="mobi">.mobi</option>
|
||||
<option value="mn">.mn</option>
|
||||
<option value="bz">.bz</option>
|
||||
<option value="cc">.cc</option>
|
||||
<option value="tv">.tv</option>
|
||||
<option value="eu.com">eu.com</option>
|
||||
<option value="gb.com">gb.com</option>
|
||||
<option value="ae.org">ae.org</option>
|
||||
<option value="kr.com">kr.com</option>
|
||||
<option value="us.com">us.com</option>
|
||||
<option value="qc.com">qc.com</option>
|
||||
<option value="de.com">de.com</option>
|
||||
<option value="gb.net">gb.net</option>
|
||||
<option value="no.com">no.com</option>
|
||||
<option value="hu.com">hu.com</option>
|
||||
<option value="jpn.com">jpn.com</option>
|
||||
<option value="uy.com">uy.com</option>
|
||||
<option value="za.com">za.com</option>
|
||||
<option value="br.com">br.com</option>
|
||||
<option value="cn.com">cn.com</option>
|
||||
<option value="sa.com">sa.com</option>
|
||||
<option value="se.com">se.com</option>
|
||||
<option value="se.net">se.net</option>
|
||||
<option value="uk.com">uk.com</option>
|
||||
<option value="uk.net">uk.net</option>
|
||||
<option value="ru.com">ru.com</option>
|
||||
<option value="ws">ws</option>
|
||||
<option value="co.uk">co.uk</option>
|
||||
<option value="org.uk">org.uk</option>
|
||||
<option value="me.uk">me.uk</option>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td><input type="submit"></td>
|
||||
</tr>
|
||||
</form>
|
|
@ -1,29 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
body {
|
||||
background-image: url('/static/images/cloudsbg.jpeg');
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block page_content %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-primary panel-transparent">
|
||||
<div class="panel-body">
|
||||
<iframe src="https://datapoint.bg/kiwi/" style="border:0; width:100%; height:600px;"></iframe>
|
||||
To permanently stay connected to our chat network you could use a client like <a href="https://hexchat.github.io/downloads.html">HexChat</a> and use the following URL:<br /><a href="irc://irc.datapoint.bg:+6697/#support">irc://irc.datapoint.bg:+6697/#support</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block footer %}
|
||||
{% endblock %}
|
|
@ -1,18 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block page_content %}
|
||||
<h1>App Store</h1>
|
||||
<center>
|
||||
<div class="row">
|
||||
{% for key, value in products.items() %}
|
||||
<div class="col-md-4">
|
||||
<p><a href="/deploy/{{ key }}"><img src="{{ value['img'] }}"></img><br/>{{ value['name'] }}</a><br/>{{ value['description'] }}</p>
|
||||
</div>
|
||||
{% if key|int % 3 == 0 %}
|
||||
</div>
|
||||
<div class="row">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,18 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block page_content %}
|
||||
<h1>{{ groupname }}</h1>
|
||||
<center>
|
||||
<div class="row">
|
||||
{% for key, value in products.items() %}
|
||||
<div class="col-md-4">
|
||||
<p><a href="/deploy/{{ key }}"><img src="{{ value['img'] }}"></img><br/>{{ value['name'] }}</a><br/>{{ value['description'] }}</p>
|
||||
</div>
|
||||
{% if key|int % 3 == 0 %}
|
||||
</div>
|
||||
<div class="row">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,21 +0,0 @@
|
|||
{% for server in servers %}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-primary panel-transparent">
|
||||
<div class="panel-body">
|
||||
<div class="col-md-8">
|
||||
<img src="../../static/images/server.png" width="80%"><br /><br />
|
||||
<a href="/chat"><button type="button" class="btn btn-lg btn-success">Order VPS</button></a>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
Alias: <b>{{ server.name }}</b><br />
|
||||
Processor: <b>{{ server.cpu }}</b><br />
|
||||
Memory: <b>{{ server.mem }}</b><br />
|
||||
Storage: <b>{{ server.hdd }}</b><br />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
|
@ -14,139 +14,21 @@ $('a[data-toggle="tooltip"]').tooltip({
|
|||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Only run what comes next *after* the page has loaded
|
||||
addEventListener("DOMContentLoaded", function() {
|
||||
// Grab all of the elements with a class of command
|
||||
// (which all of the buttons we just created have)
|
||||
var commandButtons = document.querySelectorAll(".command");
|
||||
for (var i=0, l=commandButtons.length; i<l; i++) {
|
||||
var button = commandButtons[i];
|
||||
// For each button, listen for the "click" event
|
||||
button.addEventListener("click", function(e) {
|
||||
// When a click happens, stop the button
|
||||
// from submitting our form (if we have one)
|
||||
e.preventDefault();
|
||||
|
||||
if (window.confirm("Are you sure?")) {
|
||||
var clickedButton = e.target;
|
||||
var command = clickedButton.value;
|
||||
var vmid = clickedButton.getAttribute('vmid');
|
||||
|
||||
// Now we need to send the data to our server
|
||||
// without reloading the page - this is the domain of
|
||||
// AJAX (Asynchronous JavaScript And XML)
|
||||
// We will create a new request object
|
||||
// and set up a handler for the response
|
||||
var request = new XMLHttpRequest();
|
||||
request.onload = function() {
|
||||
// We could do more interesting things with the response
|
||||
// or, we could ignore it entirely
|
||||
//alert(request.responseText);
|
||||
};
|
||||
// We point the request at the appropriate command
|
||||
request.open("GET", "/vmanager/command/" + command + "/" + vmid, true);
|
||||
// and then we send it off
|
||||
request.send();
|
||||
alert("command " + command + " executed.");
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, true);
|
||||
</script>
|
||||
|
||||
{{ pagedown.include_pagedown() }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
{% if current_user.fresh_user == True %}
|
||||
<div class="row">
|
||||
<center>
|
||||
<img class="img-responsive img-rounded" src="{{ url_for('static', filename='images/createvm.gif') }}" alt="ping">
|
||||
</center><br/>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
|
||||
{% if inv_deployments != [] %}
|
||||
{% if inv_items != [] %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="deployments">
|
||||
<div class="panel-heading">Datacenter Manager</div>
|
||||
<div class="panel-body"><p>
|
||||
<div class="panel-group" id="deploycubes" role="tablist" aria-multiselectable="true">
|
||||
{% for deploy in inv_deployments %}
|
||||
{% include "panel/vdc_pool.html" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if inv_services != [] %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="services">
|
||||
<div class="panel-heading">Services</div>
|
||||
<div class="panel panel-info" id="items">
|
||||
<div class="panel-heading">Items</div>
|
||||
<div class="panel-body">
|
||||
{% include "panel/services.html" %}
|
||||
{% include "panel/items.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if inv_domains != [] %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="domains">
|
||||
<div class="panel-heading">Domains</div>
|
||||
<div class="panel-body">
|
||||
{% include "panel/domains.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if inv_addresses != [] %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="addresses">
|
||||
<div class="panel-heading">Communications</div>
|
||||
<div class="panel-body"><p>
|
||||
<img width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAEW0lEQVRYhe3YT0zbVhwH8HfgwKGHHnrYYYcddkBVT7t0kybNh8kvgTiBJlTdhCba0R03qVo3NBUtUkv88sdOgtapYu0mFQ1tY4BGK9qKaZmYkud/BFzKyBYYGmgRNCGBjf+ovB0SVyklJHEM7aR9pafIVmJ//Ht5z34G4P8AAJHQDxHegm48bkJCj4nFzZQzdPRZux4nByT5jUYRGbK4xZATmFhM1XmFXsoZqtJ7DMoZOkK7IjWQxS0Q4aE87FcVVdPE4pdsnJQ816muWznxViXIXcdthm4hk0PO6EJSzlB1PS/9cX04kYwlt8m7nWr6dFD5qVwkREI/jfBa9jPSSjlDRwAAwOwWXoQI/6JVsmyg2YM/uvD15N8zSztkZmmHxJLb5L0b6lq5ldzjPxiiUfgMAACYXOHXIItViPAWdIXPloyjnKGjFq+4oiY2iQbUkHoqyfiUY7QrYoEIh3LIbbNbeBWAXHdn981p1S0ae0DmP/5mcj4fVykyd+FVJiRczoEmKWeoGgAANLgJhZtKvGIxNTy18hSu0u7WooFoFPkQAABoFL6U3cZdRX9Mt4dPnO4YyRTClVPJWq9ykuHlGMPLMRMSXn8MZAU7RJhAt9ANAAC0O+zQ5seiQCsntbX1xVPFgKUgrbwS//ROirQNJomVV6a1/WbX8PFcNy9lt4Xj2S7Ga0WBjR3K3R4lWRSXjzx/4z6xeEWya7QShpPJXkAAsqPbhISeQtsF4wgq6lBsuWTgfpU0e6Q3LD6JMJwchyx+s+jJS4mNl+aVufWygPshIcLEEJgWq09MR//aKBtYaHQbDmzwywk9FSxUScOBjqCi3vt1STdwN9JwoN0vD3SLCxUB87vb4hWJUU9BAAAAGjtGLl76/veiE3WpyLOdY0TPbbFgIBt52cqJ60YAS5nMdaWeFxfKnQsPFfn2ZyPtH9ycWDQKaDiScoaqGU5c3u+J5pkjzR7h3PtdE8tGAvNHd8VrHMoZqmoMKqP+e7MPDwJpSCUZn3KsnpcWeqPJjecWCT34FYYTdwbUtKFADXn+C3XNwol9uoH24AjfdO1++q2ro6TjxzlDgX3R5GqDX868cy3q0IWjXZGaWo+4/t34Bumd2CItX06QC92TpNLRrSY2ibM/vmnjpFnaFanRXT0bL09eGUxkBqd2yODUDrkdf0TYuwli5UTS+u1vD8uFqolNcuWH6bTFK643XY1er+i1RwMvXzzz+dji7fgjogG1BhEmFo9wmfGJaUdQXnXdmt4aUNPk5/g/RHtUG5/fItKfa+TOgwwJDs1uN3eOZWo94gbjE27WeqQXdMMAyL6WqPOKK13R1adwGlD7Lt0ePmH24E/sAQWf8stxGyclIcKE8YnL9bw0eyogR+s8gtfEYsqwe3GDXxlu7Z1J7YXbDTyU2ALKSXtAju1ele3X7IEn17oHmsYOJd4/uljWH743miKO4JNLyQMLRFjXdHFoXf2fAOpthwJ8XvMve9hz7NcDU4IAAAAASUVORK5CYII="> Public<br />
|
||||
<div id="routers" class="no-more-tables">
|
||||
<table class="table table-hover table-striped table-condensed cf">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>IP</th>
|
||||
<th>Region</th>
|
||||
<th>Reverse DNS</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for address in inv_addresses %}
|
||||
<tr>
|
||||
<td data-title="IP">{{ address.ip }}</td>
|
||||
<td data-title="Region">{{ regions[address.region_id] }}</td>
|
||||
<td data-title="RDNS">{{ address.rdns }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!--<img width="32" height="32" src="data:image/png;base64,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"> No Public<br />-->
|
||||
|
||||
|
||||
<!--<button class="btn btn-default" onclick="window.open('{{ url_for('panel.dashboard') }}','_self')"><span class="glyphicon glyphicon-plus" aria-hiddent="true"></span> Assign</button> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div class="row">
|
||||
</div>
|
||||
|
||||
|
|
|
@ -1,119 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}Deploy a server{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{ super() }}
|
||||
<script>
|
||||
function cpuUpdate(value) {
|
||||
$('#selected-cpu').html('<h3>' + value + ' cores</h3>');
|
||||
//for (i = 0; i < value; i++) {
|
||||
// cpuimg += 'x';
|
||||
//}
|
||||
//$('#selected-cpu').html('test ' + cpuimg);
|
||||
}
|
||||
|
||||
function memoryUpdate(value) {
|
||||
$('#selected-memory').html('<h3>' + value + ' MB</h3>');
|
||||
}
|
||||
|
||||
function storageUpdate(value) {
|
||||
$('#selected-storage').html('<h3>' + value + ' GB</h3>');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
<center><h2>Deploy new Server</h2></center>
|
||||
<div class="row">
|
||||
<form method="POST" action="{{ url_for('panel.deploy') }}">
|
||||
<div class="col-md-6">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">1. Location</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
{{ form.region.label }}<br /> {{ form.region }}<br />
|
||||
{% for error in form.region.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">2. Image</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
{{ form.recipe.label }}<br /> {{ form.recipe }}<br />
|
||||
{% for error in form.recipe.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">3. Size</div>
|
||||
<div class="panel-body">
|
||||
<div class="col-md-4">
|
||||
<p>
|
||||
{{ form.cpu.label }}
|
||||
{{ form.cpu(min=2, max=8, step=2, oninput="cpuUpdate(value)") }}
|
||||
<center><output for="cpu" id="selected-cpu"><h3>{{ form.cpu.data }} cores</h3></output></center>
|
||||
{% for error in form.cpu.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<p>
|
||||
{{ form.memory.label }}<br /> {{ form.memory(min=1024, max=8192, step=512, oninput="memoryUpdate(value)") }}
|
||||
<center><output for="memory" id="selected-memory"><h3>{{ form.memory.data }} MB</h3></output></center>
|
||||
{% for error in form.memory.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<p>
|
||||
{{ form.storage.label }}<br /> {{ form.storage(min=20, max=240, step=20, oninput="storageUpdate(value)") }}
|
||||
<center><output for="storage" id="selected-storage"><h3>{{ form.storage.data }} GB</h3></output></center>
|
||||
{% for error in form.storage.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">4. Server Hostname</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
{{ form.alias.label }}<br /> {{ form.alias }}<br />
|
||||
{% for error in form.alias.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<center>
|
||||
<p>
|
||||
{{ form.csrf_token() }}
|
||||
{{ form.submit }}
|
||||
</p>
|
||||
</center>
|
||||
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{% block domains %}
|
||||
<div class="no-more-tables">
|
||||
<table class="table table-hover table-striped table-condensed cf">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Expiry Date</th>
|
||||
<th>Time Left</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
{% for domain in inv_domains %}
|
||||
<tr>
|
||||
<td data-title="Domain"><b><a href="http://{{ domain.fqdn }}">{{ domain.fqdn }}</a></b></td>
|
||||
<td data-title="Expiry Date">{{ domain.date_expire }}</td>
|
||||
{% if domain.enabled == False %}
|
||||
<td data-title="Time Left">EXPIRED</td>
|
||||
{% else %}
|
||||
{% if domain.warning == True %}
|
||||
<td data-title="Time Left"><button class="btn btn-default btn-warning" onclick="window.open('/dmanager/activate/{{ domain.pid }}','_self');"><span class="glyphicon glyphicon-bell" aria-hidden="true"></span> Renew </button></td>
|
||||
{% else %}
|
||||
<td data-title="Time Left">{{ domain.daysleft }} day(s)</td>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- Address Book icon by Icons8 -->
|
||||
<button class="btn btn-default" onclick="window.open('{{ url_for('dmanager.createdomain') }}','_self')"><img class="icon icons8-Address-Book" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAACOElEQVRYhe2Y3W7aQBCF83ZIVdTn4iK973tUCo1KoVVbCC0hSqUoKrKxoQYDCf5BGBtjz+nFeMFO41RtyIIqjzTCs1jMt7OzZ7GPjgrboR2ffK2Wyk3sw49PWm/+CFgqN/G6HW+8VG7iVCEpXio3UQD+94DCX+T1474B03kLwAKwAJQJWNUI17eEvgs4AbBcA1MP0BzgwtwzYMckrCIgigHLZyjFAswFsAgBAJgtgc8/9wA4nDPA1ANq+sP3XI4J/hogAr48ApkW6pevWuMnA15NCADQs5EZ/9jnJT9VCHWdr2s6IYwBLwTOevmAwp5cwarGCRchUFF5rGEQlutNDvRs/tQdZCakWHh+wJs7TnY+5PhDnxATEERAe0T4NqJN/3UToLcqgQiYeBIAzQX/kFiugctxx/x9Et+n2zE3APy1BMD5iqVExKJa71L9JZb0crwds30gjCUARjHrnYhjAtwgm7hrcbKGwXFF5fucQAKgE7DupeP7lbF9ZPq0YXBFNUcCYD/puXqifUpSretb3gw3d4Spx2Oqzb069XhS7zUJMiP6y5hzNT4N+DQR5gYsP35KdoIIaBoShXq25MStZAlrOp8a50PaaONZj3BhEtojymygPEDNIWjOI88nfwNY13mzxAT8mG2h7ntFzf/uWQEF5CTpNS/kPwhdC7ia8C4euMAq2vaqdEDhHZPF2vax6UV/zZKiWPnnrzTAXXgBWAAeAmBKqA/z1ceDUAXgLgEP/hVwYf9gvwBORombjyORBAAAAABJRU5ErkJggg=="> Order</button>
|
||||
{% else %}
|
||||
<!--<button class="btn btn-default btn-lg btn-block" onclick="window.open('{{ url_for('dmanager.createdomain') }}','_self')"><img class="icon icons8-Address-Book" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAACOElEQVRYhe2Y3W7aQBCF83ZIVdTn4iK973tUCo1KoVVbCC0hSqUoKrKxoQYDCf5BGBtjz+nFeMFO41RtyIIqjzTCs1jMt7OzZ7GPjgrboR2ffK2Wyk3sw49PWm/+CFgqN/G6HW+8VG7iVCEpXio3UQD+94DCX+T1474B03kLwAKwAJQJWNUI17eEvgs4AbBcA1MP0BzgwtwzYMckrCIgigHLZyjFAswFsAgBAJgtgc8/9wA4nDPA1ANq+sP3XI4J/hogAr48ApkW6pevWuMnA15NCADQs5EZ/9jnJT9VCHWdr2s6IYwBLwTOevmAwp5cwarGCRchUFF5rGEQlutNDvRs/tQdZCakWHh+wJs7TnY+5PhDnxATEERAe0T4NqJN/3UToLcqgQiYeBIAzQX/kFiugctxx/x9Et+n2zE3APy1BMD5iqVExKJa71L9JZb0crwds30gjCUARjHrnYhjAtwgm7hrcbKGwXFF5fucQAKgE7DupeP7lbF9ZPq0YXBFNUcCYD/puXqifUpSretb3gw3d4Spx2Oqzb069XhS7zUJMiP6y5hzNT4N+DQR5gYsP35KdoIIaBoShXq25MStZAlrOp8a50PaaONZj3BhEtojymygPEDNIWjOI88nfwNY13mzxAT8mG2h7ntFzf/uWQEF5CTpNS/kPwhdC7ia8C4euMAq2vaqdEDhHZPF2vax6UV/zZKiWPnnrzTAXXgBWAAeAmBKqA/z1ceDUAXgLgEP/hVwYf9gvwBORombjyORBAAAAABJRU5ErkJggg=="> Order</button>-->
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -1,5 +0,0 @@
|
|||
<p>{{ user.email }} have ordered a new deployment<br />
|
||||
<br />
|
||||
</p>
|
||||
<p>Regards,<br />
|
||||
Proxadmin</p>
|
|
@ -1,4 +0,0 @@
|
|||
User {{ user.email }} have ordered a new deployment.
|
||||
|
||||
Regards,
|
||||
Proxadmin
|
20
flask/forest/templates/panel/items.html
Normal file
20
flask/forest/templates/panel/items.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
{% block services %}
|
||||
<div class="no-more-tables">
|
||||
<table class="table table-hover table-striped table-condensed cf">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Description</th>
|
||||
<th>Date Created</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
{% for item in inv_items %}
|
||||
<td data-title="Key">{{ item.key }}</td>
|
||||
<td data-title="Description" >{{ item.description }}</td>
|
||||
<td data-title="Date Created">{{ moment(item.date_created).format('lll') }}</td>
|
||||
</tr >
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1,40 +0,0 @@
|
|||
{% block services %}
|
||||
<div class="no-more-tables">
|
||||
<table class="table table-hover table-striped table-condensed cf">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Category</th>
|
||||
<th>Description</th>
|
||||
<th>Last Charged</th>
|
||||
<th>Time Left</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
{% for service in inv_services %}
|
||||
{% if service.enabled == False %}
|
||||
<tr class="danger">
|
||||
{% else %}
|
||||
{% if service.warning == True %}
|
||||
<tr class="warning">
|
||||
{% else %}
|
||||
<tr>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<td data-title="Category">{{ service.category }}</td>
|
||||
<td data-title="Description" >{{ service.description }}</td>
|
||||
<td data-title="Last Charged">{{ moment(service.date_last_charge).format('lll') }} ({{ moment(service.date_last_charge).fromNow() }})</td>
|
||||
{% if service.enabled == False %}
|
||||
<td data-title="Time Left"><button class="btn btn-default btn-success" onclick="window.open('/smanager/activate/{{ service.pid }}','_self');"><span class="glyphicon glyphicon-bell" aria-hidden="true"></span> Activate</button></td>
|
||||
{% else %}
|
||||
{% if service.warning == True %}
|
||||
<td data-title="Time Left"><button class="btn btn-default btn-success" onclick="window.open('/smanager/activate/{{ service.pid }}','_self');"><span class="glyphicon glyphicon-bell" aria-hidden="true"></span> Renew ({{ service.daysleft }} days left)</button></td>
|
||||
{% else %}
|
||||
<td data-title="Time Left">{{ service.daysleft }} day(s)</td>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</tr >
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- <button class="btn btn-default" onclick="window.open('{{ url_for('smanager.requestservice') }}','_self')"><img class="icon icons8-Key-2" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAADwUlEQVRYhdXYz0/bVhwA8Bz4I/Yn9A/gwKGHHApxiENwo8IG2rSqh/XUw267cRmJY8dOQpIGOq2cdtguFZNoUQQeiOBnm7h4iB+TRkJwkiJtdZ0GQzPLeTtU0bIQ0qQ8wP1K30sU6X3y/X7fs18cjk89Bsn1fjwEAgQj7nhpQXMFeeilBY1gpV2cFkgsCG7fCAwL8E5fWBQmk7IeX1bNTM6ASrkG83odKuUazOQMGF9WzYmEXPWFxd+xAO+8FphziuvzMRKDkcBKLKt/H2gWzOv1C/NAs2ByRdXdJDD9kc2oc4rru1LcSFj4dTIpn6z9edIR1pqZnAG/mt06GWXExStD+hiJ+SKR1ff/MnvCNVfz69mt1yOMOI8chwV4J0YCq9fKtSZ/aEA3Ccyh6Q0cKdAXFoUUVzJbK8IsFc4IVqoSrFSln+fffWgm83odpriSiVNgDxlukFzvn0zKeuvizFLhzEuL224SDLhJMOClBIlZKpx10+qJhFxBtrPHY9mZaLqgty5EsFLVTYKB5h9CsFK1m1ZH0wX9XlSaRQIkGHEnkzPOLXIZYCZnQIIRd5AAvbSgNQ7h5qSf59/hlCAOkuv9g+R6P06BNWoxf9oNUCnXoJcWNCRAV5C/cJaYFwWjsUmoxfxpN5ukka4gD5EAR8LtK3iZVMo1OBJGVMG7EWmv3QxeJjM5AxKstIsE+Hk8G4+mC29RAqPpo+pYbPMJEiAWBLe/fPyy0st8dXEO1rGQcA8J0OFwOPwRaT+5op47Cz8m51ZLcHwma92NSK+GQ+JnSIBYgHe6SWBedhb5QwN6KAEuKBqcXS1VkCL9kc1ou0deL6395sdt+OinAygfv/8MKdI5xfWNMuLigzmlyh/2Vkn+0IAPn27D737+A26+suDTl9aVIufdJDATK6rWzRv13GoJ4pQAv184gI3vy8f1/yF/WCtbPkYsImv30PTGKE6Bvc53kqI5kZTrY7GstaBo5/CtSOQz6XC83zweCrBtb3UUiLpIcN9LC5UUV2x7AlwL8kMxNL1xy0uLeoorvrE5UtBTvxU12yMfc6q9kZ4Q0FxBHjayExL57u412r1r2qKSnYC2Qg6HwOtPvt2/7P73tIqljyw/Kz2zDbA1t4//gTglnF7pn1AXRad2N+eDJ8obV4C/c+3A5ugEjKXVk7EZed62wPR+BfrCYvlGgZ4Q0GLpI6v1uquUa3A8nn07TPHf3ihwaHrjlp+VnuEUOL0/t6UnllVraVe3B645nFNcnyvA3/FQIOELi2Vb4bqJfwEpWpu91pyNygAAAABJRU5ErkJggg==">Request</button>-->
|
||||
{% endblock %}
|
|
@ -1,28 +0,0 @@
|
|||
{% block support_item %}
|
||||
{% if support != None %}
|
||||
|
||||
<div class="panel panel-default" style="margin-top: 0px">
|
||||
<div class="panel-heading" href="#support{{ support.pid }}" aria-expanded="true" aria-controls="support{{ support.pid }}" role="tab" id="support{{ support.pid }}">
|
||||
<font color="green">started at {{ moment(support.timestamp).format('ll') }}</font></b></a>
|
||||
</div>
|
||||
</div> <!-- end of heading -->
|
||||
|
||||
<br />
|
||||
{% for line in support.inv_lines %}
|
||||
<div align="right">{{ line.topic.owner.email }} {{ moment(line.timestamp).format('lll') }}</div>
|
||||
{{ line.line }} <br />
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
<form method="POST" action="{{ url_for('panel.support', topic=support.hashtag) }}">
|
||||
{{ form.line | safe }}
|
||||
{% for error in form.line.errors %}
|
||||
{{ error }}<br />
|
||||
{% endfor %}
|
||||
|
||||
{{ form.csrf_token() }}
|
||||
{{ form.submit }}
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{{ super() }}
|
||||
<script type="text/javascript">
|
||||
$('a[data-toggle="tooltip"]').tooltip({
|
||||
animated: 'fade',
|
||||
placement: 'bottom',
|
||||
html: true
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
<div class="row">
|
||||
|
||||
{% if inv_topics != [] %}
|
||||
{% for support in inv_topics %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="deployments">
|
||||
<div class="panel-heading">{{ support.hashtag }}</div>
|
||||
<div class="panel-body"><p>
|
||||
<div class="panel-group" id="support{{ support.pid }}" role="tablist" aria-multiselectable="true">
|
||||
{% include "panel/support_item.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
|
@ -1,122 +0,0 @@
|
|||
{% block vdc_pool %}
|
||||
{% if deploy.enabled == False %}
|
||||
<div class="panel panel-danger" style="margin-top: 2px">
|
||||
{% else %}
|
||||
{% if deploy.warning == True %}
|
||||
<div class="panel panel-warning" style="margin-top: 2px">
|
||||
{% else %}
|
||||
<div class="panel panel-success" style="margin-top: 2px">
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<div class="panel-heading" data-toggle="collapse" data-parent="#deploycubes" href="#cube{{ deploy.machine_id }}" aria-expanded="true" aria-controls="cube{{ deploy.machine_id }}" role="tab" id="dpanel{{ deploy.machine_id }}">
|
||||
{% if deploy.protected == True %}<img class="icon icons8-Security-Checked" width="24" height="24" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAADr0lEQVRYheXYzWrbWBQHcD1CHiGPkEfwxtaXm05baDclCels0kWbTRbuJl0EJF1JdnHo1DQQOgstSgqBiJIygY4XwVdXFnUIuKA0H1BIiVrTGmxrrBDnzCJ4SNLYkmzZGWb+cFYG3x+6OkdXoqj/Q+LIHGNl8hsnE4eTiZMQC5k4MseuFUWLxk1OJhqvmN9uZT9UH2r7IOXrIOXr8FDbh1vZD1VeMb9xMtFo0bg5cFAsUxpJSHgymS6usMhw72RL7tzqIaQ3XchZrSsrvenC3Ooh3M6Waiwy3GS6uJKQ8GQsUxqJBMUIeDQh4ckbavE9LWK4/7JcTekOLBrHHVGdatE4hpTuwP2X5SotYrihFt8nJDzJCHg0NIoWjcdJxdxnZdKcXrZr8+uVnlDdsPPrFZhetmusTJq8Qj7RovE4EJYWMcxoe8359UpkIL+aX6/AjLbXpEUMgYDDgl2u/waQR6TSrTMHVelNF3jVPPAFJlVra2GjOnTgwkYVkqq1de3A5VLfwOKblO4MBPfnwSl4JwBr9s+/pXQHkmrxjS8wIeCnj15/HgjufN7tXvz90evPkBDwU18gLRVmZ7S95iBxFRd+2uoHr3Y8WirM+gIZAcfuPt/+MUxczmrB3efbPxgBx3yBsUxpJKpZGBSXswLOwHY4RL5K+XrHha0vpx0X6gUn5evBZmA7vGL+0amT7cqp74LvdluBcaE6uB1aKsxOL9u1y3+0ZvsvvFJugXcSHJezWjCx9LERF/BUYCAj4FEWkSs7udvW9YLLWS1gEWmGPhfyqnnQ6T68CrlmX8R5JwDatj8u9P3XDi0WnnWbh5eR5+OdAKyUg3X6g1c7Hi0WnoUGMgIe5RDxwnRqWFzP29sOrxQtv+fyeWRYXEp3gFeKVk84iqKouICn7gV4qrQPAWFwOasF42nrr1Dde1U4yTgKcvwK0q3na2GjCpxkHPWFC3MVw9btbKnW99Vrh5PN3Sjf8lK6A6xM7EhwFHV2wmERaUbxbrxoHLc7NxYZkKIoilPIi4mlcqNf4MRSucEp5EWkOIo6O4Zxsrnbz+vA3OohsDKxI/s2czlxZI4xyHC7HcW6dS2DDHfgn+USUuEXDhEvDFLK1wdz33VKXMBTQZFSvg4cIl5kIyUMkpeN793GT0p3zrZ12Lh/kMgc4xD5OqPtXRhBi8Yx/Pr7jsdJxtG1fwqOZUojLDLejmesxhPdgSe6A+MZq8Ei4+3AurWXMAKOJVVrK6laW0Nrhn9D/gYrB5WUx8IwEwAAAABJRU5ErkJggg==">{% endif %} <a href="#"><b>{% if status[deploy.machine_id] == 'running' %}<font color="green">{% else %}<font color="red">{% endif %}{{ deploy.machine_alias }}</font></b></a>
|
||||
</div></div> <!-- end of heading -->
|
||||
|
||||
<!-- START OF HIDDEN PANEL -->
|
||||
{% if deploy.enabled == False or deploy.warning == True or status[deploy.machine_id] != 'running' %}
|
||||
<div id="cube{{ deploy.machine_id }}" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="heading{{ deploy.machine_id }}" style="border:3px solid #faebcc; border-top: none; margin-bottom: 10px;">
|
||||
{% else %}
|
||||
<div id="cube{{ deploy.machine_id }}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading{{ deploy.machine_id }}" style="border:3px solid #d6e9c6; border-top: none; margin-bottom: 10px;">
|
||||
{% endif %}
|
||||
<div class="panel-body">
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active"><a data-toggle="tab" href="#nfo{{ deploy.machine_id }}">Information</a></li>
|
||||
<li><a data-toggle="tab" href="#controls{{ deploy.machine_id }}">Control</a></li>
|
||||
<!-- <li><a data-toggle="tab" href="#support{{ deploy.machine_id }}">Support</a></li>-->
|
||||
<li><a data-toggle="tab" href="#graphs{{ deploy.machine_id }}">Monitoring</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div id="nfo{{ deploy.machine_id }}" class="tab-pane fade in active">
|
||||
<p><br/>
|
||||
<img class="icon icons8-Time" width="32" height="32" src="data:image/png;base64,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">
|
||||
{% if deploy.enabled == False %}
|
||||
<button class="btn btn-default btn-success" onclick="window.open('/vmanager/activate/{{ deploy.machine_id }}','_self');"><span class="glyphicon glyphicon-bell" aria-hidden="true"></span> Activate</button></td>
|
||||
{% else %}
|
||||
{% if deploy.warning == True %}
|
||||
<button class="btn btn-default btn-success" onclick="window.open('/vmanager/activate/{{ deploy.machine_id }}');"><span class="glyphicon glyphicon-bell" aria-hidden="true"></span> Activate ({{ deploy.daysleft }} days left)</button></td>
|
||||
{% else %}
|
||||
<td data-title="Time Left">{{ deploy.daysleft }} day(s)</td>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</br>
|
||||
</br>
|
||||
Last Payment Date: {{ moment(deploy.date_last_charge).format('lll') }}</br />
|
||||
{% if deploy.period == 1 %}
|
||||
{{ deploy.period }} month payment cycle<br />
|
||||
{% else %}
|
||||
{{ deploy.period }} months payment cycle<br />
|
||||
{% endif %}
|
||||
State: {{ status[deploy.machine_id] }}<br />
|
||||
Protected: {{ deploy.protected }}<br />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="controls{{ deploy.machine_id }}" class="tab-pane fade">
|
||||
<p><br />
|
||||
{% if deploy.enabled == True %}
|
||||
<img class="icon icons8-Device-Manager" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACl0lEQVRYhe2X70sTcRzHfdhDH/Zn9KAHPrwnejNSwqx01hpBw+1RDyoJrfZk3i0mKerWrtApKJmtQVkSSoPIfbc1vJtzOuFiWeE6QnaJlqbeuydNlj92m/PoBx68nrz5wvfFfd984FNSUuSnYwi1Xyirv7TY+0uq20JL1x8mUoVS2xFJ6xhCFS1gcAsfk7KCQrnxaG7x/xIg71fwckZW5bW4rI3ATa8Ic98Mrg6JObF44toJcETGC1HJSaNWAreeiLjojsLUG8+JpU8jgT9ewrHEVwyGJFVGYmntOtDsm4djXMqJZh3QrIQn7oSPbp/h5baJY9sFnK8+weyJq8KMJPMXqLBP1NIs+U6zBLswli2gSQlpOxmlWTKrY4gxG9pO7tMsQaU9WKatAEv8NBvkt+c6hhhplkDHEOpABCrtwbIqR/jDuS7+c4MzmspQ7xTW6rr59ezsVy7XdfOodwqLepewkRky510C2OfJwgQoq/9IlSOcHuBXVBusxrO5DTQNixgISvkLlNvfHDd5ZhaKvTzDvUAat31i/gI6hlDm/kTqoAQ4IqPFW4BARWvgpJGLLXFEBkdkVLeFYeqJoab9LWyjC8jku2HkpmDqiaHByaPZNw+OyLCNLuDa0BySsoK4tK4uQLMBQ0175IfeFV3Vu6KrBregJGUFTUMJnO2c3Mp3o65rUknKCgZDEs50TsLgnkKDS4DFE8dw5AtolsD29F1hT3C6I4IWrwh9N686Wi/3xNHiFdHYOw3HuPTbEwyGJNAsgXWPPuwpkP2LfbPrOQX6IstbZx9Pr+3oQHj+2z9QwkOBQ4G/QuDU3Uja3J9I7QeTZ1ax9Cc2M1x6ML15wSWs5r2cUlZ/aTErNt0auLIDNmDIdz3/CZaw0mqfwL4CAAAAAElFTkSuQmCC">
|
||||
{% if status[deploy.machine_id] == 'running' %}
|
||||
<button class="confirm command command-shutdown btn btn-default btn-warning" value="shutdown" vmid="{{ deploy.machine_id }}"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> Shutdown</button>
|
||||
<button class="confirm command command-stop btn btn-default btn-danger" value="stop" vmid="{{ deploy.machine_id }}"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span> Force Stop</button>
|
||||
</p>
|
||||
<p>
|
||||
<img class="icon icons8-Remote-Control" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC+0lEQVRYhcWXz04aURTGZ+HCB+jCB2Dh0kWXXbBh7sREsPuuTBc+QB+A1MBctKBLgtGYVuPChYmuak2mDWXuBGfU0mpDhWCoKMb/KK0Q7pwuxmGGQflTBr3JJMNd3N93z/edAzBMFxbiRQfC0haLCUEBMs36xWGnV+jpBqvpcvliAxyWeISJwPrF/icRwTAMw/rFfoSJwGLxzZNVw+kVejgs8Swf89p6sMsXG3B6hV79s54BhKVlxJPXVhEIk6jLFxvoGDw4Hu9zB+Wdkdlk3hOS960eI150cFiaQAGyOjge79P3Wb/Yz2JCOrJicDze5w7Jmbcfz4/CMoWJL0XwTMlH9wUN8SKHAmTVvMdhaYzDsVe2wPWnkQgOSxOIJ6MmUQ4Ok0Xb4M1EDL2Tn1mrwGJCbIU3E2EFIkyEjuBLuxRiWRXiORXW0ipMbzYWYU1+y51wH/zHsQrWdfEXYGm3tUx0dPNothZeqhjvhRLATJNKtAcPbqR865cVs8fFsgY7LQIsfqcwvUkhnjNEfd5X6zLhDm38Ng+r/4Z/SNAqSMgYoIhCoVDS9hPHal0wR+fTJ4gXuY7gYZnCQoJWS64cGqClXQrXdwLkw1oBvvXLylBQ3mtp8j3UanPbxnv+xvBeOtA6IFcwcrD6yxAw9uni2hOSs+ZR3DY8c6H5u3WkVm9L65sAAADS5zbD338zPC+Wobq//JPC2R8DXKZa6SOKjXD92c6rUCwDxLL14Zrb1iqig9uGMwzDuIPyjjlwEYVC6kyFq9taP8MyBSGjQqF0f9L1wLmDG6mW4YgXHSOzybz5kJWkYXD2qhaktxoAwEKiQzjDaL9QPJPKwZR4Wz1oZpPCzR0oail74m4Enxahc7i+OCy9GJ5ScmYREUUbOmGZwlpahdSZCitJtToLzPC2PW9VhB6yCjXmvNVzW+DNKqH7bs2DrfBGIma3aN33fVfgjUR0/eatingU+EMiHhVuFvFyUjkYnU+fDAXlvUeF68vpFXpdga/Pu/Gn8h8Gr4IF2ejgSgAAAABJRU5ErkJggg==">
|
||||
<button class="btn btn-default btn-info" onclick="window.open('/vmanager/command/vmvnc/{{ deploy.machine_id }}', '_blank');"><span class="glyphicon glyphicon-console" aria-hidden="true"></span> Console</button>
|
||||
{% else %}
|
||||
<button class="command command-start btn btn-default btn-success" value="start" vmid="{{ deploy.machine_id }}"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Start</button>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="graphs{{ deploy.machine_id }}" class="tab-pane fade">
|
||||
<p>
|
||||
<div class="row">
|
||||
<div class="col-md-6"><img class="img-responsive" src='data:image/png;base64,{{ rrd[deploy.machine_id]['cpu'] }}'>
|
||||
<img class="icon icons8-Electronics" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABPUlEQVRYheWXMWuDQBiG/Tn+DCdxNFpdBDtLh0L2rjrW4yIEF+lPcJJMnapL7jy4krXQpN2E0KUuyXUSQlNpGr1+lL5wwze9D7zHx/cqSo/0sFSNqNKMqNL0sFSHzn0+vXIxyYOMN0HGGxeTfOh8FsBitRWL1VZ4CS2Gzn8HwET1tRXTzQVmrZ9y4adcODPWDp3NmLxOEJ1+C2DFdDNf7oSMZ6F6fWSoh6XqYpJ7CS28hBYOZu+yAJwZazsfF5NcD0tVMaJKCzLedHldplyK+Xy5E37KRedzdff4ZkSVBg8AHgE4AHgEpwDcP+3FT/XwvB/vD4wFcPYfkAoAHgE4AHgE4ADgEYAvIvBVDA4AHgE4AHgEnzVB9EUWgI3Z8VH6BcDURvXoZ7mN2dq8pTenlQPlPzejQwDQcvpb9fwDkojR+HkAxLYAAAAASUVORK5CYII=">
|
||||
Processor {{ deploy.machine_cpu }} {% if deploy.machine_cpu > 1 %}cores{% else %}core{% endif %}
|
||||
</div>
|
||||
<div class="col-md-6"><img class="img-responsive" src='data:image/png;base64,{{ rrd[deploy.machine_id]['mem'] }}'>
|
||||
<img class="icon icons8-Memory-Slot" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABpklEQVRYhe2XzUsCURTF35/Ssj/DVQ20c9EXBrrJNrVokdQyoUHcRGUfkAViIbbIbNEyF+VDsKmsqVG0RIhxGgdKUCyYOS3MbPogRJhmMRcOD8595/JbXHg8QqyyihDiCHDLjlVOdG1cGqKxtQtxNHAeJoQQwrC0x711Jd4/aTBSkyG+3LeQ7CUMS20zEcFwgNloVmFYajMfwHpa1anlH+X1fqLYHnZS0ucOs+3cb/MsAAvAArAAzAtwUtKr5XNlvc/L7R4v63tcWQ/30zzzvgXGA/iofXj5rD5/kIeRGglwDcZH7YTxUfvgykV9Li7BSA0FMu8ALLU5g4L4dVv/0hJ9wUS4II2H8o+LyUZH2fW0CmdQED92wBkUxERRQ6UGhC5VVF+AeFbDtaThVtawf6ui9grsZFRUasBpScNkpPjM+OhUP0sn3OGC0mn+G0BG0gAAezcqgOalhypQqQHH981ePNs8hYoG15agMCy1dZs3B8CAP1Wd3hVkb+xOcW1el72xO8W9zUueaE72RHOye5uXPvemdwV5wJ+qtgC6yf/vh8QqM9QbwskG2n58EgAAAAAASUVORK5CYII=">
|
||||
Allocated memory {{ deploy.machine_mem }} MB</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="row">
|
||||
<div class="col-md-6"><img class="img-responsive" src='data:image/png;base64,{{ rrd[deploy.machine_id]['net'] }}'>
|
||||
<img class="icon icons8-Flow-Chart" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABlElEQVRYhe2Xz0vCUBzA35/g0T/Bo3+Ah13UIWQgSzQhjE4RHhPq5EHdENSGGkqEdAnpINhliNBOOnU/aBhlp4qIYTA2vNc6JfJ46gQLqX3hA9vjw9vn3d4AMDG+TN+OkxxmFk+64zCzr+nBSS4aLMl69HyoLCJcHqibebGx8oDj65FRFj4WkmxpRoCWGCvACvh7AbHas5FsaQs5rL/9QADVdQVoiYHx53getb6RF2IrDZg1Xopjf+VDVsD/CvBSHGsWD9XRlvHdqbZzpada0q3iJIdZAVbA+gV40h1HsCA2IiWJiZQkhjjh+ckzLdRhn6CFOsoNFsQGfBveosXk1F7dcFG8+X7Hqa4LAAAATnLYfnWgNu91A2b7VFLhgFBRfEe5Bxd3Y/iEoYL4gHJzzRcDJ7noJCBeGypP+qcBs1uRFThgp3L7inKPrh5VVADKveyNrAArYM0CCFrQ4rWhAuPP9sZwgD/bG6NcghY0OICgBRnl7p3J+iQAS7C2eb/acMA8F0uwtmnXnWo7Z7m+TN8OAABf+SW5Q83GlOAAAAAASUVORK5CYII=">
|
||||
Network traffic
|
||||
</div>
|
||||
<div class="col-md-6"><img class="img-responsive" src='data:image/png;base64,{{ rrd[deploy.machine_id]['hdd'] }}'>
|
||||
<img class="icon icons8-SSD" width="32" height="32" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADMElEQVRYhcWXy0/TcADHe/DgwQNHDhz8Izx44LCD0gHycBiDjygcFjV6UfFCohKdrAPdA4JMkZfxrcEgvkdcjLiOrSuPAQ4HTAQdMLYOcWRutF8PphOyTUlc6y/5HLvPp02/yUoQKY6ixrpJSdlzlVpakREoe66ixro5lSvpkFR/4dGOsdnGN3PhTHKkfXSuWO8s/2vAweah6Y9BAb5wZpnkBFS2uGf+KFdq6a2655+DmZaLNPR+DSu19Na0AXm1tl03+4PfpAp4NLgUyau17UobUKJnzr30rMSlCrBORgWVia1NG7DbyHb3z8QlkfvCAlj/KsoaBl6lDVCZXBNjAV6yAG9IwMHmoem0AUc7RkJSyUWq7n4MpJQX1DmyL/Z8kmwBIobXs6GUSyC19I52OrAkdcA9lltOuYRiveP0s9HvMakDeieiq6UG5kJSQKnRdc82HZNU7gsLYL6sQmVyPU2eoIEZGV2QbgEi40EB5U0DU0kB6taRgNRykZO3x+fXyRU11qzzj32SL0Ck7sVMsKDOkZ0IyNfZt1/vWwjLFXDLEfpGam3KNQH9J7rd36NyBbzyrMSL9K7q3y+gaaDt3acfssh9YQGO2ThUJlfX7wAj63DPS78AkQ+LAsoa2IlEQGXL8MIUJ49c5FjHaFBcwJbqhxOcnHJfWMClp9O/lrBT17ft1P3JQM84DzmpejC1oNTSCkKppRUVrR6/meEhJ5VtnmDKAI2FQ/3bCMwMD511GTrrMswMj/q3EWgsHMwMD6MtCo2FQ6M9hkZ7DBoLB6MtmnT9WjoGNxhAUjTUnV6YGR4Hro1gb9MQzAyP43d8ICkaZoZH9ZN5kBQNjYWDzroMkqJxputL0vUiPk4AAAz4hY0FqEws1J1eFOsZFF1xQt3pxZ7GwcSP7ze7QVI0DrWM4fCNDyApGuVXh6Hu9IKkaOxrdidEN4d4iCcSw8YC/hWViV33BAbnBERiwPvPqZ4AZc/9Hy9hRavHr9TSCkJRY80qvOxYanLEZZM3O1dRYmAW83X2HIIgCKJI7zxZdIUJVbR6/HJQoncGSw3s2XX/CfJ19pyMfY7/hcSdEwTxE6x7GguhLb0ZAAAAAElFTkSuQmCC">
|
||||
IOPS of {{ deploy.machine_hdd }} GB storage</div>
|
||||
</div>
|
||||
</p>
|
||||
</div>
|
||||
<div id="support{{ deploy.machine_id }}" class="tab-pane fade">
|
||||
<p>
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="supportpanel{{ deploy.machine_id }}">
|
||||
<div class="panel-heading"></div>
|
||||
<div class="panel-body"><p>
|
||||
{% with support=deploy.topic %}
|
||||
{% include "panel/support_item.html" %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END OF HIDDEN PANEL -->
|
||||
|
||||
<!--Cloud Storage icon by Icons8 -->
|
||||
{% if inv_deployments != [] %}
|
||||
<!-- TODO: Create new deployment within this pool! -->
|
||||
{% else %}
|
||||
<button class="btn btn-default btn-lg btn-block" onclick="window.open('{{ url_for('vmanager.vmcreate') }}','_self')"><img class="icon icons8-Cloud-Storage" width="48" height="48" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAEEklEQVRYhe3Xy0/bBhwHcA6btEMP0077A3boYYdK23EHLiQ0hQBtVC1S9zjs0L069TCkSUWNpgZCshDYItZOI+tKH7Cibgw6Wu2RAXWMYyc8mpAoUAIEp6VuTR5OwAnJd5dBEbYJKDSA1J/0PfjgXz6y5W/ssrKDNm9dYl4+aqYeq00kSpnK5pGUusX1WkGgxux+/ePLvmQ4lkcp88nPfkHV6DpcEFhpGnnH2D8XKzXwQv98UtXoqioIVDeRH/1IcKlSAzsIbqXSTJ0tCKy2uNt/uy+slhrYez8JrY25XhCotdKDgzNiSXHhWB5DYRFaK+0tfAWt9Pzow9WSA8cereKYheILAo/bGDHE72z5n8E46rsC0LXR0LXRqO8K4O5kbEc7pvg8TrQxuXKD8xVFnLrJ9canVyYTO1k84FvCe+1eXCcWwPLLYPlldJMsPrg4ipsMtyPkmasBQWUk3twKWGm8PRff7kImsoxT7V5MLwrYPPNP0tDbPfh3KrltoGkgIqgaXbVbAT9zuLi00oIHfA6O4ShOOyZQZaFQZ3Pjbx8nwa3NcPAp1CYSersH529NwcuubAn8iXya0VjcXykCtVa6o9cn5JVwZzr9OHcziNBDAWI2hzCXwmourwgEAF7IgEuI6CJZ6FppMJFlRWCfX0BNq6dLEVjdQlODYfmK6RiK4twvwS0xheYasYCGnpAi8N6sCK2V8SsCq76hFsce5WRPPu2YQIBNFgXkEiL0do8icGIxB42Fisviyg3Ol463MtkpmYoZj4qoslAQs7migACgNpFo7Hsge6unl/I4+Z0nW25wHpIAVY2uw593BiQVMx4V8eGlMVwZjhSNA4B4OgtL/zROfsvIIs/eCAoVRuKIHLC26Y+IBGjqn0GHc25XcBvnh39mcaF3WgK03F1IqZoJnQR41EzVO1xPVjaf8P73o2D55V0HTi8K0LXREmAnxWe1VtogrZgW+sbvPkFygt7uAZcQdx2o9MDcnkyh1sb8KgNkvEMyFXP+1hS6SXbXgd0kK1s5rrkMalqYSQlQY6HichXjZVdwqt2LHioKXsgUDeMSIrpJFnU2N9xzacnv+R7noDFTwuaKOXSizSPKVcwasqEnhDqbu+iPI73dg4aekCwuHMtjZikPvd2TLTc4X10HVhiJI19cDe7oLeZ55suukFDRfO/tZxXTTOhMdxZK/iWnFNtf0bTKRLy7DjxmcX99meLFvYat5RodW61uYZo2PsH9fX5pxexV7gTTqGn1DGzswODwbGbPYWsZiWSgtTGhZxVjpoTxRfm3mL2In8tBY6ZS60C1icRFJrevojaReAF8bkAykkcqAxDz+W0dFxOlXVsCU///5aYy2NZxMVHadbCv4H7IC+CuA/djyg7C/AeJ36h1J+7ehgAAAABJRU5ErkJggg=="> Create</button>
|
||||
{% endif %}
|
||||
{% endblock %}
|
Loading…
Reference in a new issue