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 3 semaines

: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 3 semaines

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 3 semainesret = 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 3 semaines

: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 3 semaines

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 3 semaines

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)
Répondre