Une place pour une véritable innovation. Partagez vos propres utilitaires créés avec la communauté Manjaro.
Questions et discussions sur la programmation et le codage.
Répondre

A quelle distance sont mes miroirs ?

#1Messageil y a 2 ans

:bjr:
Un petit complément à pacman-mirrors --status
Un petit script qui va nous indiquer à quelle distance sont nos miroirs manjaro
Le plus rapide est le plus proche ???

le script:

 
#!/usr/bin/python
import urllib.request as request
from urllib.parse import urlparse
import json
import math


api_url = 'http://ip-api.com/json/'
coord_me = (-1, -1)

def getDistance(pt1, pt2):
    if pt2[0]<1:
        return "?" # api return nothing
    ret = math.acos(math.sin(math.radians(pt1[0]))*math.sin(math.radians(pt2[0]))+math.cos(math.radians(pt1[0]))*math.cos(math.radians(pt2[0]))*math.cos(math.radians(pt1[1]-pt2[1])))*6371.
    return math.trunc(ret/10)*10

# from pacman-mirrors/functions/mirror_status
def get_local_mirrors() -> tuple:
    urls = []
    with open("/etc/pacman.d/mirrorlist", "r") as f_list:
        for line in f_list:
            if not line.startswith("Server"):
                continue
            line = line.split("=")[1].strip()
            line = line.split("$")[0]
            mirror_url = line.split('/')
            mirror_url.pop()
            mirror_branch = mirror_url.pop()
            line = "/".join(mirror_url)
            urls.append(line + "/",)
    return mirror_branch, urls

# get my position
with request.urlopen(api_url) as response:
    if response.getcode() == 200:
        source = response.read()
        data = json.loads(source)
        if data['status'] == 'success':
            coord_me = (data['lat'], data['lon'])


if coord_me[0] < 0:
    exit(5)

branch,repos = get_local_mirrors()
#print(repos)
for repo in repos:
    coord_repo = (-1, -1)
    try:
        o = urlparse(repo)
        dns = o.hostname
    except AttributeError:
        #raise
        print(f"url parse error ? {repo}")
        continue

    # get repo position
    with request.urlopen(f"{api_url}/{dns}") as response:
        if response.getcode() == 200:
            source = response.read()
            data = json.loads(source)
            if data['status'] == 'success':
                coord_repo = (data['lat'], data['lon'])

                d = getDistance(coord_me, coord_repo)
                print (f"{dns} :\t à {d} kms")


Mon résultat :

mirror.futureweb.be :    à 420 kms
manjaro.osmir.ch :       à 330 kms
mirror.easylee.nl :      à 590 kms
manjaro.mirrors.lavatech.top :   à 610 kms
manjaro.moson.org :      à 530 kms
quantum-mirror.hu :      à 1200 kms
ftp.caliu.cat :  à 620 kms
ba.mirror.garr.it :      à 490 kms
ps: Distance indicative ! car ici c'est à vol d'oiseau et internet utilise plutôt le chemin des taupes (voir des araignées) :sourire:

A quelle distance sont mes miroirs ?

#2Messageil y a 2 ans

Intéressant, merci :bien

L'école commence à être loin, je bute sur celle-là qui est un peu aride:
papajoke a écrit : il y a 2 ansret = math.acos(
math.sin(math.radians(pt1[0]))
*
math.sin(math.radians(pt2[0]))
+
math.cos(math.radians(pt1[0]))
*
math.cos(math.radians(pt2[0]))
*
math.cos(math.radians(pt1[1]-pt2[1]))
)
*6371.
c'est pour calculer la distance entre 2 points à la surface d'une sphère?

Histoire de s'approprier la logique, ça serait sympa de trianguler la source à partir des résultats. Je préfère préciser : ce n'est pas de la curiosité mal placée! A la rigueur un énième exemple de données qu'on éparpille. Si ce n'est pas trop galère, ça va me faire mon we :café:

Dernière remarque : peut-on en déduire que les taupes et les araignées sont plus rapides que les oiseaux? :gsourire:

A quelle distance sont mes miroirs ?

#3Messageil y a 2 ans

:bjr:
j'ai "emprunté" cette formule ici après avoir lu une explication (donc utilisation de la sphère de Picard :saispas: ) la terre n'est pas bien ronde donc c'est un calcul approximatif donc pas génial si l'on vit au pole :siffle

Les taupes suivent les routes , les araignées avec le web n'ont pas trop de logique de distance et varie avec le temps: on passe par Amsterdam pour aller Rome et la distance donnée ici passe par le vrai "cloud" donc pas trop de rapport avec internet

----
si l'on désire tester les résultats:
utiliser l'api : curl http://ip-api.com/json/Nom-De-Domaine et pour nous: http://ip-api.com/json/
faire calcul
vérif avec un site online comme celui-ci

Paris (cyberbits.eu): avec mon calcul (arrondi à 10km) j'ai 210kms, avec site plus haut, j'obtiens 215 kms :pompom:

A quelle distance sont mes miroirs ?

#4Messageil y a 2 ans

Je vois que certains s'amusent comme des petits fous avec des calculs mathématiques "sympathiques" :lol::lol:

Mais concrètement, mis à part le plaisir intellectuel d'avoir réussi à exprimer cette distance (ça, ça vaut de l'or ...), cette information n'apporte pas vraiment grand chose pour choisir un miroir, à moins que j'ai loupé un épisode?

A quelle distance sont mes miroirs ?

#5Messageil y a 2 ans

oui, tout a fait :rigole:

Pour faire mumuse, un autre script :
un trace route ... affiche distance à vol d'oiseau et les étapes internet (calcul de distance à vol d'oiseau entre chaque point)
ici, on a quelque chose de plus réel au niveau internet (mais encore faut !)
ps: faut avoir la commande traceroute du paquet traceroute installée

un résultat, du milieu de la france vers ... paris :

/home/patrick/test/pacman-mirrors/trace.py manjaro.fr
manjaro.fr : Paris,France à 216 kms
( :censure: ,  :censure: , '', '', 'Home', 0)
(43.6047, 1.44421, 'Toulouse', 'France', '194.149.169.246', 399)
(43.2778, 5.39087, 'Marseille', 'France', '37.77.34.60', 320)
(43.2778, 5.39087, 'Marseille', 'France', '37.77.34.73', 0)
(48.8954, 2.2574, 'Courbevoie', 'France', '62.100.128.147', 669)
(48.8566, 2.35222, 'Paris', 'France', '188.130.25.102', 8)

['194.149.169.246', '37.77.34.60', '37.77.34.73', '62.100.128.147', '188.130.25.102']
oiseau: 216     route/oiseau: 1396 kms
je suis à 216 kms de paris MAIS je passe par toulouse puis marseille :roll::mrgreen:
donc environ 1396 kms :evil: (c'est clairement une toile d’araignée)

colonnes: (lat, long, ville, pays, ip, distance à vol d'oiseau du point précédent)
On passe un nom de domaine au script

source trace.py [nom_de_domaine] :

#!/usr/bin/python
import sys
import subprocess
import urllib.request as request
import math
import json
from urllib.parse import urlparse

api_url = 'http://ip-api.com/json/'
coord_me = (-1, -1, '', '', '', 0)


def getDistance(pt1, pt2):
    if pt2[0]<1:
        return "?" # api return nothing
    ret = math.acos(math.sin(math.radians(pt1[0]))*math.sin(math.radians(pt2[0]))+math.cos(math.radians(pt1[0]))*math.cos(math.radians(pt2[0]))*math.cos(math.radians(pt1[1]-pt2[1])))*6371.
    return math.trunc(ret)

def setPoint(dest_ip, dep_coord):
    with request.urlopen(f"{api_url}/{dest_ip}") as response:
        if response.getcode() == 200:
            source = response.read()
            data = json.loads(source)
            if data['status'] == 'success':
                coord_tmp = (data['lat'], data['lon'], data['city'], data['country'], dest_ip, 0)
                d = getDistance(dep_coord, coord_tmp)
                #coord_tmp[5] = d
                #print (f"{dep_coord[4]} : {coord_repo[2]},{coord_repo[3]} à {d} kms")
                return (coord_tmp[0],coord_tmp[1],coord_tmp[2],coord_tmp[3],coord_tmp[4],d)
    return (-1,-1)


def getIPS(dest_name):
    comm = f"traceroute -4 -I {dest_name} | awk '/  .*\(/{{print $3}}' | grep -v '(192\.'"
    result = subprocess.check_output(comm,shell=True, text=True)
    #print(result.splitlines())
    for line in result.splitlines():
        yield line[1:-1]


def main(dest_name):

    # get my position
    with request.urlopen(api_url) as response:
        if response.getcode() == 200:
            source = response.read()
            data = json.loads(source)
            if data['status'] == 'success':
                coord_me = (data['lat'], data['lon'], '','','Home', 0)


    if coord_me[0] < 0:
        exit(5)

    # position (col oiseau)
    d_oiseau = 0
    
    with request.urlopen(f"{api_url}/{dest_name}") as response:
            if response.getcode() == 200:
                source = response.read()
                data = json.loads(source)
                if data['status'] == 'success':
                    #coord_repo = (-1, -1, '', '', '', 0)
                    coord_repo = (data['lat'], data['lon'], data['city'], data['country'], dest_name, 0)

                    d_oiseau = getDistance(coord_me, coord_repo)
                    print (f"{dest_name} : {coord_repo[2]},{coord_repo[3]} à {d_oiseau} kms")
                    
    ips = list(getIPS(dest_name))
    coord = coord_me
    d_route = 0
    print(coord)
    for ip in ips:
        coord = setPoint(ip, coord)
        d_route += coord[5]
        print(coord)
    print('')
    print(ips)
    print(f'oiseau: {d_oiseau}\troute/oiseau: {d_route} kms')


if __name__ == "__main__":
    if len(sys.argv)<2:
        go = 'google.fr'
    else:
        go = sys.argv[1]
    main(go)

A quelle distance sont mes miroirs ?

#6Messageil y a 2 ans

Super merci pour ton script amusant.

Pour la petite histoire, quand tu vas voir le site d'une connaissance qui habite à 4 kilomètres de chez toi :

~]$ ~/scripts/trace.py elysee.fr
elysee.fr : New York,United States à 5842 kms
(48.8323, 2.4075, '', '', 'Home', 0)
(48.7529, 2.3224, 'Fresnes', 'France', '212.27.38.253', 10)
(48.8323, 2.4075, 'Paris', 'France', '78.192.27.254', 10)
(48.838, 2.29587, 'Paris', 'France', '78.255.0.126', 8)
(43.6267, 3.84001, 'Montpellier', 'France', '78.254.252.45', 591)
(48.8714, 2.32125, 'Paris', 'France', '78.254.253.45', 594)
(43.6047, 1.44421, 'Toulouse', 'France', '194.149.166.53', 589)
(48.8566, 2.35222, 'Paris', 'France', '154.54.61.21', 588)
(32.7767, -96.797, 'Dallas', 'United States', '4.68.39.73', 7934)
(48.8566, 2.35222, 'Paris', 'France', '213.242.111.234', 7934)
(51.5074, -0.127758, 'London', 'United Kingdom', '45.60.155.214', 343)

['212.27.38.253', '78.192.27.254', '78.255.0.126', '78.254.252.45', '78.254.253.45', '194.149.166.53', '154.54.61.21', '4.68.39.73', '213.242.111.234', '45.60.155.214']
oiseau: 5842	route/oiseau: 18601 kms
(depuis au moins Hollande, la souveraineté française est aux USA :P )

A quelle distance sont mes miroirs ?

#7Messageil y a 2 ans

et oui :oops:
mon code:

 curl http://ip-api.com/json/elysee.fr
{"status":"success","country":"United States","countryCode":"US","region":"NY","regionName":"New York","city":"New York","zip":"10123","lat":40.7128,"lon":-74.006,"timezone":"America/New_York","isp":"Incapsula Inc","org":"Incapsula Inc","as":"AS19551 Incapsula Inc","query":"45.60.151.214"}
et ce site donne bien le même résultat :ivre: donc apparemment pas de bug

----

nom de domaine/pays, on obtient de curieux résultats:

>curl http://ip-api.com/json/www.google.com
{"status":"success","country":"United Kingdom","countryCode":"GB","region":"ENG","regionName":"England","city":"London","zip":"W1B","lat":51.5074,"lon":-0.127758,"timezone":"Europe/London","isp":"Google LLC","org":"Google LLC","as":"AS15169 Google LLC","query":"172.217.169.36"}
> curl http://ip-api.com/json/www.google.fr
{"status":"success","country":"Spain","countryCode":"ES","region":"MD","regionName":"Madrid","city":"Madrid","zip":"28001","lat":40.4168,"lon":-3.70379,"timezone":"Europe/Madrid","isp":"Google LLC","org":"Google LLC","as":"AS15169 Google LLC","query":"172.217.16.227"}
Répondre