60 lines
2.0 KiB
Python

# -*- coding: utf-8 -*-
import dns.exception
import dns.resolver
import requests
import socket
import subprocess
from .paths import MYIP_URL, PING_URL
def compile_url(domain, port, proto='https'):
port = '' if (proto == 'https' and port == '443') or (proto == 'http' and port == '80') else ':{}'.format(port)
return '{}://{}{}'.format(proto, 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(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, qtype):
# Resolve domain name using Google Public DNS
try:
return resolver.query(domain, qtype)[0].address
except dns.exception.Timeout:
raise
except:
return None
def ping_url(url):
try:
return requests.get(PING_URL, params={'url': url}, timeout=5).text == 'vm-pong'
except requests.exceptions.Timeout:
raise
except:
return False