diff --git a/app/admin/routes.py b/app/admin/routes.py index e45c872..91ba770 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -48,7 +48,7 @@ def list_items(): @login_required @admin_required def list_users(): - allusers = User.query.order_by(User.last_seen.desc()).all() + allusers = User.query.filter_by(active=True).order_by(User.last_seen.desc()).all() return render_template('admin/list_users.html', users=allusers) @admin.route("/charge/", methods=['GET', 'POST']) diff --git a/app/auth/routes.py b/app/auth/routes.py index 54742ef..e4dd5cf 100644 --- a/app/auth/routes.py +++ b/app/auth/routes.py @@ -150,7 +150,7 @@ def register(): db.session.add(transaction) db.session.commit() token = user.generate_confirmation_token() - send_email(user.email, 'Потвърдете_вашият_акаунт', 'auth/email/confirm', user=user, token=token) + send_email(user.email, 'Потвърдете Вашата регистрация', 'auth/email/confirm', user=user, token=token) #notify admin newip = request.remote_addr if request.headers.getlist("X-Forwarded-For"): diff --git a/app/models.py b/app/models.py index bc59e62..c7ae8f7 100644 --- a/app/models.py +++ b/app/models.py @@ -254,26 +254,6 @@ class Deployment(db.Model): machine_hdd = db.Column(db.Integer) machine_addresses = db.relationship('Address', backref='deployments', lazy='dynamic') - def charge(): - result = Deployment.query.all() - for deploy in result: - if deploy.enabled == True: - managed_user = User.query.get(deploy.user_id) - db.session.add(managed_user) - current_product = Product.query.get(int(deploy.product_id)) - cpu_cost = deploy.machine_cpu * current_app.config['CPU_RATIO'] - mem_cost = ( deploy.machine_mem / 1024 ) * current_app.config['MEM_RATIO'] - hdd_cost = deploy.machine_hdd * current_app.config['HDD_RATIO'] - total = cpu_cost + mem_cost + hdd_cost - - if managed_user.wallet - total > 0: - managed_user.wallet -= total - print('{}> Charging deployment #{} with {}. Wallet now is: {}'.format(managed_user.email, deploy.machine_id, total, managed_user.walet)) - else: - print('{}> Deployment #{} cannot be charged with {}. Not enough money in the wallet ({}). Notifying admin...'.format(managed_user.email, deploy.machine_id, total, managed_user.wallet)) - #TODO: Send emails here. - db.session.commit() - #NAMESPACE class Region(db.Model): __tablename__ = 'regions' diff --git a/app/templates/admin/list_users.html b/app/templates/admin/list_users.html index 7d892c7..74e0f88 100644 --- a/app/templates/admin/list_users.html +++ b/app/templates/admin/list_users.html @@ -6,7 +6,7 @@
-
Users
+
List Active Users

diff --git a/app/templates/auth/already_confirmed.html b/app/templates/auth/already_confirmed.html index 8703963..1f7b742 100644 --- a/app/templates/auth/already_confirmed.html +++ b/app/templates/auth/already_confirmed.html @@ -5,9 +5,6 @@ {% block page_content %} - + @@ -150,7 +150,8 @@ addEventListener("DOMContentLoaded", function() { - + + {% else %} diff --git a/app/vmanager/routes.py b/app/vmanager/routes.py index 55f071d..b885a4a 100644 --- a/app/vmanager/routes.py +++ b/app/vmanager/routes.py @@ -183,6 +183,23 @@ def dashboard(): current_app.logger.info('[{}] Enabled deployments: {}, services: {}, domains: {}, addresses: {}'.format(current_user.email, inv_deployments_list, inv_services_list, inv_domains_list, inv_addresses_list )) return render_template('vmanager/dashboard.html', rrd=rrd, status=statuses, inv_deployments=inv_deployments, inv_services=inv_services, inv_domains=inv_domains, inv_addresses=inv_addresses, region=regions) +@vmanager.route('/activate/') +@login_required +def activate(vmid=0): + #work with disabled deploys only + result = current_user.inv_deployments.filter_by(enabled=False) + inventory = [] + for invcls in result: + inventory.extend([invcls.machine_id]) + #checks if current user owns this vmid + if not vmid in inventory: + current_app.logger.warning('[{}] Access violation with cube id: {}'.format(current_user.email, vmid)) + #TODO: log ips + abort(404) + else: + current_app.logger.info('[{}] Disabled deployments: {}'.format(current_user.email, inventory)) + abort(403) + @vmanager.route('//') @login_required @@ -198,26 +215,25 @@ def command(cmd=None, vmid=0): # return redirect(url_for('uinvoice.addfunds')) #work with enabled deploys only - result = current_user.inv_deployments.filter_by(enabled=True).order_by(Deployment.date_created.desc()) + result = current_user.inv_deployments.filter_by(enabled=True) inventory = [] for invcls in result: inventory.extend([invcls.machine_id]) - #checks if current user owns this vmid - if not vmid in inventory: - current_app.logger.warning('[{}] Access violation with cube id: {}'.format(current_user.email, vmid)) - #TODO: log ips - else: - db_result = contact_proxmaster({}, cmd, vmid) - #print(db_result) - - #admin override if current_user.is_administrator(): current_app.logger.info('[ADMIN] Access override for cube id:{}'.format(vmid)) db_result = contact_proxmaster({}, cmd, vmid) - - if cmd == 'vmvnc': - return redirect(db_result['url']) - + if cmd == 'vmvnc': + return redirect(db_result['url']) + else: + #checks if current user owns this vmid + if not vmid in inventory: + current_app.logger.warning('[{}] Access violation with cube id: {}'.format(current_user.email, vmid)) + #TODO: log ips + else: + db_result = contact_proxmaster({}, cmd, vmid) + #print(db_result) + if cmd == 'vmvnc': + return redirect(db_result['url']) abort(404) diff --git a/manage.py b/manage.py index b90d2de..e082af5 100644 --- a/manage.py +++ b/manage.py @@ -1,12 +1,16 @@ #!/usr/bin/env python -import os +import os, sys import subprocess, shlex +from datetime import date, time, datetime +from dateutil.relativedelta import relativedelta + from app import app, db from flask_script import Manager, Shell, Command from flask_migrate import Migrate, MigrateCommand def make_shell_context(): + from app.models import User, Role, Permission, Deployment return dict(app=app, db=db, User=User, @@ -34,11 +38,65 @@ def deploy(): @manager.command def charge(): - print('charge') - from app.models import Deployment, Service, Domain - #Deployment.charge() - #Service.charge() - #Domain.charge() + from app.models import User, Deployment, Service, Domain + + today = datetime.utcnow() + print('[1] Scan for active expired items and set them as inactive {}\n'.format(today)) + deployments_ena = Deployment.query.filter_by(enabled=True).all() + for deploy in deployments_ena: + lastcharge = deploy.date_last_charge + expiry = lastcharge + relativedelta(lastcharge, months=+(deploy.period)) + if today > expiry: + print('last charged: ' + lastcharge.strftime('%c') + 'expiry date: ' + expiry.strftime('%c')) + print(deploy.machine_alias + ' is past expiration date and will be marked INACTIVE') + services_ena = Service.query.filter_by(enabled=True).all() + for service in services_ena: + lastcharge = service.date_last_charge + expiry = lastcharge + relativedelta(lastcharge, months=+(service.period)) + if today > expiry: + print('last charged: ' + lastcharge.strftime('%c') + 'expiry date: ' + expiry.strftime('%c')) + print('Service "' + service.description + '" is past expiration date and will be marked INACTIVE') + for domain in domains_ena: + expiry = domain.date_expire + if today > expiry: + print('last charged: ' + lastcharge.strftime('%c') + 'expiry date: ' + expiry.strftime('%c')) + print('Domain "' + domain.fqdn + '" is past expiration date and will be marked as INACTIVE') + + today = datetime.utcnow() + print('[2] Scan for items that will expire soon and try to autocharge them if they are not active. {}\n'.format(today)) + deployments_ena = Deployment.query.filter_by(enabled=True).all() + for deploy in deployments_ena: + lastcharge = deploy.date_last_charge + expiry = lastcharge + relativedelta(lastcharge, months=+(deploy.period)) + daysleft = relativedelta(today, expiry).days() + warn = deploy.period * 5 + print(daysleft) + if daysleft < 10: + print(deploy.machine_alias + ' is eligible for charging') + print('last charged: ' + lastcharge.strftime('%c')) + print('expiry date: ' + expiry.strftime('%c')) + cpu_cost = deploy.machine_cpu * app.config['CPU_RATIO'] + mem_cost = ( deploy.machine_mem / 1024 ) * app.config['MEM_RATIO'] + hdd_cost = deploy.machine_hdd * app.config['HDD_RATIO'] + total = cpu_cost + mem_cost + hdd_cost + print('total: ' + str(total)) + services_ena = Service.query.filter_by(enabled=True).all() + for service in services_ena: + lastcharge = service.date_last_charge + expiry = lastcharge + relativedelta(lastcharge, months=+(service.period)) + if today > expiry: + print(service.description + ' is eligible for charging') + print('last charged: ' + lastcharge.strftime('%c')) + print('expiry date: ' + expiry.strftime('%c')) + cost = service.price + print('total: ' + str(cost)) + domains_ena = Domain.query.filter_by(enabled=True).all() + for domain in domains_ena: + expire = domain.date_expire + if expire - today < 60: + daysleft = relativedelta(now, expire).days + print(domain.fqdn + ' is expiring after ' + daysleft + ' for charging') + print('expiry date: ' + expire.strftime('%c')) @manager.command def runserver():
CPU Mem HDDIPv4Network Control
{{ deploy.machine_mem }} MB {{ deploy.machine_hdd }} GB {% for addr in deploy.machine_addresses %} {{ addr.ip }}
{% endfor %}
{% if status[deploy.machine_id] == 'running' %}{% else %}{% endif %}{{ deploy.machine_alias }}