views.py 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373
  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.template import loader
  4. from django.shortcuts import redirect
  5. from django.conf import settings
  6. from django.urls import reverse
  7. from django.http import QueryDict
  8. import vyos
  9. import vycontrol_vyos_api_lib as vapilib
  10. import vycontrol_vyos_api as vapi
  11. import vycontrol_messages as vcmsg
  12. from performance import timer
  13. from perms import is_authenticated
  14. import perms
  15. import network
  16. import json
  17. import pprint
  18. import types
  19. from filters.vycontrol_filters import get_item
  20. from filters.vycontrol_filters import get_item_port
  21. from filters.vycontrol_filters import get_item_network
  22. @is_authenticated
  23. def index(request):
  24. #interfaces = vyos.get_interfaces()
  25. all_instances = vyos.instance_getall_by_group(request)
  26. hostname_default = vyos.get_hostname_prefered(request)
  27. firewall2 = vapilib.api(
  28. hostname = hostname_default,
  29. api = 'get',
  30. op = 'showConfig',
  31. cmd = {"op": "showConfig", "path": ["firewall"]},
  32. description = "get all firewall",
  33. )
  34. is_superuser = perms.get_is_superuser(request.user)
  35. firewall_all = vyos.get_firewall_all(hostname_default)
  36. if firewall_all == False:
  37. return redirect('firewall:firewall-create')
  38. for xitem in firewall_all['name']:
  39. if 'default-action' in firewall_all['name'][xitem]:
  40. firewall_all['name'][xitem]['default_action'] = firewall_all['name'][xitem]['default-action']
  41. del firewall_all['name'][xitem]['default-action']
  42. template = loader.get_template('firewall/list.html')
  43. context = {
  44. #'interfaces': interfaces,
  45. 'instances': all_instances,
  46. 'hostname_default': hostname_default,
  47. 'firewall_all': firewall_all,
  48. 'username': request.user,
  49. 'is_superuser' : is_superuser,
  50. }
  51. return HttpResponse(template.render(context, request))
  52. @is_authenticated
  53. def create(request):
  54. #interfaces = vyos.get_interfaces()
  55. all_instances = vyos.instance_getall()
  56. hostname_default = vyos.get_hostname_prefered(request)
  57. is_superuser = perms.get_is_superuser(request.user)
  58. if 'name' in request.POST:
  59. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name']]}
  60. result1 = vyos.set_config(hostname_default, cmd)
  61. print(result1)
  62. if 'description' in request.POST:
  63. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name'], "description", request.POST['description']]}
  64. result2 = vyos.set_config(hostname_default, cmd)
  65. print(result2)
  66. if 'action' in request.POST:
  67. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name'], "default-action", request.POST['action']]}
  68. result3 = vyos.set_config(hostname_default, cmd)
  69. print(result3)
  70. return redirect('firewall:firewall-list')
  71. template = loader.get_template('firewall/create.html')
  72. context = {
  73. #'interfaces': interfaces,
  74. 'instances': all_instances,
  75. 'hostname_default': hostname_default,
  76. 'username': request.user,
  77. 'is_superuser' : is_superuser,
  78. }
  79. return HttpResponse(template.render(context, request))
  80. @is_authenticated
  81. def firewall_removerule(request, firewall_name, firewall_rulenumber):
  82. all_instances = vyos.instance_getall()
  83. hostname_default = vyos.get_hostname_prefered(request)
  84. firewall = vyos.get_firewall(hostname_default, firewall_name)
  85. firewall_rule = vyos.get_firewall_rule(hostname_default, firewall_name, firewall_rulenumber)
  86. if firewall_rule and firewall:
  87. vyos.delete_route_rule(hostname_default, firewall_name, firewall_rulenumber)
  88. return redirect('firewall:show', firewall_name)
  89. def changerule(request, firewall_name, mode, template_name="firewall/addrule.html", rulenumber = None):
  90. msg = vcmsg.msg()
  91. #interfaces = vyos.get_interfaces()
  92. all_instances = vyos.instance_getall()
  93. hostname_default = vyos.get_hostname_prefered(request)
  94. is_superuser = perms.get_is_superuser(request.user)
  95. # get all selected firewall data --- WHY NEED ALL FIREWALL????
  96. firewall = vyos.get_firewall(hostname_default, firewall_name)
  97. # get all firewall groups
  98. firewall_group = {}
  99. firewall_group['network-group'] = {}
  100. firewall_group['address-group'] = {}
  101. firewall_group['port-group'] = {}
  102. firewall_group_raw = vapi.get_firewall_group(hostname_default)
  103. if firewall_group_raw.success:
  104. if 'network-group' in firewall_group_raw.data:
  105. for g in firewall_group_raw.data['network-group']:
  106. firewall_group['network-group'][g] = firewall_group_raw.data['network-group'][g]
  107. if 'address-group' in firewall_group_raw.data:
  108. for g in firewall_group_raw.data['address-group']:
  109. firewall_group['address-group'][g] = firewall_group_raw.data['address-group'][g]
  110. if 'port-group' in firewall_group_raw.data:
  111. for g in firewall_group_raw.data['port-group']:
  112. firewall_group['port-group'][g] = firewall_group_raw.data['port-group'][g]
  113. firewall_networkgroup_js = json.dumps(firewall_group['network-group'])
  114. firewall_addressgroup_js = json.dumps(firewall_group['address-group'])
  115. netservices = network.get_services()
  116. netservices_js = json.dumps(netservices)
  117. portgroups = vyos.get_firewall_portgroup(hostname_default)
  118. if portgroups != False:
  119. portgroups_groups = portgroups['port-group']
  120. else:
  121. portgroups_groups = []
  122. changed = False
  123. rulenumber_valid = False
  124. ruleaction_valid = False
  125. ruledata = {}
  126. # edit rule without valid rulenumber
  127. if mode == "editrule":
  128. if rulenumber == None:
  129. msg.add_error("Rule number empty")
  130. else:
  131. v = vapi.get_firewall_rulenumber(hostname_default, firewall_name, rulenumber)
  132. if v.success:
  133. ruledata = v.data
  134. # if rule exists control variables are true
  135. rulenumber_valid = True
  136. ruleaction_valid = True
  137. else:
  138. msg.add_error("There is no rule number inside firewall")
  139. # mode add rule
  140. elif mode == "addrule":
  141. if request.POST.get('rulenumber', None) == None:
  142. #msg.add_error("Rule number empty")
  143. # before fill form rule number is empty
  144. pass
  145. else:
  146. rulenumber = request.POST.get('rulenumber')
  147. if int(rulenumber) >= 1 and int(rulenumber) <= 9999:
  148. rulenumber_valid = True
  149. rulenumber = request.POST.get('rulenumber')
  150. else:
  151. rulenumber_valid = False
  152. msg.add_error("Rule number must be between 1 and 9999")
  153. ###############################################################################################################################################################
  154. # update rule action
  155. if rulenumber_valid and request.POST.get('ruleaction', None) != None:
  156. if request.POST.get('ruleaction') in ["accept", "drop", "reject"]:
  157. if mode == "editrule" and ruledata['action'] and request.POST.get('ruleaction') == ruledata['action']:
  158. msg.add_debug("Action: not changed")
  159. else:
  160. v = vapi.set_firewall_rule_action(hostname_default, firewall_name, rulenumber, request.POST.get('ruleaction'))
  161. if v.success == False:
  162. msg.add_error("Action: fail to change - " + v.reason)
  163. else:
  164. # updating ruledata
  165. ruledata['action'] = request.POST.get('ruleaction')
  166. changed = True
  167. msg.add_success("Action: updated")
  168. else:
  169. msg.add_error("Action invalid")
  170. ###############################################################################################################################################################
  171. # update rule status
  172. if rulenumber_valid and request.POST.get('status', None) != None:
  173. if mode == "editrule":
  174. if request.POST.get('status') == "enable" and "disable" not in ruledata:
  175. msg.add_debug("Status: not changed")
  176. elif request.POST.get('status') == "disable" and "disable" in ruledata:
  177. msg.add_debug("Status: not changed")
  178. elif request.POST.get('status') == "disable" and "disable" not in ruledata:
  179. v = vapi.set_firewall_rule_disabled(hostname_default, firewall_name, rulenumber)
  180. if v.success == False:
  181. msg.add_error("Status: failed to disable - " + v.reason)
  182. else:
  183. # updating ruledata
  184. ruledata['disable'] = {}
  185. ruledata['status'] = 'disabled'
  186. changed = True
  187. msg.add_success("Status disabled")
  188. elif request.POST.get('status') == "enable" and "disable" in ruledata:
  189. v = vapi.set_firewall_rule_enabled(hostname_default, firewall_name, rulenumber)
  190. if v.success == False:
  191. msg.add_error("Status: failed to enable - " + v.reason)
  192. else:
  193. # updating ruledata
  194. del ruledata['disable']
  195. ruledata['status'] = 'enabled'
  196. changed = True
  197. msg.add_success("Status: enabled")
  198. elif mode == "addrule":
  199. if request.POST.get('status') == "disable":
  200. v = vapi.set_firewall_rule_disabled(hostname_default, firewall_name, rulenumber)
  201. if v.success == False:
  202. msg.add_error("Status: failed to disable - " + v.reason)
  203. else:
  204. # updating ruledata
  205. ruledata['disable'] = {}
  206. ruledata['status'] = 'disabled'
  207. changed = True
  208. msg.add_info("Status: disabled")
  209. else:
  210. # nothing to do if status = enable
  211. pass
  212. ###############################################################################################################################################################
  213. # update description
  214. if rulenumber_valid == True and request.POST.get('description', None) != None:
  215. if 'description' in ruledata and request.POST.get('description') == ruledata['description']:
  216. msg.add_debug("Description: not changed")
  217. else:
  218. v = vapi.set_firewall_rule_description(hostname_default, firewall_name, rulenumber, request.POST.get('description'))
  219. if v.success == False:
  220. msg.add_error("Description: failed to update")
  221. else:
  222. # updating ruledata
  223. ruledata['description'] = request.POST.get('description')
  224. changed = True
  225. msg.add_success("Description: updated")
  226. ###############################################################################################################################################################
  227. # update criteria_protocol
  228. if rulenumber_valid == True and request.POST.get('criteria_protocol', None) == "1":
  229. protocol_criteria = None
  230. protocol_criteria_delete = False
  231. # other protocol - todo validate data
  232. if request.POST.get('protocol_criteria', None) == "other":
  233. if request.POST.get('protocol_custom', None) != None:
  234. protocol_criteria = request.POST.get('protocol_custom')
  235. # delete protocol
  236. elif request.POST.get('protocol_criteria', None) == "none":
  237. protocol_criteria_delete = True
  238. if 'protocol' in ruledata:
  239. v = vapi.set_firewall_rule_protocol_delete(hostname_default, firewall_name, rulenumber)
  240. if v.success == False:
  241. msg.add_error("Criteria Protocol: failed to unset - " + v.reason)
  242. else:
  243. del ruledata['protocol']
  244. changed = True
  245. msg.add_success("Criteria Protocol: unset")
  246. else:
  247. msg.add_debug("Criteria Protocol: not changed unset not needed")
  248. # common protocols
  249. elif request.POST.get('protocol_criteria', None) in ['all', 'tcp', 'udp', 'tcp_udp', 'icmp']:
  250. protocol_criteria = request.POST.get('protocol_criteria')
  251. # other cases did not checked anything
  252. if protocol_criteria != None:
  253. # negate protocol
  254. if request.POST.get('protocol_negate', None) == "1":
  255. protocol_negate = "!"
  256. else:
  257. protocol_negate = ""
  258. protocol_criteria_txt = protocol_negate + protocol_criteria
  259. if 'protocol' in ruledata and protocol_criteria_txt == ruledata['protocol']:
  260. msg.add_debug("Criteria Protocol: not changed")
  261. else:
  262. v = vapi.set_firewall_rule_protocol(hostname_default, firewall_name, rulenumber, protocol_criteria_txt)
  263. if v.success == False:
  264. msg.add_error("Criteria Protocol: failed to update - " + v.reason)
  265. else:
  266. # updating ruledata
  267. ruledata['protocol'] = protocol_criteria_txt
  268. changed = True
  269. msg.add_success("Criteria Protocol: updated")
  270. else:
  271. if protocol_criteria_delete != True:
  272. msg.add_error("Criteria Protocol: invalid protocol")
  273. ###############################################################################################################################################################
  274. # update criteria_protocol
  275. destinationport_json = request.POST.get('destinationport_json', None)
  276. sourceport_json = request.POST.get('sourceport_json', None)
  277. dport_form = []
  278. sport_form = []
  279. if destinationport_json != None:
  280. try:
  281. dport_form = json.loads(destinationport_json)
  282. except ValueError:
  283. pass
  284. if sourceport_json != None:
  285. try:
  286. sport_form = json.loads(sourceport_json)
  287. except ValueError:
  288. pass
  289. # remove ports unset
  290. dport_delete = []
  291. sport_delete = []
  292. if 'destination' in ruledata and 'port' in ruledata['destination']:
  293. dport_ruledata = ruledata['destination']['port'].split(",")
  294. else:
  295. dport_ruledata = []
  296. if 'source' in ruledata and 'port' in ruledata['source']:
  297. sport_ruledata = ruledata['source']['port'].split(",")
  298. else:
  299. sport_ruledata = []
  300. dport_changes = 0
  301. sport_changes = 0
  302. dport_delete_all = False
  303. sport_delete_all = False
  304. #msg.add_debug("Criteria Ports Destination: ports - " + pprint.pformat(dport_ruledata))
  305. #msg.add_debug("Criteria Ports Source: ports - " + pprint.pformat(sport_ruledata))
  306. # find ports to mark as removed
  307. if rulenumber_valid == True and request.POST.get('criteria_port', None) == "1":
  308. if len(sport_form) == 0:
  309. msg.add_debug("Criteria Ports Source: remove all ports")
  310. sport_ruledata = []
  311. sport_changes = sport_changes + 1
  312. sport_delete_all = True
  313. else:
  314. for port in sport_ruledata:
  315. if port not in sport_form:
  316. sport_ruledata.remove(port)
  317. sport_delete.append(port)
  318. sport_changes = sport_changes + 1
  319. for port in sport_form:
  320. if port not in sport_ruledata:
  321. sport_ruledata.append(port)
  322. sport_changes = sport_changes + 1
  323. if rulenumber_valid == True and request.POST.get('criteria_port', None) == "1":
  324. if len(dport_form) <= 0:
  325. msg.add_debug("Criteria Ports Destination: remove all ports")
  326. dport_ruledata = []
  327. dport_changes = dport_changes + 1
  328. dport_delete_all = True
  329. else:
  330. for port in dport_ruledata:
  331. if port not in dport_form:
  332. dport_ruledata.remove(port)
  333. dport_delete.append(port)
  334. dport_changes = dport_changes + 1
  335. for port in dport_form:
  336. if port not in dport_ruledata:
  337. dport_ruledata.append(port)
  338. dport_changes = dport_changes + 1
  339. if len(dport_delete) > 0:
  340. msg.add_debug("Criteria Ports Destination: remove ports - " + ",".join(dport_delete))
  341. if len(sport_delete) > 0:
  342. msg.add_debug("Criteria Ports Source: remove ports - " + ",".join(sport_delete))
  343. if rulenumber_valid == True and dport_changes > 0:
  344. if dport_delete_all == True:
  345. v = vapi.set_firewall_rule_destination_ports_delete(hostname_default, firewall_name, rulenumber)
  346. if v.success:
  347. changed = True
  348. msg.add_success("Criteria Ports Destination: updated delete all destination success")
  349. if 'destination' in ruledata and 'port' in ruledata['destination']:
  350. del ruledata['destination']['port']
  351. else:
  352. msg.add_error("Criteria Ports Destination: delete all failed - " + v.reason)
  353. else:
  354. msg.add_debug("Criteria Ports Destination: ports - " + ",".join(dport_ruledata))
  355. v = vapi.set_firewall_rule_destination_ports(hostname_default, firewall_name, rulenumber, dport_ruledata)
  356. if v.success:
  357. changed = True
  358. msg.add_success("Criteria Ports Destination: updated")
  359. ruledata['destination']['port'] = ','.join(dport_ruledata)
  360. else:
  361. msg.add_error("Criteria Ports Destination: failed - " + v.reason)
  362. else:
  363. msg.add_info("Criteria Ports Destination: no changes")
  364. if rulenumber_valid == True and sport_changes > 0:
  365. if sport_delete_all == True:
  366. v = vapi.set_firewall_rule_source_ports_delete(hostname_default, firewall_name, rulenumber)
  367. if v.success:
  368. changed = True
  369. msg.add_success("Criteria Ports Destination: updated delete all source success")
  370. if 'source' in ruledata and 'port' in ruledata['source']:
  371. del ruledata['source']['port']
  372. else:
  373. msg.add_error("Criteria Ports Destination: delete all failed - " + v.reason)
  374. else:
  375. msg.add_debug("Criteria Ports Source: ports - " + ",".join(sport_ruledata))
  376. v = vapi.set_firewall_rule_source_ports(hostname_default, firewall_name, rulenumber, sport_ruledata)
  377. if v.success:
  378. changed = True
  379. msg.add_success("Criteria Ports Source: updated")
  380. ruledata['source']['port'] = ','.join(sport_ruledata)
  381. else:
  382. msg.add_error("Criteria Ports Source: failed - " + v.reason)
  383. else:
  384. msg.add_info("Criteria Ports Source: no changes")
  385. # if criteria_tcpflags set, save it
  386. if request.POST.get('criteria_tcpflags', None) == "1":
  387. tcpflags_form = []
  388. if request.POST.get('tcpflags_syn', None) == "1":
  389. tcpflags_form.append('SYN')
  390. if request.POST.get('tcpflags_isyn', None) == "1":
  391. tcpflags_form.append('!SYN')
  392. if request.POST.get('tcpflags_ack', None) == "1":
  393. tcpflags_form.append('ACK')
  394. if request.POST.get('tcpflags_iack', None) == "1":
  395. tcpflags_form.append('!ACK')
  396. if request.POST.get('tcpflags_fin', None) == "1":
  397. tcpflags_form.append('FIN')
  398. if request.POST.get('tcpflags_ifin', None) == "1":
  399. tcpflags_form.append('!FIN')
  400. if request.POST.get('tcpflags_rst', None) == "1":
  401. tcpflags_form.append('RST')
  402. if request.POST.get('tcpflags_irst', None) == "1":
  403. tcpflags_form.append('!RST')
  404. if request.POST.get('tcpflags_urg', None) == "1":
  405. tcpflags_form.append('URG')
  406. if request.POST.get('tcpflags_iurg', None) == "1":
  407. tcpflags_form.append('!URG')
  408. if request.POST.get('tcpflags_psh', None) == "1":
  409. tcpflags_form.append('PSH')
  410. if request.POST.get('tcpflags_ipsh', None) == "1":
  411. tcpflags_form.append('!PSH')
  412. if request.POST.get('tcpflags_all', None) == "1":
  413. tcpflags_form.append('ALL')
  414. if request.POST.get('tcpflags_iall', None) == "1":
  415. tcpflags_form.append('!ALL')
  416. # will need to empty tcpflags
  417. if 'tcp' in ruledata and 'flags' in ruledata['tcp']:
  418. tcpflags_rule = ruledata['tcp']['flags'].split(',')
  419. else:
  420. tcpflags_rule = []
  421. if len(tcpflags_form) == 0 and len(tcpflags_rule) > 0:
  422. v = vapi.set_firewall_rule_tcpflags_delete(hostname_default, firewall_name, rulenumber)
  423. if v.success:
  424. changed = True
  425. msg.add_success("Criteria TCP Ports: empty tcp flags success")
  426. changed = True
  427. if 'tcp' in ruledata:
  428. if 'flags' in ruledata['tcp']:
  429. del ruledata['tcp']['flags']
  430. else:
  431. msg.add_error("Criteria TCP Ports: empty tcp failed - " + v.reason)
  432. elif len(tcpflags_form) > 0:
  433. v = vapi.set_firewall_rule_tcpflags(hostname_default, firewall_name, rulenumber, tcpflags_form)
  434. if v.success:
  435. changed = True
  436. msg.add_success("Criteria TCP Ports: updated success")
  437. changed = True
  438. #if 'source' in ruledata and 'port' in ruledata['source']:
  439. # del ruledata['source']['port']
  440. if 'tcp' not in ruledata:
  441. ruledata['tcp'] = {}
  442. ruledata['tcp']['flags'] = ",".join(tcpflags_form)
  443. else:
  444. msg.add_error("Criteria TCP Ports: updated failed - " + v.reason)
  445. if rulenumber_valid == True:
  446. if False:
  447. # verifing basic informations, should have rulenumber, status and ruleaction
  448. msg.add_error("Invalid Status or Action")
  449. elif False:
  450. # rule created, continue to configure firewall rule according his criterias
  451. if v.success:
  452. # if criteria_address set, save it
  453. if request.POST.get('criteria_address', None) == "1":
  454. # negate sdaddress_source
  455. if request.POST.get('sdaddress_source_negate', None) == "1":
  456. sdaddress_source_negate = "!"
  457. else:
  458. sdaddress_source_negate = ""
  459. # negate sdaddress_destination_negate
  460. if request.POST.get('sdaddress_destination_negate', None) == "1":
  461. sdaddress_destination_negate = "!"
  462. else:
  463. sdaddress_destination_negate = ""
  464. if request.POST.get('sdaddress_source', None) != None:
  465. sdaddress_source = request.POST.get('sdaddress_source')
  466. sdaddress_source_txt = sdaddress_source_negate + sdaddress_source
  467. v = vapilib.api (
  468. hostname= hostname_default,
  469. api = "post",
  470. op = "set",
  471. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "source", "address", sdaddress_source_txt],
  472. description = "set sdaddress_source",
  473. )
  474. if v.success:
  475. changed = True
  476. if request.POST.get('sdaddress_destination', None) != None:
  477. sdaddress_destination = request.POST.get('sdaddress_destination')
  478. sdaddress_destination_txt = sdaddress_destination_negate + sdaddress_destination
  479. v = vapilib.api (
  480. hostname= hostname_default,
  481. api = "post",
  482. op = "set",
  483. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "destination", "address", sdaddress_destination_txt],
  484. description = "set sdaddress_destination_txt",
  485. )
  486. if v.success:
  487. changed = True
  488. # if criteria_addressgroup set, save it
  489. if request.POST.get('criteria_addressgroup', None) == "1":
  490. if request.POST.get('sdaddressgroup_source', None) != None:
  491. sdaddressgroup_source = request.POST.get('sdaddressgroup_source')
  492. v = vapilib.api (
  493. hostname= hostname_default,
  494. api = "post",
  495. op = "set",
  496. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "source", "group", "address-group", sdaddressgroup_source],
  497. description = "set sdaddressgroup_source",
  498. )
  499. vcmsg.log("set sdaddressgroup_source", v.data)
  500. if v.success:
  501. changed = True
  502. if request.POST.get('sdaddressgroup_destination', None) != None:
  503. sdaddressgroup_destination = request.POST.get('sdaddressgroup_destination')
  504. v = vapilib.api (
  505. hostname= hostname_default,
  506. api = "post",
  507. op = "set",
  508. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "destination", "group", "address-group", sdaddressgroup_destination],
  509. description = "set sdaddressgroup_destination",
  510. )
  511. vcmsg.log("set sdaddressgroup_destination", v.data)
  512. if v.success:
  513. changed = True
  514. # if criteria_networkgroup set, save it
  515. if request.POST.get('criteria_networkgroup', None) == "1":
  516. if request.POST.get('sdnetworkgroup_source', None) != None:
  517. sdnetworkgroup_source = request.POST.get('sdnetworkgroup_source')
  518. v = vapilib.api (
  519. hostname= hostname_default,
  520. api = "post",
  521. op = "set",
  522. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "source", "group", "network-group", sdnetworkgroup_source],
  523. description = "set sdnetworkgroup_source",
  524. )
  525. if v.success:
  526. changed = True
  527. else:
  528. vcmsg.log("sdnetworkgroup_source", v.error)
  529. if request.POST.get('sdnetworkgroup_destination', None) != None:
  530. sdnetworkgroup_destination = request.POST.get('sdnetworkgroup_destination')
  531. v = vapilib.api (
  532. hostname= hostname_default,
  533. api = "post",
  534. op = "set",
  535. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "destination", "group", "network-group", sdnetworkgroup_destination],
  536. description = "set sdnetworkgroup_destination",
  537. )
  538. if v.success:
  539. changed = True
  540. else:
  541. vcmsg.log("sdnetworkgroup_source", v.error)
  542. # if criteria_sourcemac set, save it
  543. if request.POST.get('criteria_sourcemac', None) == "1":
  544. # negate sdaddress_source
  545. if request.POST.get('smac_source_negate', None) == "1":
  546. sourcemac_negate = "!"
  547. else:
  548. sourcemac_negate = ""
  549. if request.POST.get('smac_source', None) != None:
  550. sourcemac = request.POST.get('smac_source')
  551. sourcemac = sourcemac.replace("-",":")
  552. sourcemac = sourcemac.lower()
  553. sourcemac_txt = sourcemac_negate + sourcemac
  554. v = vapilib.api (
  555. hostname= hostname_default,
  556. api = "post",
  557. op = "set",
  558. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "source", "mac-address", sourcemac_txt],
  559. description = "set source mac",
  560. )
  561. if v.success:
  562. changed = True
  563. # if criteria_packetstate set, save it
  564. if request.POST.get('criteria_packetstate', None) == "1":
  565. packetstates = []
  566. if request.POST.get('packetstate_established', None) == "1":
  567. packetstates.append('established')
  568. if request.POST.get('packetstate_invalid', None) == "1":
  569. packetstates.append('invalid')
  570. if request.POST.get('packetstate_new', None) == "1":
  571. packetstates.append('new')
  572. if request.POST.get('packetstate_related', None) == "1":
  573. packetstates.append('related')
  574. if len(packetstates) > 0:
  575. for packetstate in packetstates:
  576. v = vapilib.api (
  577. hostname= hostname_default,
  578. api = "post",
  579. op = "set",
  580. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "state", packetstate, "enable"],
  581. description = "set criteria_packetstate",
  582. )
  583. if v.success:
  584. changed = True
  585. # if criteria_portgroup set, save it
  586. if request.POST.get('criteria_portgroup', None) == "1":
  587. if request.POST.get('sdportgroup_source', None) != None:
  588. v = vapilib.api (
  589. hostname= hostname_default,
  590. api = "post",
  591. op = "set",
  592. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "source", "group", "port-group", request.POST.get('sdportgroup_source')],
  593. description = "set sdportgroup_source",
  594. )
  595. if v.success:
  596. changed = True
  597. if request.POST.get('sdportgroup_destination', None) != None:
  598. v = vapilib.api (
  599. hostname= hostname_default,
  600. api = "post",
  601. op = "set",
  602. cmd = ["firewall", "name", firewall_name, "rule", rulenumber, "destination", "group", "port-group", request.POST.get('sdportgroup_destination')],
  603. description = "set sdportgroup_destination",
  604. )
  605. if v.success:
  606. changed = True
  607. if changed == True:
  608. msg.add_success("Firewall rule saved")
  609. ruledata_json = json.dumps(ruledata)
  610. vcmsg.log("json", ruledata_json)
  611. template = loader.get_template(template_name)
  612. context = {
  613. #'interfaces': interfaces,
  614. 'instances': all_instances,
  615. 'hostname_default': hostname_default,
  616. 'firewall': firewall,
  617. 'firewall_name': firewall_name,
  618. 'username': request.user,
  619. 'is_superuser' : is_superuser,
  620. 'services' : netservices['services'],
  621. 'services_common' : netservices['common'],
  622. 'firewall_networkgroup': firewall_group['network-group'],
  623. 'firewall_addressgroup': firewall_group['address-group'],
  624. 'firewall_networkgroup_js': firewall_networkgroup_js,
  625. 'firewall_addressgroup_js': firewall_addressgroup_js,
  626. 'netservices_js' : netservices_js,
  627. 'portgroups_groups': portgroups_groups,
  628. 'mode' : mode,
  629. 'msg' : msg.get_all(),
  630. 'ruledata' : ruledata,
  631. 'ruledata_pretty' : pprint.pformat(ruledata, indent=4, width=120),
  632. 'ruledata_json' : ruledata_json,
  633. 'rulenumber' : rulenumber,
  634. }
  635. if mode == "editrule":
  636. pass
  637. return HttpResponse(template.render(context, request))
  638. @is_authenticated
  639. def addrule(request, firewall_name):
  640. return changerule(request, firewall_name, mode="addrule", template_name="firewall/editrule.html", rulenumber = None)
  641. @is_authenticated
  642. def editrule(request, firewall_name, rulenumber):
  643. return changerule(request, firewall_name, mode="editrule", template_name="firewall/editrule.html", rulenumber=rulenumber)
  644. @is_authenticated
  645. def show(request, firewall_name):
  646. #interfaces = vyos.get_interfaces()
  647. all_instances = vyos.instance_getall()
  648. hostname_default = vyos.get_hostname_prefered(request)
  649. is_superuser = perms.get_is_superuser(request.user)
  650. firewall = vyos.get_firewall(hostname_default, firewall_name)
  651. template = loader.get_template('firewall/show.html')
  652. context = {
  653. #'interfaces': interfaces,
  654. 'instances': all_instances,
  655. 'hostname_default': hostname_default,
  656. 'firewall': firewall,
  657. 'firewall_name': firewall_name,
  658. 'username': request.user,
  659. 'is_superuser' : is_superuser,
  660. }
  661. return HttpResponse(template.render(context, request))
  662. @is_authenticated
  663. def firewall_portgroup_list(request):
  664. hostname_default = vyos.get_hostname_prefered(request)
  665. firewall_portgroup = vyos.get_firewall_portgroup(hostname_default)
  666. all_instances = vyos.instance_getall_by_group(request)
  667. is_superuser = perms.get_is_superuser(request.user)
  668. template = loader.get_template('firewall/portgroup-list.html')
  669. context = {
  670. 'firewall_portgroup': firewall_portgroup,
  671. 'hostname_default': hostname_default,
  672. 'username': request.user,
  673. 'instances': all_instances,
  674. 'is_superuser' : is_superuser,
  675. }
  676. return HttpResponse(template.render(context, request))
  677. @is_authenticated
  678. def firewall_portgroup_del(request, groupname):
  679. hostname_default = vyos.get_hostname_prefered(request)
  680. vyos.set_firewall_portgroup_del(hostname_default, groupname)
  681. return redirect('firewall:firewall-portgroup-list')
  682. @is_authenticated
  683. def firewall_portgroup_add(request):
  684. hostname_default = vyos.get_hostname_prefered(request)
  685. all_instances = vyos.instance_getall_by_group(request)
  686. is_superuser = perms.get_is_superuser(request.user)
  687. netservices = network.get_services()
  688. if request.POST.get('name', None) != None and request.POST.get('portgroup_ports_hidden', None) != None and request.POST.get('portgroup_ports_hidden') != '':
  689. try:
  690. ports = json.loads(request.POST.get('portgroup_ports_hidden'))
  691. except ValueError:
  692. return redirect('firewall:firewall-portgroup-list')
  693. for port in ports:
  694. vyos.set_firewall_portgroup_add(hostname_default, request.POST.get('name'), port)
  695. if request.POST.get('description', None) != None:
  696. vyos.set_firewall_portgroup_description(hostname_default, request.POST.get('name'), request.POST.get('description'))
  697. return redirect('firewall:firewall-portgroup-list')
  698. template = loader.get_template('firewall/portgroup-add.html')
  699. context = {
  700. 'hostname_default': hostname_default,
  701. 'username': request.user,
  702. 'instances': all_instances,
  703. 'is_superuser' : is_superuser,
  704. 'services_common' : netservices['common'],
  705. 'services' : netservices['services'],
  706. }
  707. return HttpResponse(template.render(context, request))
  708. @is_authenticated
  709. def firewall_portgroup_edit(request, groupname):
  710. hostname_default = vyos.get_hostname_prefered(request)
  711. all_instances = vyos.instance_getall_by_group(request)
  712. is_superuser = perms.get_is_superuser(request.user)
  713. netservices = network.get_services()
  714. portgroups = vyos.get_firewall_portgroup(hostname_default)
  715. portgroups_json = json.dumps(portgroups['port-group'][groupname], separators=(',', ':'))
  716. description = portgroups['port-group'][groupname]['description']
  717. if request.POST.get('description', None) != None:
  718. vyos.set_firewall_portgroup_description(hostname_default, groupname, request.POST.get('description'))
  719. if request.POST.get('portgroup_ports_hidden', None) != None and request.POST.get('portgroup_ports_hidden') != '':
  720. try:
  721. ports = json.loads(request.POST.get('portgroup_ports_hidden'))
  722. except ValueError:
  723. return redirect('firewall:firewall-portgroup-list')
  724. port_remove = []
  725. port_add = []
  726. # each port in vyos database
  727. for port in portgroups['port-group'][groupname]['port']:
  728. # vyos port not in form
  729. if port not in ports:
  730. # so mark to remove
  731. port_remove.append(port)
  732. # each port comming from form
  733. for port in ports:
  734. # form port not in vyos database
  735. if port not in portgroups['port-group'][groupname]['port']:
  736. # so mark to add
  737. port_add.append(port)
  738. # add ports to vyos database
  739. for port in port_add:
  740. vyos.set_firewall_portgroup_add(hostname_default, groupname, port)
  741. # remove ports to vyos database
  742. for port in port_remove:
  743. vyos.set_firewall_portgroup_delete_port(hostname_default, groupname, port)
  744. if request.POST.get('description', None) != None:
  745. vyos.set_firewall_portgroup_description(hostname_default, request.POST.get('name'), request.POST.get('description'))
  746. return redirect('firewall:firewall-portgroup-list')
  747. template = loader.get_template('firewall/portgroup-edit.html')
  748. context = {
  749. 'hostname_default': hostname_default,
  750. 'username': request.user,
  751. 'instances': all_instances,
  752. 'is_superuser' : is_superuser,
  753. 'groupname' : groupname,
  754. 'services_common' : netservices['common'],
  755. 'services' : netservices['services'],
  756. 'description' : description,
  757. 'portgroups_json' : portgroups_json,
  758. }
  759. return HttpResponse(template.render(context, request))
  760. @is_authenticated
  761. def firewall_networkgroup_list(request):
  762. hostname_default = vyos.get_hostname_prefered(request)
  763. firewall_networkgroup = vyos.get_firewall_networkgroup(hostname_default)
  764. all_instances = vyos.instance_getall_by_group(request)
  765. is_superuser = perms.get_is_superuser(request.user)
  766. template = loader.get_template('firewall/networkgroup-list.html')
  767. context = {
  768. 'firewall_networkgroup': firewall_networkgroup,
  769. 'hostname_default': hostname_default,
  770. 'username': request.user,
  771. 'instances': all_instances,
  772. 'is_superuser' : is_superuser,
  773. }
  774. return HttpResponse(template.render(context, request))
  775. @is_authenticated
  776. def firewall_networkgroup_add(request):
  777. hostname_default = vyos.get_hostname_prefered(request)
  778. all_instances = vyos.instance_getall_by_group(request)
  779. is_superuser = perms.get_is_superuser(request.user)
  780. if ( request.POST.get('name', None) != None
  781. and request.POST.get('networkgroup_json', None) != None):
  782. group = request.POST.get('name', None)
  783. description = request.POST.get('description', None)
  784. try:
  785. networks = json.loads(request.POST.get('networkgroup_json'))
  786. except ValueError:
  787. networks = {}
  788. changed = False
  789. vcmsg.log('networks', networks)
  790. for network in networks:
  791. v = vapilib.api (
  792. hostname= hostname_default,
  793. api = "post",
  794. op = "set",
  795. cmd = ["firewall", "group", "network-group", group, "network", network],
  796. description = "add network-group network",
  797. )
  798. if v.success and changed == False:
  799. changed = True
  800. # set network description if it was created
  801. if changed == True:
  802. v = vapilib.api (
  803. hostname= hostname_default,
  804. api = "post",
  805. op = "set",
  806. cmd = ["firewall", "group", "network-group", group, "description", description],
  807. description = "set network-group description",
  808. )
  809. return redirect('firewall:firewall-networkgroup-list')
  810. template = loader.get_template('firewall/networkgroup-add.html')
  811. context = {
  812. 'hostname_default': hostname_default,
  813. 'username': request.user,
  814. 'instances': all_instances,
  815. 'is_superuser' : is_superuser,
  816. }
  817. return HttpResponse(template.render(context, request))
  818. @is_authenticated
  819. def firewall_networkgroup_del(request, groupname):
  820. hostname_default = vyos.get_hostname_prefered(request)
  821. vyos.set_firewall_networkgroup_del(hostname_default, groupname)
  822. return redirect('firewall:firewall-networkgroup-list')
  823. @is_authenticated
  824. def firewall_addressgroup_list(request):
  825. hostname_default = vyos.get_hostname_prefered(request)
  826. firewall_addressgroup = vyos.get_firewall_addressgroup(hostname_default)
  827. all_instances = vyos.instance_getall_by_group(request)
  828. is_superuser = perms.get_is_superuser(request.user)
  829. template = loader.get_template('firewall/addressgroup-list.html')
  830. context = {
  831. 'firewall_addressgroup': firewall_addressgroup,
  832. 'hostname_default': hostname_default,
  833. 'username': request.user,
  834. 'instances': all_instances,
  835. 'is_superuser' : is_superuser,
  836. }
  837. return HttpResponse(template.render(context, request))
  838. @is_authenticated
  839. def firewall_addressgroup_add(request):
  840. hostname_default = vyos.get_hostname_prefered(request)
  841. all_instances = vyos.instance_getall_by_group(request)
  842. is_superuser = perms.get_is_superuser(request.user)
  843. if ( request.POST.get('name', None) != None
  844. and request.POST.get('addressgroup_json', None) != None):
  845. group = request.POST.get('name', None)
  846. description = request.POST.get('description', None)
  847. try:
  848. networks = json.loads(request.POST.get('addressgroup_json'))
  849. except ValueError:
  850. networks = {}
  851. changed = False
  852. vcmsg.log('networks', networks)
  853. for network in networks:
  854. v = vapilib.api (
  855. hostname = hostname_default,
  856. api = "post",
  857. op = "set",
  858. cmd = ["firewall", "group", "address-group", group, "address", network],
  859. description = "add address-group network",
  860. )
  861. if v.success and changed == False:
  862. changed = True
  863. # set network description if it was created
  864. if changed == True:
  865. if description != None:
  866. v = vapilib.api (
  867. hostname= hostname_default,
  868. api = "post",
  869. op = "set",
  870. cmd = ["firewall", "group", "address-group", group, "description", description],
  871. description = "set address-group description",
  872. )
  873. return redirect('firewall:firewall-addressgroup-list')
  874. template = loader.get_template('firewall/addressgroup-add.html')
  875. context = {
  876. 'hostname_default': hostname_default,
  877. 'username': request.user,
  878. 'instances': all_instances,
  879. 'is_superuser' : is_superuser,
  880. }
  881. return HttpResponse(template.render(context, request))
  882. @is_authenticated
  883. def firewall_addressgroup_del(request, groupname):
  884. hostname_default = vyos.get_hostname_prefered(request)
  885. vyos.set_firewall_addressgroup_del(hostname_default, groupname)
  886. return redirect('firewall:firewall-addressgroup-list')
  887. @is_authenticated
  888. def firewall_addressgroup_desc(request, groupname):
  889. hostname_default = vyos.get_hostname_prefered(request)
  890. all_instances = vyos.instance_getall_by_group(request)
  891. is_superuser = perms.get_is_superuser(request.user)
  892. v = vapilib.api (
  893. hostname= hostname_default,
  894. api = "get",
  895. op = "showConfig",
  896. cmd = ["firewall", "group", "address-group", groupname],
  897. description = "show address-group config",
  898. )
  899. groupinfo = v.data
  900. if 'address' not in groupinfo:
  901. networks_original = []
  902. else:
  903. networks_original = groupinfo['address']
  904. if type(networks_original) is str:
  905. vcmsg.log("tipo", type(networks_original))
  906. networks_original = [groupinfo['address']]
  907. else:
  908. networks_original = groupinfo['address']
  909. vcmsg.log("networks_original", networks_original)
  910. networks_json = json.dumps(networks_original)
  911. changed = False
  912. if v.success:
  913. if request.POST.get('description', None) != None:
  914. v = vapilib.api (
  915. hostname= hostname_default,
  916. api = "post",
  917. op = "set",
  918. cmd = ["firewall", "group", "address-group", groupname, "description", request.POST.get('description')],
  919. description = "set network-group description",
  920. )
  921. changed = True
  922. if request.POST.get('networkgroup_json', None) != None:
  923. try:
  924. networks_new = json.loads(request.POST.get('networkgroup_json'))
  925. except ValueError:
  926. networks_new = {}
  927. vcmsg.log('networks new', networks_new)
  928. for network in networks_new:
  929. v = vapilib.api (
  930. hostname= hostname_default,
  931. api = "post",
  932. op = "set",
  933. cmd = ["firewall", "group", "address-group", groupname, "address", network],
  934. description = "edit address-group network",
  935. )
  936. if v.success and changed == False:
  937. changed = True
  938. vcmsg.log('networks original', networks_original)
  939. for network in networks_original:
  940. if network not in networks_new:
  941. v = vapilib.api (
  942. hostname= hostname_default,
  943. api = "post",
  944. op = "delete",
  945. cmd = ["firewall", "group", "address-group", groupname, "address", network],
  946. description = "delete address-group network",
  947. )
  948. if v.success and changed == False:
  949. changed = True
  950. if changed == True:
  951. return redirect('firewall:firewall-addressgroup-list')
  952. template = loader.get_template('firewall/addressgroup-desc.html')
  953. context = {
  954. 'groupinfo': groupinfo,
  955. 'hostname_default': hostname_default,
  956. 'username': request.user,
  957. 'instances': all_instances,
  958. 'is_superuser' : is_superuser,
  959. 'groupname': groupname,
  960. 'networks_json' : networks_json,
  961. }
  962. return HttpResponse(template.render(context, request))
  963. else:
  964. return redirect('firewall:firewall-addressgroup-list')
  965. @is_authenticated
  966. def firewall_networkgroup_desc(request, groupname):
  967. hostname_default = vyos.get_hostname_prefered(request)
  968. all_instances = vyos.instance_getall_by_group(request)
  969. is_superuser = perms.get_is_superuser(request.user)
  970. v = vapilib.api (
  971. hostname= hostname_default,
  972. api = "get",
  973. op = "showConfig",
  974. cmd = ["firewall", "group", "network-group", groupname],
  975. description = "show network-group config",
  976. )
  977. groupinfo = v.data
  978. if 'network' not in groupinfo:
  979. networks_original = []
  980. else:
  981. networks_original = groupinfo['network']
  982. if type(networks_original) is str:
  983. vcmsg.log("tipo", type(networks_original))
  984. networks_original = [groupinfo['network']]
  985. else:
  986. networks_original = groupinfo['network']
  987. vcmsg.log("networks_original", networks_original)
  988. networks_json = json.dumps(networks_original)
  989. changed = False
  990. if v.success:
  991. if request.POST.get('description', None) != None:
  992. v = vapilib.api (
  993. hostname= hostname_default,
  994. api = "post",
  995. op = "set",
  996. cmd = ["firewall", "group", "network-group", groupname, "description", request.POST.get('description')],
  997. description = "set network-group description",
  998. )
  999. changed = True
  1000. if request.POST.get('networkgroup_json', None) != None:
  1001. try:
  1002. networks_new = json.loads(request.POST.get('networkgroup_json'))
  1003. except ValueError:
  1004. networks_new = {}
  1005. vcmsg.log('networks new', networks_new)
  1006. for network in networks_new:
  1007. v = vapilib.api (
  1008. hostname= hostname_default,
  1009. api = "post",
  1010. op = "set",
  1011. cmd = ["firewall", "group", "network-group", groupname, "network", network],
  1012. description = "edit network-group network",
  1013. )
  1014. if v.success and changed == False:
  1015. changed = True
  1016. vcmsg.log('networks original', networks_original)
  1017. for network in networks_original:
  1018. if network not in networks_new:
  1019. v = vapilib.api (
  1020. hostname= hostname_default,
  1021. api = "post",
  1022. op = "delete",
  1023. cmd = ["firewall", "group", "network-group", groupname, "network", network],
  1024. description = "delete network-group network",
  1025. )
  1026. if v.success and changed == False:
  1027. changed = True
  1028. if changed == True:
  1029. return redirect('firewall:firewall-networkgroup-list')
  1030. template = loader.get_template('firewall/networkgroup-desc.html')
  1031. context = {
  1032. 'groupinfo': groupinfo,
  1033. 'hostname_default': hostname_default,
  1034. 'username': request.user,
  1035. 'instances': all_instances,
  1036. 'is_superuser' : is_superuser,
  1037. 'groupname': groupname,
  1038. 'networks_json' : networks_json,
  1039. }
  1040. return HttpResponse(template.render(context, request))
  1041. else:
  1042. return redirect('firewall:firewall-networkgroup-list')
  1043. @is_authenticated
  1044. def firewall_config(request, firewall_name):
  1045. #interfaces = vyos.get_interfaces()
  1046. all_instances = vyos.instance_getall()
  1047. hostname_default = vyos.get_hostname_prefered(request)
  1048. is_superuser = perms.get_is_superuser(request.user)
  1049. firewall = vyos.get_firewall(hostname_default, firewall_name)
  1050. template = loader.get_template('firewall/show.html')
  1051. context = {
  1052. #'interfaces': interfaces,
  1053. 'instances': all_instances,
  1054. 'hostname_default': hostname_default,
  1055. 'firewall': firewall,
  1056. 'firewall_name': firewall_name,
  1057. 'username': request.user,
  1058. 'is_superuser' : is_superuser,
  1059. }
  1060. return HttpResponse(template.render(context, request))
  1061. @is_authenticated
  1062. def firewall_global(request):
  1063. #interfaces = vyos.get_interfaces()
  1064. all_instances = vyos.instance_getall()
  1065. hostname_default = vyos.get_hostname_prefered(request)
  1066. if int(request.POST.get('allping', 0)) == 1:
  1067. vyos.set_firewall_allping_enable(hostname_default)
  1068. else:
  1069. vyos.set_firewall_allping_disable(hostname_default)
  1070. if int(request.POST.get('syncookies', 0)) == 1:
  1071. vyos.set_firewall_syncookies_enable(hostname_default)
  1072. else:
  1073. vyos.set_firewall_syncookies_disable(hostname_default)
  1074. return redirect('firewall:firewall-list')
  1075. @is_authenticated
  1076. def firewall_remove(request, firewall_name):
  1077. #interfaces = vyos.get_interfaces()
  1078. all_instances = vyos.instance_getall()
  1079. hostname_default = vyos.get_hostname_prefered(request)
  1080. firewall = vyos.delete_firewall(hostname_default, firewall_name)
  1081. return redirect('firewall:firewall-list')
  1082. @is_authenticated
  1083. def firewall_edit(request, firewall_name):
  1084. #interfaces = vyos.get_interfaces()
  1085. all_instances = vyos.instance_getall()
  1086. hostname_default = vyos.get_hostname_prefered(request)
  1087. firewall = vyos.get_firewall(hostname_default, firewall_name)
  1088. firewall['defaultaction'] = firewall['default-action']
  1089. is_superuser = perms.get_is_superuser(request.user)
  1090. changed = False
  1091. if 'description' in request.POST:
  1092. cmd = {"op": "set", "path": ["firewall", "name", firewall_name, "description", request.POST['description']]}
  1093. result2 = vyos.set_config(hostname_default, cmd)
  1094. print(result2)
  1095. changed = True
  1096. if 'action' in request.POST:
  1097. cmd = {"op": "set", "path": ["firewall", "name", firewall_name, "default-action", request.POST['action']]}
  1098. result3 = vyos.set_config(hostname_default, cmd)
  1099. print(result3)
  1100. changed = True
  1101. if changed == True:
  1102. return redirect('firewall:firewall-list')
  1103. template = loader.get_template('firewall/edit.html')
  1104. context = {
  1105. #'interfaces': interfaces,
  1106. 'instances': all_instances,
  1107. 'hostname_default': hostname_default,
  1108. 'firewall_name': firewall_name,
  1109. 'firewall': firewall,
  1110. 'username': request.user,
  1111. 'is_superuser' : is_superuser,
  1112. }
  1113. return HttpResponse(template.render(context, request))