# 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/') 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)