blob: 2da02d8dbc7843bd6ef84b4dedcc549bd8be4f86 [file] [log] [blame]
Jeremy Mowery4cdec802015-12-04 13:50:05 -07001import os
2import sys
Jeremy Mowery37d8a432016-02-07 17:07:55 -07003import time
4
5from django.db.models import F, Q
Jeremy Mowery3384d2d2016-01-05 00:30:24 -07006from services.vpn.models import VPNTenant
Jeremy Mowery37d8a432016-02-07 17:07:55 -07007from synchronizers.base.SyncInstanceUsingAnsible import \
8 SyncInstanceUsingAnsible
Jeremy Mowery4cdec802015-12-04 13:50:05 -07009
10parentdir = os.path.join(os.path.dirname(__file__), "..")
11sys.path.insert(0, parentdir)
12
Jeremy Mowery37d8a432016-02-07 17:07:55 -070013
Jeremy Mowery4cdec802015-12-04 13:50:05 -070014class SyncVPNTenant(SyncInstanceUsingAnsible):
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070015 """Class for syncing a VPNTenant using Ansible."""
Jeremy Mowery4cdec802015-12-04 13:50:05 -070016 provides = [VPNTenant]
17 observes = VPNTenant
18 requested_interval = 0
19 template_name = "sync_vpntenant.yaml"
Jeremy Mowery594b7962016-01-24 19:42:30 -070020 service_key_name = "/opt/xos/synchronizers/vpn/vpn_private_key"
Jeremy Mowery4cdec802015-12-04 13:50:05 -070021
22 def __init__(self, *args, **kwargs):
23 super(SyncVPNTenant, self).__init__(*args, **kwargs)
24
25 def fetch_pending(self, deleted):
26 if (not deleted):
27 objs = VPNTenant.get_tenant_objects().filter(
28 Q(enacted__lt=F('updated')) | Q(enacted=None), Q(lazy_blocked=False))
29 else:
30 objs = VPNTenant.get_deleted_tenant_objects()
31
32 return objs
33
Jeremy Mowery37d8a432016-02-07 17:07:55 -070034 def get_extra_attributes(self, tenant):
35 return {"server_key": tenant.server_key,
36 "is_persistent": tenant.is_persistent,
37 "vpn_subnet": tenant.vpn_subnet,
38 "server_network": tenant.server_network,
39 "clients_can_see_each_other": tenant.clients_can_see_each_other,
40 "ca_crt": tenant.ca_crt,
41 "server_crt": tenant.server_crt,
42 "dh": tenant.dh
43 }
Jeremy Mowery6cacf1b2016-01-05 17:50:56 -070044
Jeremy Moweryda2c3132016-01-10 15:21:52 -070045 def create_client_script(self, tenant):
Jeremy Mowery0111e922016-01-25 20:51:11 -070046 script = open("/opt/xos/core/static/vpn/" + str(tenant.script), 'w')
Jeremy Moweryda2c3132016-01-10 15:21:52 -070047 # write the configuration portion
48 script.write("printf \"")
49 for line in self.generate_client_conf(tenant).splitlines():
50 script.write(line + r"\n")
51 script.write("\" > client.conf\n")
Jeremy Mowery37d8a432016-02-07 17:07:55 -070052 script.write("printf \"")
53 for line in self.generate_login().splitlines():
54 script.write(line + r"\n")
55 script.write("\" > login.up\n")
Jeremy Moweryc3933b92016-02-09 22:48:01 -070056 script.write("printf \"")
Jeremy Mowery37d8a432016-02-07 17:07:55 -070057 for line in tenant.ca_crt:
Jeremy Mowery072f08a2016-02-09 23:30:57 -070058 script.write(line.rstrip() + r"\n")
Jeremy Mowery37d8a432016-02-07 17:07:55 -070059 script.write("\" > ca.crt\n")
Jeremy Moweryda2c3132016-01-10 15:21:52 -070060 # make sure openvpn is installed
61 script.write("apt-get update\n")
62 script.write("apt-get install openvpn\n")
Jeremy Mowery9d131a02016-01-26 18:17:30 -070063 script.write("openvpn client.conf &\n")
Jeremy Moweryda2c3132016-01-10 15:21:52 -070064 # close the script
65 script.close()
66
Jeremy Mowery0111e922016-01-25 20:51:11 -070067 def run_playbook(self, o, fields):
68 self.create_client_script(o)
69 super(SyncVPNTenant, self).run_playbook(o, fields)
70
Jeremy Mowery37d8a432016-02-07 17:07:55 -070071 def generate_login(self):
72 return str(time.time()) + "\npassword\n"
73
Jeremy Mowery6cacf1b2016-01-05 17:50:56 -070074 def generate_client_conf(self, tenant):
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070075 """str: Generates the client configuration to use to connect to this VPN server.
76
77 Args:
78 tenant (VPNTenant): The tenant to generate the client configuration for.
Jeremy Mowery8c52f562016-01-09 10:45:36 -070079
Jeremy Mowery4cf74cf2016-01-08 16:36:22 -070080 """
Jeremy Mowery37d8a432016-02-07 17:07:55 -070081 conf = ("client\n" +
82 "auth-user-pass login.up\n" +
83 "dev tun\n" +
84 "proto udp\n" +
85 "remote " + str(tenant.nat_ip) + " 1194\n" +
86 "resolv-retry infinite\n" +
87 "nobind\n" +
88 "ca ca.crt\n" +
89 "comp-lzo\n" +
90 "verb 3\n")
91
Jeremy Mowery8c52f562016-01-09 10:45:36 -070092 if tenant.is_persistent:
Jeremy Mowery8c52f562016-01-09 10:45:36 -070093 conf += "persist-tun\n"
Jeremy Mowery37d8a432016-02-07 17:07:55 -070094 conf += "persist-key\n"
Jeremy Mowery8c52f562016-01-09 10:45:36 -070095
Jeremy Mowery6cacf1b2016-01-05 17:50:56 -070096 return conf