Advertisement
Guest User

Untitled

a guest
Aug 10th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 31.06 KB | None | 0 0
  1. # -*- coding: utf8 -*-
  2. # Create your views here.
  3. from django.http import HttpResponse
  4. import datetime, time
  5. import cherry.db
  6. import json
  7. from loki.conf.path_config import path_to_reports_by_traffic_by_money
  8. from django.views.decorators.csrf import csrf_exempt
  9. from loki.apps.inet.models import NetflowReportQueue, SessionDisconnectQueue
  10. import hashlib
  11. from loki.daemons.netflow_reportd import NetflowReport
  12. import os
  13. from django.db import connections
  14.  
  15. path_to_reports = path_to_reports_by_traffic_by_money
  16.  
  17. def kill_sessions_by_id(id):
  18.     """
  19.    Убить сессию вручную по идентификатору.
  20.    """
  21.     try:
  22.         s = SessionDisconnectQueue()
  23.         s.session = id
  24.         s.processed_datetime = None
  25.         s.disconnect_reason = 5
  26.         s.save()
  27.         return 0
  28.     except Exception, e:
  29.         return None
  30.  
  31.  
  32. def connect_to_cherry():
  33.     """
  34.    Возвращает курсор на БД
  35.    """
  36.     return cherry.db.INFERNO_CHERRY().cursor()
  37.  
  38. def hev(a):
  39.     """
  40.    Функция Хевисайда
  41.    """
  42.     if a >0:
  43.         return a
  44.     else:
  45.         return 0
  46.  
  47. def overhead(a,b):
  48.  
  49.     """
  50.    Функция оверхеда
  51.    """
  52.  
  53.     if a>b:
  54.         return 0
  55.     else:
  56.         return a
  57.  
  58. class Response(object):
  59.  
  60.     """
  61.    Класс универсального ответа в JSON
  62.    """
  63.     def __init__(self, error, error_str, data):
  64.         self.error = error
  65.         self.error_str = error_str
  66.         self.data = data
  67.  
  68.     def serialize(self):
  69.         return json.dumps(self.__dict__, sort_keys=True, indent=4)
  70.  
  71.     def __str__(self):
  72.         return self.serialize()
  73.  
  74. @csrf_exempt
  75. def check_password(request):
  76.  
  77.     """
  78.    Проверка пароля для client_id. На входе клинт_ид и пароль.
  79.    """
  80.  
  81.     if request.method == 'POST':
  82.         client_id = request.POST.get('client_id')
  83.         password = request.POST.get('password')
  84.  
  85.         if client_id is None or client_id == '':
  86.             return HttpResponse(Response('-1', 'client_id is None', []))
  87.         if password is None or password == '':
  88.             return HttpResponse(Response('-1', 'password is None', []))
  89.         try:
  90.             curr = connect_to_cherry()
  91.         except Exception, e:
  92.             return HttpResponse(Response('-1', 'Database is dead becouse: %s' % e, []))
  93.  
  94.         curr.execute("""SELECT client_id, password
  95.                        FROM base_clients
  96.                        WHERE client_id = %s
  97.                        AND password = %s
  98.                        AND client_type in ('person', 'profit_org', 'non_profit_org')""",
  99.                     (client_id, password))
  100.         rows = curr.fetchall()
  101.         curr.close()
  102.  
  103.         if len(rows) > 0:
  104.             return HttpResponse(Response('0', 'Password is correct', rows))
  105.         else:
  106.             return HttpResponse(Response('-1', 'Password or client_id is incorrect', rows))
  107.  
  108.     elif request.method == 'GET':
  109.         return HttpResponse('This is secure branch.')
  110.  
  111.  
  112. @csrf_exempt
  113. def get_services(request):
  114.  
  115.     """
  116.    Получение списка услуг привязанных к client_id. Только inet_static_ip.
  117.    """
  118.     if request.method == 'POST':
  119.         client_id = request.POST.get('client_id')
  120.         if client_id is None or client_id == '':
  121.             return HttpResponse(Response('-1', 'client_id is None', []))
  122.  
  123.         try:
  124.             curr = connect_to_cherry()
  125.         except Exception, e:
  126.             return HttpResponse(Response('-1', 'Database is dead becouse: %s' % e, []))
  127.  
  128.         curr.execute("""SELECT s.id,
  129.                            CASE WHEN s.user_id ~ 'ip_grp'
  130.                            THEN (select textcat_all(gi.ip || ', ')
  131.                        FROM inet_fixed_ip_group_items as gi
  132.                        WHERE gi.ip_group = user_id)
  133.                            ELSE s.user_id END,
  134.                        s.date_create, s.date_expire, tp.descr
  135.                        FROM inet_fixed_ip_services as s
  136.                        LEFT JOIN inet_fixed_ip_tariff_plans as tp
  137.                        ON (s.tariff_plan = tp.tariff_plan and s.oper_id = tp.oper_id)
  138.                        WHERE client_id = %s """, (client_id,))
  139.         rows = curr.fetchall()
  140.         curr.close()
  141.         res = {}
  142.         if len(rows) > 0:
  143.             ans = []
  144.             for row in rows:
  145.                 tmp = []
  146.                 for r in row:
  147.                     if type(r) == type(u''):
  148.                         r = r.encode('utf-8').strip()
  149.                     if type(r) == type(datetime.datetime.today()):
  150.                         r = str(r).strip()
  151.                     if type(r) == type(123):
  152.                         r = str(r).strip()
  153.                     tmp.append(r)
  154.                 tmp.append('inet_static_ip')
  155.                 tmp = dict(zip(['service_id', 'ips', 'date_start', 'date_end', 'tariff_plan_name', 'type'], tmp))
  156.                 ans.append(tmp)
  157.             res = ans
  158.             return HttpResponse(Response('0', 'Ok', res))
  159.         else:
  160.             return HttpResponse(Response('-1', 'There is no inet_static_ip services.', []))
  161.     elif request.method == 'GET':
  162.         return HttpResponse('This is secure branch.')
  163.  
  164. @csrf_exempt
  165. def get_netflow_report(request):
  166.  
  167.     """
  168.    Добавление запроса на отчет по Netflow в очередь.
  169.  
  170.    Если всё хорошо, вернет «All correct: job is added.»
  171.    """
  172.  
  173.     if request.method == 'POST':
  174.         date_from = request.POST.get('date_start')
  175.         date_to = request.POST.get('date_end')
  176.         ips = request.POST.get('ips')
  177.         in_out = request.POST.get('in_out')
  178.         email = request.POST.get('email')
  179.         login = request.POST.get('login')
  180.         internal = request.POST.get('internal')
  181.         if date_from is None or date_from == '':
  182.             return HttpResponse(Response('-1', 'date_start is None', []))
  183.         if date_to is None or date_to == '':
  184.             return HttpResponse(Response('-1', 'date_end is None', []))
  185.         if ips is None or ips == '' or ips == 'None':
  186.             return HttpResponse(Response('-1', 'ips is None', []))
  187.         if in_out is None or in_out == '':
  188.             return HttpResponse(Response('-1', 'in_out is None', []))
  189.         if email is None or email == '':
  190.             return HttpResponse(Response('-1', 'email is None', []))
  191.         if login is None or login == '':
  192.             return HttpResponse(Response('-1', 'login is None', []))
  193.         try:
  194.             date_from = datetime.datetime.fromtimestamp(time.mktime(time.strptime(date_from, "%Y-%m-%d %H:%M:%S")))
  195.         except Exception, e:
  196.             return HttpResponse(Response('-1', 'date_start is not valid: %s'%e, []))
  197.         try:
  198.             date_to = datetime.datetime.fromtimestamp(time.mktime(time.strptime(date_to, "%Y-%m-%d %H:%M:%S")))
  199.         except Exception, e:
  200.             return HttpResponse(Response('-1', 'date_end is not valid: %s'%e, []))
  201.  
  202.         if date_to < date_from:
  203.             return HttpResponse(Response('-1', 'date_end should be > date_start.', []))
  204.  
  205.         if in_out == 'None':
  206.             in_out = None
  207.         elif in_out == 'False':
  208.             in_out = False
  209.         elif in_out == 'True':
  210.             in_out = True
  211.         else:
  212.             return HttpResponse(Response('-1', 'in_out should be True, False or None', []))
  213.         try:
  214.             report = NetflowReportQueue()
  215.             report.date_from = date_from
  216.             report.date_to = date_to
  217.             report.ip = str(ips)
  218.             report.in_out = in_out
  219.             report.email = email
  220.             report.login = login
  221.             report.md5sum = hashlib.md5(str(date_from)+str(date_to)+str(login)+str(ips)+str(in_out)).hexdigest()
  222.             report.insert_date = datetime.datetime.today()
  223.             report.internal = True
  224.             report.save()
  225.         except Exception, e:
  226.             return HttpResponse(Response('-1', e, []))
  227.  
  228.         return HttpResponse(Response('0', 'All correct: job is added.', []))
  229.  
  230.     elif request.method == 'GET':
  231.         return HttpResponse('This is secure branch.')
  232.  
  233. @csrf_exempt
  234. def get_traffic_report_by_money(request):
  235.     try:
  236.         return get_traffic_report_by_money_real(request)
  237.     except:
  238.         import traceback
  239.         exc = traceback.format_exc()
  240.         return HttpResponse( str(exc) )
  241.  
  242. def get_traffic_report_by_money_real(request):
  243.  
  244.     """
  245.    Это ёбаный мрак :( без острой необходимости, читать не советуется.
  246.    Запрос на отчет по трафику по деньгам.
  247.  
  248.    Вьюху можно дергать несколько раз, как только отчет будет готов, она вернет его.
  249.    """
  250.     if request.method == 'GET':
  251.         try:
  252.             date_start = request.GET.get('date_start').strip()
  253.             date_end = request.GET.get('date_end').strip()
  254.             login = request.GET.get('login').strip()
  255.         except Exception, e:
  256.             return HttpResponse(Response('-1', str(e), []))
  257.            
  258.     if request.method == 'POST':
  259.         date_start = request.POST.get('date_start').strip()
  260.         date_end = request.POST.get('date_end').strip()
  261.         login = request.POST.get('login').strip()
  262.         client_id = request.POST.get('client_id').strip()
  263.  
  264.     try:
  265.         datetime.datetime.strptime(date_start, "%Y-%m-%d %H:%M:%S")
  266.         datetime.datetime.strptime(date_end, "%Y-%m-%d %H:%M:%S")
  267.     except Exception, e:
  268.         return HttpResponse(Response('-1', str(e), []))
  269.                          
  270.     user_id = (login,)
  271.  
  272.     try:
  273.         cursor = connect_to_cherry()
  274.     except Exception, e:
  275.         return HttpResponse(Response('-1', 'Database Cherry is dead becouse: %s' % e, []))
  276.    
  277.     if request.method == 'POST':
  278.         try:
  279.             cursor.execute("""SELECT
  280.                        CASE WHEN s.user_id ~ 'ip_grp'
  281.                            THEN (select textcat_all(gi.ip || ', ')
  282.                        FROM inet_fixed_ip_group_items as gi
  283.                        WHERE gi.ip_group = user_id)
  284.                            ELSE s.user_id END
  285.                        FROM inet_fixed_ip_services as s
  286.                        LEFT JOIN inet_fixed_ip_tariff_plans as tp
  287.                        ON (s.tariff_plan = tp.tariff_plan and s.oper_id = tp.oper_id)
  288.                        WHERE client_id IN %s""", (tuple(client_id.split(',')),) )
  289.             rows = cursor.fetchall()
  290.             s = 0
  291.             for row in rows:
  292.                 rw = str(row[0]).split(',')
  293.                 for r in rw:
  294.                     if login.lower().strip() == r.lower().strip():
  295.                         s = 1
  296.                         break
  297.             if s == 0:
  298.                 return HttpResponse(Response('-1', 'Login is not for you!',[]))
  299.         except Exception, e:
  300.             return HttpResponse(Response('-1', 'Query fail: %s' % e, []))
  301.  
  302.     filename = hashlib.sha224(date_start+date_end+str(user_id)).hexdigest() + '.csv'
  303.  
  304.     if not os.path.exists(os.path.join(path_to_reports,filename)) and not os.path.exists(os.path.join(path_to_reports,filename+'.lock')):
  305.  
  306.         o = open(os.path.join(path_to_reports, filename), 'wr+')
  307.         lockfile = open(os.path.join(path_to_reports,filename+'.lock'), 'wr+')
  308.         lockfile.close()
  309.  
  310.         ie_global = il_global = oe_global = 0
  311.  
  312.         try:
  313.             loki_cursor = connections['default'].cursor()
  314.         except Exception, e:
  315.             return HttpResponse(Response('-1', 'Database Loki is dead becouse: %s' % e, []))
  316.  
  317.         if request.method == 'GET':
  318.             print>>o, ';'.join(['Дата/время сессии', 'Логин', 'Ресурс', 'Тип трафика', 'Сумма в рублях'])
  319.                          
  320.         cursor.execute("""SELECT session_id, session_type, session_begin, session_long, user_id, resource, tariff_zone, amount
  321.                          FROM base_sessions_view
  322.                          WHERE user_id IN %s
  323.                          AND session_begin >= %s AND session_begin_calc >= %s
  324.                          AND session_begin < %s AND session_begin_calc < %s
  325.                          AND session_id ~'lk_' order by 3;""", (user_id, date_start, date_start, date_end, date_end))
  326.         rows = cursor.fetchall()
  327.         for row in rows:
  328.             service = row[0].split('_')
  329.             if row[0].find('lk_s_du') > -1:
  330.                 loki_cursor.execute("""select tariff_id from inet_inetsessionlog where id = %s;""", (service[-1],))
  331.                 tariff_id = str(loki_cursor.fetchall()[0][0])
  332.             else:
  333.                 if row[1] == 'inet_dynamic_ip':
  334.                     cursor.execute('select tariff_plan from inet_dynamic_ip_services where id = %s', (service[-1],))
  335.                     tariff = str(cursor.fetchall()[0][0])
  336.                 elif row[1] == 'inet_fixed_ip':
  337.                     if row[0].split('_')[-1].find('.') == -1:
  338.                         cursor.execute('select tariff_plan from inet_fixed_ip_services where id = %s', (service[-1],))
  339.                     else:
  340.                         cursor.execute('select tariff_plan from inet_fixed_ip_services where id = %s', (service[-2],))
  341.                     tariff = str(cursor.fetchall()[0][0])
  342.                 loki_cursor.execute("select tariff_ptr_id from inet_inettariff where cherry_id = %s", (tariff,))
  343.                 tariff_id = str(loki_cursor.fetchall()[0][0])
  344.             loki_cursor.execute("select * from inet_inettariff where tariff_ptr_id = %s", (tariff_id,))
  345.             tariff = loki_cursor.fetchall()[0]
  346.             tariff = dict(zip(('tariff_ptr_id', 'price_per_unit', 'is_dynamic', 'cherry_id', 'ie_price_first', 'ie_price_second', 'ie_price_switch', 'oe_price_first', 'oe_price_second', 'oe_price_switch', 'il_price_first', 'il_price_second', 'il_price_switch', 'ol_price_first', 'ol_price_second', 'ol_price_switch'), tariff))
  347.             if row[0].find('lk_s_du') > -1 or row[0].find('lk_s_su') > -1:
  348.                 price = ''
  349.                 if row[6] == 'incoming_external':
  350.                     if tariff['ie_price_second'] == 0:
  351.                         price = row[5] * tariff['ie_price_first'] / 102400
  352.                     elif ie_global > tariff['ie_price_switch']:
  353.                         price = row[5] * tariff['ie_price_second'] / 102400
  354.                     else:
  355.                         price = overhead(tariff['ie_price_switch']-ie_global,tariff['ie_price_switch'])*tariff['ie_price_first'] / 102400 + hev((row[5]+ie_global-tariff['ie_price_switch']))*tariff['ie_price_second'] / 102400
  356.                     ie_global += row[5]
  357.                     unit = 'kb'
  358.                     if tariff['price_per_unit'] == 1:
  359.                         price = price /1024
  360.                         unit = 'mb'
  361.                     if tariff['price_per_unit'] == 2:
  362.                         price = price /1024/1024
  363.                         unit = 'gb'
  364.                     if tariff['price_per_unit'] == 3:
  365.                         price = price /1024/1024/1024
  366.                         unit = 'tb'
  367.                 if row[6] == 'internal':
  368.                     if tariff['il_price_second'] == 0:
  369.                         price = row[5] * tariff['il_price_first'] / 102400
  370.                     elif il_global > tariff['il_price_switch']:
  371.                         price = row[5] * tariff['il_price_second'] / 102400
  372.                     else:
  373.                         price = overhead(tariff['il_price_switch']-il_global,tariff['il_price_switch'])*tariff['il_price_first'] / 102400 + hev((row[5]+il_global-tariff['il_price_switch']))*tariff['il_price_second'] / 102400
  374.                     il_global += row[5]
  375.                     unit = 'kb'
  376.                     if tariff['price_per_unit'] == 1:
  377.                         price = price /1024
  378.                         unit = 'mb'
  379.                     if tariff['price_per_unit'] == 2:
  380.                         price = price /1024/1024
  381.                         unit = 'gb'
  382.                     if tariff['price_per_unit'] == 3:
  383.                         price = price /1024/1024/1024
  384.                         unit = 'tb'
  385.                 if row[6] == 'outgoing_any':
  386.                     if tariff['oe_price_second'] == 0:
  387.                         price = row[5] * tariff['oe_price_first'] / 102400
  388.                     elif oe_global > tariff['oe_price_switch']:
  389.                         price = row[5] * tariff['oe_price_second'] / 102400
  390.                     else:
  391.                         price = overhead(tariff['oe_price_switch']-oe_global,tariff['oe_price_switch'])*tariff['oe_price_first'] / 102400 + hev((row[5]+oe_global-tariff['oe_price_switch']))*tariff['oe_price_second'] / 102400
  392.                     oe_global += row[5]
  393.                     unit = 'kb'
  394.                     if tariff['price_per_unit'] == 1:
  395.                         price = price /1024
  396.                         unit = 'mb'
  397.                     if tariff['price_per_unit'] == 2:
  398.                         price = price /1024/1024
  399.                         unit = 'gb'
  400.                     if tariff['price_per_unit'] == 3:
  401.                         price = price /1024/1024/1024
  402.                         unit = 'tb'
  403.                 price = str(price).replace('.',',')
  404.                 if login in row[0]:
  405.                     print>>o, (str(row[2]) + ';' + row[4] + ';' + str(row[5]).replace('.000000', '').replace('.', ',') + ';' + row[6] + ';' + str(price)).decode('utf-8').replace(u'incoming_external', u'Входящий внешний').replace(u'internal', u'Внутренний').replace(u'outgoing_any',u'Исходящий внешний').encode('utf-8')
  406.                 else:
  407.                     print>>o, (str(row[2]) + ';' + row[4] + ';' + str(row[5]).replace('.000000', '').replace('.', ',') + ';' + row[6] + ';' + str(price)).decode('utf-8').replace(u'incoming_external', u'Входящий внешний').replace(u'internal', u'Внутренний').replace(u'outgoing_any',u'Исходящий внешний').replace(date_start,u'Суммарно').encode('utf-8')
  408.             else:
  409.                 price = str(row[7]).replace('.',',')
  410.                 if login in row[0]:
  411.                     print>>o, (str(row[2]) + ';' + row[4] + ';' + str(row[5]).replace('.000000', '').replace('.', ',') + ';' + row[6] + ';' + str(price)).decode('utf-8').replace(u'incoming_external', u'Входящий внешний').replace(u'internal', u'Внутренний').replace(u'outgoing_any',u'Исходящий внешний').encode('utf-8')
  412.                 else:
  413.                     print>>o, (str(row[2]) + ';' + row[4] + ';' + str(row[5]).replace('.000000', '').replace('.', ',') + ';' + row[6] + ';' + str(price)).decode('utf-8').replace(u'incoming_external', u'Входящий внешний').replace(u'internal', u'Внутренний').replace(u'outgoing_any',u'Исходящий внешний').replace(date_start,u'Суммарно').encode('utf-8')
  414.  
  415.         cursor.close()
  416.  
  417.         loki_cursor.close()
  418.         o.close()
  419.         os.remove(os.path.join(path_to_reports,filename+'.lock'))
  420.         if request.method == 'POST':
  421.             s = open(os.path.join(path_to_reports,filename), 'r+').readlines()
  422.             resp = Response('0', 'Report in JSON', [dict(zip(['date', 'login', 'resource', 'type', 'amount'],x.replace('\n','').split(';'))) for x in s])
  423.             return HttpResponse(resp)
  424.         elif request.method == 'GET':
  425.             response = HttpResponse(open(os.path.join(path_to_reports, filename), 'rb'), mimetype='application/vnd.ms-excel')
  426.             response['Content-Disposition'] = 'attachment; filename=%s' % filename + '.csv'
  427.             response['Cache-Control'] = 'no-cache'
  428.             return response
  429.  
  430.     elif os.path.exists(filename+'.lock'):
  431.         return HttpResponse(Response('1', 'Report is generating', []))
  432.        
  433.     elif not os.path.exists(filename+'.lock'):
  434.         if request.method == 'POST':
  435.             s = open(os.path.join(path_to_reports,filename), 'r+').readlines()
  436.             resp = Response('0', 'Report in JSON', [dict(zip(['date', 'login', 'resource', 'type', 'amount'],x.replace('\n','').split(';'))) for x in s])
  437.             return HttpResponse(resp)
  438.         elif request.method == 'GET':
  439.             response = HttpResponse(open(os.path.join(path_to_reports,filename), 'rb'), mimetype='application/vnd.ms-excel')
  440.             response['Content-Disposition'] = 'attachment; filename=%s' % filename + '.csv'
  441.             response['Cache-Control'] = 'no-cache'
  442.             return response
  443.  
  444.  
  445. ################################################################################
  446. #    Функционал для тарифов
  447. ################################################################################
  448.  
  449. from models import InetSessionAcceptedTest, InetSessionRejectedTest, InetSessionActiveTest, InetTariff
  450.  
  451. from django.http import HttpResponseRedirect #, HttpResponse
  452. from django.shortcuts import render_to_response
  453. from django.core.urlresolvers import reverse
  454. from django.contrib.auth.decorators import login_required
  455. from django.template import RequestContext
  456. from django.core.paginator import Paginator, InvalidPage, EmptyPage
  457. from forms import CreateTarifForm
  458. from common.utils import pagination_process, search_process
  459.  
  460. @login_required
  461. def create_tarif(request, id=''):
  462.     ctx = RequestContext(request)
  463.     ctx['form'] = CreateTarifForm()
  464.     ctx['mode'] = 'Создать'
  465.     obj = None
  466.  
  467.     try:
  468.         obj = InetTariff.objects.get(id=int(id))
  469.         ctx['form'] = CreateTarifForm(instance=obj)
  470.         ctx['mode'] = 'Редактировать'
  471.         ctx['id'] = id
  472.     except:
  473.         ctx['form'] = CreateTarifForm()
  474.  
  475.     if request.method == 'POST':
  476.         ctx['form'] = CreateTarifForm(request.POST, instance=obj)
  477.         if ctx['form'].is_valid():
  478.             try:
  479.                 ctx['form'].save()
  480.                 return HttpResponseRedirect( reverse('_tarif_list') )
  481.             except:
  482.                 #import traceback
  483.                 #exc = traceback.format_exc()
  484.                 #return HttpResponse( str(exc) )
  485.                 ctx['errors'] = 'Невозможно создать тариф. Ошибка модели.'
  486.  
  487.         else:
  488.             ctx['errors'] = 'Невозможно создать тариф. Ошибка валидации. Корректно заполните поля.'
  489.  
  490.     return render_to_response('inet/create_tarif.html', context_instance = ctx)
  491.  
  492.  
  493.  
  494. @login_required
  495. def tarif_list(request):
  496.     ctx = RequestContext(request)
  497.  
  498.     search_process(ctx, InetTariff, request, 'name', 'inet.models.InetTariff')
  499.     pagination_process(ctx, request)
  500.  
  501.     return render_to_response('inet/tarif_list.html', context_instance = ctx)
  502.  
  503.  
  504.  
  505. def delete_tarif(request, id):
  506.     ctx = RequestContext(request)
  507.     try:
  508.         o = InetTariff.objects.get(pk=int(id))
  509.         o.delete()
  510.     except:
  511.         ctx['errors'] = 'Не удалось удалить тариф!'
  512.     return HttpResponseRedirect( reverse('_tarif_list') )
  513.  
  514.  
  515.  
  516. ################################################################################
  517. #    Функционал для мониторинга подключений
  518. ################################################################################
  519.  
  520. from django.db.models import Q
  521. from django.utils import simplejson as json
  522. from forms import AuthRequestParamsForm
  523.  
  524. TIMEDELTA = {
  525.     '1': datetime.timedelta(seconds=60),
  526.     '2': datetime.timedelta(seconds=300),
  527.     '3': datetime.timedelta(seconds=600),
  528.     '4': datetime.timedelta(seconds=900),
  529.     '5': datetime.timedelta(seconds=1800)
  530. }
  531.  
  532. def auth_obj_sort(a, b):
  533.     if a.time < b.time:
  534.         return 1
  535.     if a.time > b.time:
  536.         return -1
  537.  
  538. @login_required
  539. def monitoring_default(request):
  540.     ctx = RequestContext(request)
  541.     params = None
  542.     filters = Q()
  543.     top = 100
  544.     min = datetime.datetime.now()
  545.     #min = datetime.datetime.now() - datetime.timedelta(days=60)
  546.  
  547.     if request.method == 'POST':
  548.         if request.POST.get('reset', False):
  549.             params = None
  550.         else:
  551.             params = request.POST
  552.             username = params.get('username', False)
  553.             limit = params.get('limit', False)
  554.             if username:
  555.                 filters = filters & Q(login=username)
  556.             if limit:
  557.                 min = datetime.datetime.now() - TIMEDELTA.get(limit, datetime.timedelta(0))
  558.     filters = filters & Q(time__gt=min)
  559.     ctx['auth_obj'] = list(InetSessionAcceptedTest.objects.all().filter(filters))
  560.     ctx['auth_obj'] += list(InetSessionRejectedTest.objects.all().filter(filters))
  561.     ctx['auth_obj'].sort(auth_obj_sort)
  562.     #ctx['auth_obj'] = ctx['auth_obj'][:top]
  563.     ctx['form'] = AuthRequestParamsForm(params)
  564.     #ctx['timestamp'] = int(time.time())
  565.     ctx['timestamp'] = time.time()
  566.     return render_to_response('inet/connection_monitoring.html', context_instance = ctx)
  567.  
  568.  
  569.  
  570. @login_required
  571. def monitoring_get_new_connections(request):
  572.     response = HttpResponse()
  573.     response['Content-type'] = 'text/javascript; charset=utf-8'
  574.  
  575.     top = 200
  576.     username = request.GET.get('username', False)
  577.     #limit = request.GET.get('limit', False)
  578.     try:
  579.         timestamp = float(request.GET.get('timestamp'))
  580.     except:
  581.         timestamp = False
  582.  
  583.     if not timestamp:
  584.         response.write(json.dumps({u'message': u'Ошибка входных данных', u'code': 1, u'newtimestamp': time.time()}))
  585.         return response
  586.     filters = Q(time__gt=datetime.datetime.fromtimestamp(timestamp))
  587.     #filters = Q(time__gt=(datetime.datetime.now() - datetime.timedelta(days=100)))
  588.     if username:
  589.         filters = filters & Q(login=username)
  590.     items = list(InetSessionRejectedTest.objects.all().filter(filters))
  591.     items += list(InetSessionAcceptedTest.objects.all().filter(filters))
  592.     obj = {u'items':[], u'newtimestamp': timestamp, u'message': u'Успешный запрос', u'code': 0}
  593.  
  594.     if len(items) < 1:
  595.         obj['message'] = u'Нет данных по запросу.'
  596.         obj['code'] = 3
  597.         response.write(json.dumps(obj))
  598.         return response
  599.     if len(items) > top:
  600.         obj['message'] = u'Слишком много объектов! Уменьшите диапазон!'
  601.         obj['code'] = 2
  602.         obj['newtimestamp'] = time.time()
  603.         response.write(json.dumps(obj))
  604.         return response
  605.     items.sort(auth_obj_sort)
  606.     #items = items[:top]
  607.     newtimestamp = 0.0
  608.     for item in items:
  609.         if item.time > datetime.datetime.fromtimestamp(newtimestamp):
  610.             newtimestamp = time.mktime(item.time.timetuple())
  611.         auth_type = item.get_inet_session_auth_type()
  612.         tmp = {}
  613.         tmp['time'] = item.time.strftime('%d %b %Y %H:%M:%S')
  614.         tmp['login'] = unicode(item.login)
  615.         tmp['auth_type'] = unicode(auth_type)
  616.         tmp['nas'] = unicode(item.nas)
  617.         tmp['mac'] = unicode(item.mac)
  618.         #tmp['service'] = unicode(item.service)
  619.         try:
  620.             tmp['tariff'] = unicode(item.tariff)
  621.             tmp['speed_profile'] = unicode(item.speed_profile)
  622.             tmp['processed_by_snmp_checker'] = unicode(item.processed_by_snmp_checker)
  623.         except:
  624.             pass
  625.         try:
  626.             tmp['reason'] = unicode(item.get_inet_session_reject_reason())
  627.         except:
  628.             pass
  629.         obj['items'].append(tmp.copy())
  630.     obj['newtimestamp'] = newtimestamp
  631.     response.write(json.dumps(obj))
  632.     return response
  633.  
  634.  
  635.  
  636. ################################################################################
  637. #    Функционал для активных сессий
  638. ################################################################################
  639.  
  640. @login_required
  641. def active_sessions_list(request):
  642.     ctx = RequestContext(request)
  643.     ctx['data'] = InetSessionActiveTest.objects.values(
  644.         'login', 'ip', 'mac', 'virtual_time_start', 'last_alive', 'id'
  645.     ).order_by('-time_start')
  646.     return render_to_response('inet/active_sessions_list.html', context_instance = ctx)
  647.  
  648.  
  649.  
  650. @login_required
  651. def active_sessions_detail(request, id):
  652.     ctx = RequestContext(request)
  653.     try:
  654.         ctx['data'] = InetSessionActiveTest.objects.get(pk=id)
  655.     except:
  656.         HttpResponse('')
  657.     return render_to_response('inet/active_sessions_detail.html', context_instance = ctx)
  658.  
  659.  
  660.  
  661. @login_required
  662. def active_sessions_delete(request, id):
  663.     res = '0' if kill_sessions_by_id(id) == None else '1'
  664.     return HttpResponse(res)
  665.  
  666.  
  667.  
  668. ################################################################################
  669. #    Функционал для профилей скорости
  670. ################################################################################
  671.  
  672. from models import SpeedProfile
  673. from forms import SpeedProfileForm
  674.  
  675. @login_required
  676. def speed_profile_create(request, id=''):
  677.     ctx = RequestContext(request)
  678.     ctx['form'] = SpeedProfileForm()
  679.     ctx['mode'] = 'Создать'
  680.     obj = None
  681.  
  682.     try:
  683.         obj = SpeedProfile.objects.get(id=int(id))
  684.         ctx['form'] = SpeedProfileForm(instance=obj)
  685.         ctx['mode'] = 'Редактировать'
  686.         ctx['id'] = id
  687.     except:
  688.         ctx['form'] = SpeedProfileForm()
  689.  
  690.     if request.method == 'POST':
  691.         ctx['form'] = SpeedProfileForm(request.POST, instance=obj)
  692.         if ctx['form'].is_valid():
  693.             try:
  694.                 ctx['form'].save()
  695.                 return HttpResponseRedirect( reverse('_speed_profile_list') )
  696.             except:
  697.                 #import traceback
  698.                 #exc = traceback.format_exc()
  699.                 #return HttpResponse( str(exc) )
  700.                 ctx['errors'] = 'Невозможно создать профиль скорости. Ошибка модели.'
  701.  
  702.         else:
  703.             ctx['errors'] = 'Невозможно создать профиль скорости. Ошибка валидации. Корректно заполните поля.'
  704.  
  705.     return render_to_response('inet/speed_profile_create.html', context_instance = ctx)
  706.  
  707.  
  708.  
  709. @login_required
  710. def speed_profile_list(request):
  711.     ctx = RequestContext(request)
  712.    
  713.     search_process(ctx, SpeedProfile, request, 'name', 'inet.models.SpeedProfile')
  714.     pagination_process(ctx, request)
  715.  
  716.     return render_to_response('inet/speed_profile_list.html', context_instance = ctx)
  717.    
  718.    
  719. def get_manual_netflow_report(request):
  720.    
  721.     date_start = request.GET.get('date_start')
  722.     date_end = request.GET.get('date_end')
  723.     ips = request.GET.get('ips')
  724.    
  725.     if ips is None or date_start is None or date_end is None:
  726.         return HttpResponse('Чето Вы накосячили в параметрах гета.')
  727.    
  728.     filename = hashlib.md5(date_start+date_end+ips).hexdigest() + '.csv'
  729.  
  730.     if os.path.exists('/home/loki/loki/spool/report_daemon/reports/' + filename):
  731.         response = HttpResponse(open('/home/loki/loki/spool/report_daemon/reports/' + filename, 'r'), mimetype='application/vnd.ms-excel')
  732.         response['Content-Disposition'] = 'attachment; filename=%s' % filename
  733.         response['Cache-Control'] = 'no-cache'
  734.         return response
  735.  
  736.     nfrp = NetflowReport(tmp_path = '/home/loki/loki/spool/report_daemon/tmp',
  737.                          dst_path = '/home/loki/loki/spool/report_daemon/reports')
  738.     nfrp.prepare()
  739.     nfrp.generate_query(date_start,
  740.                         date_end,
  741.                         ips.split(','),
  742.                         True)
  743.     nfrp.execute_query()
  744.     nfrp.dst_filename = filename
  745.     nfrp.date_time_ip_filter(date_start,
  746.                             date_end)
  747.     nfrp.clear()
  748.     response = HttpResponse(open(nfrp.dst_path + '/'+ nfrp.dst_filename, 'r'), mimetype='application/vnd.ms-excel')
  749.     response['Content-Disposition'] = 'attachment; filename=%s' % nfrp.dst_filename
  750.     response['Cache-Control'] = 'no-cache'
  751.     return response
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement