blob: 522a5049357bc0ce5835d0b0487321ac99096ba5 [file] [log] [blame]
Jeremy Moweryda2c3132016-01-10 15:21:52 -07001import time
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -07002from subprocess import PIPE, Popen
3
Jeremy Mowery3cd52b72015-12-04 11:52:16 -07004from core.admin import ReadOnlyAwareAdmin, SliceInline
5from core.middleware import get_request
6from core.models import User
7from django import forms
8from django.contrib import admin
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -07009from services.vpn.models import VPN_KIND, VPNService, VPNTenant
10
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070011
12class VPNServiceAdmin(ReadOnlyAwareAdmin):
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070013 """Defines the admin for the VPNService."""
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070014 model = VPNService
15 verbose_name = "VPN Service"
16
17 list_display = ("backend_status_icon", "name", "enabled")
18
19 list_display_links = ('backend_status_icon', 'name', )
20
21 fieldsets = [(None, {'fields': ['backend_status_text', 'name', 'enabled',
22 'versionNumber', 'description', "view_url"],
23 'classes':['suit-tab suit-tab-general']})]
24
25 readonly_fields = ('backend_status_text', )
26
27 inlines = [SliceInline]
28
29 extracontext_registered_admins = True
30
31 user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
32
33 suit_form_tabs = (('general', 'VPN Service Details'),
34 ('administration', 'Tenants'),
35 ('slices', 'Slices'),)
36
37 suit_form_includes = (('vpnserviceadmin.html',
38 'top',
39 'administration'),)
40
41 def queryset(self, request):
42 return VPNService.get_service_objects_by_user(request.user)
43
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070044
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070045class VPNTenantForm(forms.ModelForm):
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070046 """The form used to create and edit a VPNTenant.
47
48 Attributes:
49 creator (forms.ModelChoiceField): The XOS user that created this tenant.
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070050 client_conf (forms.CharField): The readonly configuration used on the client to connect to this Tenant.
51 server_address (forms.GenericIPAddressField): The ip address on the VPN of this Tenant.
52 client_address (forms.GenericIPAddressField): The ip address on the VPN of the client.
53 is_persistent (forms.BooleanField): Determines if this Tenant keeps this connection alive through failures.
54 can_view_subnet (forms.BooleanField): Determins if this Tenant makes it's subnet available to the client.
Jeremy Moweryfb7df5a2016-01-08 17:07:46 -070055
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070056 """
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070057 creator = forms.ModelChoiceField(queryset=User.objects.all())
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070058 server_address = forms.GenericIPAddressField(
59 protocol='IPv4', required=True)
60 client_address = forms.GenericIPAddressField(
61 protocol='IPv4', required=True)
Jeremy Mowery59da8f62016-01-06 15:46:02 -070062 is_persistent = forms.BooleanField(required=False)
63 can_view_subnet = forms.BooleanField(required=False)
Jeremy Mowery2e6ac152016-01-11 17:47:05 -070064
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070065
66 def __init__(self, *args, **kwargs):
67 super(VPNTenantForm, self).__init__(*args, **kwargs)
68 self.fields['kind'].widget.attrs['readonly'] = True
Jeremy Moweryb143dfc2016-01-11 22:17:06 -070069 # self.fields['script_name'].widget.attrs['readonly'] = True
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070070 self.fields[
71 'provider_service'].queryset = VPNService.get_service_objects().all()
72
73 self.fields['kind'].initial = VPN_KIND
74
75 if self.instance:
76 self.fields['creator'].initial = self.instance.creator
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070077 self.fields[
78 'server_address'].initial = self.instance.server_address
79 self.fields[
80 'client_address'].initial = self.instance.client_address
Jeremy Mowery6853b2e2016-01-06 15:16:33 -070081 self.fields['is_persistent'].initial = self.instance.is_persistent
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070082 self.fields[
83 'can_view_subnet'].initial = self.instance.can_view_subnet
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070084
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070085 if (not self.instance) or (not self.instance.pk):
86 self.fields['creator'].initial = get_request().user
Jeremy Moweryd2da28f2016-01-05 16:52:43 -070087 self.fields['server_address'].initial = "10.8.0.1"
88 self.fields['client_address'].initial = "10.8.0.2"
Jeremy Mowery6853b2e2016-01-06 15:16:33 -070089 self.fields['is_persistent'].initial = True
90 self.fields['can_view_subnet'].initial = False
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070091 if VPNService.get_service_objects().exists():
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070092 self.fields["provider_service"].initial = VPNService.get_service_objects().all()[
93 0]
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070094
95 def save(self, commit=True):
96 self.instance.creator = self.cleaned_data.get("creator")
Jeremy Moweryd2da28f2016-01-05 16:52:43 -070097 self.instance.server_address = self.cleaned_data.get("server_address")
98 self.instance.client_address = self.cleaned_data.get("client_address")
Jeremy Mowery6853b2e2016-01-06 15:16:33 -070099 self.instance.is_persistent = self.cleaned_data.get('is_persistent')
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -0700100 self.instance.can_view_subnet = self.cleaned_data.get(
101 'can_view_subnet')
Jeremy Mowery70912c92016-01-24 17:40:44 -0700102
103 if self.instance.script_name == None:
104 self.instance.script_name = str(time.time()) + ".vpn"
105
106 if self.instance.server_key == None:
107 self.instance.server_key = self.generate_VPN_key()
108
Jeremy Mowery3cd52b72015-12-04 11:52:16 -0700109 return super(VPNTenantForm, self).save(commit=commit)
110
Jeremy Mowery4fb886b2015-12-06 23:10:49 -0700111 def generate_VPN_key(self):
Jeremy Moweryfb7df5a2016-01-08 17:07:46 -0700112 """str: Generates a VPN key using the openvpn command."""
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -0700113 proc = Popen("openvpn --genkey --secret /dev/stdout",
114 shell=True, stdout=PIPE)
Jeremy Moweryef2af0a2015-12-06 22:43:19 -0700115 (stdout, stderr) = proc.communicate()
116 return stdout
117
Jeremy Mowery3cd52b72015-12-04 11:52:16 -0700118 class Meta:
119 model = VPNTenant
120
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -0700121
Jeremy Mowery3cd52b72015-12-04 11:52:16 -0700122class VPNTenantAdmin(ReadOnlyAwareAdmin):
123 verbose_name = "VPN Tenant Admin"
124 list_display = ('id', 'backend_status_icon', 'instance')
125 list_display_links = ('id', 'backend_status_icon', 'instance')
126 fieldsets = [(None, {'fields': ['backend_status_text', 'kind',
127 'provider_service', 'instance', 'creator',
Jeremy Mowery6853b2e2016-01-06 15:16:33 -0700128 'server_address', 'client_address',
129 'is_persistent', 'can_view_subnet'],
Jeremy Mowery3cd52b72015-12-04 11:52:16 -0700130 'classes': ['suit-tab suit-tab-general']})]
Jeremy Mowery9990a862016-01-11 17:23:44 -0700131 readonly_fields = ('backend_status_text', 'instance')
Jeremy Mowery3cd52b72015-12-04 11:52:16 -0700132 form = VPNTenantForm
133
134 suit_form_tabs = (('general', 'Details'),)
135
136 def queryset(self, request):
137 return VPNTenant.get_tenant_objects_by_user(request.user)
138
139# Associate the admin forms with the models.
140admin.site.register(VPNService, VPNServiceAdmin)
141admin.site.register(VPNTenant, VPNTenantAdmin)