views.py 90 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149
  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 vmsg
  12. from slugify import slugify
  13. from performance import timer
  14. from perms import is_authenticated
  15. import perms
  16. import network
  17. import json
  18. import pprint
  19. import types
  20. from filters.vycontrol_filters import get_item
  21. from filters.vycontrol_filters import get_item_port
  22. from filters.vycontrol_filters import get_item_network
  23. @is_authenticated
  24. def index(request):
  25. #interfaces = vyos.get_interfaces()
  26. all_instances = vyos.instance_getall_by_group(request)
  27. hostname_default = vyos.get_hostname_prefered(request)
  28. """firewall2 = vapilib.api(
  29. hostname = hostname_default,
  30. api = 'get',
  31. op = 'showConfig',
  32. cmd = {"op": "showConfig", "path": ["firewall"]},
  33. description = "get all firewall",
  34. )"""
  35. is_superuser = perms.get_is_superuser(request.user)
  36. firewall_all = vyos.get_firewall_all(hostname_default)
  37. if firewall_all == False:
  38. return redirect('firewall:firewall-create')
  39. for xitem in firewall_all['name']:
  40. if 'default-action' in firewall_all['name'][xitem]:
  41. firewall_all['name'][xitem]['default_action'] = firewall_all['name'][xitem]['default-action']
  42. del firewall_all['name'][xitem]['default-action']
  43. template = loader.get_template('firewall/list.html')
  44. context = {
  45. #'interfaces': interfaces,
  46. 'instances': all_instances,
  47. 'hostname_default': hostname_default,
  48. 'firewall_all': firewall_all,
  49. 'username': request.user,
  50. 'is_superuser' : is_superuser,
  51. }
  52. return HttpResponse(template.render(context, request))
  53. @is_authenticated
  54. def create(request):
  55. #interfaces = vyos.get_interfaces()
  56. all_instances = vyos.instance_getall()
  57. hostname_default = vyos.get_hostname_prefered(request)
  58. is_superuser = perms.get_is_superuser(request.user)
  59. if 'name' in request.POST:
  60. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name']]}
  61. result1 = vyos.set_config(hostname_default, cmd)
  62. print(result1)
  63. if 'description' in request.POST:
  64. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name'], "description", request.POST['description']]}
  65. result2 = vyos.set_config(hostname_default, cmd)
  66. print(result2)
  67. if 'action' in request.POST:
  68. cmd = {"op": "set", "path": ["firewall", "name", request.POST['name'], "default-action", request.POST['action']]}
  69. result3 = vyos.set_config(hostname_default, cmd)
  70. print(result3)
  71. return redirect('firewall:firewall-list')
  72. template = loader.get_template('firewall/create.html')
  73. context = {
  74. #'interfaces': interfaces,
  75. 'instances': all_instances,
  76. 'hostname_default': hostname_default,
  77. 'username': request.user,
  78. 'is_superuser' : is_superuser,
  79. }
  80. return HttpResponse(template.render(context, request))
  81. @is_authenticated
  82. def firewall_removerule(request, firewall_name, firewall_rulenumber):
  83. all_instances = vyos.instance_getall()
  84. hostname_default = vyos.get_hostname_prefered(request)
  85. firewall = vyos.get_firewall(hostname_default, firewall_name)
  86. firewall_rule = vyos.get_firewall_rule(hostname_default, firewall_name, firewall_rulenumber)
  87. if firewall_rule and firewall:
  88. vyos.delete_route_rule(hostname_default, firewall_name, firewall_rulenumber)
  89. return redirect('firewall:show', firewall_name)
  90. def changerule(request, firewall_name, mode, rulenumber=None):
  91. msg = vmsg.msg()
  92. #interfaces = vyos.get_interfaces()
  93. all_instances = vyos.instance_getall()
  94. hostname_default = vyos.get_hostname_prefered(request)
  95. is_superuser = perms.get_is_superuser(request.user)
  96. # get all firewall groups
  97. firewall_group = {}
  98. changed = False
  99. rulenumber_valid = False
  100. ruledata = {}
  101. # netservices /etc/services parser
  102. netservices = network.get_services()
  103. # firewall groups
  104. firewall_group['network-group'] = {}
  105. firewall_group['address-group'] = {}
  106. firewall_group['port-group'] = {}
  107. firewall_group_raw = vapi.get_firewall_group(hostname_default)
  108. if firewall_group_raw.success:
  109. if 'network-group' in firewall_group_raw.data:
  110. firewall_group['network-group'] = firewall_group_raw.data['network-group']
  111. if 'address-group' in firewall_group_raw.data:
  112. firewall_group['address-group'] = firewall_group_raw.data['address-group']
  113. if 'port-group' in firewall_group_raw.data:
  114. firewall_group['port-group'] = firewall_group_raw.data['port-group']
  115. # edit rule without valid rulenumber
  116. if mode == "editrule":
  117. if rulenumber == None:
  118. msg.add_error("Rule number empty")
  119. else:
  120. v = vapi.get_firewall_rulenumber(hostname_default, firewall_name, rulenumber)
  121. if v.success:
  122. ruledata = v.data
  123. # if rule exists control variables are true
  124. rulenumber_valid = True
  125. else:
  126. msg.add_error("There is no rule number inside firewall")
  127. # mode add rule
  128. elif mode == "addrule":
  129. if request.POST.get('rulenumber', None) == None:
  130. #msg.add_error("Rule number empty")
  131. # before fill form rule number is empty
  132. pass
  133. else:
  134. rulenumber = request.POST.get('rulenumber')
  135. if int(rulenumber) >= 1 and int(rulenumber) <= 9999:
  136. rulenumber_valid = True
  137. rulenumber = request.POST.get('rulenumber')
  138. else:
  139. rulenumber_valid = False
  140. msg.add_error("Rule number must be between 1 and 9999")
  141. ###############################################################################################################################################################
  142. # update rule action
  143. if rulenumber_valid and request.POST.get('ruleaction', None) != None:
  144. if request.POST.get('ruleaction') in ["accept", "drop", "reject"]:
  145. if mode == "editrule" and ruledata['action'] and request.POST.get('ruleaction') == ruledata['action']:
  146. msg.add_debug("Action: not changed")
  147. else:
  148. v = vapi.set_firewall_rule_action(hostname_default, firewall_name, rulenumber, request.POST.get('ruleaction'))
  149. if v.success == False:
  150. msg.add_error("Action: fail to change - " + v.reason)
  151. else:
  152. # updating ruledata
  153. ruledata['action'] = request.POST.get('ruleaction')
  154. changed = True
  155. msg.add_success("Action: updated")
  156. else:
  157. msg.add_error("Action invalid")
  158. ###############################################################################################################################################################
  159. # update rule status
  160. if rulenumber_valid and request.POST.get('status', None) != None:
  161. if mode == "editrule":
  162. if request.POST.get('status') == "enable" and "disable" not in ruledata:
  163. msg.add_debug("Status: not changed")
  164. elif request.POST.get('status') == "disable" and "disable" in ruledata:
  165. msg.add_debug("Status: not changed")
  166. elif request.POST.get('status') == "disable" and "disable" not in ruledata:
  167. v = vapi.set_firewall_rule_disabled(hostname_default, firewall_name, rulenumber)
  168. if v.success == False:
  169. msg.add_error("Status: failed to disable - " + v.reason)
  170. else:
  171. # updating ruledata
  172. ruledata['disable'] = {}
  173. ruledata['status'] = 'disabled'
  174. changed = True
  175. msg.add_success("Status disabled")
  176. elif request.POST.get('status') == "enable" and "disable" in ruledata:
  177. v = vapi.set_firewall_rule_enabled(hostname_default, firewall_name, rulenumber)
  178. if v.success == False:
  179. msg.add_error("Status: failed to enable - " + v.reason)
  180. else:
  181. # updating ruledata
  182. del ruledata['disable']
  183. ruledata['status'] = 'enabled'
  184. changed = True
  185. msg.add_success("Status: enabled")
  186. elif mode == "addrule":
  187. if request.POST.get('status') == "disable":
  188. v = vapi.set_firewall_rule_disabled(hostname_default, firewall_name, rulenumber)
  189. if v.success == False:
  190. msg.add_error("Status: failed to disable - " + v.reason)
  191. else:
  192. # updating ruledata
  193. ruledata['disable'] = {}
  194. ruledata['status'] = 'disabled'
  195. changed = True
  196. msg.add_info("Status: disabled")
  197. else:
  198. # nothing to do if status = enable
  199. pass
  200. ###############################################################################################################################################################
  201. # update description
  202. if rulenumber_valid == True and request.POST.get('description', None) != None:
  203. if 'description' in ruledata and request.POST.get('description') == ruledata['description']:
  204. msg.add_debug("Description: not changed")
  205. else:
  206. v = vapi.set_firewall_rule_description(hostname_default, firewall_name, rulenumber, request.POST.get('description'))
  207. if v.success == False:
  208. msg.add_error("Description: failed to update")
  209. else:
  210. # updating ruledata
  211. ruledata['description'] = request.POST.get('description')
  212. changed = True
  213. msg.add_success("Description: updated")
  214. ###############################################################################################################################################################
  215. # update criteria_protocol
  216. if rulenumber_valid == True and request.POST.get('criteria_protocol', None) == "1":
  217. protocol_criteria = None
  218. protocol_criteria_delete = False
  219. # other protocol - todo validate data
  220. if request.POST.get('protocol_criteria', None) == "other":
  221. if request.POST.get('protocol_custom', None) != None:
  222. protocol_criteria = request.POST.get('protocol_custom')
  223. # delete protocol
  224. elif request.POST.get('protocol_criteria', None) == "none":
  225. protocol_criteria_delete = True
  226. if 'protocol' in ruledata:
  227. v = vapi.set_firewall_rule_protocol_delete(hostname_default, firewall_name, rulenumber)
  228. if v.success == False:
  229. msg.add_error("Criteria Protocol: failed to unset - " + v.reason)
  230. else:
  231. del ruledata['protocol']
  232. changed = True
  233. msg.add_success("Criteria Protocol: unset")
  234. else:
  235. msg.add_debug("Criteria Protocol: not changed unset not needed")
  236. # common protocols
  237. elif request.POST.get('protocol_criteria', None) in ['all', 'tcp', 'udp', 'tcp_udp', 'icmp']:
  238. protocol_criteria = request.POST.get('protocol_criteria')
  239. # other cases did not checked anything
  240. if protocol_criteria != None:
  241. # negate protocol
  242. if request.POST.get('protocol_negate', None) == "1":
  243. protocol_negate = "!"
  244. else:
  245. protocol_negate = ""
  246. protocol_criteria_txt = protocol_negate + protocol_criteria
  247. if 'protocol' in ruledata and protocol_criteria_txt == ruledata['protocol']:
  248. msg.add_debug("Criteria Protocol: not changed")
  249. else:
  250. v = vapi.set_firewall_rule_protocol(hostname_default, firewall_name, rulenumber, protocol_criteria_txt)
  251. if v.success == False:
  252. msg.add_error("Criteria Protocol: failed to update - " + v.reason)
  253. else:
  254. # updating ruledata
  255. ruledata['protocol'] = protocol_criteria_txt
  256. changed = True
  257. msg.add_success("Criteria Protocol: updated")
  258. else:
  259. if protocol_criteria_delete != True:
  260. msg.add_error("Criteria Protocol: invalid protocol")
  261. ###############################################################################################################################################################
  262. # update criteria_port (True only to group if block on Visual Studio)
  263. if True:
  264. destinationport_json = request.POST.get('destinationport_json', None)
  265. sourceport_json = request.POST.get('sourceport_json', None)
  266. dport_form = []
  267. sport_form = []
  268. if destinationport_json != None:
  269. try:
  270. dport_form = json.loads(destinationport_json)
  271. except ValueError:
  272. pass
  273. if sourceport_json != None:
  274. try:
  275. sport_form = json.loads(sourceport_json)
  276. except ValueError:
  277. pass
  278. # remove ports unset
  279. dport_delete = []
  280. sport_delete = []
  281. if 'destination' in ruledata and 'port' in ruledata['destination']:
  282. dport_ruledata = ruledata['destination']['port'].split(",")
  283. else:
  284. dport_ruledata = []
  285. if 'source' in ruledata and 'port' in ruledata['source']:
  286. sport_ruledata = ruledata['source']['port'].split(",")
  287. else:
  288. sport_ruledata = []
  289. dport_changes = 0
  290. sport_changes = 0
  291. dport_delete_all = False
  292. sport_delete_all = False
  293. #msg.add_debug("Criteria Ports Destination: ports - " + pprint.pformat(dport_ruledata))
  294. #msg.add_debug("Criteria Ports Source: ports - " + pprint.pformat(sport_ruledata))
  295. # find ports to mark as removed
  296. if rulenumber_valid == True and request.POST.get('criteria_port', None) == "1":
  297. if len(sport_form) == 0:
  298. msg.add_debug("Criteria Ports Source: remove all ports")
  299. sport_ruledata = []
  300. sport_changes = sport_changes + 1
  301. sport_delete_all = True
  302. else:
  303. for port in sport_ruledata:
  304. if port not in sport_form:
  305. sport_ruledata.remove(port)
  306. sport_delete.append(port)
  307. sport_changes = sport_changes + 1
  308. for port in sport_form:
  309. if port not in sport_ruledata:
  310. sport_ruledata.append(port)
  311. sport_changes = sport_changes + 1
  312. if rulenumber_valid == True and request.POST.get('criteria_port', None) == "1":
  313. if len(dport_form) <= 0:
  314. msg.add_debug("Criteria Ports Destination: remove all ports")
  315. dport_ruledata = []
  316. dport_changes = dport_changes + 1
  317. dport_delete_all = True
  318. else:
  319. for port in dport_ruledata:
  320. if port not in dport_form:
  321. dport_ruledata.remove(port)
  322. dport_delete.append(port)
  323. dport_changes = dport_changes + 1
  324. for port in dport_form:
  325. if port not in dport_ruledata:
  326. dport_ruledata.append(port)
  327. dport_changes = dport_changes + 1
  328. if len(dport_delete) > 0:
  329. msg.add_debug("Criteria Ports Destination: remove ports - " + ",".join(dport_delete))
  330. if len(sport_delete) > 0:
  331. msg.add_debug("Criteria Ports Source: remove ports - " + ",".join(sport_delete))
  332. if rulenumber_valid == True and dport_changes > 0:
  333. if dport_delete_all == True:
  334. v = vapi.set_firewall_rule_destination_ports_delete(hostname_default, firewall_name, rulenumber)
  335. if v.success:
  336. changed = True
  337. msg.add_success("Criteria Ports Destination: updated delete all destination success")
  338. if 'destination' in ruledata and 'port' in ruledata['destination']:
  339. del ruledata['destination']['port']
  340. else:
  341. msg.add_error("Criteria Ports Destination: delete all failed - " + v.reason)
  342. else:
  343. msg.add_debug("Criteria Ports Destination: ports - " + ",".join(dport_ruledata))
  344. v = vapi.set_firewall_rule_destination_ports(hostname_default, firewall_name, rulenumber, dport_ruledata)
  345. if v.success:
  346. changed = True
  347. msg.add_success("Criteria Ports Destination: updated")
  348. ruledata['destination']['port'] = ','.join(dport_ruledata)
  349. else:
  350. msg.add_error("Criteria Ports Destination: failed - " + v.reason)
  351. if rulenumber_valid == True and sport_changes > 0:
  352. if sport_delete_all == True:
  353. v = vapi.set_firewall_rule_source_ports_delete(hostname_default, firewall_name, rulenumber)
  354. if v.success:
  355. changed = True
  356. msg.add_success("Criteria Ports Destination: updated delete all source success")
  357. if 'source' in ruledata and 'port' in ruledata['source']:
  358. del ruledata['source']['port']
  359. else:
  360. msg.add_error("Criteria Ports Destination: delete all failed - " + v.reason)
  361. else:
  362. msg.add_debug("Criteria Ports Source: ports - " + ",".join(sport_ruledata))
  363. v = vapi.set_firewall_rule_source_ports(hostname_default, firewall_name, rulenumber, sport_ruledata)
  364. if v.success:
  365. changed = True
  366. msg.add_success("Criteria Ports Source: updated")
  367. ruledata['source']['port'] = ','.join(sport_ruledata)
  368. else:
  369. msg.add_error("Criteria Ports Source: failed - " + v.reason)
  370. ###############################################################################################################################################################
  371. # update criteria_tcpflags
  372. if request.POST.get('criteria_tcpflags', None) == "1":
  373. tcpflags_form = []
  374. if request.POST.get('tcpflags_syn', None) == "1":
  375. tcpflags_form.append('SYN')
  376. if request.POST.get('tcpflags_isyn', None) == "1":
  377. tcpflags_form.append('!SYN')
  378. if request.POST.get('tcpflags_ack', None) == "1":
  379. tcpflags_form.append('ACK')
  380. if request.POST.get('tcpflags_iack', None) == "1":
  381. tcpflags_form.append('!ACK')
  382. if request.POST.get('tcpflags_fin', None) == "1":
  383. tcpflags_form.append('FIN')
  384. if request.POST.get('tcpflags_ifin', None) == "1":
  385. tcpflags_form.append('!FIN')
  386. if request.POST.get('tcpflags_rst', None) == "1":
  387. tcpflags_form.append('RST')
  388. if request.POST.get('tcpflags_irst', None) == "1":
  389. tcpflags_form.append('!RST')
  390. if request.POST.get('tcpflags_urg', None) == "1":
  391. tcpflags_form.append('URG')
  392. if request.POST.get('tcpflags_iurg', None) == "1":
  393. tcpflags_form.append('!URG')
  394. if request.POST.get('tcpflags_psh', None) == "1":
  395. tcpflags_form.append('PSH')
  396. if request.POST.get('tcpflags_ipsh', None) == "1":
  397. tcpflags_form.append('!PSH')
  398. if request.POST.get('tcpflags_all', None) == "1":
  399. tcpflags_form.append('ALL')
  400. if request.POST.get('tcpflags_iall', None) == "1":
  401. tcpflags_form.append('!ALL')
  402. # will need to empty tcpflags
  403. if 'tcp' in ruledata and 'flags' in ruledata['tcp']:
  404. tcpflags_rule = ruledata['tcp']['flags'].split(',')
  405. else:
  406. tcpflags_rule = []
  407. if len(tcpflags_form) == 0 and len(tcpflags_rule) > 0:
  408. v = vapi.set_firewall_rule_tcpflags_delete(hostname_default, firewall_name, rulenumber)
  409. if v.success:
  410. changed = True
  411. msg.add_success("Criteria TCP Ports: empty tcp flags success")
  412. if 'tcp' in ruledata:
  413. if 'flags' in ruledata['tcp']:
  414. del ruledata['tcp']['flags']
  415. else:
  416. msg.add_error("Criteria TCP Ports: empty tcp failed - " + v.reason)
  417. elif len(tcpflags_form) > 0:
  418. v = vapi.set_firewall_rule_tcpflags(hostname_default, firewall_name, rulenumber, tcpflags_form)
  419. if v.success:
  420. changed = True
  421. msg.add_success("Criteria TCP Ports: updated success")
  422. if 'tcp' not in ruledata:
  423. ruledata['tcp'] = {}
  424. ruledata['tcp']['flags'] = ",".join(tcpflags_form)
  425. else:
  426. msg.add_error("Criteria TCP Ports: updated failed - " + v.reason)
  427. ###############################################################################################################################################################
  428. # update criteria_address
  429. if request.POST.get('criteria_address', None) == "1":
  430. if request.POST.get('saddress', None) != None:
  431. saddress = request.POST.get('saddress')
  432. if len(saddress.strip()) == 0:
  433. v = vapi.set_firewall_rule_source_address_delete(hostname_default, firewall_name, rulenumber)
  434. if v.success:
  435. changed = True
  436. msg.add_success("Criteria Source Address: clean success")
  437. if 'source' in ruledata:
  438. if 'address' in ruledata['source']:
  439. del ruledata['source']['address']
  440. else:
  441. msg.add_error("Criteria Source Address: clean failed - " + v.reason)
  442. else:
  443. # negate saddress
  444. if request.POST.get('saddress_negate', None) == "1":
  445. saddress_negate = "!"
  446. else:
  447. saddress_negate = ""
  448. saddress_txt = saddress_negate + saddress
  449. v = vapi.set_firewall_rule_source_address(hostname_default, firewall_name, rulenumber, saddress_txt)
  450. if v.success:
  451. changed = True
  452. msg.add_success("Criteria Source Address: updated success")
  453. if 'source' not in ruledata:
  454. ruledata['source'] = {}
  455. ruledata['source']['address'] = saddress_txt
  456. else:
  457. msg.add_error("Criteria Source Address: updated failed - " + v.reason)
  458. if request.POST.get('daddress', None) != None:
  459. daddress = request.POST.get('daddress')
  460. if len(daddress.strip()) == 0:
  461. v = vapi.set_firewall_rule_destination_address_delete(hostname_default, firewall_name, rulenumber)
  462. if v.success:
  463. changed = True
  464. msg.add_success("Criteria Destination Address: clean success")
  465. if 'destination' in ruledata:
  466. if 'address' in ruledata['destination']:
  467. del ruledata['destination']['address']
  468. else:
  469. msg.add_error("Criteria Destination Address: clean failed - " + v.reason)
  470. else:
  471. # negate daddress_negate
  472. if request.POST.get('daddress_negate', None) == "1":
  473. daddress_negate = "!"
  474. else:
  475. daddress_negate = ""
  476. daddress_txt = daddress_negate + daddress
  477. v = vapi.set_firewall_rule_destination_address(hostname_default, firewall_name, rulenumber, daddress_txt)
  478. if v.success:
  479. changed = True
  480. msg.add_success("Criteria Destination Address: updated success")
  481. if 'destination' not in ruledata:
  482. ruledata['destination'] = {}
  483. ruledata['destination']['address'] = daddress
  484. else:
  485. msg.add_error("Criteria Destination Address: updated failed - " + v.reason)
  486. ###############################################################################################################################################################
  487. # update criteria_addressgroup
  488. if request.POST.get('criteria_addressgroup', None) == "1":
  489. # source address
  490. if request.POST.get('saddressgroup', None) != None:
  491. saddressgroup = request.POST.get('saddressgroup').strip()
  492. else:
  493. saddressgroup = ''
  494. saddressgroup_ruledata = ''
  495. if 'source' in ruledata:
  496. if 'group' in ruledata['source']:
  497. if 'address-group' in ruledata['source']['group']:
  498. saddressgroup_ruledata = ruledata['source']['group']['address-group']
  499. if len(saddressgroup) == 0:
  500. v = vapi.set_firewall_rule_source_addressgroup_delete(hostname_default, firewall_name, rulenumber)
  501. if v.success:
  502. changed = True
  503. msg.add_success("Criteria Source Address Group: delete success")
  504. if 'source' in ruledata:
  505. if 'group' in ruledata['source']:
  506. if 'address-group' in ruledata['source']['group']:
  507. del ruledata['source']['group']['address-group']
  508. else:
  509. msg.add_error("Criteria Source Address Group: delete failed - " + v.reason)
  510. elif saddressgroup != saddressgroup_ruledata:
  511. v = vapi.set_firewall_rule_source_addressgroup(hostname_default, firewall_name, rulenumber, saddressgroup)
  512. if v.success:
  513. changed = True
  514. msg.add_success("Criteria Source Address Group: updated success")
  515. if 'source' not in ruledata:
  516. ruledata['source'] = {}
  517. if 'group' not in ruledata['source']:
  518. ruledata['source']['group'] = {}
  519. ruledata['source']['group']['address-group'] = saddressgroup
  520. else:
  521. msg.add_error("Criteria Source Address Group: updated failed - " + v.reason)
  522. # destination address
  523. if request.POST.get('daddressgroup', None) != None:
  524. daddressgroup = request.POST.get('daddressgroup').strip()
  525. else:
  526. daddressgroup = ''
  527. daddressgroup_ruledata = ''
  528. if 'destination' in ruledata:
  529. if 'group' in ruledata['destination']:
  530. if 'address-group' in ruledata['destination']['group']:
  531. daddressgroup_ruledata = ruledata['destination']['group']['address-group']
  532. if len(daddressgroup) == 0:
  533. v = vapi.set_firewall_rule_destination_addressgroup_delete(hostname_default, firewall_name, rulenumber)
  534. if v.success:
  535. changed = True
  536. msg.add_success("Criteria Destination Address Group: delete success")
  537. if 'destination' in ruledata:
  538. if 'group' in ruledata['destination']:
  539. if 'address-group' in ruledata['destination']['group']:
  540. del ruledata['destination']['group']['address-group']
  541. else:
  542. msg.add_error("Criteria Destination Address Group: delete failed - " + v.reason)
  543. elif daddressgroup != daddressgroup_ruledata:
  544. v = vapi.set_firewall_rule_destination_addressgroup(hostname_default, firewall_name, rulenumber, daddressgroup)
  545. if v.success:
  546. changed = True
  547. msg.add_success("Criteria Destination Address Group: updated success")
  548. if 'destination' not in ruledata:
  549. ruledata['source'] = {}
  550. if 'group' not in ruledata['destination']:
  551. ruledata['destination']['group'] = {}
  552. ruledata['destination']['group']['address-group'] = daddressgroup
  553. else:
  554. msg.add_error("Criteria Destination Address Group: updated failed - " + v.reason)
  555. ###############################################################################################################################################################
  556. # update criteria_networkgroup
  557. if request.POST.get('criteria_networkgroup', None) == "1":
  558. # source group
  559. if request.POST.get('snetworkgroup', None) != None:
  560. snetworkgroup = request.POST.get('snetworkgroup').strip()
  561. else:
  562. snetworkgroup = ''
  563. snetworkgroup_ruledata = ''
  564. if 'source' in ruledata:
  565. if 'group' in ruledata['source']:
  566. if 'network-group' in ruledata['source']['group']:
  567. snetworkgroup_ruledata = ruledata['source']['group']['network-group']
  568. if len(snetworkgroup) == 0:
  569. v = vapi.set_firewall_rule_source_networkgroup_delete(hostname_default, firewall_name, rulenumber)
  570. if v.success:
  571. changed = True
  572. msg.add_success("Criteria Source Network Group: delete success")
  573. if 'source' in ruledata:
  574. if 'group' in ruledata['source']:
  575. if 'network-group' in ruledata['source']['group']:
  576. del ruledata['source']['group']['network-group']
  577. else:
  578. msg.add_error("Criteria Source Network Group: delete failed - " + v.reason)
  579. elif snetworkgroup != snetworkgroup_ruledata:
  580. v = vapi.set_firewall_rule_source_networkgroup(hostname_default, firewall_name, rulenumber, snetworkgroup)
  581. if v.success:
  582. changed = True
  583. msg.add_success("Criteria Source Network Group: updated success")
  584. if 'source' not in ruledata:
  585. ruledata['source'] = {}
  586. if 'group' not in ruledata['source']:
  587. ruledata['source']['group'] = {}
  588. ruledata['source']['group']['network-group'] = snetworkgroup
  589. else:
  590. msg.add_error("Criteria Source Network Group: updated failed - " + v.reason)
  591. # destination group
  592. if request.POST.get('dnetworkgroup', None) != None:
  593. dnetworkgroup = request.POST.get('dnetworkgroup').strip()
  594. else:
  595. dnetworkgroup = ''
  596. dnetworkgroup_ruledata = ''
  597. if 'destination' in ruledata:
  598. if 'group' in ruledata['destination']:
  599. if 'network-group' in ruledata['destination']['group']:
  600. dnetworkgroup_ruledata = ruledata['destination']['group']['network-group']
  601. if len(dnetworkgroup) == 0:
  602. v = vapi.set_firewall_rule_destination_networkgroup_delete(hostname_default, firewall_name, rulenumber)
  603. if v.success:
  604. changed = True
  605. msg.add_success("Criteria Destination Network Group: delete success")
  606. if 'destination' in ruledata:
  607. if 'group' in ruledata['destination']:
  608. if 'network-group' in ruledata['destination']['group']:
  609. del ruledata['destination']['group']['network-group']
  610. else:
  611. msg.add_error("Criteria Destination Network Group: delete failed - " + v.reason)
  612. elif dnetworkgroup != dnetworkgroup_ruledata:
  613. v = vapi.set_firewall_rule_destination_networkgroup(hostname_default, firewall_name, rulenumber, dnetworkgroup)
  614. if v.success:
  615. changed = True
  616. msg.add_success("Criteria Destination Network Group: updated success")
  617. if 'destination' not in ruledata:
  618. ruledata['source'] = {}
  619. if 'group' not in ruledata['destination']:
  620. ruledata['destination']['group'] = {}
  621. ruledata['destination']['group']['network-group'] = dnetworkgroup
  622. else:
  623. msg.add_error("Criteria Destination Network Group: updated failed - " + v.reason)
  624. ###############################################################################################################################################################
  625. # update criteria_portgroup
  626. if request.POST.get('criteria_portgroup', None) == "1":
  627. # source port
  628. if request.POST.get('sportgroup', None) != None:
  629. sportgroup = request.POST.get('sportgroup').strip()
  630. else:
  631. sportgroup = ''
  632. sportgroup_ruledata = ''
  633. if 'source' in ruledata:
  634. if 'group' in ruledata['source']:
  635. if 'port-group' in ruledata['source']['group']:
  636. sportgroup_ruledata = ruledata['source']['group']['port-group']
  637. if len(sportgroup) == 0:
  638. v = vapi.set_firewall_rule_source_portgroup_delete(hostname_default, firewall_name, rulenumber)
  639. if v.success:
  640. changed = True
  641. msg.add_success("Criteria Source Port Group: delete success")
  642. if 'source' in ruledata:
  643. if 'group' in ruledata['source']:
  644. if 'port-group' in ruledata['source']['group']:
  645. del ruledata['source']['group']['port-group']
  646. else:
  647. msg.add_error("Criteria Source Port Group: delete failed - " + v.reason)
  648. elif sportgroup != sportgroup_ruledata:
  649. v = vapi.set_firewall_rule_source_portgroup(hostname_default, firewall_name, rulenumber, sportgroup)
  650. if v.success:
  651. changed = True
  652. msg.add_success("Criteria Source Port Group: updated success")
  653. if 'source' not in ruledata:
  654. ruledata['source'] = {}
  655. if 'group' not in ruledata['source']:
  656. ruledata['source']['group'] = {}
  657. ruledata['source']['group']['port-group'] = sportgroup
  658. else:
  659. msg.add_error("Criteria Source Port Group: updated failed - " + v.reason)
  660. # destination port
  661. if request.POST.get('dportgroup', None) != None:
  662. dportgroup = request.POST.get('dportgroup').strip()
  663. else:
  664. dportgroup = ''
  665. dportgroup_ruledata = ''
  666. if 'destination' in ruledata:
  667. if 'group' in ruledata['destination']:
  668. if 'port-group' in ruledata['destination']['group']:
  669. dportgroup_ruledata = ruledata['destination']['group']['port-group']
  670. if len(dportgroup) == 0:
  671. v = vapi.set_firewall_rule_destination_portgroup_delete(hostname_default, firewall_name, rulenumber)
  672. if v.success:
  673. changed = True
  674. msg.add_success("Criteria Destination Port Group: delete success")
  675. if 'destination' in ruledata:
  676. if 'group' in ruledata['destination']:
  677. if 'port-group' in ruledata['destination']['group']:
  678. del ruledata['destination']['group']['port-group']
  679. else:
  680. msg.add_error("Criteria Destination Port Group: delete failed - " + v.reason)
  681. elif dportgroup != dportgroup_ruledata:
  682. v = vapi.set_firewall_rule_destination_portgroup(hostname_default, firewall_name, rulenumber, dportgroup)
  683. if v.success:
  684. changed = True
  685. msg.add_success("Criteria Destination Port Group: updated success")
  686. if 'destination' not in ruledata:
  687. ruledata['source'] = {}
  688. if 'group' not in ruledata['destination']:
  689. ruledata['destination']['group'] = {}
  690. ruledata['destination']['group']['port-group'] = dportgroup
  691. else:
  692. msg.add_error("Criteria Destination Port Group: updated failed - " + v.reason)
  693. ###############################################################################################################################################################
  694. # update criteria_sourcemac
  695. if request.POST.get('criteria_sourcemac', None) == "1":
  696. if request.POST.get('smac_source', None) != None:
  697. smac = request.POST.get('smac_source')
  698. smac = smac.replace("-",":")
  699. smac = smac.lower()
  700. if len(smac.strip()) == 0:
  701. v = vapi.set_firewall_rule_source_mac_delete(hostname_default, firewall_name, rulenumber)
  702. if v.success:
  703. changed = True
  704. msg.add_success("Criteria Source Mac Address: clean success")
  705. if 'source' in ruledata:
  706. if 'mac-address' in ruledata['source']:
  707. del ruledata['source']['mac-address']
  708. else:
  709. msg.add_error("Criteria Source Mac Address: clean failed - " + v.reason)
  710. else:
  711. # negate smac
  712. if request.POST.get('smac_source_negate', None) == "1":
  713. smac_negate = "!"
  714. else:
  715. smac_negate = ""
  716. smac_txt = smac_negate + smac
  717. smac_original = ''
  718. if 'source' in ruledata:
  719. if 'mac-address' in ruledata['source']:
  720. smac_original = ruledata['source']['mac-address']
  721. if smac_txt != smac_original:
  722. v = vapi.set_firewall_rule_source_mac(hostname_default, firewall_name, rulenumber, smac_txt)
  723. if v.success:
  724. changed = True
  725. msg.add_success("Criteria Source Mac Address: updated success")
  726. if 'source' not in ruledata:
  727. ruledata['source'] = {}
  728. ruledata['source']['mac-address'] = smac_txt
  729. else:
  730. msg.add_error("Criteria Source Mac Address: updated failed - " + v.reason)
  731. ###############################################################################################################################################################
  732. # update criteria_packetstate
  733. if request.POST.get('criteria_packetstate', None) == "1":
  734. packetstates_all = ['established', 'invalid', 'new', 'related']
  735. packetstates_form = []
  736. packetstates_add = []
  737. packetstates_delete = []
  738. if request.POST.get('packetstate_established', None) == "1":
  739. packetstates_form.append('established')
  740. if request.POST.get('packetstate_invalid', None) == "1":
  741. packetstates_form.append('invalid')
  742. if request.POST.get('packetstate_new', None) == "1":
  743. packetstates_form.append('new')
  744. if request.POST.get('packetstate_related', None) == "1":
  745. packetstates_form.append('related')
  746. if len(packetstates_form) == 0:
  747. if 'state' in ruledata:
  748. for pstate in ruledata['state']:
  749. packetstates_delete.append(pstate)
  750. if len(packetstates_form) > 0:
  751. for pstate in packetstates_all:
  752. # check what to add
  753. if 'state' not in ruledata:
  754. if pstate in packetstates_form:
  755. packetstates_add.append(pstate)
  756. else:
  757. if pstate not in ruledata['state']:
  758. if pstate in packetstates_form:
  759. packetstates_add.append(pstate)
  760. else:
  761. if ruledata['state'][pstate] != 'enable':
  762. if pstate in packetstates_form:
  763. packetstates_add.append(pstate)
  764. # check what to delete
  765. if 'state' in ruledata:
  766. if pstate in ruledata['state']:
  767. if ruledata['state'][pstate] == 'enable':
  768. if pstate not in packetstates_form:
  769. packetstates_delete.append(pstate)
  770. if 'state' not in ruledata:
  771. ruledata['state'] = {}
  772. for pstate in packetstates_add:
  773. v = vapi.set_firewall_rule_packetstate(hostname_default, firewall_name, rulenumber, pstate)
  774. if v.success:
  775. changed = True
  776. msg.add_success("Criteria Packet State: state added")
  777. ruledata['state'][pstate] = 'enable'
  778. for pstate in packetstates_delete:
  779. v = vapi.set_firewall_rule_packetstate_delete(hostname_default, firewall_name, rulenumber, pstate)
  780. if v.success:
  781. changed = True
  782. msg.add_success("Criteria Packet State: state delete")
  783. if pstate in ruledata['state']:
  784. del ruledata['state'][pstate]
  785. if changed == True:
  786. msg.add_success("Firewall rule saved")
  787. ruledata_json = json.dumps(ruledata)
  788. #vmsg.log("json", ruledata_json)
  789. template = loader.get_template("firewall/editrule.html")
  790. context = {
  791. #'interfaces': interfaces,
  792. 'instances': all_instances,
  793. 'hostname_default': hostname_default,
  794. 'firewall_name': firewall_name,
  795. 'username': request.user,
  796. 'is_superuser' : is_superuser,
  797. 'services' : netservices['services'],
  798. 'services_common' : netservices['common'],
  799. 'firewall_networkgroup': firewall_group['network-group'],
  800. 'firewall_addressgroup': firewall_group['address-group'],
  801. 'firewall_portgroup': firewall_group['port-group'],
  802. 'mode' : mode,
  803. 'msg' : msg.get_all(),
  804. 'ruledata' : ruledata,
  805. 'ruledata_pretty' : pprint.pformat(ruledata, indent=4, width=120),
  806. 'ruledata_json' : ruledata_json,
  807. 'rulenumber' : rulenumber,
  808. }
  809. return HttpResponse(template.render(context, request))
  810. @is_authenticated
  811. def addrule(request, firewall_name):
  812. return changerule(request, firewall_name, mode="addrule", rulenumber=None)
  813. @is_authenticated
  814. def editrule(request, firewall_name, rulenumber):
  815. return changerule(request, firewall_name, mode="editrule", rulenumber=rulenumber)
  816. @is_authenticated
  817. def show(request, firewall_name):
  818. #interfaces = vyos.get_interfaces()
  819. all_instances = vyos.instance_getall()
  820. hostname_default = vyos.get_hostname_prefered(request)
  821. is_superuser = perms.get_is_superuser(request.user)
  822. firewall = vyos.get_firewall(hostname_default, firewall_name)
  823. template = loader.get_template('firewall/show.html')
  824. context = {
  825. #'interfaces': interfaces,
  826. 'instances': all_instances,
  827. 'hostname_default': hostname_default,
  828. 'firewall': firewall,
  829. 'firewall_name': firewall_name,
  830. 'username': request.user,
  831. 'is_superuser' : is_superuser,
  832. }
  833. return HttpResponse(template.render(context, request))
  834. @is_authenticated
  835. def firewall_portgroup_list(request):
  836. hostname_default = vyos.get_hostname_prefered(request)
  837. firewall_portgroup = vyos.get_firewall_portgroup(hostname_default)
  838. all_instances = vyos.instance_getall_by_group(request)
  839. is_superuser = perms.get_is_superuser(request.user)
  840. template = loader.get_template('firewall/portgroup-list.html')
  841. context = {
  842. 'firewall_portgroup': firewall_portgroup,
  843. 'hostname_default': hostname_default,
  844. 'username': request.user,
  845. 'instances': all_instances,
  846. 'is_superuser' : is_superuser,
  847. }
  848. return HttpResponse(template.render(context, request))
  849. @is_authenticated
  850. def firewall_portgroup_del(request, groupname):
  851. hostname_default = vyos.get_hostname_prefered(request)
  852. vyos.set_firewall_portgroup_del(hostname_default, groupname)
  853. return redirect('firewall:firewall-portgroup-list')
  854. @is_authenticated
  855. def firewall_portgroup_add(request):
  856. hostname_default = vyos.get_hostname_prefered(request)
  857. all_instances = vyos.instance_getall_by_group(request)
  858. is_superuser = perms.get_is_superuser(request.user)
  859. netservices = network.get_services()
  860. if request.POST.get('name', None) != None and request.POST.get('portgroup_ports_hidden', None) != None and request.POST.get('portgroup_ports_hidden') != '':
  861. try:
  862. ports = json.loads(request.POST.get('portgroup_ports_hidden'))
  863. except ValueError:
  864. return redirect('firewall:firewall-portgroup-list')
  865. for port in ports:
  866. vyos.set_firewall_portgroup_add(hostname_default, request.POST.get('name'), port)
  867. if request.POST.get('description', None) != None:
  868. vyos.set_firewall_portgroup_description(hostname_default, request.POST.get('name'), request.POST.get('description'))
  869. return redirect('firewall:firewall-portgroup-list')
  870. template = loader.get_template('firewall/portgroup-add.html')
  871. context = {
  872. 'hostname_default': hostname_default,
  873. 'username': request.user,
  874. 'instances': all_instances,
  875. 'is_superuser' : is_superuser,
  876. 'services_common' : netservices['common'],
  877. 'services' : netservices['services'],
  878. }
  879. return HttpResponse(template.render(context, request))
  880. @is_authenticated
  881. def firewall_portgroup_edit(request, groupname):
  882. hostname_default = vyos.get_hostname_prefered(request)
  883. all_instances = vyos.instance_getall_by_group(request)
  884. is_superuser = perms.get_is_superuser(request.user)
  885. netservices = network.get_services()
  886. portgroups = vyos.get_firewall_portgroup(hostname_default)
  887. portgroups_json = json.dumps(portgroups['port-group'][groupname], separators=(',', ':'))
  888. description = portgroups['port-group'][groupname]['description']
  889. if request.POST.get('description', None) != None:
  890. vyos.set_firewall_portgroup_description(hostname_default, groupname, request.POST.get('description'))
  891. if request.POST.get('portgroup_ports_hidden', None) != None and request.POST.get('portgroup_ports_hidden') != '':
  892. try:
  893. ports = json.loads(request.POST.get('portgroup_ports_hidden'))
  894. except ValueError:
  895. return redirect('firewall:firewall-portgroup-list')
  896. port_remove = []
  897. port_add = []
  898. # each port in vyos database
  899. for port in portgroups['port-group'][groupname]['port']:
  900. # vyos port not in form
  901. if port not in ports:
  902. # so mark to remove
  903. port_remove.append(port)
  904. # each port comming from form
  905. for port in ports:
  906. # form port not in vyos database
  907. if port not in portgroups['port-group'][groupname]['port']:
  908. # so mark to add
  909. port_add.append(port)
  910. # add ports to vyos database
  911. for port in port_add:
  912. vyos.set_firewall_portgroup_add(hostname_default, groupname, port)
  913. # remove ports to vyos database
  914. for port in port_remove:
  915. vyos.set_firewall_portgroup_delete_port(hostname_default, groupname, port)
  916. if request.POST.get('description', None) != None:
  917. vyos.set_firewall_portgroup_description(hostname_default, request.POST.get('name'), request.POST.get('description'))
  918. return redirect('firewall:firewall-portgroup-list')
  919. template = loader.get_template('firewall/portgroup-edit.html')
  920. context = {
  921. 'hostname_default': hostname_default,
  922. 'username': request.user,
  923. 'instances': all_instances,
  924. 'is_superuser' : is_superuser,
  925. 'groupname' : groupname,
  926. 'services_common' : netservices['common'],
  927. 'services' : netservices['services'],
  928. 'description' : description,
  929. 'portgroups_json' : portgroups_json,
  930. }
  931. return HttpResponse(template.render(context, request))
  932. @is_authenticated
  933. def firewall_networkgroup_list(request):
  934. hostname_default = vyos.get_hostname_prefered(request)
  935. firewall_networkgroup = vyos.get_firewall_networkgroup(hostname_default)
  936. all_instances = vyos.instance_getall_by_group(request)
  937. is_superuser = perms.get_is_superuser(request.user)
  938. template = loader.get_template('firewall/networkgroup-list.html')
  939. context = {
  940. 'firewall_networkgroup': firewall_networkgroup,
  941. 'hostname_default': hostname_default,
  942. 'username': request.user,
  943. 'instances': all_instances,
  944. 'is_superuser' : is_superuser,
  945. }
  946. return HttpResponse(template.render(context, request))
  947. @is_authenticated
  948. def firewall_networkgroup_add(request):
  949. hostname_default = vyos.get_hostname_prefered(request)
  950. all_instances = vyos.instance_getall_by_group(request)
  951. is_superuser = perms.get_is_superuser(request.user)
  952. if ( request.POST.get('name', None) != None
  953. and request.POST.get('networkgroup_json', None) != None):
  954. group = request.POST.get('name', None)
  955. description = request.POST.get('description', None)
  956. try:
  957. networks = json.loads(request.POST.get('networkgroup_json'))
  958. except ValueError:
  959. networks = {}
  960. changed = False
  961. vmsg.log('networks', networks)
  962. for network in networks:
  963. v = vapilib.api (
  964. hostname= hostname_default,
  965. api = "post",
  966. op = "set",
  967. cmd = ["firewall", "group", "network-group", group, "network", network],
  968. description = "add network-group network",
  969. )
  970. if v.success and changed == False:
  971. changed = True
  972. # set network description if it was created
  973. if changed == True:
  974. v = vapilib.api (
  975. hostname= hostname_default,
  976. api = "post",
  977. op = "set",
  978. cmd = ["firewall", "group", "network-group", group, "description", description],
  979. description = "set network-group description",
  980. )
  981. return redirect('firewall:firewall-networkgroup-list')
  982. template = loader.get_template('firewall/networkgroup-add.html')
  983. context = {
  984. 'hostname_default': hostname_default,
  985. 'username': request.user,
  986. 'instances': all_instances,
  987. 'is_superuser' : is_superuser,
  988. }
  989. return HttpResponse(template.render(context, request))
  990. @is_authenticated
  991. def firewall_networkgroup_del(request, groupname):
  992. hostname_default = vyos.get_hostname_prefered(request)
  993. vyos.set_firewall_networkgroup_del(hostname_default, groupname)
  994. return redirect('firewall:firewall-networkgroup-list')
  995. @is_authenticated
  996. def firewall_addressgroup_list(request):
  997. hostname_default = vyos.get_hostname_prefered(request)
  998. firewall_addressgroup = vyos.get_firewall_addressgroup(hostname_default)
  999. all_instances = vyos.instance_getall_by_group(request)
  1000. is_superuser = perms.get_is_superuser(request.user)
  1001. template = loader.get_template('firewall/addressgroup-list.html')
  1002. context = {
  1003. 'firewall_addressgroup': firewall_addressgroup,
  1004. 'hostname_default': hostname_default,
  1005. 'username': request.user,
  1006. 'instances': all_instances,
  1007. 'is_superuser' : is_superuser,
  1008. }
  1009. return HttpResponse(template.render(context, request))
  1010. @is_authenticated
  1011. def firewall_addressgroup_add(request):
  1012. hostname_default = vyos.get_hostname_prefered(request)
  1013. all_instances = vyos.instance_getall_by_group(request)
  1014. is_superuser = perms.get_is_superuser(request.user)
  1015. if ( request.POST.get('name', None) != None
  1016. and request.POST.get('addressgroup_json', None) != None):
  1017. group = request.POST.get('name', None)
  1018. description = request.POST.get('description', None)
  1019. try:
  1020. networks = json.loads(request.POST.get('addressgroup_json'))
  1021. except ValueError:
  1022. networks = {}
  1023. changed = False
  1024. vmsg.log('networks', networks)
  1025. for network in networks:
  1026. v = vapilib.api (
  1027. hostname = hostname_default,
  1028. api = "post",
  1029. op = "set",
  1030. cmd = ["firewall", "group", "address-group", group, "address", network],
  1031. description = "add address-group network",
  1032. )
  1033. if v.success and changed == False:
  1034. changed = True
  1035. # set network description if it was created
  1036. if changed == True:
  1037. if description != None:
  1038. v = vapilib.api (
  1039. hostname= hostname_default,
  1040. api = "post",
  1041. op = "set",
  1042. cmd = ["firewall", "group", "address-group", group, "description", description],
  1043. description = "set address-group description",
  1044. )
  1045. return redirect('firewall:firewall-addressgroup-list')
  1046. template = loader.get_template('firewall/addressgroup-add.html')
  1047. context = {
  1048. 'hostname_default': hostname_default,
  1049. 'username': request.user,
  1050. 'instances': all_instances,
  1051. 'is_superuser' : is_superuser,
  1052. }
  1053. return HttpResponse(template.render(context, request))
  1054. @is_authenticated
  1055. def firewall_addressgroup_del(request, groupname):
  1056. hostname_default = vyos.get_hostname_prefered(request)
  1057. vyos.set_firewall_addressgroup_del(hostname_default, groupname)
  1058. return redirect('firewall:firewall-addressgroup-list')
  1059. @is_authenticated
  1060. def firewall_addressgroup_desc(request, groupname):
  1061. hostname_default = vyos.get_hostname_prefered(request)
  1062. all_instances = vyos.instance_getall_by_group(request)
  1063. is_superuser = perms.get_is_superuser(request.user)
  1064. v = vapilib.api (
  1065. hostname= hostname_default,
  1066. api = "get",
  1067. op = "showConfig",
  1068. cmd = ["firewall", "group", "address-group", groupname],
  1069. description = "show address-group config",
  1070. )
  1071. groupinfo = v.data
  1072. if 'address' not in groupinfo:
  1073. networks_original = []
  1074. else:
  1075. networks_original = groupinfo['address']
  1076. if type(networks_original) is str:
  1077. vmsg.log("tipo", type(networks_original))
  1078. networks_original = [groupinfo['address']]
  1079. else:
  1080. networks_original = groupinfo['address']
  1081. vmsg.log("networks_original", networks_original)
  1082. networks_json = json.dumps(networks_original)
  1083. changed = False
  1084. if v.success:
  1085. if request.POST.get('description', None) != None:
  1086. v = vapilib.api (
  1087. hostname= hostname_default,
  1088. api = "post",
  1089. op = "set",
  1090. cmd = ["firewall", "group", "address-group", groupname, "description", request.POST.get('description')],
  1091. description = "set network-group description",
  1092. )
  1093. changed = True
  1094. if request.POST.get('networkgroup_json', None) != None:
  1095. try:
  1096. networks_new = json.loads(request.POST.get('networkgroup_json'))
  1097. except ValueError:
  1098. networks_new = {}
  1099. vmsg.log('networks new', networks_new)
  1100. for network in networks_new:
  1101. v = vapilib.api (
  1102. hostname= hostname_default,
  1103. api = "post",
  1104. op = "set",
  1105. cmd = ["firewall", "group", "address-group", groupname, "address", network],
  1106. description = "edit address-group network",
  1107. )
  1108. if v.success and changed == False:
  1109. changed = True
  1110. vmsg.log('networks original', networks_original)
  1111. for network in networks_original:
  1112. if network not in networks_new:
  1113. v = vapilib.api (
  1114. hostname= hostname_default,
  1115. api = "post",
  1116. op = "delete",
  1117. cmd = ["firewall", "group", "address-group", groupname, "address", network],
  1118. description = "delete address-group network",
  1119. )
  1120. if v.success and changed == False:
  1121. changed = True
  1122. if changed == True:
  1123. return redirect('firewall:firewall-addressgroup-list')
  1124. template = loader.get_template('firewall/addressgroup-desc.html')
  1125. context = {
  1126. 'groupinfo': groupinfo,
  1127. 'hostname_default': hostname_default,
  1128. 'username': request.user,
  1129. 'instances': all_instances,
  1130. 'is_superuser' : is_superuser,
  1131. 'groupname': groupname,
  1132. 'networks_json' : networks_json,
  1133. }
  1134. return HttpResponse(template.render(context, request))
  1135. else:
  1136. return redirect('firewall:firewall-addressgroup-list')
  1137. @is_authenticated
  1138. def firewall_networkgroup_desc(request, groupname):
  1139. hostname_default = vyos.get_hostname_prefered(request)
  1140. all_instances = vyos.instance_getall_by_group(request)
  1141. is_superuser = perms.get_is_superuser(request.user)
  1142. v = vapilib.api (
  1143. hostname= hostname_default,
  1144. api = "get",
  1145. op = "showConfig",
  1146. cmd = ["firewall", "group", "network-group", groupname],
  1147. description = "show network-group config",
  1148. )
  1149. groupinfo = v.data
  1150. if 'network' not in groupinfo:
  1151. networks_original = []
  1152. else:
  1153. networks_original = groupinfo['network']
  1154. if type(networks_original) is str:
  1155. vmsg.log("tipo", type(networks_original))
  1156. networks_original = [groupinfo['network']]
  1157. else:
  1158. networks_original = groupinfo['network']
  1159. vmsg.log("networks_original", networks_original)
  1160. networks_json = json.dumps(networks_original)
  1161. changed = False
  1162. if v.success:
  1163. if request.POST.get('description', None) != None:
  1164. v = vapilib.api (
  1165. hostname= hostname_default,
  1166. api = "post",
  1167. op = "set",
  1168. cmd = ["firewall", "group", "network-group", groupname, "description", request.POST.get('description')],
  1169. description = "set network-group description",
  1170. )
  1171. changed = True
  1172. if request.POST.get('networkgroup_json', None) != None:
  1173. try:
  1174. networks_new = json.loads(request.POST.get('networkgroup_json'))
  1175. except ValueError:
  1176. networks_new = {}
  1177. vmsg.log('networks new', networks_new)
  1178. for network in networks_new:
  1179. v = vapilib.api (
  1180. hostname= hostname_default,
  1181. api = "post",
  1182. op = "set",
  1183. cmd = ["firewall", "group", "network-group", groupname, "network", network],
  1184. description = "edit network-group network",
  1185. )
  1186. if v.success and changed == False:
  1187. changed = True
  1188. vmsg.log('networks original', networks_original)
  1189. for network in networks_original:
  1190. if network not in networks_new:
  1191. v = vapilib.api (
  1192. hostname= hostname_default,
  1193. api = "post",
  1194. op = "delete",
  1195. cmd = ["firewall", "group", "network-group", groupname, "network", network],
  1196. description = "delete network-group network",
  1197. )
  1198. if v.success and changed == False:
  1199. changed = True
  1200. if changed == True:
  1201. return redirect('firewall:firewall-networkgroup-list')
  1202. template = loader.get_template('firewall/networkgroup-desc.html')
  1203. context = {
  1204. 'groupinfo': groupinfo,
  1205. 'hostname_default': hostname_default,
  1206. 'username': request.user,
  1207. 'instances': all_instances,
  1208. 'is_superuser' : is_superuser,
  1209. 'groupname': groupname,
  1210. 'networks_json' : networks_json,
  1211. }
  1212. return HttpResponse(template.render(context, request))
  1213. else:
  1214. return redirect('firewall:firewall-networkgroup-list')
  1215. @is_authenticated
  1216. def firewall_config(request, firewall_name):
  1217. #interfaces = vyos.get_interfaces()
  1218. all_instances = vyos.instance_getall()
  1219. hostname_default = vyos.get_hostname_prefered(request)
  1220. is_superuser = perms.get_is_superuser(request.user)
  1221. firewall = vyos.get_firewall(hostname_default, firewall_name)
  1222. template = loader.get_template('firewall/show.html')
  1223. context = {
  1224. #'interfaces': interfaces,
  1225. 'instances': all_instances,
  1226. 'hostname_default': hostname_default,
  1227. 'firewall': firewall,
  1228. 'firewall_name': firewall_name,
  1229. 'username': request.user,
  1230. 'is_superuser' : is_superuser,
  1231. }
  1232. return HttpResponse(template.render(context, request))
  1233. @is_authenticated
  1234. def firewall_global(request):
  1235. #interfaces = vyos.get_interfaces()
  1236. all_instances = vyos.instance_getall()
  1237. hostname_default = vyos.get_hostname_prefered(request)
  1238. if int(request.POST.get('allping', 0)) == 1:
  1239. vyos.set_firewall_allping_enable(hostname_default)
  1240. else:
  1241. vyos.set_firewall_allping_disable(hostname_default)
  1242. if int(request.POST.get('syncookies', 0)) == 1:
  1243. vyos.set_firewall_syncookies_enable(hostname_default)
  1244. else:
  1245. vyos.set_firewall_syncookies_disable(hostname_default)
  1246. return redirect('firewall:firewall-list')
  1247. @is_authenticated
  1248. def firewall_remove(request, firewall_name):
  1249. #interfaces = vyos.get_interfaces()
  1250. all_instances = vyos.instance_getall()
  1251. hostname_default = vyos.get_hostname_prefered(request)
  1252. firewall = vyos.delete_firewall(hostname_default, firewall_name)
  1253. return redirect('firewall:firewall-list')
  1254. @is_authenticated
  1255. def firewall_edit(request, firewall_name):
  1256. #interfaces = vyos.get_interfaces()
  1257. all_instances = vyos.instance_getall()
  1258. hostname_default = vyos.get_hostname_prefered(request)
  1259. firewall = vyos.get_firewall(hostname_default, firewall_name)
  1260. firewall['defaultaction'] = firewall['default-action']
  1261. is_superuser = perms.get_is_superuser(request.user)
  1262. changed = False
  1263. if 'description' in request.POST:
  1264. cmd = {"op": "set", "path": ["firewall", "name", firewall_name, "description", request.POST['description']]}
  1265. result2 = vyos.set_config(hostname_default, cmd)
  1266. print(result2)
  1267. changed = True
  1268. if 'action' in request.POST:
  1269. cmd = {"op": "set", "path": ["firewall", "name", firewall_name, "default-action", request.POST['action']]}
  1270. result3 = vyos.set_config(hostname_default, cmd)
  1271. print(result3)
  1272. changed = True
  1273. if changed == True:
  1274. return redirect('firewall:firewall-list')
  1275. template = loader.get_template('firewall/edit.html')
  1276. context = {
  1277. #'interfaces': interfaces,
  1278. 'instances': all_instances,
  1279. 'hostname_default': hostname_default,
  1280. 'firewall_name': firewall_name,
  1281. 'firewall': firewall,
  1282. 'username': request.user,
  1283. 'is_superuser' : is_superuser,
  1284. }
  1285. return HttpResponse(template.render(context, request))
  1286. @is_authenticated
  1287. def firewall_zones(request):
  1288. # basic methods all views should call
  1289. all_instances = vyos.instance_getall()
  1290. hostname_default = vyos.get_hostname_prefered(request)
  1291. is_superuser = perms.get_is_superuser(request.user)
  1292. # local methods to prepare env
  1293. get_firewall_zones = vapi.get_firewall_zones(hostname_default) # get all zones since we cannot allow an interface belongs more than one zone
  1294. interfaces_defined = []
  1295. interfaces_defined_form = []
  1296. interfaces_zone = {}
  1297. allzones = []
  1298. allzonesrules = []
  1299. if get_firewall_zones.success:
  1300. allzones = get_firewall_zones.data
  1301. if 'zone' in allzones:
  1302. for zone in allzones['zone']:
  1303. if 'interface' in allzones['zone'][zone]:
  1304. for zoneinterface in allzones['zone'][zone]['interface']:
  1305. interfaces_defined.append(zoneinterface)
  1306. interfaces_defined_form.append("interface_" + zoneinterface)
  1307. interfaces_zone[zoneinterface] = zone
  1308. if 'from' in allzones['zone'][zone]:
  1309. zonerule = {}
  1310. zonerule['dstzone'] = zone
  1311. for zonesrc in allzones['zone'][zone]['from']:
  1312. zonerule['srczone'] = zonesrc
  1313. if 'firewall' in allzones['zone'][zone]['from'][zonesrc]:
  1314. if 'name' in allzones['zone'][zone]['from'][zonesrc]['firewall']:
  1315. zonerule['firewall'] = allzones['zone'][zone]['from'][zonesrc]['firewall']['name']
  1316. allzonesrules.append(zonerule)
  1317. if 'zone' in allzones:
  1318. allzones2 = []
  1319. for zone in allzones['zone']:
  1320. zonec = allzones['zone'][zone]
  1321. zonec['name'] = zone
  1322. allzones2.append(zonec)
  1323. template = loader.get_template('firewall/zones.html')
  1324. context = {
  1325. #'interfaces': interfaces,
  1326. 'instances': all_instances,
  1327. 'hostname_default': hostname_default,
  1328. 'username': request.user,
  1329. 'is_superuser' : is_superuser,
  1330. 'allzones': allzones2,
  1331. 'allzones_pretty': pprint.pformat(allzones2, indent=4, width=120),
  1332. 'allzonesrules' : allzonesrules,
  1333. }
  1334. return HttpResponse(template.render(context, request))
  1335. @is_authenticated
  1336. def firewall_zones_add(request):
  1337. msg = vmsg.msg()
  1338. # basic methods all views should call
  1339. all_instances = vyos.instance_getall()
  1340. hostname_default = vyos.get_hostname_prefered(request)
  1341. is_superuser = perms.get_is_superuser(request.user)
  1342. # local methods to prepare env
  1343. interfaces = vyos.get_interfaces(hostname_default)
  1344. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  1345. get_firewall_zones = vapi.get_firewall_zones(hostname_default) # get all zones since we cannot allow an interface belongs more than one zone
  1346. interfaces_defined = []
  1347. interfaces_defined_form = []
  1348. interfaces_zone = {}
  1349. allzones = []
  1350. if get_firewall_zones.success:
  1351. allzones = get_firewall_zones.data
  1352. if 'zone' in allzones:
  1353. for zone in allzones['zone']:
  1354. if 'interface' in allzones['zone'][zone]:
  1355. for zoneinterface in allzones['zone'][zone]['interface']:
  1356. interfaces_defined.append(zoneinterface)
  1357. interfaces_defined_form.append("interface_" + zoneinterface)
  1358. interfaces_zone[zoneinterface] = zone
  1359. # local control vars
  1360. valid = False
  1361. localzone = False
  1362. if request.POST.get('name', None) != None:
  1363. zonename = request.POST.get('name')
  1364. zonename = zonename.strip()
  1365. if request.POST.get('localzone', None) != None:
  1366. # set local-zone
  1367. v = vapi.set_firewall_zone_localzone(hostname_default, zonename)
  1368. if v.success:
  1369. valid = True
  1370. msg.add_success("Local-zone defined")
  1371. else:
  1372. msg.add_error("Local-zone failed to set")
  1373. else:
  1374. # add all interfaces
  1375. interfaces_form = []
  1376. for rv in request.POST:
  1377. iface_form = None
  1378. if rv.startswith("interface_"):
  1379. rvprefixlen = len("interface_")
  1380. iface_form = rv[rvprefixlen:]
  1381. interfaces_form.append(iface_form)
  1382. v = vapi.set_firewall_zone_interface(hostname_default, zonename, iface_form)
  1383. if v.success:
  1384. valid = True
  1385. msg.add_success("Interface added to zone: " + iface_form)
  1386. else:
  1387. msg.add_error("Interface not added to zone: " + iface_form + " - " + v.reason)
  1388. if valid == True:
  1389. # if editing remove localzone if set
  1390. pass
  1391. if valid == True:
  1392. if request.POST.get('description', None) != None:
  1393. zonedescription = request.POST.get('description')
  1394. zonedescription = zonedescription.strip()
  1395. if len(zonedescription) > 0:
  1396. v = vapi.set_firewall_zone_description(hostname_default, zonename, zonedescription)
  1397. if v.success:
  1398. valid = True
  1399. msg.add_success("Description defined")
  1400. else:
  1401. msg.add_error("Description failed to set")
  1402. if request.POST.get('action', None) != None:
  1403. zoneaction = request.POST.get('action')
  1404. zoneaction = zoneaction.strip()
  1405. if zoneaction in ['drop', 'reject']:
  1406. v = vapi.set_firewall_zone_defaultaction(hostname_default, zonename, zoneaction)
  1407. if v.success:
  1408. valid = True
  1409. msg.add_success("Default action defined")
  1410. else:
  1411. msg.add_error("Default action failed to set")
  1412. msg.add_success("Zone added")
  1413. template = loader.get_template('firewall/zones-add.html')
  1414. context = {
  1415. #'interfaces': interfaces,
  1416. 'instances': all_instances,
  1417. 'hostname_default': hostname_default,
  1418. 'username': request.user,
  1419. 'is_superuser': is_superuser,
  1420. 'interfaces': interfaces,
  1421. 'interfaces_pretty': pprint.pformat(interfaces, indent=4, width=120),
  1422. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1423. 'interfaces_all_names': interfaces_all_names,
  1424. 'msg' : msg.get_all(),
  1425. 'allzones': allzones,
  1426. 'interfaces_defined': interfaces_defined,
  1427. 'interfaces_defined_form': interfaces_defined_form,
  1428. 'interfaces_zone': interfaces_zone,
  1429. 'form_added': valid,
  1430. }
  1431. return HttpResponse(template.render(context, request))
  1432. @is_authenticated
  1433. def firewall_zones_edit(request, zonename):
  1434. # validation
  1435. zonename = zonename.strip()
  1436. msg = vmsg.msg()
  1437. # basic methods all views should call
  1438. all_instances = vyos.instance_getall()
  1439. hostname_default = vyos.get_hostname_prefered(request)
  1440. is_superuser = perms.get_is_superuser(request.user)
  1441. # local methods to prepare env
  1442. interfaces = vyos.get_interfaces(hostname_default)
  1443. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  1444. get_firewall_zones = vapi.get_firewall_zones(hostname_default) # get all zones since we cannot allow an interface belongs more than one zone
  1445. get_firewall_zone = vapi.get_firewall_zone(hostname_default, zonename)
  1446. zoneinfo = get_firewall_zone.data
  1447. form_changed = False
  1448. if request.POST.get('form_changed', None) == "1":
  1449. form_changed = True
  1450. # set interface_alias in format eth0 if has not vif and eth0.vlan if has vlan
  1451. for iname in interfaces_all_names:
  1452. if 'vif' in iname:
  1453. iname['interface_alias'] = "{interface_name}.{vif}".format(interface_name=iname['interface_name'], vif=iname['vif'])
  1454. else:
  1455. iname['interface_alias'] = iname['interface_name']
  1456. # create a dict
  1457. interfaces_all_names_dict = {}
  1458. for iname in interfaces_all_names:
  1459. if 'vif' in iname:
  1460. ialias = "{interface_name}.{vif}".format(interface_name=iname['interface_name'], vif=iname['vif'])
  1461. else:
  1462. ialias = iname['interface_name']
  1463. interfaces_all_names_dict[ialias] = iname
  1464. if zoneinfo == None:
  1465. msg.add_error("Zone not exists")
  1466. template = loader.get_template('firewall/zones-edit.html')
  1467. context = {
  1468. #'interfaces': interfaces,
  1469. 'instances': all_instances,
  1470. 'hostname_default': hostname_default,
  1471. 'username': request.user,
  1472. 'is_superuser': is_superuser,
  1473. 'interfaces': interfaces,
  1474. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1475. 'interfaces_all_names': interfaces_all_names,
  1476. 'msg' : msg.get_all(),
  1477. "zoneinfo": zoneinfo,
  1478. "zonename": zonename,
  1479. "exists": False
  1480. }
  1481. return HttpResponse(template.render(context, request))
  1482. interfaces_defined = []
  1483. interfaces_defined_form = []
  1484. allzones = []
  1485. interfaces_zone_alias = []
  1486. interfaces_zone_alias_other = []
  1487. interfaces_zone = []
  1488. interfaces_zone_other = []
  1489. if get_firewall_zones.success:
  1490. allzones = get_firewall_zones.data
  1491. if 'zone' in allzones:
  1492. for zone in allzones['zone']:
  1493. if 'interface' in allzones['zone'][zone]:
  1494. if isinstance(allzones['zone'][zone]['interface'], list):
  1495. for zoneinterface in allzones['zone'][zone]['interface']:
  1496. if zone == zonename:
  1497. #print("@@@", zone, zoneinterface)
  1498. interfaces_zone_alias.append("interface_" + zoneinterface)
  1499. interfaces_zone.append(zoneinterface)
  1500. else:
  1501. interfaces_zone_alias_other.append("interface_" + zoneinterface)
  1502. interfaces_zone_other.append(zoneinterface)
  1503. interfaces_defined.append(zoneinterface)
  1504. interfaces_defined_form.append("interface_" + zoneinterface)
  1505. else:
  1506. zoneinterface = allzones['zone'][zone]['interface']
  1507. if zone == zonename:
  1508. # print("@@@", zone, zoneinterface)
  1509. interfaces_zone_alias.append("interface_" + zoneinterface)
  1510. interfaces_zone.append(zoneinterface)
  1511. else:
  1512. interfaces_zone_alias_other.append("interface_" + zoneinterface)
  1513. interfaces_zone_other.append(zoneinterface)
  1514. interfaces_defined.append(zoneinterface)
  1515. interfaces_defined_form.append("interface_" + zoneinterface)
  1516. # local control vars
  1517. valid = False
  1518. localzone = False
  1519. # add all interfaces
  1520. interfaces_form = []
  1521. for rv in request.POST:
  1522. iface_form = None
  1523. if rv.startswith("interface_"):
  1524. rvprefixlen = len("interface_")
  1525. iface_form = rv[rvprefixlen:]
  1526. interfaces_form.append(iface_form)
  1527. # each interface unset on form we need to delete from zone
  1528. if form_changed:
  1529. for iface in interfaces_all_names:
  1530. # interface belongs to zone currently
  1531. if iface["interface_alias"] in interfaces_zone:
  1532. # interface not marked on form
  1533. if iface["interface_alias"] not in interfaces_form:
  1534. v = vapi.delete_firewall_zone_interface(hostname_default, zonename, iface["interface_alias"])
  1535. if v.success:
  1536. valid = True
  1537. msg.add_success("Interface {iface} removed from zone.".format(iface=iface["interface_alias"]))
  1538. zalias = "interface_" + iface["interface_alias"]
  1539. if zalias in interfaces_zone_alias:
  1540. interfaces_zone_alias.remove(zalias)
  1541. else:
  1542. msg.add_error("Interface {iface} not removed from zone: {error}".format(iface=iface["interface_alias"], error=v.reason))
  1543. # each interface set on form we need to add to zone
  1544. for iface in interfaces_form:
  1545. if iface in interfaces_zone:
  1546. msg.add_info("Zone add interface {iface} not added since already addded.".format(iface=iface))
  1547. elif iface in interfaces_zone_other:
  1548. msg.add_alert("Zone add interface {iface} not added since belongs to other zone.".format(iface=iface))
  1549. else:
  1550. v = vapi.set_firewall_zone_interface(hostname_default, zonename, iface)
  1551. if v.success:
  1552. valid = True
  1553. msg.add_success("Zone add interface {iface} added.".format(iface=iface))
  1554. zalias = "interface_" + iface
  1555. interfaces_zone_alias.append(zalias)
  1556. else:
  1557. msg.add_success("Zone add interface {iface} not added: {error}.".format(iface=iface, error=v.reason))
  1558. if request.POST.get('description', None) != None:
  1559. zonedescription = request.POST.get('description')
  1560. zonedescription = zonedescription.strip()
  1561. if 'description' not in zoneinfo or zoneinfo['description'] != zonedescription:
  1562. if len(zonedescription) > 0:
  1563. v = vapi.set_firewall_zone_description(hostname_default, zonename, zonedescription)
  1564. if v.success:
  1565. valid = True
  1566. msg.add_success("Description defined")
  1567. zoneinfo['description'] = zonedescription
  1568. else:
  1569. msg.add_success("Description failed to set")
  1570. if request.POST.get('action', None) != None:
  1571. zoneaction = request.POST.get('action')
  1572. zoneaction = zoneaction.strip()
  1573. if zoneaction in ['drop', 'reject']:
  1574. if 'default-action' not in zoneinfo or zoneinfo['default-action'] != zoneaction:
  1575. v = vapi.set_firewall_zone_defaultaction(hostname_default, zonename, zoneaction)
  1576. if v.success:
  1577. valid = True
  1578. msg.add_success("Default action defined")
  1579. zoneinfo['default-action'] = zoneaction
  1580. else:
  1581. msg.add_success("Default action failed to set")
  1582. """if request.POST.get('localzone', None) != None:
  1583. # set local-zone
  1584. v = vapi.set_firewall_zone_localzone(hostname_default, zonename)
  1585. if v.success:
  1586. valid = True
  1587. msg.add_success("Local-zone defined")
  1588. else:
  1589. msg.add_success("Local-zone failed to set")"""
  1590. zoneaction = None
  1591. if 'default-action' in zoneinfo:
  1592. zoneaction = zoneinfo['default-action']
  1593. template = loader.get_template('firewall/zones-edit.html')
  1594. context = {
  1595. #'interfaces': interfaces,
  1596. 'instances': all_instances,
  1597. 'hostname_default': hostname_default,
  1598. 'username': request.user,
  1599. 'is_superuser': is_superuser,
  1600. 'interfaces': interfaces,
  1601. 'interfaces_pretty': pprint.pformat(interfaces, indent=4, width=120),
  1602. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1603. 'interfaces_all_names': interfaces_all_names,
  1604. 'msg' : msg.get_all(),
  1605. 'allzones': allzones,
  1606. 'interfaces_defined': interfaces_defined,
  1607. 'interfaces_defined_form': interfaces_defined_form,
  1608. 'interfaces_zone_alias': interfaces_zone_alias,
  1609. 'interfaces_zone_alias_other': interfaces_zone_alias_other,
  1610. "zoneinfo": zoneinfo,
  1611. "allzones_pretty": pprint.pformat(allzones, indent=4, width=120),
  1612. "zonename": zonename,
  1613. "exists": True,
  1614. 'interfaces_all_names_dict': interfaces_all_names_dict,
  1615. 'interfaces_all_names_dict_pretty': pprint.pformat(interfaces_all_names_dict, indent=4, width=120),
  1616. 'zoneaction': zoneaction,
  1617. }
  1618. return HttpResponse(template.render(context, request))
  1619. @is_authenticated
  1620. def firewall_zones_remove(request, zonename):
  1621. # validation
  1622. zonename = zonename.strip()
  1623. msg = vmsg.msg()
  1624. # basic methods all views should call
  1625. all_instances = vyos.instance_getall()
  1626. hostname_default = vyos.get_hostname_prefered(request)
  1627. is_superuser = perms.get_is_superuser(request.user)
  1628. # local methods to prepare env
  1629. interfaces = vyos.get_interfaces(hostname_default)
  1630. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  1631. get_firewall_zone = vapi.get_firewall_zone(hostname_default, zonename)
  1632. zoneinfo = get_firewall_zone.data
  1633. if zoneinfo == None:
  1634. msg.add_error("Zone not exists")
  1635. else:
  1636. v = vapi.delete_firewall_zone(hostname_default, zonename)
  1637. if v.success:
  1638. msg.add_success("Zone {zone} removed".format(zone=zonename))
  1639. else:
  1640. msg.add_error("Zone {zone} not removed: {error}".format(zone=zonename, error=v.reason))
  1641. template = loader.get_template('firewall/zones-remove.html')
  1642. context = {
  1643. #'interfaces': interfaces,
  1644. 'instances': all_instances,
  1645. 'hostname_default': hostname_default,
  1646. 'username': request.user,
  1647. 'is_superuser': is_superuser,
  1648. 'interfaces': interfaces,
  1649. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1650. 'interfaces_all_names': interfaces_all_names,
  1651. 'msg' : msg.get_all(),
  1652. "zoneinfo": zoneinfo,
  1653. "zonename": zonename,
  1654. }
  1655. return HttpResponse(template.render(context, request))
  1656. @is_authenticated
  1657. def firewall_zones_addrule(request):
  1658. msg = vmsg.msg()
  1659. # basic methods all views should call
  1660. all_instances = vyos.instance_getall()
  1661. hostname_default = vyos.get_hostname_prefered(request)
  1662. is_superuser = perms.get_is_superuser(request.user)
  1663. # local methods to prepare env
  1664. interfaces = vyos.get_interfaces(hostname_default)
  1665. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  1666. get_firewall_zones = vapi.get_firewall_zones(hostname_default)
  1667. zones = []
  1668. if get_firewall_zones.success:
  1669. allzones = get_firewall_zones.data
  1670. if 'zone' in allzones:
  1671. for zone in allzones['zone']:
  1672. zones.append(zone)
  1673. firewalls = []
  1674. firewall_all = vyos.get_firewall_all(hostname_default)
  1675. if firewall_all == False:
  1676. return redirect('firewall:firewall-create')
  1677. if 'name' in firewall_all:
  1678. for firewall in firewall_all['name']:
  1679. firewalls.append(firewall)
  1680. reverse = False
  1681. if request.POST.get('reverse', None) == "1":
  1682. reverse = True
  1683. dstzone = None
  1684. srczone = None
  1685. firewallrule = None
  1686. if request.POST.get('dstzone', None) != None:
  1687. dstzone = request.POST.get('dstzone').strip()
  1688. if request.POST.get('srczone', None) != None:
  1689. srczone = request.POST.get('srczone').strip()
  1690. if request.POST.get('firewall', None) != None:
  1691. firewallrule = request.POST.get('firewall').strip()
  1692. if dstzone != None and srczone != None and firewallrule != None:
  1693. v = vapi.set_interface_firewall_zone_addrule(hostname_default, dstzone, srczone, firewallrule)
  1694. if v.success:
  1695. msg.add_success("Zone ruleset zone {dst} from {src} firewall {firewall} added".format(
  1696. dst=dstzone,
  1697. src=srczone,
  1698. firewall=firewallrule
  1699. ))
  1700. else:
  1701. msg.add_error("Zone ruleset {dst} from {src} firewall {firewall} not added: {reason}".format(
  1702. dst=dstzone,
  1703. src=srczone,
  1704. firewall=firewallrule
  1705. ))
  1706. if reverse == True:
  1707. v = vapi.set_interface_firewall_zone_addrule(hostname_default, srczone, dstzone, firewallrule)
  1708. if v.success:
  1709. msg.add_success("Zone reverse ruleset {dst} from {src} firewall {firewall} added".format(
  1710. dst=srczone,
  1711. src=dstzone,
  1712. firewall=firewallrule
  1713. ))
  1714. else:
  1715. msg.add_error("Zone reverse ruleset {dst} from {src} firewall {firewall} not added: {reason}".format(
  1716. dst=srczone,
  1717. src=dstzone,
  1718. firewall=firewallrule
  1719. ))
  1720. template = loader.get_template('firewall/zones-addrule.html')
  1721. context = {
  1722. #'interfaces': interfaces,
  1723. 'instances': all_instances,
  1724. 'hostname_default': hostname_default,
  1725. 'username': request.user,
  1726. 'is_superuser': is_superuser,
  1727. 'interfaces': interfaces,
  1728. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1729. 'interfaces_all_names': interfaces_all_names,
  1730. 'msg' : msg.get_all(),
  1731. 'zones' : zones,
  1732. 'firewalls' : firewalls
  1733. }
  1734. return HttpResponse(template.render(context, request))
  1735. @is_authenticated
  1736. def firewall_zones_removerule(request, dstzone, srczone, firewall):
  1737. # validation
  1738. dstzone = dstzone.strip()
  1739. srczone = srczone.strip()
  1740. firewall = firewall.strip()
  1741. msg = vmsg.msg()
  1742. # basic methods all views should call
  1743. all_instances = vyos.instance_getall()
  1744. hostname_default = vyos.get_hostname_prefered(request)
  1745. is_superuser = perms.get_is_superuser(request.user)
  1746. # local methods to prepare env
  1747. interfaces = vyos.get_interfaces(hostname_default)
  1748. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  1749. get_firewall_zonedst = vapi.get_firewall_zone(hostname_default, dstzone)
  1750. zoneinfodst = get_firewall_zonedst.data
  1751. get_firewall_zonesrc = vapi.get_firewall_zone(hostname_default, srczone)
  1752. zoneinfosrc = get_firewall_zonesrc.data
  1753. if zoneinfodst == None or zoneinfosrc == None:
  1754. msg.add_error("Zone not exists")
  1755. else:
  1756. v = vapi.delete_interface_firewall_zone_rule(hostname_default, dstzone, srczone)
  1757. if v.success:
  1758. msg.add_success("Zone ruleset {dst} from {src} removed".format(
  1759. dst=dstzone,
  1760. src=srczone,
  1761. ))
  1762. else:
  1763. msg.add_error("Zone ruleset {dst} from {src} not removed: {reason}".format(
  1764. dst=dstzone,
  1765. src=srczone,
  1766. reason=v.reason
  1767. ))
  1768. template = loader.get_template('firewall/zones-removerule.html')
  1769. context = {
  1770. #'interfaces': interfaces,
  1771. 'instances': all_instances,
  1772. 'hostname_default': hostname_default,
  1773. 'username': request.user,
  1774. 'is_superuser': is_superuser,
  1775. 'interfaces': interfaces,
  1776. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  1777. 'interfaces_all_names': interfaces_all_names,
  1778. 'msg' : msg.get_all(),
  1779. }
  1780. return HttpResponse(template.render(context, request))