various fixes
This commit is contained in:
parent
96e62c8c4f
commit
2399334a18
17 changed files with 295 additions and 115 deletions
|
@ -114,6 +114,15 @@ def internal_server_error(e):
|
|||
return response
|
||||
return render_template('errors/500.html'), 500
|
||||
|
||||
@app.errorhandler(503)
|
||||
def service_unavailable(e):
|
||||
if request.accept_mimetypes.accept_json and \
|
||||
not request.accept_mimetypes.accept_html:
|
||||
response = jsonify({'error': 'service unavailable'})
|
||||
response.status_code = 503
|
||||
return response
|
||||
return render_template('errors/503.html'), 503
|
||||
|
||||
@app.errorhandler(CSRFError)
|
||||
def handle_csrf_error(e):
|
||||
return render_template('errors/csrf_error.html', reason=e.description), 400
|
||||
|
|
|
@ -39,21 +39,21 @@ def index():
|
|||
@login_required
|
||||
@admin_required
|
||||
def list_deployments():
|
||||
alldeployments = Deployment.query.filter_by(cancelled=False).order_by(Deployment.daysleft.asc()).all()
|
||||
alldeployments = Deployment.query.filter_by(deleted=False).order_by(Deployment.daysleft.asc()).all()
|
||||
return render_template('admin/list_deployments.html', deployments=alldeployments)
|
||||
|
||||
@admin.route("/listservices", methods=['GET'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def list_services():
|
||||
allservices = Service.query.filter_by(cancelled=False).order_by(Service.daysleft.asc()).all()
|
||||
allservices = Service.query.filter_by(deleted=False).order_by(Service.daysleft.asc()).all()
|
||||
return render_template('admin/list_services.html', services=allservices)
|
||||
|
||||
@admin.route("/listdomains", methods=['GET'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def list_domains():
|
||||
alldomains = Domain.query.filter_by(cancelled=False).order_by(Domain.daysleft.asc()).all()
|
||||
alldomains = Domain.query.filter_by(deleted=False).order_by(Domain.daysleft.asc()).all()
|
||||
return render_template('admin/list_domains.html', domains=alldomains)
|
||||
|
||||
@admin.route("/listrecyclebin", methods=['GET'])
|
||||
|
@ -61,8 +61,8 @@ def list_domains():
|
|||
@admin_required
|
||||
def list_recyclebin():
|
||||
deployments = Deployment.query.filter_by(protected=False).order_by(Deployment.daysleft.asc()).all()
|
||||
services = Service.query.filter_by(cancelled=True).all()
|
||||
domains = Domain.query.filter_by(cancelled=True).all()
|
||||
services = Service.query.filter_by(deleted=True).all()
|
||||
domains = Domain.query.filter_by(deleted=True).all()
|
||||
return render_template('admin/list_recyclebin.html', deployments=deployments, services=services, domains=domains)
|
||||
|
||||
@admin.route("/listaddresses", methods=['GET'])
|
||||
|
@ -152,7 +152,7 @@ def transaction(user_pid=0):
|
|||
def dashboard(user_pid=0):
|
||||
cuser = User.query.filter_by(pid=user_pid).first()
|
||||
|
||||
inv_deployments = cuser.inv_deployments.filter_by(cancelled=False).order_by(Deployment.date_created.desc()).all()
|
||||
inv_deployments = cuser.inv_deployments.filter_by(deleted=False).order_by(Deployment.date_created.desc()).all()
|
||||
inv_deploycubeids = []
|
||||
inv_deployments_list = []
|
||||
for invcls in inv_deployments:
|
||||
|
@ -160,13 +160,13 @@ def dashboard(user_pid=0):
|
|||
inv_deploycubeids.extend([invcls.machine_id])
|
||||
inv_deployments_list.extend([invcls.machine_alias])
|
||||
|
||||
inv_services = cuser.inv_services.filter_by(cancelled=False).order_by(Service.date_last_charge.asc()).all()
|
||||
inv_services = cuser.inv_services.filter_by(deleted=False).order_by(Service.date_last_charge.asc()).all()
|
||||
inv_services_list = []
|
||||
for invcls in inv_services:
|
||||
if invcls.user_id == cuser.pid:
|
||||
inv_services_list.extend([invcls.description])
|
||||
|
||||
inv_domains = cuser.inv_domains.filter_by(cancelled=False).order_by(Domain.date_created.desc()).all()
|
||||
inv_domains = cuser.inv_domains.filter_by(deleted=False).order_by(Domain.date_created.desc()).all()
|
||||
inv_domains_list = []
|
||||
for invcls in inv_domains:
|
||||
if invcls.user_id == cuser.pid:
|
||||
|
@ -205,7 +205,7 @@ def dashboard(user_pid=0):
|
|||
flash('Deploy #{} unreachable. Support is notified'.format(str(cubeid)))
|
||||
send_email(current_app.config['MAIL_USERNAME'], 'Cube {} is unreachable'.format(cubeid),
|
||||
'vmanager/email/adm_unreachable', user=cuser, cubeid=cubeid )
|
||||
current_app.logger.warning('[ADMIN] {} deployments: {}, services: {}, domains: {}, services: {}'.format(cuser.email, inv_deployments_list, inv_services_list, inv_domains_list, inv_addresses_list ))
|
||||
#current_app.logger.warning('[ADMIN] {} deployments: {}, services: {}, domains: {}, services: {}'.format(cuser.email, inv_deployments_list, inv_services_list, inv_domains_list, inv_addresses_list ))
|
||||
return render_template('main/dashboard.html', rrd=rrd, status=statuses, inv_deployments=inv_deployments, inv_services=inv_services, inv_domains=inv_domains, inv_addresses=inv_addresses, region=regions)
|
||||
|
||||
|
||||
|
|
|
@ -33,13 +33,33 @@ def chat():
|
|||
def terms():
|
||||
return render_template('main/terms.html')
|
||||
|
||||
#APP STORE
|
||||
@main.route('/market/<int:group_id>', methods=['GET'])
|
||||
@login_required
|
||||
def market(group_id=0):
|
||||
page = { 'title': 'Market' }
|
||||
allproducts = Product.get_products()
|
||||
allgroups = current_app.config['GROUPS']
|
||||
|
||||
if group_id == 0:
|
||||
return render_template('main/market.html', groups=allgroups, products=allproducts)
|
||||
|
||||
filtered_products = {}
|
||||
for key, value in allproducts.items():
|
||||
if value['group'] == group_id:
|
||||
filtered_products[key] = value
|
||||
|
||||
if filtered_products == {}:
|
||||
abort(404)
|
||||
return render_template('main/marketgroup.html', groupname=allgroups[group_id], products=filtered_products)
|
||||
|
||||
#DASHBOARD
|
||||
@main.route("/dashboard", methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def dashboard():
|
||||
cuser = current_user
|
||||
|
||||
inv_deployments = cuser.inv_deployments.filter_by(cancelled=False).order_by(Deployment.date_created.desc()).all()
|
||||
inv_deployments = cuser.inv_deployments.filter_by(deleted=False).order_by(Deployment.date_created.desc()).all()
|
||||
inv_deploycubeids = []
|
||||
inv_deployments_list = []
|
||||
for invcls in inv_deployments:
|
||||
|
@ -47,13 +67,13 @@ def dashboard():
|
|||
inv_deploycubeids.extend([invcls.machine_id])
|
||||
inv_deployments_list.extend([invcls.machine_alias])
|
||||
|
||||
inv_services = cuser.inv_services.filter_by(cancelled=False).order_by(Service.date_last_charge.asc()).all()
|
||||
inv_services = cuser.inv_services.filter_by(deleted=False).order_by(Service.date_last_charge.asc()).all()
|
||||
inv_services_list = []
|
||||
for invcls in inv_services:
|
||||
if invcls.user_id == cuser.pid:
|
||||
inv_services_list.extend([invcls.description])
|
||||
|
||||
inv_domains = cuser.inv_domains.filter_by(cancelled=False).order_by(Domain.date_created.desc()).all()
|
||||
inv_domains = cuser.inv_domains.filter_by(deleted=False).order_by(Domain.date_created.desc()).all()
|
||||
inv_domains_list = []
|
||||
for invcls in inv_domains:
|
||||
if invcls.user_id == cuser.pid:
|
||||
|
@ -99,6 +119,6 @@ def dashboard():
|
|||
send_email(current_app.config['MAIL_USERNAME'], 'Cube {} is unreachable'.format(cubeid),
|
||||
'vmanager/email/adm_unreachable', user=current_user, cubeid=cubeid )
|
||||
|
||||
#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 ))
|
||||
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('main/dashboard.html', rrd=rrd, status=statuses, inv_deployments=inv_deployments, inv_services=inv_services, inv_domains=inv_domains, inv_addresses=inv_addresses, region=regions)
|
||||
|
||||
|
|
|
@ -86,10 +86,12 @@ class User(db.Model, UserMixin):
|
|||
currency = db.Column(db.String, default='BGN')
|
||||
|
||||
inv_routers = db.relationship('Router', backref='owner', lazy='dynamic')
|
||||
inv_addresses = db.relationship('Address', backref='owner', lazy='dynamic')
|
||||
inv_bridges = db.relationship('Bridge', backref='owner', lazy='dynamic')
|
||||
|
||||
inv_deployments = db.relationship('Deployment', backref='owner', lazy='dynamic')
|
||||
inv_services = db.relationship('Service', backref='owner', lazy='dynamic')
|
||||
inv_domains = db.relationship('Domain', backref='owner', lazy='dynamic')
|
||||
inv_addresses = db.relationship('Address', backref='owner', lazy='dynamic')
|
||||
|
||||
inv_transactions = db.relationship('Transaction', backref='owner', lazy='dynamic')
|
||||
|
||||
|
@ -233,42 +235,53 @@ class Router(db.Model):
|
|||
__tablename__ = 'routers'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
cancelled = db.Column(db.Boolean, default=False)
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
deleted = db.Column(db.Boolean, default=False)
|
||||
|
||||
machine_id = db.Column(db.BigInteger) #cubeid
|
||||
|
||||
class Bridge(db.Model):
|
||||
__tablename__ = 'bridge'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
deleted = db.Column(db.Boolean, default=False)
|
||||
|
||||
bridge_id = db.Column(db.String)
|
||||
|
||||
class Deployment(db.Model):
|
||||
__tablename__ = 'deployments'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
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)
|
||||
period = db.Column(db.Integer)
|
||||
daysleft = db.Column(db.Integer)
|
||||
warning = db.Column(db.Boolean, default=False)
|
||||
enabled = db.Column(db.Boolean, default=True)
|
||||
cancelled = 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.
|
||||
|
||||
machine_id = db.Column(db.BigInteger) #cubeid
|
||||
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)
|
||||
machine_addresses = db.relationship('Address', backref='deployments', lazy='dynamic')
|
||||
discount = db.Column(db.Integer)
|
||||
|
||||
class Service(db.Model):
|
||||
__tablename__ = 'services'
|
||||
pid = db.Column(db.Integer, primary_key=True) #PK
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
deleted = db.Column(db.Boolean, default=False)
|
||||
|
||||
enabled = db.Column(db.Boolean, default=False)
|
||||
warning = db.Column(db.Boolean, default=False)
|
||||
date_last_charge = db.Column(db.DateTime)
|
||||
period = db.Column(db.Integer)
|
||||
daysleft = db.Column(db.Integer)
|
||||
warning = db.Column(db.Boolean, default=False)
|
||||
enabled = db.Column(db.Boolean, default=False)
|
||||
cancelled = db.Column(db.Boolean, default=False)
|
||||
|
||||
category = db.Column(db.String)
|
||||
description = db.Column(db.Unicode)
|
||||
|
@ -286,12 +299,12 @@ class Region(db.Model):
|
|||
class Address(db.Model):
|
||||
__tablename__ = 'address'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_assigned = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
enabled = db.Column(db.Boolean)
|
||||
|
||||
date_assigned = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
region_id = db.Column(db.Integer, db.ForeignKey('regions.pid')) #FK
|
||||
deploy_id = db.Column(db.Integer, db.ForeignKey('deployments.pid')) #FK
|
||||
router_id = db.Column(db.Integer, db.ForeignKey('routers.pid')) #FK
|
||||
|
||||
ip = db.Column(db.String)
|
||||
mac = db.Column(db.String)
|
||||
|
@ -322,14 +335,15 @@ class Address(db.Model):
|
|||
class Domain(db.Model):
|
||||
__tablename__ = 'domains'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
deleted = db.Column(db.Boolean, default=False)
|
||||
|
||||
date_expire = db.Column(db.DateTime)
|
||||
daysleft = db.Column(db.Integer)
|
||||
warning = db.Column(db.Boolean, default=False)
|
||||
enabled = db.Column(db.Boolean, default=False)
|
||||
cancelled = db.Column(db.Boolean, default=False)
|
||||
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
date_expire = db.Column(db.DateTime)
|
||||
fqdn = db.Column(db.String, unique=True)
|
||||
auto_update = db.Column(db.Boolean)
|
||||
|
||||
|
@ -338,7 +352,8 @@ class Transaction(db.Model):
|
|||
__tablename__ = 'transaction'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
currency = db.Column(db.String, default='BGN')
|
||||
description = db.Column(db.String)
|
||||
value = db.Column(db.Float)
|
||||
|
@ -346,9 +361,10 @@ class Transaction(db.Model):
|
|||
class Invoice(db.Model):
|
||||
__tablename__ = 'invoice'
|
||||
pid = db.Column(db.Integer, primary_key=True)
|
||||
invoice_number = db.Column(db.Integer, unique=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK
|
||||
date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow)
|
||||
date_created = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
invoice_number = db.Column(db.Integer, unique=True)
|
||||
currency = db.Column(db.String, default='BGN')
|
||||
tax = db.Column(db.Float) #VAT
|
||||
description = db.Column(db.Unicode)
|
||||
|
|
|
@ -6,13 +6,13 @@ import requests
|
|||
import json
|
||||
from facepy import GraphAPI
|
||||
|
||||
@lru_cache(maxsize=8)
|
||||
@lru_cache(maxsize=32)
|
||||
def get_fb_token():
|
||||
payload = {'grant_type': 'client_credentials', 'client_id': current_app.config['FB_APP_ID'], 'client_secret': current_app.config['FB_APP_SECRET']}
|
||||
response = requests.post('https://graph.facebook.com/oauth/access_token?', params = payload)
|
||||
fbjson = json.loads(response.text)
|
||||
fbtoken = fbjson['access_token']
|
||||
current_app.logger.info("FB Token: {}".format(fbtoken))
|
||||
#current_app.logger.info("FB Token: {}".format(fbtoken))
|
||||
return fbtoken
|
||||
|
||||
@news.route("/all", methods=['GET'])
|
||||
|
|
|
@ -74,7 +74,7 @@ addEventListener("DOMContentLoaded", function() {
|
|||
</thead>
|
||||
<tbody>
|
||||
{% for deploy in deployments %}
|
||||
{% if deploy.cancelled == True %}
|
||||
{% if deploy.deleted == True %}
|
||||
<tr class="active">
|
||||
{% else %}
|
||||
{% if deploy.enabled == False %}
|
||||
|
@ -99,7 +99,7 @@ addEventListener("DOMContentLoaded", function() {
|
|||
<td>{{ moment(deploy.date_last_charge).format('lll') }} ({{ moment(deploy.date_last_charge).fromNow() }})</td>
|
||||
{% endif %}
|
||||
<td>{{ deploy.daysleft }}</td>
|
||||
{% if deploy.cancelled == True %}
|
||||
{% if deploy.deleted == True %}
|
||||
<td>-deleted-</td>
|
||||
{% else %}
|
||||
<td><button class="btn btn-default btn-danger" onclick="location.reload();location.href='/vmanager/vmremove/{{ deploy.machine_id }}'"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Delete</button></td>
|
||||
|
|
30
app/templates/errors/503.html
Normal file
30
app/templates/errors/503.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Forbidden{% endblock %}
|
||||
|
||||
{% block page_content %}
|
||||
<div class="page-header">
|
||||
<h1>Forbidden</h1>
|
||||
</div>
|
||||
<b>
|
||||
<pre>
|
||||
,-.
|
||||
/ \ `. __..-,O
|
||||
: \ --''_..-'.'
|
||||
| . .-' `. '.
|
||||
: . .`.'
|
||||
\ `. / ..
|
||||
\ `. ' .
|
||||
`, `. \
|
||||
,|,`. `-.\
|
||||
'.|| ``-...__..-`
|
||||
| |
|
||||
|__|
|
||||
/||\
|
||||
//||\\
|
||||
// || \\
|
||||
__//__||__\\__
|
||||
'--------------' SSt
|
||||
</pre>
|
||||
</b>
|
||||
|
|
@ -1,5 +1,30 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<link href="/static/css/simple-slideshow-styles.css" type="text/css" rel="stylesheet" media="screen">
|
||||
<style>
|
||||
body {
|
||||
background-image: url('/static/images/cloudsbg.jpeg');
|
||||
}
|
||||
|
||||
.panel-transparent {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-heading {
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-body{
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block page_content %}
|
||||
<h1>About us</h1>
|
||||
<center>
|
||||
|
@ -7,6 +32,27 @@
|
|||
<img src="../../static/images/datapoint.png" class="img-responsive"></img>
|
||||
</div>
|
||||
|
||||
<pre>
|
||||
,-.
|
||||
/ \ `. __..-,O
|
||||
: \ --''_..-'.'
|
||||
| . .-' `. '.
|
||||
: . .`.'
|
||||
\ `. / ..
|
||||
\ `. ' .
|
||||
`, `. \
|
||||
,|,`. `-.\
|
||||
'.|| ``-...__..-`
|
||||
| |
|
||||
|__|
|
||||
/||\
|
||||
//||\\
|
||||
// || \\
|
||||
__//__||__\\__
|
||||
'--------------' SSt
|
||||
</pre>
|
||||
|
||||
|
||||
<p style="text-align: left;"> datapoint.bg е проект на Новахостинг ЕООД който създадохме, за да предоставим на потребителите ново поколение изчислителни услуги. Стремим се да помагаме на неуверените и неопитни потребители в първата им среща с тях, като сме на линия за съвети отновно одимите услуги и инструменти, за да не влагате излишни средства в ресурси.</p>
|
||||
<h3 style="text-align: left;"> Историята</h3>
|
||||
<p style="text-align: left;"> Този сайт е естествено продължение на няколко лични проекта на двама ентусиасти, на едно пространство, използвано по много предназначения и наричано от нас просто “избата“. Там е мястото, където се затваряхме, за да свършим малко работа бързо и без никой да знае къде сме. От там са тръгнали много идеи, за да оживеят в сървърното помещение, което изградихме първоначално за собствена употреба. После пораснахме и дойдоха идеите, а след тях и клиентите ни. Както споменах естественото продължение на нещата беше да затворим цялостно процеса на работа и усъвършенствахме сървърното помещение, за да е пригодно за крайни клиенти. Докато се усетим имахме готово чисто ново сървърно помещение- мечта за всеки системен администратор. С мощни сървъри, гъвкава мрежова инфраструктура, резервирана свързаност с най- големите български интернет доставчици, резервирано захранване, климатични системи, температурен контрол, цялостен мониторинг и ново поколение охранителна система.</p>
|
||||
|
|
|
@ -2,6 +2,22 @@
|
|||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<style type="text/css">
|
||||
.panel-transparent {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-heading {
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-body{
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style type="text/css">
|
||||
.tg {border-collapse:collapse;border-spacing:0;}
|
||||
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:1px 1px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
|
||||
|
@ -125,7 +141,7 @@ addEventListener("DOMContentLoaded", function() {
|
|||
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="deployments">
|
||||
<div class="panel-heading">Deployments</div>
|
||||
<div class="panel-heading">Device Manager</div>
|
||||
<div class="panel-body"><p>
|
||||
|
||||
{% if inv_deployments != [] %}
|
||||
|
@ -286,7 +302,7 @@ addEventListener("DOMContentLoaded", function() {
|
|||
{% if inv_addresses != [] %}
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-info" id="addresses">
|
||||
<div class="panel-heading">Addresses</div>
|
||||
<div class="panel-heading">Communications</div>
|
||||
<div class="panel-body"><p>
|
||||
<div id="no-more-tables">
|
||||
<table class="table table-hover table-striped table-condensed cf">
|
||||
|
|
|
@ -46,7 +46,12 @@
|
|||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#newsmenu').load('https://www.datapoint.bg/news/latest');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#livesupport').load('https://www.datapoint.bg/kiwi/');
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
@ -75,6 +80,8 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="container-fluid-index">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
|
@ -82,15 +89,16 @@
|
|||
<div class="panel-body">
|
||||
<img src="../../static/images/VPS-equipment.png" width="128" height="128" />
|
||||
<h2 class="media-heading">Оборудване</h2>
|
||||
<p>Благодарение на внедрените нови технологии ние предлагаме изчислителна мощ, надеждно съхранение на данни и гъвкаво разпределение на ресурсите.</p>
|
||||
<p>Благодарение на внедрените нови технологии ние предлагаме изчислителна мощ, надеждно съхранение на данни и гъвкаво разпределение на ресурсите. Предвиждаме възможности нашата система да бъде неразделна част от текущата ви инфраструктура.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-primary panel-transparent">
|
||||
<div class="panel-body">
|
||||
<img src="../../static/images/VPS-Support.png" width="128" height="128" />
|
||||
<h2 class="media-heading">Бърз приятелски support</h2>
|
||||
<h2 class="media-heading">Поддръжка</h2>
|
||||
<p>Ще Ви помогнем във всички неприятни ситуации, по всяко време. Независимо от нивото на умения Ви. Ние сме винаги насреща за въпроси.</p>
|
||||
<a href="/chat"><button type="button" class="btn btn-success">Support</button></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -100,7 +108,7 @@
|
|||
<div class="panel-body">
|
||||
<img src="../../static/images/VPS-Mission.png" width="128" height="128" />
|
||||
<h2 class="media-heading">Мисия</h2>
|
||||
<p>Основната ни цел е безкомпромисно качество на услугите. Предлагаме цялостна поддръжка на вашите машини, включително тези които използвате във Вашият офис.</p>
|
||||
<p>Желанието ни е да предоставим елегантна платформа за управление на изчислителни процеси, която цели да бъде използваема от всеки, а не само от тесен кръг специалисти, без да се прави компромис със качеството и възможностите й.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -109,12 +117,23 @@
|
|||
<div class="panel-body">
|
||||
<img src="../../static/images/VPS-Security.png" width="128" height="128" />
|
||||
<h2 class="media-heading">Сигурност и надеждност</h2>
|
||||
<p>Разработваме система за контрол и наблюдение на Вашите изчислителни процеси в реално време, обезпечена от най-големите български доставчици на интернет свързаност.</p>
|
||||
<p>Системата включва контрол и наблюдение на Вашите процеси в реално време и е обезпечена от най-големите български доставчици на интернет свързаност.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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:480px;"></iframe>-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block footer %}
|
||||
|
|
|
@ -1,11 +1,43 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<style>
|
||||
body {
|
||||
background-image: url('/static/images/cloudsbg.jpeg');
|
||||
}
|
||||
|
||||
.panel-transparent {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-heading {
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-body{
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block page_content %}
|
||||
|
||||
<iframe src="https://kiwiirc.com/client/irc.datapoint.bg:+6697/?&theme=relaxed#support" style="border:0; width:100%; height:640px;"></iframe>
|
||||
<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:460px;"></iframe>
|
||||
To permanently stay connected to our chat network you could use an 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 %}
|
||||
|
||||
To permanently stay connected to our chat network you could use an client like <a href="https://hexchat.github.io/downloads.html">HexChan</a> and use the following URL <a href="irc://irc.datapoint.bg:+6697/#support">irc://irc.datapoint.bg:+6697/#support</a>
|
||||
|
||||
{% block footer %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,5 +1,30 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block styles %}
|
||||
{{ super() }}
|
||||
<link href="/static/css/simple-slideshow-styles.css" type="text/css" rel="stylesheet" media="screen">
|
||||
<style>
|
||||
body {
|
||||
background-image: url('/static/images/cloudsbg.jpeg');
|
||||
}
|
||||
|
||||
.panel-transparent {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-heading {
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
|
||||
.panel-transparent .panel-body{
|
||||
background: rgb(255, 255, 255); /* fallback */
|
||||
background: rgba(255, 255, 255, 0.7)!important;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block page_content %}
|
||||
<div class="row">
|
||||
|
||||
|
|
|
@ -35,8 +35,9 @@
|
|||
|
||||
<div class="col-md-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Настройки</div>
|
||||
<div class="panel-heading">Create Deployment</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<form method="POST" action="{{ url_for('vmanager.createvm') }}">
|
||||
<p>
|
||||
{{ form.servername.label }}<br />{{ form.servername(size=42) }}<br />
|
||||
|
|
|
@ -6,7 +6,7 @@ from . import vmanager
|
|||
from .forms import CreateForm, ActivateForm
|
||||
from .. import db
|
||||
from ..email import send_email
|
||||
from ..models import User, Permission, Transaction, Deployment, Service, Region, Address, Domain, contact_proxmaster
|
||||
from ..models import User, Permission, Transaction, Router, Deployment, Service, Region, Address, Domain, contact_proxmaster
|
||||
from ..decorators import admin_required, permission_required
|
||||
|
||||
import base64
|
||||
|
@ -34,7 +34,7 @@ def createvm():
|
|||
flash('Please update profile info for this operation.')
|
||||
return redirect(url_for('settings.profile'))
|
||||
|
||||
deployment_seeds = current_user.inv_deployments.filter_by(cancelled=False).filter_by(protected=False).all()
|
||||
deployment_seeds = current_user.inv_deployments.filter_by(deleted=False).filter_by(protected=False).all()
|
||||
if deployment_seeds != []:
|
||||
flash('Offline deployments still exist.')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
@ -42,29 +42,6 @@ def createvm():
|
|||
form = CreateForm()
|
||||
if current_user.confirmed and form.validate_on_submit():
|
||||
selected_region = Region.query.filter_by(pid=int(form.region.data)).first()
|
||||
###
|
||||
#flash('Region: {}'.format(str(selected_region.description)))
|
||||
#return redirect(url_for('main.dashboard'))
|
||||
|
||||
router = current_user.inv_routers.filter_by(cancelled=False).all()
|
||||
if router == []:
|
||||
#no router. creating...
|
||||
data = { 'clientid': str(current_user.pid),
|
||||
'clientemail': str(current_user.email),
|
||||
'hostname': 'c' + str(current_user.pid) + 'router',
|
||||
'region': str(selected_region.name),
|
||||
'type': 'kvm',
|
||||
'cpu': '1',
|
||||
'mem': '128',
|
||||
'hdd': '1'
|
||||
}
|
||||
try:
|
||||
query = contact_procmaster(data, 'vmcreate')
|
||||
except:
|
||||
flash('Region unreachable! Cannot create router. Please try again later...')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
#exit 0
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
data = { 'clientid': str(current_user.pid),
|
||||
'clientemail': str(current_user.email),
|
||||
|
@ -85,9 +62,9 @@ def createvm():
|
|||
deployment = Deployment(user_id=int(current_user.pid), machine_alias=query['hostname'], machine_id=query['cube'], machine_cpu=data['cpu'], machine_mem=data['mem'], machine_hdd=data['hdd'], enabled=True, protected=False, daysleft=15, warning=True, discount=0)
|
||||
db.session.add(deployment)
|
||||
db.session.commit()
|
||||
flash('Deploy created successfully in region "{}".'.format(str(selected_region.description)))
|
||||
flash('Machine created successfully in region "{}".'.format(str(selected_region.description)))
|
||||
else:
|
||||
flash('Deploy cancelled! Please try again later...')
|
||||
flash('Machine creation cancelled! Please try again later...')
|
||||
|
||||
return redirect(url_for('main.dashboard'))
|
||||
return render_template('vmanager/create.html', form=form)
|
||||
|
@ -98,22 +75,27 @@ def remove(itemid=0):
|
|||
data = {}
|
||||
deploy = Deployment.query.filter_by(machine_id=int(itemid)).first()
|
||||
if current_user.is_administrator():
|
||||
try:
|
||||
query = contact_proxmaster(data, 'vmremove', int(itemid))
|
||||
flash('Machine {} terminated'.format(itemid))
|
||||
deploy.cancelled = True
|
||||
deploy.enabled = False
|
||||
deploy.warning = False
|
||||
db.session.commit()
|
||||
except:
|
||||
flash('Cannot delete machine {}'.format(itemid))
|
||||
return redirect(url_for('admin.list_recyclebin'))
|
||||
if deploy.protected is not True:
|
||||
try:
|
||||
query = contact_proxmaster(data, 'vmremove', int(itemid))
|
||||
flash('Machine {} terminated'.format(itemid))
|
||||
deploy.deleted = True
|
||||
deploy.enabled = False
|
||||
deploy.warning = False
|
||||
db.session.commit()
|
||||
except:
|
||||
flash('Cannot delete machine {}'.format(itemid))
|
||||
return redirect(url_for('admin.list_recyclebin'))
|
||||
else:
|
||||
current_app.logger.warning('Deployment id:{} is protected! Cannot be removed'.format(itemid))
|
||||
else:
|
||||
current_app.logger.warning('[WARNING] Unauthorized attempt to remove Deployment id:{}'.format(itemid))
|
||||
abort(404)
|
||||
|
||||
@vmanager.route('/activate/<int:itemid>', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def activate(itemid=0):
|
||||
result = current_user.inv_deployments.filter_by(cancelled=False).all()
|
||||
result = current_user.inv_deployments.filter_by(deleted=False).all()
|
||||
inventory = []
|
||||
for invcls in result:
|
||||
inventory.extend([invcls.machine_id])
|
||||
|
@ -163,6 +145,10 @@ def activate(itemid=0):
|
|||
deploy.protected = True
|
||||
db.session.commit()
|
||||
|
||||
#router = current_user.inv_routers.filter_by(deleted=False).all()
|
||||
#if router == []:
|
||||
|
||||
|
||||
transaction = Transaction(user_id=int(owner.pid), description='Deployment {} activated for {} month(s)'.format(str(deploy.machine_alias), form.period.data), value=-total)
|
||||
db.session.add(transaction)
|
||||
db.session.commit()
|
||||
|
@ -210,23 +196,3 @@ def command(cmd=None, vmid=0):
|
|||
return redirect(db_result['url'])
|
||||
abort(404)
|
||||
|
||||
#APP STORE
|
||||
@vmanager.route('/market/<int:group_id>', methods=['GET'])
|
||||
@login_required
|
||||
def market(group_id=0):
|
||||
page = { 'title': 'Market' }
|
||||
allproducts = Product.get_products()
|
||||
allgroups = current_app.config['GROUPS']
|
||||
|
||||
if group_id == 0:
|
||||
return render_template('vmanager/market.html', groups=allgroups, products=allproducts)
|
||||
|
||||
filtered_products = {}
|
||||
for key, value in allproducts.items():
|
||||
if value['group'] == group_id:
|
||||
filtered_products[key] = value
|
||||
|
||||
if filtered_products == {}:
|
||||
abort(404)
|
||||
return render_template('vmanager/marketgroup.html', groupname=allgroups[group_id], products=filtered_products)
|
||||
|
||||
|
|
14
manage.py
14
manage.py
|
@ -41,7 +41,7 @@ def autoremove():
|
|||
from app.models import User, Deployment
|
||||
today = datetime.utcnow()
|
||||
print('\nScan for unprotected deployments, lower their days left by 1 and autodelete them if expired. Script Started at {}'.format(today))
|
||||
drafts = Deployment.query.filter_by(cancelled=False).filter_by(protected=False).all()
|
||||
drafts = Deployment.query.filter_by(deleted=False).filter_by(protected=False).all()
|
||||
for draft in drafts:
|
||||
daysleft = draft.daysleft
|
||||
daysleft -= 1
|
||||
|
@ -58,7 +58,7 @@ def autodisable():
|
|||
dep_c = 0
|
||||
srv_c = 0
|
||||
dom_c = 0
|
||||
deployments = Deployment.query.filter_by(cancelled=False).filter_by(enabled=True).filter_by(protected=True).all()
|
||||
deployments = Deployment.query.filter_by(deleted=False).filter_by(enabled=True).filter_by(protected=True).all()
|
||||
for deploy in deployments:
|
||||
#print('Found {}.'.format(str(deploy.machine_alias)))
|
||||
lastcharge = deploy.date_last_charge
|
||||
|
@ -71,7 +71,7 @@ def autodisable():
|
|||
db.session.commit()
|
||||
else:
|
||||
dep_c += 1
|
||||
services_ena = Service.query.filter_by(cancelled=False).filter_by(enabled=True).all()
|
||||
services_ena = Service.query.filter_by(deleted=False).filter_by(enabled=True).all()
|
||||
for service in services_ena:
|
||||
lastcharge = service.date_last_charge
|
||||
expiry = lastcharge + relativedelta(lastcharge, months=+(service.period))
|
||||
|
@ -83,7 +83,7 @@ def autodisable():
|
|||
db.session.commit()
|
||||
else:
|
||||
srv_c += 1
|
||||
domains_ena = Domain.query.filter_by(cancelled=False).filter_by(enabled=True).all()
|
||||
domains_ena = Domain.query.filter_by(deleted=False).filter_by(enabled=True).all()
|
||||
for domain in domains_ena:
|
||||
expiry = domain.date_expire
|
||||
if today > expiry:
|
||||
|
@ -101,7 +101,7 @@ def autowarn():
|
|||
from app.models import User, Deployment, Service, Domain, Transaction
|
||||
today = datetime.utcnow()
|
||||
print('\nScan for items that will expire soon and enable the warning flag. Script started at {}'.format(today))
|
||||
deployments_ena = Deployment.query.filter_by(cancelled=False).filter_by(enabled=True).filter_by(protected=True).all()
|
||||
deployments_ena = Deployment.query.filter_by(deleted=False).filter_by(enabled=True).filter_by(protected=True).all()
|
||||
for deploy in deployments_ena:
|
||||
lastcharge = deploy.date_last_charge
|
||||
expiry = lastcharge + relativedelta(lastcharge, months=+(deploy.period))
|
||||
|
@ -114,7 +114,7 @@ def autowarn():
|
|||
deploy.warning = True
|
||||
db.session.commit()
|
||||
|
||||
services_ena = Service.query.filter_by(cancelled=False).filter_by(enabled=True).all()
|
||||
services_ena = Service.query.filter_by(deleted=False).filter_by(enabled=True).all()
|
||||
for service in services_ena:
|
||||
lastcharge = service.date_last_charge
|
||||
expiry = lastcharge + relativedelta(lastcharge, months=+(service.period))
|
||||
|
@ -127,7 +127,7 @@ def autowarn():
|
|||
service.warning = True
|
||||
db.session.commit()
|
||||
|
||||
domains_ena = Domain.query.filter_by(cancelled=False).filter_by(enabled=True).all()
|
||||
domains_ena = Domain.query.filter_by(deleted=False).filter_by(enabled=True).all()
|
||||
for domain in domains_ena:
|
||||
expiry = domain.date_expire
|
||||
daysleft = expiry - today
|
||||
|
|
Loading…
Reference in a new issue