'''Script should be launched with python3, generated on April 7, 2020'''
'''Cloud Passlist checkup tool v0.0.4 - always under construction'''
'''This script is made to check if you can access the cloud instances'''
'''Copyright 2018 - present Network Optix Inc.''' 
'''Licensed under MPL 2.0: www.mozilla.org/MPL/2.0/'''

'''Changelog v0.0.2 January 22, 2020'''
'''Added regional relay servers'''
'''US: New York (Backup), Miami, Dallas'''
'''Europe; Amsterdam'''

'''Changelog v0.0.3, September 15, 2021'''
'''Changed the order of the relay servers per continent'''
'''Removed old Chinese relay address (relay-ch.vmsproxy.com)'''
'''Added new Chinese relay address(cn-north-1.relay.vmsproxy.cn)'''

'''Changelog v0.0.4, January 8, 2023'''
'''Added multiple additional relay servers for scalability'''

'''Changelog v0.0.4.2, March 9, 2023'''
'''Completed the list of mediator proxy servers'''

'''Changelog v0.0.4.3, June 19, 2023'''
'''Added new Ney York Relay address (dp-ny-3.vmsproxy.com)'''

'''Changelog v0.0.4.4, July 11, 2023'''
'''Added new Ney York Relay address (dp-ny-4.vmsproxy.com)'''

import socket
from time import sleep
import argparse


def str2bool(v):
    if isinstance(v, bool):
        return v
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')

parser = argparse.ArgumentParser(description = 
    'This script checks availability of the ports required for proper \
    Cloud features functioning.')

parser.add_argument('--resolve', type=str2bool, nargs='?', const=True, default=False,
                    help = 'Add this parameter if you want actual ip address to be displayed as well')
parser.add_argument('--retries', type = int, default = 3, help = "Define a number of retries. Default value: 3")
parser.add_argument('--timeout', type = float, default = 1, help= "Define a timeout to wait for a server response.\
    Default value: 1 second.")

args = parser.parse_args()


class bcolors:
    OK = '\033[92m'
    FAIL = '\033[91m'
    WARNING = '\033[93m'


def isOpen(ip,port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(2)
    try:
        s.connect((ip, int(port)))
        s.shutdown(2)
        return True
    except:
        return False


def resolve_ip(ip):
    try:
        res_ip = socket.gethostbyname(ip)
        if res_ip is None:
            return ''
        return res_ip
    except socket.gaierror:
        print(bcolors.FAIL + ip + " COULD NOT BE RESOLVED")
        return ''

urls = []
h_urls = [
	'relay.vmsproxy.com',
	'relay-ny.vmsproxy.com',
	'relay-ny2.vmsproxy.com',
	'dp-ny-3.vmsproxy.com',
	'dp-ny-4.vmsproxy.com',
	'relay-la.vmsproxy.com',
	'dp-la-2.vmsproxy.com',
	'relay-chi.vmsproxy.com',
	'relay-mia.vmsproxy.com',
	'relay-dal.vmsproxy.com',
	'dp-ash-1.vmsproxy.com', 
	'relay-fr.vmsproxy.com',
	'relay-ams.vmsproxy.com',
	'relay-sy.vmsproxy.com',
	'vultr-syd-1.vmsproxy.com',
	'vultr-syd-2.vmsproxy.com',
	'vultr-syd-3.vmsproxy.com',
	'vultr-syd-4.vmsproxy.com',
	'vultr-mel-1.vmsproxy.com',
	'vultr-mel-2.vmsproxy.com',
	'vultr-mel-3.vmsproxy.com',
	'vultr-mel-4.vmsproxy.com',
	'cn-north-1.relay.vmsproxy.cn',
	'relay-si.vmsproxy.com',
	'relay-sgp.vmsproxy.com',
	'vultr-sgp-1.vmsproxy.com',
	'vultr-sgp-2.vmsproxy.com',
	'vultr-sgp-3.vmsproxy.com',
	'vultr-sgp-4.vmsproxy.com',
	'us-east-1.mediator.vmsproxy.com',
	'us-west-1.mediator.vmsproxy.com',
	'ap-southeast-2.mediator.vmsproxy.com',
	'eu-central-1.mediator.vmsproxy.com',
	'licensing.vmsproxy.com',
	'updates.vmsproxy.com',
	'beta.vmsproxy.com',
	'stats.vmsproxy.com',
	'stats2.vmsproxy.com',
	'tools.vmsproxy.com',
	'tools-eu.vmsproxy.com'
]
h_ports = [80, 443]

for url in h_urls:
    for port in h_ports:
        urls.append(url + ":" + str(port))

speedtest_urls = [
	'speedtest.vmsproxy.com'
]

for url in speedtest_urls:
    urls.append(url + ":80")

time_urls = [
    'time.rfc868server.com',
    'us-west.rfc868server.com',
    'frankfurt.rfc868server.com',
    'singapore.rfc868server.com'
]

for url in time_urls:
    urls.append(url + ":37")
    
mediator_urls = [
	'mediator.vmsproxy.com',
	'us-east-1.mediator.vmsproxy.com',
	'us-west-1.mediator.vmsproxy.com', 
	'ap-southeast-2.mediator.vmsproxy.com',
	'eu-central-1.mediator.vmsproxy.com'
]

for url in mediator_urls:
    urls.append(url + ":3345")

for url in urls:
    ip = url.split(":")[0]
    port = url.split(":")[1]
    res_ip = ''
    if args.resolve:
        res_ip = '(' + resolve_ip(ip) + ')'

    for i in range(args.retries):
        if isOpen(ip,port):
            print(bcolors.OK + ip + ":" + port + res_ip + " OPEN")
            break
        else:
            if (i < args.retries - 1):
                print(bcolors.WARNING + ip + ":" + port + res_ip + " connection retry in 1 second")
                sleep(1)
                continue
            else:
                print(bcolors.FAIL + ip + ":" + port + res_ip + " CLOSED")
