Bez popisu

views.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. mkt = Mikrotik()
  13. def index(request):
  14. collection = db['mascot']
  15. mascot_details = collection.find({})
  16. rapi = exfo.list_api()
  17. sla = exfo.call_api("sla")
  18. data_to_parse = """
  19. interface Loopback0
  20. description Router-id-loopback
  21. ip address 192.168.0.113/24
  22. !
  23. interface Vlan778
  24. description CPE_Acces_Vlan
  25. ip address 2002::fd37/124
  26. ip vrf CPE1
  27. !
  28. """
  29. ttp_template = """
  30. interface {{ interface }}
  31. ip address {{ ip }}/{{ mask }}
  32. description {{ description }}
  33. ip vrf {{ vrf }}
  34. """
  35. template = """
  36. <input load="text">
  37. interface Loopback0
  38. description Router-id-loopback
  39. ip address 192.168.0.113/24
  40. !
  41. interface Loopback1
  42. description Router-id-loopback
  43. ip address 192.168.0.1/24
  44. !
  45. interface Vlan778
  46. ip address 2002::fd37/124
  47. ip vrf CPE1
  48. !
  49. interface Vlan779
  50. ip address 2002::bbcd/124
  51. ip vrf CPE2
  52. !
  53. </input>
  54. <group name="loopbacks_new**.{{ interface }}">
  55. interface {{ interface | contains("Loop") }}
  56. ip address {{ ip }}/{{ mask }}
  57. description {{ description }}
  58. ip vrf {{ vrf }}
  59. </group>
  60. <group name="vlans*">
  61. interface {{ interface | contains("Vlan") }}
  62. ip address {{ ip }}/{{ mask }}
  63. description {{ description }}
  64. ip vrf {{ vrf }}
  65. </group>
  66. """
  67. parser = ttp(template=template)
  68. parser.parse()
  69. # form excel table and save in file
  70. parser.result(
  71. format="excel",
  72. filename="excel_out_test_excel_formatter_update.xlsx",
  73. returner="file",
  74. update=True,
  75. url="./Output/",
  76. table=[
  77. {
  78. "headers": ["interface", "ip", "mask", "vrf", "description"],
  79. "path": "loopbacks_new",
  80. "key": "interface",
  81. "tab_name": "loopbacks_new",
  82. },
  83. {"path": "vlans"},
  84. ],
  85. )
  86. # create parser object and parse data using template:
  87. # parser = ttp(data=data_to_parse, template=ttp_template)
  88. # parser.parse()
  89. # # print result in JSON format
  90. # results = parser.result(format='xlsx')[0]
  91. # pprint(results)
  92. try:
  93. mk_ips = mkt.call_remote("ip/route")
  94. mk_address = mkt.call_remote("ip/address")
  95. except:
  96. mk_ips = []
  97. mk_address = []
  98. return render(request, 'backend/index.html', {'objs': mascot_details, 'output': rapi.json(),\
  99. 'sla': sla.json(), 'mk_ips': mk_ips, 'mk_address': mk_address})
  100. #Define Collection
  101. def remote(request):
  102. cmd = request.GET.get('cmd', None)
  103. # exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
  104. # exfo.login()
  105. r = exfo.call_remote_api(cmd)
  106. pprint(r.json())
  107. # return JsonResponse(r.json())
  108. return render(request, 'backend/remote_render.html', {'res': r})
  109. def service_status(request):
  110. cmd = request.GET.get('cmd', None)
  111. import urllib.parse
  112. section = request.GET.get('section', 'all')
  113. # exfo = Exfo("administrator", "exf0w0rxC@t4dm!n")
  114. # exfo.login()
  115. cmd = urllib.parse.unquote(cmd)
  116. pprint(f" cmd = {cmd}")
  117. r = exfo.call_remote_api(cmd)
  118. pprint(r.json())
  119. # return JsonResponse(r.json())
  120. return render(request, 'backend/service_status.html', {'res': r, 'section': section})
  121. def reports(request):
  122. days = range(1,31)
  123. sla = exfo.call_api("sla")
  124. sla_json = sla.json()
  125. sla_results = {}
  126. test_status = {}
  127. service_results = {}
  128. for r in sla_json['result']:
  129. sla_uri = r['ids']['sla_uri']
  130. t = exfo.call_remote_api(sla_uri).json()
  131. sla_results[r['ids']['sla_name']] = t
  132. t = exfo.call_remote_api(sla_uri).json()
  133. service_results[r['ids']['sla_name']] = []
  134. for si in t['result']['service_instances']:
  135. service_results[r['ids']['sla_name']].append(exfo.call_remote_api(si['service_uri']).json()['result'])
  136. try:
  137. t2 = exfo.call_remote_api(t['result']['tests'][-1]['test_status_uri']).json()
  138. test_status[r['ids']['sla_name']] = t2
  139. except:
  140. test_status[r['ids']['sla_name']] = {}
  141. return render(request, 'backend/reports2.html', {'days': days, 'sla': sla.json(), 'sla_results': sla_results, 'test_status': test_status, 'service_results': service_results })
  142. def dump_api(request):
  143. from bson.json_util import dumps
  144. from bson.json_util import loads
  145. col = db['exfo_api']
  146. # col.delete_many({})
  147. sla = exfo.call_api("sla")
  148. sla_json = sla.json()
  149. temp = sla_json['result']
  150. for t in temp:
  151. sla_uri = t['ids']['sla_uri']
  152. sla_name = t['ids']['sla_name']
  153. r = exfo.call_remote_api(sla_uri).json()
  154. t['sla_uri_result'] = r['result']
  155. service_result = []
  156. for si in r['result']['service_instances']:
  157. c = exfo.call_remote_api(si['service_uri']).json()['result']
  158. service_result.append(c)
  159. test_instance_class_result = []
  160. test_status_result = []
  161. for si in r['result']['tests']:
  162. c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
  163. service = c['service']
  164. target = None
  165. if 'target' in c:
  166. target = c['target']
  167. test_instance_class_result.append(c)
  168. c = exfo.call_remote_api(si['test_status_uri']).json()['result']
  169. test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
  170. 'service': service, 'target': target, \
  171. 'type_type_name': si['test_type_name'],\
  172. 'test_instance_class_id': si['test_instance_class_id'] , 'status': c, })
  173. t['test_instance_class_result'] = test_instance_class_result
  174. t['test_status_result'] = test_status_result
  175. t['created'] = datetime.utcnow()
  176. col.insert_one(t)
  177. # pprint(temp)
  178. #col.insert_many(temp)
  179. results = col.find({})
  180. data = dumps(list(results), indent=4)
  181. return HttpResponse(data, content_type='application/json')
  182. @shared_task
  183. def dump_api_task():
  184. from bson.json_util import dumps
  185. from bson.json_util import loads
  186. col = db['exfo_api']
  187. # col.delete_many({})
  188. sla = exfo.call_api("sla")
  189. sla_json = sla.json()
  190. temp = sla_json['result']
  191. for t in temp:
  192. sla_uri = t['ids']['sla_uri']
  193. sla_name = t['ids']['sla_name']
  194. r = exfo.call_remote_api(sla_uri).json()
  195. t['sla_uri_result'] = r['result']
  196. service_result = []
  197. for si in r['result']['service_instances']:
  198. c = exfo.call_remote_api(si['service_uri']).json()['result']
  199. service_result.append(c)
  200. test_instance_class_result = []
  201. test_status_result = []
  202. for si in r['result']['tests']:
  203. c = exfo.call_remote_api(si['test_instance_class_uri']).json()['result']
  204. service = c['service']
  205. target = None
  206. if 'target' in c:
  207. target = c['target']
  208. test_instance_class_result.append(c)
  209. c = exfo.call_remote_api(si['test_status_uri']).json()['result']
  210. test_status_result.append({'sla_name':sla_name, 'test_instance_id': si['test_instance_id'],\
  211. 'service': service, 'target': target, \
  212. 'type_type_name': si['test_type_name'],\
  213. 'test_instance_class_id': si['test_instance_class_id'] , 'status': c, })
  214. t['test_instance_class_result'] = test_instance_class_result
  215. t['test_status_result'] = test_status_result
  216. t['created'] = datetime.utcnow()
  217. col.insert_one(t)
  218. pprint("Dump API ... Finished")
  219. def print_table(request):
  220. return render(request, 'backend/print_table.html')
  221. def dump_fixed_results(request):
  222. from bson.json_util import dumps
  223. from bson.json_util import loads
  224. col = db['fixed_results']
  225. col.delete_many({})
  226. tt = exfo.call_remote_api("/API/REST/Test/v1/TypeByName?list_all=false&size=0")
  227. pprint(tt)
  228. tt_json = tt.json()
  229. temp = tt_json['result']
  230. for t in temp:
  231. tn = t['ids']['test_type_name']
  232. 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()
  233. #pprint(r)
  234. try:
  235. r0 = r['result']
  236. if len(r0) > 0:
  237. col.insert_many(r0)
  238. except Exception as e:
  239. pprint(e)
  240. # pprint(temp)
  241. #col.insert_many(temp)
  242. results = col.find({})
  243. data = dumps(list(results), indent=4)
  244. data = {'msg': 'done'}
  245. redir = request.GET.get('redir', None)
  246. if redir:
  247. messages.success(request, 'Dump Fixed Results')
  248. return redirect(redir)
  249. # return HttpResponse(data, content_type='application/json')
  250. return JsonResponse(data)
  251. import humanize
  252. def con_human(r):
  253. try:
  254. '''
  255. if 'time' in r['header'].lower():
  256. return r['results']
  257. '''
  258. x = r['results']
  259. n = int(x)
  260. if n > 1000:
  261. return humanize.naturalsize(n,gnu=True)
  262. else:
  263. return n
  264. except:
  265. return r['results']
  266. def gen_report_notebook():
  267. from datetime import datetime
  268. import pandas as pd
  269. c = db['fixed_results'].find()
  270. data = []
  271. for i in c:
  272. #pprint(i['header'])
  273. res = dict(zip(i['header'], i['results']))
  274. d = {'header': i['header'], 'results': i['results'], 'output': res, 'params': i['parameters'], 'ts': i['ids']['time_stamp'],
  275. 'dt': datetime.fromtimestamp(int(i['ids']['time_stamp'])/1000000000), 'test_type_name': i['ids']['fixed_results_url']}
  276. d.update(i['names'])
  277. #res.update(i['ids'])
  278. #res.update(i[])
  279. #pprint(d)
  280. data.append(d)
  281. df0 = pd.DataFrame(data)
  282. df0 = df0.explode(["header", "results"])
  283. df1 = df0[["header", "results", "dt", "sla_name", "test_display_name"]]
  284. df1 = df1.query('sla_name == sla_name')
  285. #pprint(df1['sla_name'].unique())
  286. #df1['results_text'] = df1['results'].apply(con_human)
  287. df1['results_text'] = df1.apply(con_human, axis=1)
  288. table = df1.pivot(index=['sla_name', 'dt'],columns=['test_display_name','header'], values='results_text').sort_values(by=['sla_name', 'dt'], ascending=[True, False])
  289. table = table.dropna(how='all', axis=0)
  290. return (table,df1)
  291. def gen_report(request):
  292. pprint("report notebook ...")
  293. if request.GET.get('clear', None):
  294. return redirect("/backend/dump_fixed_results/?redir=/backend/gen_report/")
  295. try:
  296. table,df = gen_report_notebook()
  297. except:
  298. return render(request, 'backend/gen_report.html', {'dump_again': True})
  299. slas = list(df['sla_name'].unique())
  300. sla_name = request.GET.getlist('sla_name')
  301. pprint("--- sla_name ---")
  302. pprint(sla_name)
  303. if len(sla_name) > 0:
  304. sla_filter = ", ".join(f"'{w}'" for w in sla_name)
  305. table = table.query(f"sla_name in ({sla_filter})")
  306. gen_report = request.GET.get('genReport', None)
  307. report_link = None
  308. if gen_report:
  309. import time
  310. ts = int(time.time())
  311. fn = f"report_{ts}.xlsx"
  312. table.to_excel(f'/code/media/{fn}')
  313. report_link = f'/media/{fn}'
  314. try:
  315. mk_ips = mkt.call_remote("ip/route")
  316. mk_address = mkt.call_remote("ip/address")
  317. except:
  318. mk_ips = []
  319. mk_address = []
  320. return render(request, 'backend/gen_report.html', {'tbl': table.head(20).to_html(\
  321. classes=["table", "table-striped", "table-bordered", "align-middle"],\
  322. table_id="report_tbl"), 'slas': slas, 'report_link': report_link, 'mk_ips': mk_ips, 'mk_address': mk_address})