/
avpnc
executable file
·66 lines (55 loc) · 2.11 KB
/
avpnc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler
from socketserver import TCPServer
from urllib.parse import unquote
import argparse
import json
import re
import shlex
import signal
import subprocess
import tempfile
import webbrowser
parser = argparse.ArgumentParser(usage='usage: avpnc [options...] profile.ovpn [openvpn options...]')
parser.add_argument('-d', '--dump', action='store_true', help="Only dump credentials, don't start openvpn")
parser.add_argument('profile', type=argparse.FileType('r'), metavar='profile.ovpn')
parser.add_argument('ovpnargs', metavar='[extra openvpn arguments...]', nargs=argparse.REMAINDER)
args = parser.parse_args()
def get_url():
regex = re.compile('^#AviatrixController (.*)$')
for line in args.profile.readlines():
match = regex.match(line)
if match:
return match.group(1)
raise RuntimeError("Controller URL not found in profile")
def openvpn(username, password):
with tempfile.NamedTemporaryFile(mode='w+', buffering=1) as passfile:
passfile.write(f'{username}\n')
passfile.write(f'{password}\n')
cmd = f'sudo openvpn --config {args.profile.name} --auth-user-pass {passfile.name}'
argv = shlex.split(cmd)
argv.extend(args.ovpnargs)
proc = subprocess.Popen(argv)
for signum in [signal.SIGINT, signal.SIGTERM]:
signal.signal(signum, lambda: proc.send_signal(signum))
proc.communicate()
class Handler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
return
def do_POST(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(b'SuccessAviatrix')
global credentials
credentials = json.loads(unquote(self.path[1:]))
def do_OPTIONS(self):
return self.do_POST()
TCPServer.allow_reuse_address = True
with TCPServer(('localhost', 15395), Handler) as httpd:
webbrowser.open(get_url())
httpd.handle_request()
if args.dump:
print(json.dumps(credentials))
else:
openvpn(credentials['Email'], credentials['Token'])