blob: 9104168452d2deeb726e9701a8a7f88d59b200ac [file] [log] [blame]
Jeremy Mowerye02d4b62016-01-10 15:21:52 -07001import time
Jeremy Mowery82760822016-01-08 16:36:22 -07002from subprocess import PIPE, Popen
3
Jeremy Mowery8b664f72015-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 Mowery82760822016-01-08 16:36:22 -07009from services.vpn.models import VPN_KIND, VPNService, VPNTenant
10
Jeremy Mowery8b664f72015-12-04 11:52:16 -070011
12class VPNServiceAdmin(ReadOnlyAwareAdmin):
Jeremy Mowery82760822016-01-08 16:36:22 -070013 """Defines the admin for the VPNService."""
Jeremy Mowery8b664f72015-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 Mowery82760822016-01-08 16:36:22 -070044
Jeremy Mowery8b664f72015-12-04 11:52:16 -070045class VPNTenantForm(forms.ModelForm):
Jeremy Mowery82760822016-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 Mowery82760822016-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 Moweryc951d5b2016-01-08 17:07:46 -070055
Jeremy Mowery82760822016-01-08 16:36:22 -070056 """
Jeremy Mowery8b664f72015-12-04 11:52:16 -070057 creator = forms.ModelChoiceField(queryset=User.objects.all())
Jeremy Mowery82760822016-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 Moweryb3fcf1b2016-01-06 15:46:02 -070062 is_persistent = forms.BooleanField(required=False)
63 can_view_subnet = forms.BooleanField(required=False)
Jeremy Moweryc825c3c2016-01-11 17:47:05 -070064
Jeremy Mowery8b664f72015-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 Mowery85250312016-01-11 22:17:06 -070069 # self.fields['script_name'].widget.attrs['readonly'] = True
Jeremy Mowery8b664f72015-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 Mowery82760822016-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 Mowery4a23e7d2016-01-06 15:16:33 -070081 self.fields['is_persistent'].initial = self.instance.is_persistent
Jeremy Mowery82760822016-01-08 16:36:22 -070082 self.fields[
83 'can_view_subnet'].initial = self.instance.can_view_subnet
Jeremy Mowery8b664f72015-12-04 11:52:16 -070084
Jeremy Mowery8b664f72015-12-04 11:52:16 -070085 if (not self.instance) or (not self.instance.pk):
86 self.fields['creator'].initial = get_request().user
Jeremy Mowerybd2ed3a2016-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 Mowery4a23e7d2016-01-06 15:16:33 -070089 self.fields['is_persistent'].initial = True
90 self.fields['can_view_subnet'].initial = False
Jeremy Mowery8b664f72015-12-04 11:52:16 -070091 if VPNService.get_service_objects().exists():
Jeremy Mowery82760822016-01-08 16:36:22 -070092 self.fields["provider_service"].initial = VPNService.get_service_objects().all()[
93 0]
Jeremy Mowery8b664f72015-12-04 11:52:16 -070094
95 def save(self, commit=True):
96 self.instance.creator = self.cleaned_data.get("creator")
Jeremy Mowerybd2ed3a2016-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 Mowery4a23e7d2016-01-06 15:16:33 -070099 self.instance.is_persistent = self.cleaned_data.get('is_persistent')
Jeremy Mowery82760822016-01-08 16:36:22 -0700100 self.instance.can_view_subnet = self.cleaned_data.get(
101 'can_view_subnet')
Jeremy Mowery71aec162016-01-24 17:40:44 -0700102
Jeremy Mowery7ef4e2f2016-01-25 23:12:15 -0700103 self.instance.script_name = "hell"
Jeremy Mowery71aec162016-01-24 17:40:44 -0700104
Jeremy Mowery28223392016-01-25 20:51:11 -0700105 if (not self.instance.server_key):
Jeremy Mowery71aec162016-01-24 17:40:44 -0700106 self.instance.server_key = self.generate_VPN_key()
107
Jeremy Mowery8b664f72015-12-04 11:52:16 -0700108 return super(VPNTenantForm, self).save(commit=commit)
109
Jeremy Mowerye1260de2015-12-06 23:10:49 -0700110 def generate_VPN_key(self):
Jeremy Moweryc951d5b2016-01-08 17:07:46 -0700111 """str: Generates a VPN key using the openvpn command."""
Jeremy Mowery82760822016-01-08 16:36:22 -0700112 proc = Popen("openvpn --genkey --secret /dev/stdout",
113 shell=True, stdout=PIPE)
Jeremy Mowery8e91e872015-12-06 22:43:19 -0700114 (stdout, stderr) = proc.communicate()
115 return stdout
116
Jeremy Mowery8b664f72015-12-04 11:52:16 -0700117 class Meta:
118 model = VPNTenant
119
Jeremy Mowery82760822016-01-08 16:36:22 -0700120
Jeremy Mowery8b664f72015-12-04 11:52:16 -0700121class VPNTenantAdmin(ReadOnlyAwareAdmin):
122 verbose_name = "VPN Tenant Admin"
123 list_display = ('id', 'backend_status_icon', 'instance')
124 list_display_links = ('id', 'backend_status_icon', 'instance')
125 fieldsets = [(None, {'fields': ['backend_status_text', 'kind',
126 'provider_service', 'instance', 'creator',
Jeremy Mowery4a23e7d2016-01-06 15:16:33 -0700127 'server_address', 'client_address',
128 'is_persistent', 'can_view_subnet'],
Jeremy Mowery8b664f72015-12-04 11:52:16 -0700129 'classes': ['suit-tab suit-tab-general']})]
Jeremy Moweryfc502422016-01-11 17:23:44 -0700130 readonly_fields = ('backend_status_text', 'instance')
Jeremy Mowery8b664f72015-12-04 11:52:16 -0700131 form = VPNTenantForm
132
133 suit_form_tabs = (('general', 'Details'),)
134
135 def queryset(self, request):
136 return VPNTenant.get_tenant_objects_by_user(request.user)
137
138# Associate the admin forms with the models.
139admin.site.register(VPNService, VPNServiceAdmin)
140admin.site.register(VPNTenant, VPNTenantAdmin)