#!/usr/bin/env python3
import socket,time,json,concurrent.futures
import socks
host='va.baloise.de'
ports=[5451,5452,8561,8591,8592,8599,8601,15452,21031]
routes=[('direct',None,None),('warp',1088,'raw'),('mullvad-ch',1089,'raw+ch'),('mullvad-de',1089,'raw+de')]
def probe(item):
 port,(name,pport,user)=item;t=time.time();s=None
 try:
  if pport:
   s=socks.socksocket();s.set_proxy(socks.SOCKS5,'127.0.0.1',pport,username=user)
  else:s=socket.socket()
  s.settimeout(4);s.connect((host,port))
  try:
   s.settimeout(.8);data=s.recv(64)
  except Exception:data=b''
  return {'port':port,'route':name,'open':True,'elapsed':round(time.time()-t,3),'banner_hex':data.hex()}
 except Exception as e:return {'port':port,'route':name,'open':False,'elapsed':round(time.time()-t,3),'error':type(e).__name__+': '+str(e)}
 finally:
  try:s.close()
  except:pass
items=[(p,r) for p in ports for r in routes]
with concurrent.futures.ThreadPoolExecutor(max_workers=12) as ex:
 for o in ex.map(probe,items):print(json.dumps(o),flush=True)
