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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
# -*- coding: utf-8 -*-
# darwin.py
# Copyright (C) 2013-2017 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Darwin VPN launcher implementation.
"""
import os
import socket
from twisted.logger import Logger
from leap.bitmask.vpn.launcher import VPNLauncher
from leap.bitmask.vpn.launcher import VPNLauncherException
logger = Logger()
class HelperCommand(object):
SOCKET_ADDR = '/var/run/bitmask-helper.socket'
def __init__(self):
pass
def _connect(self):
self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
self._sock.connect(self.SOCKET_ADDR)
except socket.error, msg:
raise RuntimeError(msg)
def send(self, cmd, args=''):
self._connect()
sock = self._sock
data = ""
command = cmd + ' ' + args + '/CMD'
try:
sock.sendall(command)
while '\n' not in data:
data += sock.recv(32)
finally:
sock.close()
return data
class DarwinVPNLauncher(VPNLauncher):
"""
VPN launcher for the Darwin Platform
"""
UP_SCRIPT = None
DOWN_SCRIPT = None
# TODO -- move this to bitmask-helper??
# Hardcode the installation path for OSX for security, openvpn is
# run as root
INSTALL_PATH = "/Applications/Bitmask.app/"
OPENVPN_BIN = 'openvpn.leap'
OPENVPN_PATH = "%s/Contents/Resources/openvpn" % (INSTALL_PATH,)
try:
INSTALL_PATH_ESCAPED = os.path.realpath(os.getcwd() + "/../../")
except OSError as exc:
# this might happen if os.getcwd() was deleted under our feet. We do
# not want to raise the Exception at import time.
logger.error('Error while setting openvpn paths: %r' % exc)
INSTALL_PATH_ESCAPED = "/Applications/Bitmask.app/"
OPENVPN_PATH_ESCAPED = "%s/Contents/Resources/openvpn" % (
INSTALL_PATH_ESCAPED,)
OTHER_FILES = []
_openvpn_bin_path = "%s/Contents/Resources/%s" % (
INSTALL_PATH, OPENVPN_BIN)
if os.path.isfile(_openvpn_bin_path):
OPENVPN_BIN_PATH = _openvpn_bin_path
else:
# let's try with the homebrew path
OPENVPN_BIN_PATH = '/usr/local/sbin/openvpn'
def kill_previous_openvpn():
pass
def terminate_or_kill(self, terminatefun, killfun, proc):
terminatefun()
|