Commit 827575ae authored by Jondy Zhao's avatar Jondy Zhao

Use --dev-node other than --dev when run openvpn in the Cygwin;

Add function TunnelManager._get_win32_ipv6_route_table.
parent 94e8a309
import logging, errno, os import logging, errno, os, sys
from . import utils from . import utils
here = os.path.realpath(os.path.dirname(__file__)) here = os.path.realpath(os.path.dirname(__file__))
...@@ -9,7 +9,7 @@ ovpn_log = None ...@@ -9,7 +9,7 @@ ovpn_log = None
def openvpn(iface, encrypt, *args, **kw): def openvpn(iface, encrypt, *args, **kw):
args = ['openvpn', args = ['openvpn',
'--dev-type', 'tap', '--dev-type', 'tap',
'--dev', iface, '--dev-node' if sys.platform == 'cygwin' else '--dev', iface,
'--persist-tun', '--persist-tun',
'--persist-key', '--persist-key',
'--script-security', '2', '--script-security', '2',
......
...@@ -283,6 +283,25 @@ class TunnelManager(object): ...@@ -283,6 +283,25 @@ class TunnelManager(object):
if self._makeTunnel(*peer): if self._makeTunnel(*peer):
break break
def _get_win32_ipv6_route_table(self):
cmd = ['netsh', 'interface ipv6 show route verbose']
rttable = []
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
s, _x = p.communicate()
if p.returncode != 0:
return [] # Or raise exception?
for line in s.splitlines():
fs = line.split(':', 1)
if fs == []:
continue
if fs[0].startswith('Prefix'):
prefix, prefix_len = fs[1].split('/', 1)
elif fs[0].startswith('Interface'):
iface = fs[1].strip()
elif fs[0].startswith('Site Prefix Length'):
rttable.append([utils.binFromIp(prefix), int(prefix_len), iface])
return rttable
def _countRoutes(self): def _countRoutes(self):
logging.debug('Starting to count the routes on each interface...') logging.debug('Starting to count the routes on each interface...')
del self._distant_peers[:] del self._distant_peers[:]
...@@ -291,17 +310,38 @@ class TunnelManager(object): ...@@ -291,17 +310,38 @@ class TunnelManager(object):
a = len(self._network) a = len(self._network)
b = a + len(self._prefix) b = a + len(self._prefix)
other = [] other = []
with open('/proc/net/ipv6_route') as f: try:
self._last_routing_table = f.read() with open('/proc/net/ipv6_route') as f:
for line in self._last_routing_table.splitlines(): self._last_routing_table = f.read()
line = line.split() for line in self._last_routing_table.splitlines():
iface = line[-1] line = line.split()
if iface == 'lo' or int(line[-2], 16) & RTF_CACHE: iface = line[-1]
continue if iface == 'lo' or int(line[-2], 16) & RTF_CACHE:
ip = bin(int(line[0], 16))[2:].rjust(128, '0') continue
ip = bin(int(line[0], 16))[2:].rjust(128, '0')
if ip[:a] != self._network or ip[a:b] == self._prefix:
continue
prefix_len = int(line[1], 16)
prefix = ip[a:prefix_len]
logging.trace('Route on iface %s detected to %s/%u',
iface, utils.ipFromBin(ip), prefix_len)
nexthop = self._iface_to_prefix.get(iface)
if nexthop:
self._connection_dict[nexthop].routes += 1
if prefix in self._served or prefix in self._connection_dict:
continue
if iface in self._iface_list:
other.append(prefix)
else:
self._distant_peers.append(prefix)
except IOError:
self._last_routing_table = self._get_win32_ipv6_route_table()
for rtline in self._last_routing_table:
iface = rtline[2]
ip = rtline[0][2:].rjust(128, '0')
if ip[:a] != self._network or ip[a:b] == self._prefix: if ip[:a] != self._network or ip[a:b] == self._prefix:
continue continue
prefix_len = int(line[1], 16) prefix_len = rtline[1]
prefix = ip[a:prefix_len] prefix = ip[a:prefix_len]
logging.trace('Route on iface %s detected to %s/%u', logging.trace('Route on iface %s detected to %s/%u',
iface, utils.ipFromBin(ip), prefix_len) iface, utils.ipFromBin(ip), prefix_len)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment