From d7246f30edce2d52c7bba4a225cbdb82598a95eb Mon Sep 17 00:00:00 2001 From: deflax Date: Thu, 25 Jan 2018 19:48:50 +0200 Subject: [PATCH] redesign admin pages --- app/models.py | 58 ++++++++++++----------- app/templates/admin/admin_cloud.html | 7 +++ app/templates/admin/admin_misc.html | 7 +++ app/templates/admin/admin_tasks.html | 26 +++++----- app/templates/admin/list_addresses.html | 18 ++++--- app/templates/admin/list_deployments.html | 2 - app/vmanager/routes.py | 40 +++++++++------- requirements.txt | 1 + 8 files changed, 93 insertions(+), 66 deletions(-) create mode 100644 app/templates/admin/admin_cloud.html create mode 100644 app/templates/admin/admin_misc.html diff --git a/app/models.py b/app/models.py index 350a0c3..61a535c 100644 --- a/app/models.py +++ b/app/models.py @@ -258,60 +258,64 @@ class Deployment(db.Model): pid = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.ForeignKey('users.pid')) #FK server_id = db.Column(db.ForeignKey('servers.pid')) #FK + date_created = db.Column(db.DateTime, default=datetime.utcnow) deleted = db.Column(db.Boolean, default=False) - enabled = db.Column(db.Boolean, default=True) warning = db.Column(db.Boolean, default=False) protected = db.Column(db.Boolean, default=False) #machines with this False will be autodeleted after the warning period is over. date_last_charge = db.Column(db.DateTime) + discount = db.Column(db.Integer) period = db.Column(db.Integer) daysleft = db.Column(db.Integer) - vlan = db.Column(db.Integer) machine_id = db.Column(db.BigInteger) #unit_id machine_alias = db.Column(db.String) #dns name machine_cpu = db.Column(db.Integer) machine_mem = db.Column(db.Integer) machine_hdd = db.Column(db.Integer) - discount = db.Column(db.Integer) - inv_addresses = db.relationship('Address', backref='assignee', lazy='dynamic') + inv_pubvlans = db.relationship('PubVLAN', backref='deploy', lazy='dynamic') + +class PubVLAN(db.Model): + __tablename__ = 'pubvlans' + pid = db.Column(db.Integer, primary_key=True) + deploy_id = db.Column(db.ForeignKey('deployments.pid')) #FK + vlan_id = db.Column(db.Integer) + pubaddr = db.relationship('Address', uselist=False, backref='assignee') class Address(db.Model): __tablename__ = 'address' pid = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.ForeignKey('users.pid')) #FK region_id = db.Column(db.ForeignKey('regions.pid')) #FK - deployment_id = db.Column(db.ForeignKey('deployments.pid')) #FK - date_assigned = db.Column(db.DateTime, default=datetime.utcnow) + pubvlan_id = db.Column(db.ForeignKey('pubvlans.pid')) #FK enabled = db.Column(db.Boolean) - ip = db.Column(db.String) - mac = db.Column(db.String) + #mac = db.Column(db.String) rdns = db.Column(db.String) reserved = db.Column(db.Boolean, default=False) #this ip SHOULD NOT be listed as available to assign even if its not currently owned by anyone - def __init__(self, **kwargs): - super(Address, self).__init__(**kwargs) - if self.mac is None: - self.mac = self.genmac() + #def __init__(self, **kwargs): + # super(Address, self).__init__(**kwargs) + # if self.mac is None: + # self.mac = self.genmac() - def genmac(self): - alladdr = Address.query.all() - allmacs = [] - current_app.logger.info('populating mac addr pool') - for addr in alladdr: - allmacs.append(str(addr.mac)) - while True: - mac = [ random.randint(0, 255) for x in range(0, 6) ] - mac[0] = (mac[0] & 0xfc) | 0x02 - mac = ':'.join([ '{0:02x}'.format(x) for x in mac ]) - if mac in allmacs: - current_app.logger.warning('mac address {} is in the pool. regenerating...'.format(mac)) - continue - else: - return mac + #def genmac(self): + # alladdr = Address.query.all() + # allmacs = [] + # current_app.logger.info('populating mac addr pool') + # for addr in alladdr: + # allmacs.append(str(addr.mac)) + # while True: + # mac = [ random.randint(0, 255) for x in range(0, 6) ] + # mac[0] = (mac[0] & 0xfc) | 0x02 + # mac = ':'.join([ '{0:02x}'.format(x) for x in mac ]) + # if mac in allmacs: + # current_app.logger.warning('mac address {} is in the pool. regenerating...'.format(mac)) + # continue + # else: + # return mac #MISC ITEMS class Service(db.Model): diff --git a/app/templates/admin/admin_cloud.html b/app/templates/admin/admin_cloud.html new file mode 100644 index 0000000..ae13a3a --- /dev/null +++ b/app/templates/admin/admin_cloud.html @@ -0,0 +1,7 @@ +
+ + + + +
+ diff --git a/app/templates/admin/admin_misc.html b/app/templates/admin/admin_misc.html new file mode 100644 index 0000000..392945e --- /dev/null +++ b/app/templates/admin/admin_misc.html @@ -0,0 +1,7 @@ +
+ + + + +
+ diff --git a/app/templates/admin/admin_tasks.html b/app/templates/admin/admin_tasks.html index c2c8824..1caf773 100644 --- a/app/templates/admin/admin_tasks.html +++ b/app/templates/admin/admin_tasks.html @@ -1,17 +1,17 @@ -
-
-
Admin Pages
+
+
+
Cloud Manager
-
- - - - - - - - -
+ {% include "admin/admin_cloud.html" %} +
+
+
+ +
+
+
Misc
+
+ {% include "admin/admin_misc.html" %}
diff --git a/app/templates/admin/list_addresses.html b/app/templates/admin/list_addresses.html index e475b90..2d1f9fb 100644 --- a/app/templates/admin/list_addresses.html +++ b/app/templates/admin/list_addresses.html @@ -17,9 +17,9 @@ IP - Assignee VLAN - Slave + Deploy + Server Region rDNS @@ -27,19 +27,23 @@ {% for address in addresses %} - {% if address.enabled == False %}{% else %}{% endif %} + {% if address.reserved == True %}{% else %}{% endif %} {{ address.ip }} {% if address.assignee != None %} - {{ address.assignee.machine_alias }} - {{ address.assignee.vlan }} - {{ address.assignee.server.name }} + {{ address.assignee.vlan_id }} + {{ address.assignee.deploy.machine_alias }} + {{ address.assignee.deploy.server.name }} {% else %} - None + {% endif %} {{ address.region.name }} + {% if address.rdns != None %} {{ address.rdns }} + {% else %} + + {% endif %} {% endfor %} diff --git a/app/templates/admin/list_deployments.html b/app/templates/admin/list_deployments.html index 8e04410..a21ea1b 100644 --- a/app/templates/admin/list_deployments.html +++ b/app/templates/admin/list_deployments.html @@ -21,7 +21,6 @@ CPU Mem HDD - Price Last Charged Days Left @@ -42,7 +41,6 @@ {{ deploy.machine_cpu }} {{ deploy.machine_mem }} MB {{ deploy.machine_hdd }} GB - {{ deploy.price }} {% if deploy.date_last_charge == None %} Never {% else %} diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 1c4d10d..aa7b990 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -4,11 +4,12 @@ from flask_sqlalchemy import get_debug_queries from . import vmanager from .forms import CreateForm, ActivateForm -from .. import db +from .. import db, csrf from ..email import send_email -from ..models import User, Permission, Transaction, Deployment, Service, Region, Address, Domain, contact_proxmaster +from ..models import User, Permission, Transaction, Deployment, Service, Region, Server, Address, Domain, contact_proxmaster from ..decorators import admin_required, permission_required +import json import base64 import string import random @@ -27,20 +28,24 @@ def after_request(response): current_app.logger.warning('Slow query: %s\nParameters: %s\nDuration: %fs\nContext: %s\n' % (query.statement, query.parameters, query.duration, query.context)) return response -@vmanager.route('/slavetables/', methods=['GET']) -def slavetables(regionid): - selected_region = Region.query.filter_by(pid=int(regionid)).first() - if selected_region == None: - return jsonify({}) - addresses = selected_region.inv_addresses.filter_by(enabled=True).all() - regionlist = {} - for address in addresses: - regionlist[str(address.pid)] = { 'ipv4': str(address.ip), 'mac': str(address.mac) } - - data = { 'region_id': str(selected_region.pid), - 'addresses': regionlist } - return jsonify(data) - +@vmanager.route('/slavetables', methods=['POST']) +@csrf.exempt +def slavetables(): + postdata = request.get_json() + if postdata['passphrase'] == 'batkataisthebest1': + selected_slave = Server.query.filter_by(name=str(postdata['slavename'])).first() + if selected_slave == None: + return jsonify({'status': 'slave_not_found'}) + deploylist = selected_slave.inv_deployments.all() + addresslist = {} + for deploy in deploylist: + addresslist[str(deploy.machine_id)] = {} + addresses = deploy.inv_addresses.first() + deploy_address_list = [] + for address in addresses: + deploy_address_list.append(address.ip) + addresslist[deploy.vlan] = deploy_address_list + return jsonify(addresslist) @vmanager.route('/createvm', methods=['GET', 'POST']) @login_required @@ -78,7 +83,8 @@ def createvm(): return redirect(url_for('panel.dashboard')) if query['status'] == 'kvm_created': - deployment = Deployment(user_id=int(current_user.pid), machine_alias=str(form.servername.data), machine_id=query['unit_id'], machine_cpu=data['cpu'], machine_mem=data['mem'], machine_hdd=data['hdd'], enabled=True, protected=False, daysleft=15, warning=True, discount=0, bridge_id=int(selected_bridge.pid)) + selected_slave = Server.query.filter_by(name=query['slave']).first() + deployment = Deployment(user_id=int(current_user.pid), machine_alias=str(form.servername.data), machine_id=query['unit_id'], machine_cpu=data['cpu'], machine_mem=data['mem'], machine_hdd=data['hdd'], enabled=True, protected=False, daysleft=15, warning=True, discount=0, server_id=int(selected_slave.pid), vlan=query['vlanid']) db.session.add(deployment) db.session.commit() flash('A new deployment is created successfully in region "{}".'.format(str(selected_region.description))) diff --git a/requirements.txt b/requirements.txt index 3c8463c..f6f76dc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,6 +39,7 @@ requests==2.17.3 schedule==0.4.2 six==1.10.0 sortedcontainers==1.5.7 +speaklater==1.3 SQLAlchemy==1.1.10 traits==4.6.0 Unipath==1.1