60 lines
2.1 KiB
Python

# -*- coding: utf-8 -*-
import dns.exception
import dns.resolver
import requests
import socket
import subprocess
from . import paths
def compile_url(domain, port, proto='https'):
port = '' if (proto in (None, 'https') and port == '443') or (proto == 'http' and port == '80') else f':{port}'
return f'{proto}://{domain}{port}' if proto else f'{domain}{port}'
def get_local_ip(version=None):
# Return first routable IPv4/6 address of the VM (container host)
# If version is not given, try getting IPv4, if that fails, try getting IPv6, if that fails too, fall back to 127.0.0.1
if not version:
return get_local_ip(4) or get_local_ip(6) or '127.0.0.1'
try:
output = subprocess.run(['/sbin/ip', 'route', 'get', '1' if version == 4 else '2003::'], check=True, stdout=subprocess.PIPE).stdout.decode().split()
# Get field right after 'src'
return output[output.index('src')+1]
except:
return None
def get_external_ip(version):
# Return external IPv4/6 address via remote service
family = socket.AF_INET if version == 4 else socket.AF_INET6
allowed_gai_family = requests.packages.urllib3.util.connection.allowed_gai_family
try:
requests.packages.urllib3.util.connection.allowed_gai_family = lambda: family
return requests.get(paths.MYIP_URL, timeout=5).text
except:
return None
finally:
requests.packages.urllib3.util.connection.allowed_gai_family = allowed_gai_family
resolver = dns.resolver.Resolver()
resolver.timeout = 3
resolver.lifetime = 3
resolver.nameservers = ['8.8.8.8', '8.8.4.4', '2001:4860:4860::8888', '2001:4860:4860::8844']
def resolve_ip(domain, query_type):
# Resolve domain name using Google Public DNS
try:
return resolver.query(domain, query_type)[0].address
except dns.exception.Timeout:
raise
except:
return None
def ping_url(url):
try:
return requests.get(paths.PING_URL, params={'url': url}, timeout=5).text == 'vm-pong'
except requests.exceptions.Timeout:
raise
except:
return False