views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from django.template import loader
  4. from django.conf import settings
  5. from django.shortcuts import redirect
  6. from django.urls import reverse
  7. from django.template.defaultfilters import register
  8. import vyos
  9. from perms import is_authenticated
  10. import perms
  11. import vycontrol_vyos_api as vapi
  12. from config.models import Instance
  13. import pprint
  14. @register.filter
  15. def get_item(dictionary, key):
  16. return dictionary.get(key)
  17. @is_authenticated
  18. def index(request):
  19. hostname_default = vyos.get_hostname_prefered(request)
  20. all_instances = vyos.instance_getall()
  21. firewall_all = vyos.get_firewall_all(hostname_default)
  22. interfaces = vyos.get_interfaces(hostname_default)
  23. is_superuser = perms.get_is_superuser(request.user)
  24. interfaces_all_names = vyos.get_interfaces_all_names(hostname_default)
  25. interface_firewall_in = {}
  26. interface_firewall_out = {}
  27. interface_address = {}
  28. firewall_names = []
  29. # set interface_alias in format eth0 if has not vif and eth0.vlan if has vlan
  30. for iname in interfaces_all_names:
  31. if 'vif' in iname:
  32. iname['interface_alias'] = "{interface_name}.{vif}".format(interface_name=iname['interface_name'], vif=iname['vif'])
  33. else:
  34. iname['interface_alias'] = iname['interface_name']
  35. # create firewall_in and firewall_out vars
  36. for interface_type in interfaces:
  37. for interface_name in interfaces[interface_type]:
  38. try:
  39. interface_firewall_in[interface_name] = interfaces[interface_type][interface_name]['firewall']['in']['name']
  40. except:
  41. pass
  42. try:
  43. interface_firewall_out[interface_name] = interfaces[interface_type][interface_name]['firewall']['out']['name']
  44. except:
  45. pass
  46. if interface_name not in interface_address:
  47. interface_address[interface_name] = []
  48. try:
  49. interface_address[interface_name].append(interfaces[interface_type][interface_name]['address'])
  50. except:
  51. pass
  52. if 'vif' in interfaces[interface_type][interface_name]:
  53. for vif in interfaces[interface_type][interface_name]['vif']:
  54. interface_name_full = "{interface_name}.{vif}".format(interface_name=interface_name, vif=vif)
  55. try:
  56. interface_firewall_in[interface_name_full] = interfaces[interface_type][interface_name]['vif'][vif]['firewall']['in']['name']
  57. except:
  58. pass
  59. try:
  60. interface_firewall_out[interface_name_full] = interfaces[interface_type][interface_name]['vif'][vif]['firewall']['out']['name']
  61. except:
  62. pass
  63. if interface_name_full not in interface_address:
  64. interface_address[interface_name_full] = []
  65. try:
  66. interface_address[interface_name_full].append(interfaces[interface_type][interface_name]['vif'][vif]['address'])
  67. except:
  68. pass
  69. # put all information in a single var: interface_all_names
  70. for iname in interfaces_all_names:
  71. if 'vif' in iname:
  72. ialias = "{interface_name}.{vif}".format(interface_name=iname['interface_name'], vif=iname['vif'])
  73. else:
  74. ialias = iname['interface_name']
  75. if ialias in interface_firewall_out:
  76. iname['firewall_out'] = interface_firewall_out[ialias]
  77. if ialias in interface_firewall_in:
  78. iname['firewall_in'] = interface_firewall_in[ialias]
  79. if ialias in interface_address:
  80. iname['address'] = interface_address[ialias]
  81. if 'name' in firewall_all:
  82. for fname in firewall_all['name']:
  83. firewall_names.append(fname)
  84. # create a dict
  85. interfaces_all_names_dict = {}
  86. for iname in interfaces_all_names:
  87. if 'vif' in iname:
  88. ialias = "{interface_name}.{vif}".format(interface_name=iname['interface_name'], vif=iname['vif'])
  89. else:
  90. ialias = iname['interface_name']
  91. interfaces_all_names_dict[ialias] = iname
  92. fw_changed = False
  93. for el in request.POST:
  94. interface_vif = None
  95. if el.startswith('firewall-ipv4-in'):
  96. pos = el.split(".")
  97. interface_type = pos[1]
  98. interface_name = pos[2]
  99. if len(pos) >= 4:
  100. interface_vif = pos[3]
  101. ialias = "{interface_name}.{vif}".format(interface_name=interface_name, vif=interface_vif)
  102. else:
  103. ialias = interface_name
  104. firewall_name = request.POST[el]
  105. if firewall_name == "--remove--":
  106. if 'firewall_in' in interfaces_all_names_dict[ialias]:
  107. v = vapi.delete_interface_firewall_ipv4(hostname_default, interface_type, interface_name, "in", interface_vif)
  108. #print("@@@@@@@@@@@@@@@@@ in delete", hostname_default, interface_type, interface_name, "in", firewall_name, interface_vif)
  109. else:
  110. pass
  111. #print("@@@@@ not 1", interfaces_all_names_dict[ialias], firewall_name)
  112. else:
  113. if 'firewall_in' not in interfaces_all_names_dict[ialias] or interfaces_all_names_dict[ialias]['firewall_in'] != firewall_name:
  114. v = vapi.set_interface_firewall_ipv4(hostname_default, interface_type, interface_name, "in", firewall_name, interface_vif)
  115. #print("@@@@@@@@@@@@@@@@@ in add", hostname_default, interface_type, interface_name, "in", firewall_name, interface_vif)
  116. else:
  117. pass
  118. #print("@@@@@ not 2", interfaces_all_names_dict[ialias], firewall_name )
  119. fw_changed = True
  120. elif el.startswith('firewall-ipv4-out'):
  121. pos = el.split(".")
  122. interface_type = pos[1]
  123. interface_name = pos[2]
  124. if len(pos) >= 4:
  125. interface_vif = pos[3]
  126. ialias = "{interface_name}.{vif}".format(interface_name=interface_name, vif=interface_vif)
  127. else:
  128. ialias = interface_name
  129. firewall_name = request.POST[el]
  130. if firewall_name == "--remove--":
  131. if 'firewall_out' in interfaces_all_names_dict[ialias]:
  132. v = vapi.delete_interface_firewall_ipv4(hostname_default, interface_type, interface_name, "out", interface_vif)
  133. #print("@@@@@@@@@@@@@@@@@ out delete", hostname_default, interface_type, interface_name, "out", firewall_name, interface_vif)
  134. else:
  135. #print("@@@@@ not 3", interfaces_all_names_dict[ialias], firewall_name)
  136. pass
  137. else:
  138. if 'firewall_out' not in interfaces_all_names_dict[ialias] or interfaces_all_names_dict[ialias]['firewall_out'] != firewall_name:
  139. v = vapi.set_interface_firewall_ipv4(hostname_default, interface_type, interface_name, "out", firewall_name, interface_vif)
  140. #print("@@@@@@@@@@@@@@@@@ out add", hostname_default, interface_type, interface_name, "out", firewall_name, interface_vif)
  141. else:
  142. #print("@@@@@ not 4", interfaces_all_names_dict[ialias], firewall_name)
  143. pass
  144. fw_changed = True
  145. if fw_changed == True:
  146. return redirect('interface:interface-list')
  147. template = loader.get_template('interface/index.html')
  148. context = {
  149. 'interfaces': interfaces,
  150. 'interfaces_pretty': pprint.pformat(interfaces, indent=4, width=120),
  151. 'interfaces_all_names': interfaces_all_names,
  152. 'interfaces_all_names_pretty': pprint.pformat(interfaces_all_names, indent=4, width=120),
  153. 'instances': all_instances,
  154. 'hostname_default': hostname_default,
  155. 'firewall_all' : firewall_all,
  156. 'firewall_names' : firewall_names,
  157. 'interface_firewall_in' : interface_firewall_in,
  158. 'interface_firewall_out' : interface_firewall_out,
  159. 'interface_firewall_in_pretty' : pprint.pformat(interface_firewall_in, indent=4, width=120),
  160. 'interface_firewall_out_pretty' : pprint.pformat(interface_firewall_out, indent=4, width=120),
  161. 'username': request.user,
  162. 'is_superuser' : is_superuser,
  163. }
  164. return HttpResponse(template.render(context, request))
  165. @is_authenticated
  166. def interfaceshow(request, interface_type, interface_name):
  167. all_instances = vyos.instance_getall()
  168. hostname_default = vyos.get_hostname_prefered(request)
  169. firewall_all = vyos.get_firewall_all(hostname_default)
  170. interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
  171. is_superuser = perms.get_is_superuser(request.user)
  172. template = loader.get_template('interface/show.html')
  173. context = {
  174. 'interface': interface,
  175. 'instances': all_instances,
  176. 'interface_type' : interface_type,
  177. 'interface_name' : interface_name,
  178. 'hostname_default': hostname_default,
  179. 'firewall_all' : firewall_all,
  180. 'username': request.user,
  181. 'is_superuser' : is_superuser,
  182. }
  183. return HttpResponse(template.render(context, request))
  184. @is_authenticated
  185. def interfacefirewall(request, interface_type, interface_name):
  186. all_instances = vyos.instance_getall()
  187. is_superuser = perms.get_is_superuser(request.user)
  188. hostname_default = vyos.get_hostname_prefered(request)
  189. interface = vyos.get_interface(interface_type, interface_name, hostname=hostname_default)
  190. template = loader.get_template('interface/show.html')
  191. context = {
  192. 'interface': interface,
  193. 'instances': all_instances,
  194. 'hostname_default': hostname_default,
  195. 'interface_type' : interface_type,
  196. 'interface_name' : interface_name,
  197. 'username': request.user,
  198. 'is_superuser' : is_superuser,
  199. }
  200. return HttpResponse(template.render(context, request))