yunohost/data/hooks/diagnosis/10-ip.py
2019-10-10 16:07:46 +02:00

60 lines
1.9 KiB
Python

#!/usr/bin/env python
import os
from moulinette import m18n
from moulinette.utils.network import download_text
from yunohost.diagnosis import Diagnoser
class IPDiagnoser(Diagnoser):
id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1]
description = "internet_connectivity"
cache_duration = 60
def validate_args(self, args):
if "version" not in args.keys():
return { "versions" : [4, 6] }
else:
assert str(args["version"]) in ["4", "6"], "Invalid version, should be 4 or 6."
return { "versions" : [int(args["version"])] }
def run(self):
versions = self.args["versions"]
if 4 in versions:
ipv4 = self.get_public_ip(4)
yield dict(meta = {"version": 4},
result = ipv4,
report = ("SUCCESS", "diagnosis_network_connected_ipv4", {}) if ipv4 \
else ("ERROR", "diagnosis_network_no_ipv4", {}))
if 6 in versions:
ipv6 = self.get_public_ip(6)
yield dict(meta = {"version": 6},
result = ipv6,
report = ("SUCCESS", "diagnosis_network_connected_ipv6", {}) if ipv6 \
else ("WARNING", "diagnosis_network_no_ipv6", {}))
def get_public_ip(self, protocol=4):
if protocol == 4:
url = 'https://ip.yunohost.org'
elif protocol == 6:
url = 'https://ip6.yunohost.org'
else:
raise ValueError("invalid protocol version, it should be either 4 or 6 and was '%s'" % repr(protocol))
try:
return download_text(url, timeout=30).strip()
except Exception as e:
self.logger_debug("Could not get public IPv%s : %s" % (str(protocol), str(e)))
return None
def main(args, env, loggers):
IPDiagnoser(args, env, loggers).diagnose()
return 0