Nessuna descrizione

views.py 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. from django.shortcuts import render, redirect
  2. from backend.mongodb import db
  3. from exfo.lib import Exfo, Mikrotik, SLA_MAP
  4. from pprint import pprint
  5. from ttp import ttp
  6. from django.http import JsonResponse, HttpResponse
  7. from datetime import datetime
  8. from celery import shared_task
  9. from django.contrib import messages
  10. exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
  11. exfo.login()
  12. from datetime import datetime, timedelta
  13. from dateutil import tz
  14. mkt = Mikrotik()
  15. def index(request):
  16. collection = db['mascot']
  17. mascot_details = collection.find({})
  18. rapi = exfo.list_api()
  19. sla = exfo.call_api("sla")
  20. data_to_parse = """
  21. interface Loopback0
  22. description Router-id-loopback
  23. ip address 192.168.0.113/24
  24. !
  25. interface Vlan778
  26. description CPE_Acces_Vlan
  27. ip address 2002::fd37/124
  28. ip vrf CPE1
  29. !
  30. """
  31. ttp_template = """
  32. interface {{ interface }}
  33. ip address {{ ip }}/{{ mask }}
  34. description {{ description }}
  35. ip vrf {{ vrf }}
  36. """
  37. template = """
  38. <input load="text">
  39. interface Loopback0
  40. description Router-id-loopback
  41. ip address 192.168.0.113/24
  42. !
  43. interface Loopback1
  44. description Router-id-loopback
  45. ip address 192.168.0.1/24
  46. !
  47. interface Vlan778
  48. ip address 2002::fd37/124
  49. ip vrf CPE1
  50. !
  51. interface Vlan779
  52. ip address 2002::bbcd/124
  53. ip vrf CPE2
  54. !
  55. </input>
  56. <group name="loopbacks_new**.{{ interface }}">
  57. interface {{ interface | contains("Loop") }}
  58. ip address {{ ip }}/{{ mask }}
  59. description {{ description }}
  60. ip vrf {{ vrf }}
  61. </group>
  62. <group name="vlans*">
  63. interface {{ interface | contains("Vlan") }}
  64. ip address {{ ip }}/{{ mask }}
  65. description {{ description }}
  66. ip vrf {{ vrf }}
  67. </group>
  68. """
  69. parser = ttp(template=template)
  70. parser.parse()
  71. # form excel table and save in file
  72. parser.result(
  73. format="excel",
  74. filename="excel_out_test_excel_formatter_update.xlsx",
  75. returner="file",
  76. update=True,
  77. url="./Output/",
  78. table=[
  79. {
  80. "headers": ["interface", "ip", "mask", "vrf", "description"],
  81. "path": "loopbacks_new",
  82. "key": "interface",
  83. "tab_name": "loopbacks_new",
  84. },
  85. {"path": "vlans"},
  86. ],
  87. )
  88. # create parser object and parse data using template:
  89. # parser = ttp(data=data_to_parse, template=ttp_template)
  90. # parser.parse()
  91. # # print result in JSON format
  92. # results = parser.result(format='xlsx')[0]
  93. # pprint(results)
  94. try:
  95. mk_ips = mkt.call_remote("ip/route")
  96. mk_address = mkt.call_remote("ip/address")
  97. except:
  98. mk_ips = []
  99. mk_address = []
  100. return render(request, 'backend/index.html', {'objs': mascot_details, 'output': rapi.json(),\
  101. 'sla': sla.json(), 'mk_ips': mk_ips, 'mk_address': mk_address})
  102. #Define Collection
  103. def remote(request):
  104. cmd = request.GET.get('cmd', None)
  105. # exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
  106. # exfo.login()
  107. r = exfo.call_remote_api(cmd)
  108. pprint(r.json())
  109. # return JsonResponse(r.json())
  110. return render(request, 'backend/remote_render.html', {'res': r})
  111. def service_status(request):
  112. cmd = request.GET.get('cmd', None)
  113. import urllib.parse
  114. section = request.GET.get('section', 'all')
  115. # exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
  116. # exfo.login()
  117. cmd = urllib.parse.unquote(cmd)
  118. pprint(f" cmd = {cmd}")
  119. r = exfo.call_remote_api(cmd)
  120. pprint(r.json())
  121. # return JsonResponse(r.json())
  122. return render(request, 'backend/service_status.html', {'res': r, 'section': section})
  123. def reports(request):
  124. days = range(1,31)
  125. sla = exfo.call_api("sla")
  126. sla_json = sla.json()
  127. sla_results = {}
  128. test_status = {}
  129. service_results = {}
  130. for r in sla_json['result']:
  131. sla_uri = r['ids']['sla_uri']
  132. t = exfo.call_remote_api(sla_uri).json()
  133. sla_results[r['ids']['sla_name']] = t
  134. t = exfo.call_remote_api(sla_uri).json()
  135. service_results[r['ids']['sla_name']] = []
  136. for si in t['result']['service_instances']:
  137. service_results[r['ids']['sla_name']].append(exfo.call_remote_api(si['service_uri']).json()['result'])
  138. try:
  139. t2 = exfo.call_remote_api(t['result']['tests'][-1]['test_status_uri']).json()
  140. test_status[r['ids']['sla_name']] = t2
  141. except:
  142. test_status[r['ids']['sla_name']] = {}
  143. return render(request, 'backend/reports2.html', {'days': days, 'sla': sla.json(), 'sla_results': sla_results, 'test_status': test_status, 'service_results': service_results })
  144. def dump_api(request):
  145. from bson.json_util import dumps
  146. from bson.json_util import loads
  147. col = db['exfo_api']
  148. # col.delete_many({})
  149. sla = exfo.call_api("sla")
  150. sla_json = sla.json()
  151. temp = sla_json['result']
  152. for t in temp:
  153. sla_uri = t['ids']['sla_uri']
  154. sla_name = t['ids']['sla_name']
  155. r = exfo.call_remote_api(sla_uri).json()
  156. t['sla_uri_result'] = r['result']
  157. service_result = []
  158. for si in r['result']['service_instances']:
  159. c = exfo.call_remote_api(si['service_uri']).json()['result']
  160. service_result.append(c)
  161. test_instance_class_result = []
  162. test_status_result = []
  163. for si in r['result']['tests']:
  164. c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
  165. service = c['service']
  166. target = None
  167. if 'target' in c:
  168. target = c['target']
  169. test_instance_class_result.append(c)
  170. c = exfo.call_remote_api(si['test_status_uri']).json()['result']
  171. test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
  172. 'service': service, 'target': target, \
  173. 'type_type_name': si['test_type_name'],\
  174. 'test_instance_class_id': si['test_instance_class_id'] , 'status': c, })
  175. t['test_instance_class_result'] = test_instance_class_result
  176. t['test_status_result'] = test_status_result
  177. t['created'] = datetime.utcnow()
  178. col.insert_one(t)
  179. # pprint(temp)
  180. #col.insert_many(temp)
  181. results = col.find({})
  182. data = dumps(list(results), indent=4)
  183. return HttpResponse(data, content_type='application/json')
  184. @shared_task
  185. def dump_api_task():
  186. from bson.json_util import dumps
  187. from bson.json_util import loads
  188. col = db['exfo_api']
  189. # col.delete_many({})
  190. sla = exfo.call_api("sla")
  191. sla_json = sla.json()
  192. temp = sla_json['result']
  193. for t in temp:
  194. sla_uri = t['ids']['sla_uri']
  195. sla_name = t['ids']['sla_name']
  196. r = exfo.call_remote_api(sla_uri).json()
  197. t['sla_uri_result'] = r['result']
  198. service_result = []
  199. for si in r['result']['service_instances']:
  200. c = exfo.call_remote_api(si['service_uri']).json()['result']
  201. service_result.append(c)
  202. test_instance_class_result = []
  203. test_status_result = []
  204. for si in r['result']['tests']:
  205. c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
  206. service = c['service']
  207. target = None
  208. if 'target' in c:
  209. target = c['target']
  210. test_instance_class_result.append(c)
  211. c = exfo.call_remote_api(si['test_status_uri']).json()['result']
  212. test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
  213. 'service': service, 'target': target, \
  214. 'type_type_name': si['test_type_name'],\
  215. 'test_instance_class_id': si['test_instance_class_id'] , 'status': c, })
  216. t['test_instance_class_result'] = test_instance_class_result
  217. t['test_status_result'] = test_status_result
  218. t['created'] = datetime.utcnow()
  219. col.insert_one(t)
  220. pprint("Dump API ... Finished")
  221. def print_table(request):
  222. return render(request, 'backend/print_table.html')
  223. def dump_fixed_results(request):
  224. from bson.json_util import dumps
  225. from bson.json_util import loads
  226. from_zone = tz.gettz('UTC')
  227. to_zone = tz.gettz('Asia/Bangkok')
  228. col = db['fixed_results']
  229. col.delete_many({})
  230. tt = exfo.call_remote_api("/API/REST/Test/v1/TypeByName?list_all=false&size=0")
  231. pprint(tt)
  232. tt_json = tt.json()
  233. temp = tt_json['result']
  234. for t in temp:
  235. tn = t['ids']['test_type_name']
  236. r = exfo.call_remote_api('/API/REST/Test/v1/FixedResults/'+tn+'?sections=all&size=0&sort=verifier_id asc,time_stamp desc&time_range={"start":"1 days ago","end":"now"}').json()
  237. #pprint(r)
  238. try:
  239. r0 = r['result']
  240. pprint(r0)
  241. if len(r0) > 0:
  242. col.insert_many(r0)
  243. else:
  244. pprint("Empty Result")
  245. except Exception as e:
  246. pprint(e)
  247. # pprint(temp)
  248. #col.insert_many(temp)
  249. results = col.find({})
  250. data = dumps(list(results), indent=4)
  251. data = {'msg': 'done'}
  252. redir = request.GET.get('redir', None)
  253. if redir:
  254. messages.success(request, 'Dump Fixed Results')
  255. return redirect(redir)
  256. # return HttpResponse(data, content_type='application/json')
  257. return JsonResponse(data)
  258. import humanize
  259. def con_human(r):
  260. try:
  261. '''
  262. if 'time' in r['header'].lower():
  263. return r['results']
  264. '''
  265. x = r['results']
  266. n = int(x)
  267. if n > 1000:
  268. return humanize.naturalsize(n,gnu=True)
  269. else:
  270. return n
  271. except:
  272. return r['results']
  273. def gen_report_notebook():
  274. import pandas as pd
  275. from_zone = tz.gettz('UTC')
  276. to_zone = tz.gettz('Asia/Bangkok')
  277. c = db['fixed_results'].find()
  278. c2 = db['ip_address']
  279. data = []
  280. for i in c:
  281. #pprint(i['header'])
  282. res = dict(zip(i['header'], i['results']))
  283. utc = datetime.fromtimestamp(int(i['ids']['time_stamp'])/1000000000)
  284. utc = utc.replace(tzinfo=from_zone)
  285. yest = utc - timedelta(minutes=4)
  286. dt = utc.astimezone(to_zone)
  287. d = {'header': i['header'], 'results': i['results'], 'output': res, 'params': i['parameters'], 'ts': i['ids']['time_stamp'],
  288. 'dt': str(dt), 'test_type_name': i['ids']['fixed_results_url']}
  289. d.update(i['names'])
  290. if not d['sla_name']:
  291. continue
  292. # sla_splt = d['sla_name'].split('-')
  293. sla_splt = d['verifier_name'].split('_')
  294. if len(sla_splt) > 1:
  295. # reg_cond = f'(?=^pppoe-out)(?=.*{sla_splt[0]})(?=.*{sla_splt[-1]})'
  296. # reg_cond = f'(?=^pppoe-out)(?=.*{sla_splt[-1]})'
  297. reg_cond = f'(?=.*pppoe-out)(?=.*{sla_splt[-1]})'
  298. pprint(reg_cond)
  299. temp_addr = list(c2.find({'ts': {'$lte': utc, '$gte': yest }, 'interface': {'$regex': reg_cond, '$not': { '$regex': 'pppoe-out5'}, '$options': 'i' }, 'invalid': 'false'}).sort("ts", -1))
  300. # temp_addr = list(c2.find({'ts': {'$lte': utc, '$gte': yest }, 'interface': {'$regex': reg_cond, '$options': 'i' }, 'invalid': 'false'}).sort("ts", -1))
  301. # temp_addr = list(c2.find({'interface': {'$regex': reg_cond, '$options': 'i' }, 'invalid': 'false'}).sort("ts", -1))
  302. pprint("-------")
  303. pprint("temp addr")
  304. pprint(d['sla_name'])
  305. pprint(temp_addr)
  306. target_address = None
  307. if temp_addr:
  308. target_address = temp_addr[0]
  309. if target_address:
  310. pprint("Found Target")
  311. pprint(target_address)
  312. d.update(target_address)
  313. #res.update(i['ids'])
  314. #res.update(i[])
  315. #pprint(d)
  316. data.append(d)
  317. df0 = pd.DataFrame(data)
  318. df0 = df0.explode(["header", "results"])
  319. try:
  320. df1 = df0[["header", "results", "dt", "sla_name", "test_display_name", "verifier_name", "network", "address", "interface"]]
  321. except:
  322. df1 = df0[["header", "results", "dt", "sla_name", "test_display_name", "verifier_name",]]
  323. df1 = df1.query('sla_name == sla_name')
  324. #pprint(df1['sla_name'].unique())
  325. #df1['results_text'] = df1['results'].apply(con_human)
  326. df1['results_text'] = df1.apply(con_human, axis=1)
  327. try:
  328. df1['network_str'] = df1['network'] + " / " + df1['interface']
  329. except:
  330. df1['network_str'] = "N/A"
  331. table = df1.pivot(index=['sla_name', 'dt', 'verifier_name', 'network_str'],columns=['test_display_name','header'], values='results_text').sort_values(by=['sla_name', 'dt'], ascending=[True, False])
  332. table = table.dropna(how='all', axis=0)
  333. return (table,df1)
  334. def gen_report(request):
  335. pprint("report notebook ...")
  336. if request.GET.get('clear', None):
  337. return redirect("/backend/dump_fixed_results/?redir=/backend/gen_report/")
  338. try:
  339. table,df = gen_report_notebook()
  340. except Exception as e:
  341. messages.error(request, str(e))
  342. return render(request, 'backend/gen_report.html', {'dump_again': True})
  343. slas = list(df['sla_name'].unique())
  344. vrs = list(df['verifier_name'].unique())
  345. sla_name = request.GET.getlist('sla_name')
  346. vr_name = request.GET.getlist('vr_name')
  347. pprint("--- sla_name ---")
  348. pprint(sla_name)
  349. if len(sla_name) > 0:
  350. sla_filter = ", ".join(f"'{w}'" for w in sla_name)
  351. table = table.query(f"sla_name in ({sla_filter})")
  352. if len(vr_name) > 0:
  353. vr_filter = ", ".join(f"'{w}'" for w in vr_name)
  354. table = table.query(f"verifier_name in ({vr_filter})")
  355. table = table.dropna(how='all', axis=0)
  356. table = table.dropna(how='all', axis=1)
  357. is_gen_report = request.GET.get('genReport', None)
  358. report_link = None
  359. if is_gen_report:
  360. import time
  361. # ts = int(time.time())
  362. import pytz
  363. tz = pytz.timezone('Asia/Bangkok')
  364. ts = datetime.now(tz).strftime("%Y%m%d_%H%M%S")
  365. fn = f"report_{ts}.xlsx"
  366. table.to_excel(f'/code/media/{fn}')
  367. report_link = f'/media/{fn}'
  368. try:
  369. mk_ips = []
  370. mk_address = []
  371. for v in SLA_MAP.values():
  372. mkt = Mikrotik(v)
  373. mk_ips.append(mkt.call_remote("ip/route"))
  374. mk_address.append(mkt.call_remote("ip/address"))
  375. except:
  376. mk_ips = []
  377. mk_address = []
  378. return render(request, 'backend/gen_report.html', {'tbl': table.head(50).to_html(\
  379. classes=["table", "table-striped", "table-bordered", "align-middle"],\
  380. table_id="report_tbl"), 'slas': slas, 'report_link': report_link, 'mk_ips': mk_ips, 'mk_address': mk_address, 'vrs': vrs, 'sla_name': sla_name, 'vr_name': vr_name})
  381. @shared_task
  382. def mikro_dump_task():
  383. #look at only pppoe only ( excloude pppoe5 )
  384. col = db['ip_address']
  385. pprint(SLA_MAP.values())
  386. for v in SLA_MAP.values():
  387. for v0 in v.split(','):
  388. mkt = Mikrotik(v0)
  389. try:
  390. mk_address = mkt.call_remote("ip/address")
  391. for i in mk_address:
  392. temp = {'ts': datetime.utcnow()}
  393. temp = temp | i
  394. col.insert_one(temp)
  395. pprint("dump ip complete")
  396. except Exception as e:
  397. pprint(e)
  398. @shared_task
  399. def gen_report_task():
  400. import requests
  401. import socket
  402. ip = socket.gethostbyname(socket.gethostname())
  403. r = requests.get(f'http://web:8000/backend/dump_fixed_results/', timeout=None)
  404. if r.status_code == 200:
  405. pprint("dump OK")
  406. else:
  407. pprint(f"dump = {r.status_code}")
  408. # r = requests.get(f'http://web:8000/backend/gen_report/?sla_name=BNG-144-VLAN20-Public&sla_name=BNG-144-VLAN10-Private&sla_name=BRAS-88-VLAN20-Public&sla_name=BRAS-88-VLAN10-Private&genReport=Gen+Report', timeout=None)
  409. r = requests.get(f'http://web:8000/backend/gen_report/?genReport=Gen+Report', timeout=None)
  410. if r.status_code == 200:
  411. pprint("genreport OK")
  412. else:
  413. pprint(f"genreport = {r.status_code}")
  414. def list_reports(request):
  415. import os
  416. from django.conf import settings
  417. mr = settings.MEDIA_ROOT
  418. file_list =os.listdir(mr)
  419. def get_creation_time(item):
  420. item_path = os.path.join(mr, item)
  421. return os.path.getctime(item_path)
  422. file_list = sorted(file_list, key=get_creation_time, reverse=True)
  423. return render(request, 'backend/list_reports.html', {'file_list': file_list})