134 lines
4.5 KiB
Python
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)
|