blob: 4640de256a9fdf6425e2f8159832eb76e0afafdf [file] [log] [blame]
Jeremy Mowery3cd52b72015-12-04 11:52:16 -07001
2from core.admin import ReadOnlyAwareAdmin, SliceInline
3from core.middleware import get_request
4from core.models import User
5from django import forms
6from django.contrib import admin
Jeremy Moweryef2af0a2015-12-06 22:43:19 -07007from subprocess import Popen, PIPE
Jeremy Mowery3cd52b72015-12-04 11:52:16 -07008from vpn.models import VPNService, VPNTenant, VPN_KIND
9
10class VPNServiceAdmin(ReadOnlyAwareAdmin):
11 model = VPNService
12 verbose_name = "VPN Service"
13
14 list_display = ("backend_status_icon", "name", "enabled")
15
16 list_display_links = ('backend_status_icon', 'name', )
17
18 fieldsets = [(None, {'fields': ['backend_status_text', 'name', 'enabled',
19 'versionNumber', 'description', "view_url"],
20 'classes':['suit-tab suit-tab-general']})]
21
22 readonly_fields = ('backend_status_text', )
23
24 inlines = [SliceInline]
25
26 extracontext_registered_admins = True
27
28 user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
29
30 suit_form_tabs = (('general', 'VPN Service Details'),
31 ('administration', 'Tenants'),
32 ('slices', 'Slices'),)
33
34 suit_form_includes = (('vpnserviceadmin.html',
35 'top',
36 'administration'),)
37
38 def queryset(self, request):
39 return VPNService.get_service_objects_by_user(request.user)
40
41class VPNTenantForm(forms.ModelForm):
42 creator = forms.ModelChoiceField(queryset=User.objects.all())
43 # They key used to connect to this server
44 server_key = forms.CharField(required=False)
45
46 def __init__(self, *args, **kwargs):
47 super(VPNTenantForm, self).__init__(*args, **kwargs)
48 self.fields['kind'].widget.attrs['readonly'] = True
Jeremy Moweryef2af0a2015-12-06 22:43:19 -070049 # Make the server_key disabled
50 self.fields['server_key'].widget.attrs['disabled'] = True
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070051
52 self.fields[
53 'provider_service'].queryset = VPNService.get_service_objects().all()
54
55 self.fields['kind'].initial = VPN_KIND
56
57 if self.instance:
58 self.fields['creator'].initial = self.instance.creator
59 self.fields['server_key'].initial = self.instance.server_key
60
61 # If there is not an instance then we need to set initial values.
62 if (not self.instance) or (not self.instance.pk):
63 self.fields['creator'].initial = get_request().user
Jeremy Moweryef2af0a2015-12-06 22:43:19 -070064 self.fields['server_key'].initial = generate_VPN_Key()
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070065 if VPNService.get_service_objects().exists():
66 self.fields["provider_service"].initial = VPNService.get_service_objects().all()[0]
67
68 def save(self, commit=True):
69 self.instance.creator = self.cleaned_data.get("creator")
Jeremy Moweryef2af0a2015-12-06 22:43:19 -070070 self.instance.servery_key = self.cleaned_data.get("sever_key")
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070071 return super(VPNTenantForm, self).save(commit=commit)
72
Jeremy Moweryef2af0a2015-12-06 22:43:19 -070073 def generate_VPN_Key():
74 proc = Popen("openvpn --genkey --secret /dev/stdout", shell=True, stdout=PIPE)
75 (stdout, stderr) = proc.communicate()
76 return stdout
77
Jeremy Mowery3cd52b72015-12-04 11:52:16 -070078 class Meta:
79 model = VPNTenant
80
81class VPNTenantAdmin(ReadOnlyAwareAdmin):
82 verbose_name = "VPN Tenant Admin"
83 list_display = ('id', 'backend_status_icon', 'instance')
84 list_display_links = ('id', 'backend_status_icon', 'instance')
85 fieldsets = [(None, {'fields': ['backend_status_text', 'kind',
86 'provider_service', 'instance', 'creator',
87 'server_key'],
88 'classes': ['suit-tab suit-tab-general']})]
89 readonly_fields = ('backend_status_text', 'instance',)
90 form = VPNTenantForm
91
92 suit_form_tabs = (('general', 'Details'),)
93
94 def queryset(self, request):
95 return VPNTenant.get_tenant_objects_by_user(request.user)
96
97# Associate the admin forms with the models.
98admin.site.register(VPNService, VPNServiceAdmin)
99admin.site.register(VPNTenant, VPNTenantAdmin)