Nav apraksta

views.py 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. from django.shortcuts import render, redirect
  2. from backend.mongodb import db
  3. from exfo.lib import Exfo, Mikrotik
  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. if len(r0) > 0:
  241. col.insert_many(r0)
  242. except Exception as e:
  243. pprint(e)
  244. # pprint(temp)
  245. #col.insert_many(temp)
  246. results = col.find({})
  247. data = dumps(list(results), indent=4)
  248. data = {'msg': 'done'}
  249. redir = request.GET.get('redir', None)
  250. if redir:
  251. messages.success(request, 'Dump Fixed Results')
  252. return redirect(redir)
  253. # return HttpResponse(data, content_type='application/json')
  254. return JsonResponse(data)
  255. import humanize
  256. def con_human(r):
  257. try:
  258. '''
  259. if 'time' in r['header'].lower():
  260. return r['results']
  261. '''
  262. x = r['results']
  263. n = int(x)
  264. if n > 1000:
  265. return humanize.naturalsize(n,gnu=True)
  266. else:
  267. return n
  268. except:
  269. return r['results']
  270. def gen_report_notebook():
  271. import pandas as pd
  272. from_zone = tz.gettz('UTC')
  273. to_zone = tz.gettz('Asia/Bangkok')
  274. c = db['fixed_results'].find()
  275. c2 = db['ip_address']
  276. data = []
  277. for i in c:
  278. #pprint(i['header'])
  279. res = dict(zip(i['header'], i['results']))
  280. utc = datetime.fromtimestamp(int(i['ids']['time_stamp'])/1000000000)
  281. utc = utc.replace(tzinfo=from_zone)
  282. yest = utc - timedelta(minutes=4)
  283. dt = utc.astimezone(to_zone)
  284. d = {'header': i['header'], 'results': i['results'], 'output': res, 'params': i['parameters'], 'ts': i['ids']['time_stamp'],
  285. 'dt': str(dt), 'test_type_name': i['ids']['fixed_results_url']}
  286. d.update(i['names'])
  287. if not d['sla_name']:
  288. continue
  289. sla_splt = d['sla_name'].split('-')
  290. if len(sla_splt) > 1:
  291. reg_cond = f'(?=^pppoe-out)(?=.*{sla_splt[0]})(?=.*{sla_splt[-1]})'
  292. pprint(reg_cond)
  293. 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))
  294. pprint("temp addr")
  295. pprint(d['sla_name'])
  296. # //pprint(temp_addr)
  297. target_address = None
  298. if temp_addr:
  299. target_address = temp_addr[0]
  300. if target_address:
  301. pprint("Found Target")
  302. pprint(target_address)
  303. d.update(target_address)
  304. #res.update(i['ids'])
  305. #res.update(i[])
  306. #pprint(d)
  307. data.append(d)
  308. df0 = pd.DataFrame(data)
  309. df0 = df0.explode(["header", "results"])
  310. df1 = df0[["header", "results", "dt", "sla_name", "test_display_name", "verifier_name", "network", "address", "interface"]]
  311. df1 = df1.query('sla_name == sla_name')
  312. #pprint(df1['sla_name'].unique())
  313. #df1['results_text'] = df1['results'].apply(con_human)
  314. df1['results_text'] = df1.apply(con_human, axis=1)
  315. df1['network_str'] = df1['network'] + " / " + df1['interface']
  316. 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])
  317. table = table.dropna(how='all', axis=0)
  318. return (table,df1)
  319. def gen_report(request):
  320. pprint("report notebook ...")
  321. if request.GET.get('clear', None):
  322. return redirect("/backend/dump_fixed_results/?redir=/backend/gen_report/")
  323. try:
  324. table,df = gen_report_notebook()
  325. except Exception as e:
  326. messages.error(request, str(e))
  327. return render(request, 'backend/gen_report.html', {'dump_again': True})
  328. slas = list(df['sla_name'].unique())
  329. vrs = list(df['verifier_name'].unique())
  330. sla_name = request.GET.getlist('sla_name')
  331. vr_name = request.GET.getlist('vr_name')
  332. pprint("--- sla_name ---")
  333. pprint(sla_name)
  334. if len(sla_name) > 0:
  335. sla_filter = ", ".join(f"'{w}'" for w in sla_name)
  336. table = table.query(f"sla_name in ({sla_filter})")
  337. if len(vr_name) > 0:
  338. vr_filter = ", ".join(f"'{w}'" for w in vr_name)
  339. table = table.query(f"verifier_name in ({vr_filter})")
  340. table = table.dropna(how='all', axis=0)
  341. table = table.dropna(how='all', axis=1)
  342. gen_report = request.GET.get('genReport', None)
  343. report_link = None
  344. if gen_report:
  345. import time
  346. ts = int(time.time())
  347. fn = f"report_{ts}.xlsx"
  348. table.to_excel(f'/code/media/{fn}')
  349. report_link = f'/media/{fn}'
  350. try:
  351. mk_ips = mkt.call_remote("ip/route")
  352. mk_address = mkt.call_remote("ip/address")
  353. except:
  354. mk_ips = []
  355. mk_address = []
  356. return render(request, 'backend/gen_report.html', {'tbl': table.head(50).to_html(\
  357. classes=["table", "table-striped", "table-bordered", "align-middle"],\
  358. 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})
  359. @shared_task
  360. def mikro_dump_task():
  361. #look at only pppoe only ( excloude pppoe5 )
  362. col = db['ip_address']
  363. mk_address = mkt.call_remote("ip/address")
  364. for i in mk_address:
  365. temp = {'ts': datetime.utcnow()}
  366. temp = temp | i
  367. col.insert_one(temp)
  368. pprint("dump ip complete")