Skip to content

Instantly share code, notes, and snippets.

@menangen
Last active October 3, 2019 18:00
Show Gist options
  • Save menangen/31b8694983a1326a884b1e03f5ad7b34 to your computer and use it in GitHub Desktop.
Save menangen/31b8694983a1326a884b1e03f5ad7b34 to your computer and use it in GitHub Desktop.
Python Async Ping subprocess
Austria: 40ms
Smolensk: 20ms
Sofia Bulgaria: 50ms
Tambov: 24ms
Moscow MTS: 14ms
Yandex Cloud: 17ms
Novosibirsk: 65ms
Yaroslavl: 19ms
Krasnodar: 37ms
Minsk: 54ms
Finland GCE: 0ms
Rostov: 38ms
Samara: 28ms
Ekaterinburg: 42ms
Germany GCE: 32ms
Budapest Hungary: 31ms
Novosib: 65ms
Buharest Romania: 43ms
Zurih: 38ms
Seoul: 280ms
{
"Austria": ["aws.at", "sos-at-vie-1.exo.io", "eth0.store-front016.vie1.exoscale.net", "eth0.store-front015.vie1.exoscale.net", "eth0.db-proxy005.vie1.exoscale.net", "62.99.130.186"],
"Sofia Bulgaria": ["sos-bg-sof-1.exo.io", "194.182.176.76", "eth0.store-front073.sof1.exoscale.net", "lo.db-proxy009.sof1.exoscale.net", "lo.kube-master009.sof1.exoscale.net"],
"Smolensk": ["mannet.ane4k.in", "ns2.mannet.ru", "smolensk.speedtest.rt.ru", "91.203.178.17"],
"Kursk": ["speedtest.kursk.ertelecom.ru"],
"Belgorod": ["speedtest.31stk.ru"],
"Orel": ["speedtest1.orel.beeline.ru"],
"Lipetsk": ["188.235.104.179"],
"Tambov": ["kolovatoff.ru", "odb.tambov.gov.ru", "nikitin.tambov.ru"],
"Voronezh": ["109.195.54.187"],
"Saratov": ["srt1.speedtest.corbina.net", "speedtest.saratov.ertelecom.ru"],
"Novosibirsk": ["iaas.nsk.cloud.mts.ru", "vb.nsk.cloud.mts.ru"],
"Moscow MTS": ["176.118.28.1", "213.108.129.31", "cp.cloud.mts.by", "178.159.253.1"],
"Yaroslavl MTS": ["vb.spb.cloud.mts.ru"],
"SPB": ["92.53.68.204", "141.8.193.216", "5.3.5.17"],
"Tver": ["speedtest.tver.ertelecom.ru"],
"Kostroma": ["kostroma.speedtest.rt.ru"],
"Yandex Cloud": ["84.201.145.195", "84.201.146.2"],
"Moscow": ["185.22.234.115", "188.122.82.53"],
"Minsk": ["ns1.internet.mts.by", "ns2.internet.mts.by", "internet.velcom.by","217.21.54.173", "217.21.60.2", "217.21.60.1"],
"Kiev": ["176.37.49.53", "77.120.60.195"],
"N-Novgorod": ["dns2.ertelecom.ru"],
"Krasnodar": ["85.175.4.251", "77.233.10.37"],
"Rostov": ["speedtest.di-dk.ru", "rnd-speedtest.corbina.net","77.233.10.37", "213.138.77.17", "st.rostov.ertelecom.ru", "87.117.3.121", "speedtest1.rnd.beeline.ru"],
"Astrahan": ["213.80.166.5", "www.astrg.ru"],
"Yaroslavl": ["speedtest.yar.ertelecom.ru", "176.214.79.191", "185.59.138.230"],
"Samara": ["46.20.67.17"],
"Ekaterinburg": ["213.87.75.162"],
"Krasnoyarsk": ["speedtest.krk.ru", "cctv.krsk.ertelecom.ru"],
"Novosib": ["185.59.139.20", "176.118.30.218"],
"Omsk": ["omsk1.speedtest.corbina.net"],
"Arhangelsk": ["arhangelsk.speedtest.rt.ru"],
"Germany GCE": ["35.246.226.21", "35.246.226.2"],
"Finland GCE": ["35.228.81.190", "35.228.81.9", "35.228.82.1"],
"Budapest Hungary": ["www.gts.hu", "213.181.208.240", "91.219.236.1", "91.219.236.2"],
"Egypt": ["41.187.113.18"],
"Seoul": ["121.139.218.165", "121.139.218.1", "121.139.218.3"],
"Buharest Romania": ["nxdata.ro", "85.204.49.4", "85.204.49.1", "85.204.49.17", "185.105.5.100", "185.105.5.1"],
"Zurih": ["34.65.230.2", "34.65.230.17"],
"Perm": ["79.141.48.1", "212.33.226.65"],
"Kurgan": ["speedtest1.kurgan.beeline.ru"],
"Stavropol": ["stavropol-speedtest.corbina.net", "speedtest1.stv.beeline.ru"],
"Sochi": ["speed2.bisv.ru", "sochi-speedtest.corbina.net","speedtest1.sch.beeline.ru"],
"Warsaw": ["waw.as16276.ovh", "72.247.182.18", "72.247.182.15"],
"Praga": ["download.superhosting.cz"],
"Romania Buharest": ["nxdata.ro", "85.204.49.17", "188.172.254.18", "185.105.5.100"],
"London": ["108.61.196.100"],
"France Paris": ["rds.eu-west-3.amazonaws.com", "compute.P19.cloud.ovh.net"],
"France Marseille": ["40.101.92.8", "83.156.122.1", "83.156.122.80", "88.179.19.78", "sl-01-mrs.fr.seacomnet.com"],
"France Strasburg": ["164.132.96.83", "compute.sbg1.cloud.ovh.net", "compute.sbg4.cloud.ovh.net", "sbg.as16276.ovh"],
"France Gra": ["gra.as16276.ovh"],
"France Rbx": ["rbx.as16276.ovh"],
"Milan": ["193.58.239.1", "speed.speedymilan.net", "speedtest.networkgames.eu", "ookla-mil.seeweb.it"],
"AWS Stockholm": ["rds.eu-north-1.amazonaws.com"]
}
from platform import system
from json import load
from os import path
import signal
import asyncio
import re
dirname, filename = path.split(path.abspath(__file__))
min_pattern = re.compile("min")
ms_pattern = re.compile("\d+")
result = {}
def get_hosts():
with open(f"{dirname}/hosts.json", "r") as f:
try:
zones = load(f)
except:
print("JSON parse error")
hosts_list = []
for location, hosts in zones.items():
for host in hosts:
hosts_list.append({"area": location, "host": host})
return hosts_list
async def ping(host, p):
city = host.get("area")
node = host.get("host")
shell = f'ping {p} {node}'
proc = await asyncio.create_subprocess_shell(
shell,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout, stderr = await proc.communicate()
# code = proc.returncode
data = stdout or stderr
text = data.decode()
# print(text)
ping_line = min_pattern.search(text)
if ping_line:
start, end = ping_line.span()
line = text[start:]
# print(line)
ms = ms_pattern.search(line)
start, end = ms.span()
value = int(line[start:end])
print(f'[ping {city} | {value} ms]')
old_value = result.get(city)
if old_value:
value = min(old_value, value)
result[city] = value
else:
print(f"Problem with {node}")
async def main(p):
hosts = get_hosts()
# print(hosts)
tasks = [
ping(host, p) for host in hosts
]
await asyncio.gather(*tasks)
if __name__ == '__main__':
name = system()
linux = name == "Linux"
print(f"{name}: Creating event loop...")
loop = asyncio.get_event_loop()
def ask_exit():
print("***** Exit signal")
loop.stop()
for signame in {'SIGINT', 'SIGTERM'}:
loop.add_signal_handler(getattr(signal, signame), ask_exit)
params = "-c2 -w2" if linux else "-c2 -i 1 -t 2"
asyncio.run(main(params))
print("==============\n\n")
for location, ms in result.items():
print(f"\t{location}: {ms}ms")
Smolensk: 30ms
Kursk: 42ms
Orel: 41ms
Austria: 88ms
Belgorod: 51ms
Lipetsk: 43ms
Tambov: 46ms
Voronezh: 48ms
Sofia Bulgaria: 101ms
Moscow MTS: 37ms
Saratov: 52ms
Yaroslavl MTS: 45ms
SPB: 45ms
Tver: 39ms
Yandex Cloud: 38ms
Novosibirsk: 85ms
Moscow: 35ms
Kostroma: 57ms
Minsk: 47ms
Kiev: 55ms
N-Novgorod: 40ms
Krasnodar: 54ms
Rostov: 58ms
Yaroslavl: 41ms
Astrahan: 57ms
Samara: 51ms
Ekaterinburg: 70ms
Krasnoyarsk: 87ms
Arhangelsk: 63ms
Finland GCE: 53ms
Novosib: 85ms
Omsk: 76ms
Germany GCE: 85ms
Budapest Hungary: 83ms
Egypt: 124ms
Buharest Romania: 102ms
Perm: 44ms
Kurgan: 64ms
Sochi: 69ms
Stavropol: 73ms
Zurih: 86ms
Praga: 82ms
Warsaw: 95ms
Budapest: 84ms
London: 83ms
Romania Buharest: 101ms
France Marseille: 92ms
France Strasburg: 76ms
France Gra: 83ms
Milan: 82ms
France Rbx: 86ms
Seoul: 336ms
France Paris: 80ms
AWS Stockholm: 96ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment