[UPD] Update to python3
This commit is contained in:
+27
-23
@@ -25,7 +25,7 @@ import signal
|
|||||||
|
|
||||||
from iniparse import RawConfigParser
|
from iniparse import RawConfigParser
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
from distutils.spawn import find_executable
|
#from distutils.spawn import find_executable
|
||||||
|
|
||||||
usage="""\
|
usage="""\
|
||||||
%prog -c configfile action
|
%prog -c configfile action
|
||||||
@@ -106,7 +106,8 @@ Sent 2 probes (1 broadcast(s))
|
|||||||
"""
|
"""
|
||||||
ARPING1 = re.compile(r'bytes from (?P<mac>\S+).*time=(?P<rtt>[0-9.]*) (?P<unit>.*)')
|
ARPING1 = re.compile(r'bytes from (?P<mac>\S+).*time=(?P<rtt>[0-9.]*) (?P<unit>.*)')
|
||||||
ARPING2 = re.compile(r'reply from.*\[(?P<mac>\S+)\]\s+(?P<rtt>[0-9.]*)(?P<unit>.*)')
|
ARPING2 = re.compile(r'reply from.*\[(?P<mac>\S+)\]\s+(?P<rtt>[0-9.]*)(?P<unit>.*)')
|
||||||
ARPING_PATH = find_executable('arping')
|
# ARPING_PATH = find_executable('arping')
|
||||||
|
ARPING_PATH = "/usr/bin/arping"
|
||||||
if ARPING_PATH == None:
|
if ARPING_PATH == None:
|
||||||
raise Exception('No arping command found')
|
raise Exception('No arping command found')
|
||||||
elif "/usr/bin/arping" in ARPING_PATH:
|
elif "/usr/bin/arping" in ARPING_PATH:
|
||||||
@@ -115,14 +116,14 @@ Sent 2 probes (1 broadcast(s))
|
|||||||
device = device,
|
device = device,
|
||||||
target_ip = target_ip,
|
target_ip = target_ip,
|
||||||
))
|
))
|
||||||
packets = [p.groupdict() for p in ARPING2.finditer(output)]
|
packets = [p.groupdict() for p in ARPING2.finditer(output.decode('utf-8'))]
|
||||||
elif "/usr/sbin/arping" in ARPING_PATH:
|
elif "/usr/sbin/arping" in ARPING_PATH:
|
||||||
(returncode,output) = run('arping -c{ping_count} -i{device} {target_ip}'.format(
|
(returncode,output) = run('arping -c{ping_count} -i{device} {target_ip}'.format(
|
||||||
ping_count = ping_count,
|
ping_count = ping_count,
|
||||||
device = device,
|
device = device,
|
||||||
target_ip = target_ip,
|
target_ip = target_ip,
|
||||||
))
|
))
|
||||||
packets = [p.groupdict() for p in ARPING1.finditer(output)]
|
packets = [p.groupdict() for p in ARPING1.finditer(output.decode('utf-8'))]
|
||||||
result = {}
|
result = {}
|
||||||
if packets:
|
if packets:
|
||||||
result['mac'] = packets[-1]['mac']
|
result['mac'] = packets[-1]['mac']
|
||||||
@@ -216,7 +217,7 @@ ipv4 2 udp 17 178 src=192.168.149.184 dst=80.13.55.10 sport=1194 dport=1194 src=
|
|||||||
"""
|
"""
|
||||||
conn = output.splitlines()
|
conn = output.splitlines()
|
||||||
for c in conn:
|
for c in conn:
|
||||||
if "={src} ".format(src=self.last_ip) in c:
|
if "={src} ".format(src=self.last_ip) in c.decode('utf-8'):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -247,7 +248,7 @@ ipv4 2 udp 17 178 src=192.168.149.184 dst=80.13.55.10 sport=1194 dport=1194 src=
|
|||||||
6: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
|
6: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
|
||||||
"""
|
"""
|
||||||
LINK = re.compile(r':\s+<(?P<link_states>.+)>.* state (?P<link_status>.+?)\s')
|
LINK = re.compile(r':\s+<(?P<link_states>.+)>.* state (?P<link_status>.+?)\s')
|
||||||
link = LINK.search(output)
|
link = LINK.search(output.decode('utf-8'))
|
||||||
if link:
|
if link:
|
||||||
self._link_states = link.groupdict()['link_states'].split(',')
|
self._link_states = link.groupdict()['link_states'].split(',')
|
||||||
self._link_status = link.groupdict()['link_status']
|
self._link_status = link.groupdict()['link_status']
|
||||||
@@ -260,12 +261,12 @@ ipv4 2 udp 17 178 src=192.168.149.184 dst=80.13.55.10 sport=1194 dport=1194 src=
|
|||||||
if self.target_ip:
|
if self.target_ip:
|
||||||
(retcode,route) = run('/sbin/ip route show {target_ip}'.format(target_ip=self.target_ip))
|
(retcode,route) = run('/sbin/ip route show {target_ip}'.format(target_ip=self.target_ip))
|
||||||
if self.gateway:
|
if self.gateway:
|
||||||
if not "{target_ip} via {gateway}".format(target_ip=self.target_ip,gateway=self.gateway) in route:
|
if not "{target_ip} via {gateway}".format(target_ip=self.target_ip,gateway=self.gateway) in route.decode('utf-8'):
|
||||||
logger.debug(run('/sbin/ip route del {target_ip}'.format(target_ip=self.target_ip),dry_run=self.dry_run)[1])
|
logger.debug(run('/sbin/ip route del {target_ip}'.format(target_ip=self.target_ip),dry_run=self.dry_run)[1])
|
||||||
logger.warning('No route for {target_ip} via {gateway}, adding one'.format(target_ip=self.target_ip,gateway=self.gateway))
|
logger.warning('No route for {target_ip} via {gateway}, adding one'.format(target_ip=self.target_ip,gateway=self.gateway))
|
||||||
logger.debug(run('/sbin/ip route add {target_ip} via {gateway}'.format(target_ip=self.target_ip,gateway=self.gateway),dry_run=self.dry_run)[1])
|
logger.debug(run('/sbin/ip route add {target_ip} via {gateway}'.format(target_ip=self.target_ip,gateway=self.gateway),dry_run=self.dry_run)[1])
|
||||||
elif self.device:
|
elif self.device:
|
||||||
if not " {} ".format(self.device) in route:
|
if not " {} ".format(self.device) in route.decode('utf-8'):
|
||||||
logger.warning('No route for {target_ip} through {device}, adding one'.format(target_ip=self.target_ip,device=self.device))
|
logger.warning('No route for {target_ip} through {device}, adding one'.format(target_ip=self.target_ip,device=self.device))
|
||||||
logger.debug(run('/sbin/ip route add {target_ip} dev {device}'.format(target_ip=self.target_ip,device=self.device),dry_run=self.dry_run)[1])
|
logger.debug(run('/sbin/ip route add {target_ip} dev {device}'.format(target_ip=self.target_ip,device=self.device),dry_run=self.dry_run)[1])
|
||||||
else:
|
else:
|
||||||
@@ -305,8 +306,8 @@ available == True if actual rtt and loss are below the max_rtt and max_loss
|
|||||||
ping_interval=self.ping_interval,
|
ping_interval=self.ping_interval,
|
||||||
))
|
))
|
||||||
if returncode == 0:
|
if returncode == 0:
|
||||||
report = REPORT.search(output)
|
report = REPORT.search(output.decode('utf-8'))
|
||||||
rtt = RTT.search(output)
|
rtt = RTT.search(output.decode('utf-8'))
|
||||||
if report:
|
if report:
|
||||||
self.last_loss = int(report.groupdict()['loss'])
|
self.last_loss = int(report.groupdict()['loss'])
|
||||||
else:
|
else:
|
||||||
@@ -326,11 +327,11 @@ available == True if actual rtt and loss are below the max_rtt and max_loss
|
|||||||
elif self.last_rtt>self.max_rtt:
|
elif self.last_rtt>self.max_rtt:
|
||||||
self.status='Too long RTT {}ms'.format(self.last_rtt)
|
self.status='Too long RTT {}ms'.format(self.last_rtt)
|
||||||
else:
|
else:
|
||||||
self.status = 'ping test failed : {}'.format(output)
|
self.status = 'ping test failed : {}'.format(output.decode('utf-8'))
|
||||||
else:
|
else:
|
||||||
self._available = True
|
self._available = True
|
||||||
else:
|
else:
|
||||||
self.status = 'Device {} is down or link state is unknown'.format(self.device)
|
self.status = 'Device {} is down or link state is unknown'.format(self.device.decode('utf-8'))
|
||||||
self._available = False
|
self._available = False
|
||||||
|
|
||||||
self.update_leds()
|
self.update_leds()
|
||||||
@@ -341,12 +342,12 @@ available == True if actual rtt and loss are below the max_rtt and max_loss
|
|||||||
(retcode,output) = run('ip addr show dev {device}'.format(device=self.device))
|
(retcode,output) = run('ip addr show dev {device}'.format(device=self.device))
|
||||||
IPV4ADDR = re.compile(r'\sinet\s+(?P<ipv4>\d+.\d+.\d+.\d+)[/\s]')
|
IPV4ADDR = re.compile(r'\sinet\s+(?P<ipv4>\d+.\d+.\d+.\d+)[/\s]')
|
||||||
MACADDR = re.compile(r'link/(?P<type>\S+)(\s(?P<mac>\S+))?')
|
MACADDR = re.compile(r'link/(?P<type>\S+)(\s(?P<mac>\S+))?')
|
||||||
ipaddr = IPV4ADDR.search(output)
|
ipaddr = IPV4ADDR.search(output.decode('utf-8'))
|
||||||
if ipaddr:
|
if ipaddr:
|
||||||
self.last_ip = ipaddr.groupdict()['ipv4']
|
self.last_ip = ipaddr.groupdict()['ipv4']
|
||||||
else:
|
else:
|
||||||
self.last_ip = None
|
self.last_ip = None
|
||||||
macaddr = MACADDR.search(output)
|
macaddr = MACADDR.search(output.decode('utf-8'))
|
||||||
if macaddr:
|
if macaddr:
|
||||||
self.device_mac = macaddr.groupdict()['mac']
|
self.device_mac = macaddr.groupdict()['mac']
|
||||||
self.device_type = macaddr.groupdict()['type']
|
self.device_type = macaddr.groupdict()['type']
|
||||||
@@ -371,7 +372,7 @@ available == True if actual rtt and loss are below the max_rtt and max_loss
|
|||||||
88.163.76.254 scope link src 88.163.76.120
|
88.163.76.254 scope link src 88.163.76.120
|
||||||
"""
|
"""
|
||||||
GW = re.compile(r'default via (?P<gateway>\d+.\d+.\d+.\d+)\s+')
|
GW = re.compile(r'default via (?P<gateway>\d+.\d+.\d+.\d+)\s+')
|
||||||
gw = GW.search(output)
|
gw = GW.search(output.decode('utf-8'))
|
||||||
if gw:
|
if gw:
|
||||||
logger.debug('Gateway : {}'.format(gw.groupdict()['gateway']))
|
logger.debug('Gateway : {}'.format(gw.groupdict()['gateway']))
|
||||||
return gw.groupdict()['gateway']
|
return gw.groupdict()['gateway']
|
||||||
@@ -559,11 +560,13 @@ def write_pidfile(pidfile,pid=None):
|
|||||||
pid = os.getpid()
|
pid = os.getpid()
|
||||||
oldpid = is_pid_running(pidfile)
|
oldpid = is_pid_running(pidfile)
|
||||||
if oldpid:
|
if oldpid:
|
||||||
if oldpid <> pid:
|
# if oldpid <> pid:
|
||||||
|
if oldpid != pid:
|
||||||
raise Exception('There is already a running process {} for the pid file {}'.format(oldpid,pidfile))
|
raise Exception('There is already a running process {} for the pid file {}'.format(oldpid,pidfile))
|
||||||
|
|
||||||
with open(pidfile,"wb") as f:
|
with open(pidfile,"wb") as f:
|
||||||
f.write(str(pid))
|
print(pid)
|
||||||
|
f.write(bytes(pid))
|
||||||
|
|
||||||
def remove_pidfile(pidfile):
|
def remove_pidfile(pidfile):
|
||||||
if os.path.isfile(pidfile):
|
if os.path.isfile(pidfile):
|
||||||
@@ -573,7 +576,7 @@ if __name__ == '__main__':
|
|||||||
(options,args)=parser.parse_args()
|
(options,args)=parser.parse_args()
|
||||||
|
|
||||||
if len(args) < 1:
|
if len(args) < 1:
|
||||||
print "ERROR : You must provide one action to perform"
|
print("ERROR : You must provide one action to perform")
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
@@ -684,6 +687,7 @@ if __name__ == '__main__':
|
|||||||
if not provider.enabled:
|
if not provider.enabled:
|
||||||
logger.warning("Enabling the available provider {}".format(provider.provider_name))
|
logger.warning("Enabling the available provider {}".format(provider.provider_name))
|
||||||
provider.enable()
|
provider.enable()
|
||||||
|
run('conntrack -F')
|
||||||
if provider.openvpn_master:
|
if provider.openvpn_master:
|
||||||
restart_openvpn()
|
restart_openvpn()
|
||||||
|
|
||||||
@@ -698,7 +702,7 @@ if __name__ == '__main__':
|
|||||||
nexthop via 185.16.51.9 realm 3 dev eth1 weight 1
|
nexthop via 185.16.51.9 realm 3 dev eth1 weight 1
|
||||||
nexthop dev tun2 weight 1
|
nexthop dev tun2 weight 1
|
||||||
"""
|
"""
|
||||||
balance = output.splitlines()
|
balance = output.decode('utf-8').splitlines()
|
||||||
in_balance = False
|
in_balance = False
|
||||||
for l in balance:
|
for l in balance:
|
||||||
if provider.gateway in l.split(' ') or provider.device in l.split(' '):
|
if provider.gateway in l.split(' ') or provider.device in l.split(' '):
|
||||||
@@ -738,11 +742,11 @@ if __name__ == '__main__':
|
|||||||
else:
|
else:
|
||||||
selproviders = providers
|
selproviders = providers
|
||||||
for provider in selproviders:
|
for provider in selproviders:
|
||||||
print "Checking {}".format(provider.provider_name)
|
print("Checking {}".format(provider.provider_name))
|
||||||
provider.check_available()
|
provider.check_available()
|
||||||
print provider
|
print(provider)
|
||||||
if provider.used_by_openvpn():
|
if provider.used_by_openvpn():
|
||||||
print "This provider is used by Openvpn"
|
print("This provider is used by Openvpn")
|
||||||
elif action == 'check-json':
|
elif action == 'check-json':
|
||||||
result = []
|
result = []
|
||||||
if len(args) >= 2:
|
if len(args) >= 2:
|
||||||
@@ -752,4 +756,4 @@ if __name__ == '__main__':
|
|||||||
for provider in selproviders:
|
for provider in selproviders:
|
||||||
provider.check_available()
|
provider.check_available()
|
||||||
result.append(provider.as_dict())
|
result.append(provider.as_dict())
|
||||||
print jsondumps(result,indent=True)
|
print(jsondumps(result,indent=True))
|
||||||
|
|||||||
Reference in New Issue
Block a user