console/app/cloud/views/api/__init__.py
2015-12-01 02:43:10 +03:00

134 lines
4.5 KiB
Python

# coding: utf-8
# import json
import uuid
from datetime import datetime
from datetime import timedelta
from flask import jsonify
from flask import render_template
from flask import session
from flask import redirect
from flask import url_for
from flask import request
from flask import Blueprint
from cloudnsru import CloudnsClient
from app import models
from app.settings import settings
# from app.cloud.controllers import common
from app.cloud.controllers.users import ControllerUsers
viewAPI = Blueprint('api', __name__, url_prefix='/api')
@viewAPI.route('/rule', methods=['GET', 'POST', 'PUT', 'DELETE'])
def rule():
# init errors
errors = {"total": 0, "items": []}
if request.method == "POST":
# check user balance
if models.UsersBalance.select().where(models.UsersBalance.user == session['user_id']).count() == 0:
models.UsersBalance.create(user=session['user_id'])
if errors['total'] == 0:
rule_id = uuid.uuid4()
user_id = session['user_id']
backend = request.form['backend']
alias = request.form['alias']
# create a new record
# status 4 - creating
models.Rules.create(id=rule_id, user=user_id, status=4, source=backend, alias=alias)
# check
if models.Rules.select().where(models.Rules.id == rule_id).count() == 0:
errors['items'].append("Fail")
errors['total'] += 1
# api request to cloudns.ru to add a new record
email = settings.get('cloudns.ru', 'email')
secret = settings.get('cloudns.ru', 'secret')
domain = settings.get('cloudns.ru', 'domain')
destination = settings.get('cloudns.ru', 'host_roundrobin')
c = CloudnsClient(email, secret)
c.domain_record_add(domain, '%s.%s' % (rule_id, domain), "CNAME", destination)
if request.method == 'PUT':
return None
if request.method == 'GET':
return None
if request.method == 'DELETE':
# check user have a selected rule
if models.Rules.select().where(models.Rules.user == session['user_id']).count() == 0:
return jsonify(status=2, message='rule not exists')
# api request to cloudns.ru to delete record
dns_email = settings.get('cloudns.ru', 'email')
dns_secret = settings.get('cloudns.ru', 'secret')
domain = settings.get('cloudns.ru', 'domain')
c = CloudnsClient(dns_email, dns_secret)
c.domain_record_delete_by_host(domain, '%s.%s' % (rule_id, domain), "CNAME")
x = models.Rules.get(models.Rules.id == rule_id, models.Rules.user == session['user_id'])
x.status = 5
x.save()
return jsonify(status=0, message='ok')
@viewAPI.route('/stats/<uuid:rule_id>')
def stats(rule_id):
# auth user
if not ControllerUsers().auth(session['email'], session['password']):
return redirect(url_for("app_id_logout"))
rules = ControllerRules(session['user_id'])
# check the user have a selected rule
# if user not have a container then redirect to the container list
if not rules.check_exists_item(rule_id):
return redirect(url_for('rules.index'))
rules_statistics = ControllerRulesStatistics(rule_id)
errors = {'total': 0, 'items': []}
stats_string = {'requests': '', 'traffic': ''}
last_days = datetime.today() - timedelta(days=30)
# get rule details
rule_details = rules.get_item(rule_id)
stats_string['traffic'] = rules_statistics.traffic_total_get(last_days)
stats_string['requests'] = rules_statistics.requests_total_get(last_days)
traffic_by_country = rules_statistics.traffic_by_country_get(last_days)
if stats_string['traffic'] > 0:
stats_string['cost'] = 0
elif stats_string['traffic'] > 50:
stats_string['cost'] = 4
elif stats_string['traffic'] > 1000:
stats_string['cost'] = 3
elif stats_string['traffic'] > 2000:
stats_string['cost'] = 2.7
elif stats_string['traffic'] > 3000:
stats_string['cost'] = 2.6
elif stats_string['traffic'] > 4000:
stats_string['cost'] = 2.5
elif stats_string['traffic'] > 5000:
stats_string['cost'] = 2.4
# for data_item in data:
# print data_item.timestamp, data_item.body_bytes_sent
return render_template('rules/stats.twig',
rule=rule_details,
stats_string=stats_string,
traffic_by_country=traffic_by_country,
errors=errors)