views.py 83 KB

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