Python

Migration chez Gandi

Tuesday, 03 July 2012
|
Écrit par
Grégory Soutadé

Alors que mon certificat SSL expire dans deux mois, OVH m'envoie un mail m'indiquant qu'ils abandonnent la certification SSL. Je trouve dommage de ne plus proposer de certification SSL quand on veut être un acteur majeur de l'Internet... Bref je n'ai pas envie d'avoir deux contrats dans deux sociétés différentes (pour mon certificat et mon nom de domaine), j'ai donc pris la décision (contestable) de tout migrer chez Gandi. À la base je voulais m'enregistrer chez Gandi car ils ont une bonne renommée, mais j'ai finalement choisi OVH. La migration s'est faite en huit jours une fois que j'ai eu désactivé la protection du domaine et récupéré la clé secrète chez OVH.

Après quelques jours d'utilisation, je me rend compte qu'OVH est supérieur techniquement à Gandi dans les outils qu'ils proposent, ils sont beaucoup plus simples et intuitifs (même si le support est loin d'être terrible). Bon, une fois configuré, on ne touche plus à rien, mais quand même... Et surtout un GROS manque chez Gandi est qu'ils ne gèrent pas nativement une ip dynamique (DynDNS). Évidemment je m'en suis rendu compte après migration...

La solution proposé sur les forums est de faire pointer un enregistrement IP (A) vers un DynDNS ... ce n'est pas acceptable. Heureusement, après quelques recherches, je découvre que Gandi met a disposition une API XML permettant de manipuler son compte ! Après m'être battu inutilement avec la version OT&E (qui ne permet de rien faire), j'ai finalement réussit à obtenir l'équivalent d'un DynDNS avec un petit script python que l'on mettra en cron :

#!/usr/bin/env python import xmlrpclib import urllib2 import re import sys # # Update Gandi DNS with dynamic IP # # This doesn't work with OT&E platform !! # DEBUG = False zone_to_edit = 'Soutade' apikey = 'Your private API key' api = xmlrpclib.ServerProxy('https://rpc.gandi.net/xmlrpc/') def debug(str): if DEBUG: print str # Get current IP current_ip = '' try: dyndns_url = 'http://checkip.dyndns.com/' f = urllib2.urlopen(dyndns_url) data = f.read() f.close() pattern = re.compile('[^:]*(\d+\.\d+\.\d+\.\d+)') result = pattern.search(data, 0) if result == None: print "No IP found" sys.exit(1) else: current_ip = result.group(0).strip() except urllib2.HTTPError: print "Connexion error" sys.exit(1) debug('Your current IP is \'' + current_ip + '\'') # Update Gandi DNS zones = api.domain.zone.list(apikey, {'name' : zone_to_edit}) if len(zones) == 0: print 'Zone \'' + zone_to_edit + '\' not found' sys.exit(1) zone = zones[0] debug('Zone to be edited') debug(zone) records = api.domain.zone.record.list(apikey, zone['id'], zone['version']) edited = False for record in records: if record['type'] == 'A' and current_ip != record['value']: debug('Edit record') debug(record) record['value'] = current_ip edited = True # Delete all id keys del record['id'] if edited: debug('Edit result') debug(records) if zone['version'] == 1: zone['version'] = 2 else: zone['version'] = 1 debug('New version is ' + str(zone['version'])) api.domain.zone.record.set(apikey, zone['id'], zone['version'], records) api.domain.zone.version.set(apikey, zone['id'], zone['version']) debug('New zone values') debug(api.domain.zone.record.list(apikey, zone['id'], zone['version']))

Le script ne se veut pas générique, mais il fonctionne ! Il faut l'adapter en changeant la clé d'API et le nom de la zone à éditer. Il faut aussi créer deux versions (1 et 2) de la zone à modifier avec au moins un champs A et attacher le nom de domaine à cette zone. On pourra activer les traces en changeant la valeur de DEBUG. Pour info, mes paramètres DNS sont (mode expert) :

@ 1080 IN A 86.193.241.253 * 1080 IN CNAME soutade.fr. @ 1080 IN MX 10 soutade.fr.

La première ligne fait pointer soutade.fr (nom de domaine attaché = @) à une IP que l'on mettra à jour dynamiquement. La seconde ligne fait pointer n'importe quel sous domaine de soutade.fr (blog.soutade.fr par exemple) vers soutade.fr qui point lui même vers une IP. La troisième ligne permet d'indiquer que le serveur mail se trouve également sur l'IP pointée par soutade.fr.

La bonne nouvelle est que j'ai droit à un certificat SSL gratuit pendant un an et le renouvellement de mon nom de domaine pour un an également, le tout pour 15€ ! Je reviendrai peut être chez OVH pour Internet... un jour...

Autojump2

Monday, 23 January 2012
|
Écrit par
Grégory Soutadé

Il y a peu j'avais fait un article sur un petit utilitaire IN DIS PEN SABLE. Autojump de son petit nom. Pour ceux qui ont oublié : Autojump permet de se déplacer rapidement dans l'arborescence en enregistrant les dossiers dans lesquels on va le plus souvent puis en les rendant accessible via la commande "j" suivi d'un pattern. Exemple, je suis à la racine de mon dossier (~/), il me suffit de taper "j kc" pour aller directement à "/home/soutade/projets/kc". Plus fort encore, si je tape "j k[tab]" la complétion me donne directement "j "/home/soutade/projets/kc"".

J'avais adapté Autojump à ma sauce pour qu'il étende la commande cd et j'avais aussi rajouté d'autres options pour gérer la base de données. Mise à part quelques corrections mineures, mes modifications n'ont pas été intégrées dans la version originale (différence de philosophie principalement).

Bref, ceci est un temps révolu. Ma nouvelle version d'Autojump est arrivé : Autojump2 (pour garder la référence à la version originale). Ce n'est pas un fork, ce n'est pas non plus une vraie suite puisque le code a été totalement ré écrit.

Autojump2 c'est donc plus fort, plus rapide et plus intelligent qu'Autojump*. Comme dans ma version modifiée, on n'utilise plus "j", mais directement "cd", on peut ajouter/retirer/modifier nos dossiers préférés à la base, les retrouver grâce à la complétion automatique. Et surtout grande nouveauté : lister automatiquement un ensemble de répertoire !! Toutes les fonctions de cd sont préservées et il n'y a plus un accès à la base pour chaque utilisation de cd (seulement quand c'est nécessaire).

Exemple tiré du README

Arborescence

proj/
|--- v1/
|--- v2/
|--- v3/
|--- branch/
|--- v2/

 

cd --add proj/v2
>>> '/home/soutade/proj/v2' correctly added to database
cd -a proj/v1
>>> '/home/soutade/proj/v1' correctly added to database
cd -a proj/\\*
>>> '/home/soutade/proj/*' correctly added to database
cd --add proj/branch/v2
>>> '/home/soutade/proj/branch/v2' correctly added to database

cd --list
/home/soutade/proj/branch/v2
/home/soutade/proj/v1
/home/soutade/proj/v2
/home/soutade/proj/*
>>> /home/soutade/proj/branch
>>> /home/soutade/proj/v1
>>> /home/soutade/proj/v2
>>> /home/soutade/proj/v3

cd v2
/home/soutade/proj/branch/v2

cd v[tab][tab][tab]
v__1__/home/soutade/proj/branch/v2
v__2__/home/soutade/proj/v1
v__3__/home/soutade/proj/v2
v__4__/home/soutade/proj/v3

cd v__2
/home/soutade/proj/v1

cd v[tab][tab][tab]
v2__1__/home/soutade/proj/branch/v2
v2__2__/home/soutade/proj/v2

cd v2__2
/home/soutade/proj/v2

*Aucun benchmark n'a été réalisé

Autojump

Tuesday, 21 December 2010
|
Écrit par
Grégory Soutadé



Un peu de pub pour un petit outil dont on ne peut plus se passer une fois qu'on y a goûté. Quand on est développeur et qu'on utilise régulièrement la ligne de commande (projets, compilation, gestion de version ...) on se retrouve souvent dans les même dossiers (projetX, build, etc ...) et il n'est pas rare que ces chemins soient lointains les uns des autres. Joel Schaerer a donc humblement développé autojump. "humblement" car c'est un petit outil, mais qui remplit pleinement sa fonction (et en plus l'auteur est Français).

La version vanilla d'autojump mémorise sa position dans le système de fichiers à chaque commande, permettant ainsi de faire des statistiques sur les endroits où l'on se trouve le plus souvent, mais surtout de pouvoir sauter d'un endroit à un autre grâce à la commande "j" qui analyse son paramètre et essais de le faire correspondre à un chemin connu (les plus utilisés seront les premiers). Autojump supporte bien évidement l'auto-complétion par tabulation !

Exemple : Si le chemin "/home/soutade/Projets_Perso/KissCount" est enregistré dans autojump, il suffit d'entrer "j kiss" pour sauter directement à cet endroit, ce qui est un gain de temps considérable.

Autojump supporte plusieurs paramètres : "j greg kiss" saute sur "/home/greg/Projets_Perso/KissCount"

En cas de conflit on peut utiliser tab et choisir le chemin le plus approprié :

cd v2__[tab]
v2__1__/home/soutade/Projets/v2-helium-greg
v2__2__/home/soutade/Projets/v2-helium

La commande "jumpstat" permet d'avoir un aperçu de la base

...
54.5:  /home/shared/musique
60.0:  /home/joel/workspace/coolstuff/glandu
83.0:  /home/joel/workspace/abs_user/autojump
96.9:  /home/joel/workspace/autojump
141.8: /home/joel/workspace/vv
161.7: /home/joel
Total key weight: 1077


D'autres alternatives existent comme apparix, wcd ou kcd mais je les trouve moins élégantes (nécessite de scanner le système de fichier, utilisation moins transparente ...).

Le code d'autojump est disponible ici : https://github.com/joelthelion/autojump/wiki

Une démonstration (en) est disponible sur youtube : http://www.youtube.com/watch?v=tnNyoMGnbKg

Une fois installé, c'est adopté. Néanmoins en réfléchissant deux secondes je trouvais dommage qu'autojump soit appelé à chaque commande. En effet quand je suis dans un répertoire et que je fait cd .. je n'ai pas forcément envie que ce soit répertorié. J'ai donc retroussé mes manches et modifié le comportement du logiciel (https://github.com/soutade/autojump/tree/v2).

Sur ma version "cd" devient un alias d'autojump. Elle permet donc à la fois de sauter à un endroit et d'enregistrer un chemin dans la base de façon transparente. Si un dossier n'est pas trouvé dans la base ou qu'il est dans le répertoire courant, c'est la complétion normale de bash qui s'applique.

Il y a donc deux modes : manuel (il faut faire cd -a "chemin" pour enregistrer un chemin) ou automatique (chemin enregistré à chaque commande cd). Tout ceci est paramétrable dans le autojump.bash.

Par effet de bord on peut indifféremment manipuler la base avec la commande autojump ou cd.

En plus de cette modification j'ai aussi rajouté la commande "autojump/cd --remove key" qui permet de supprimer une entrée dans la base (la complétion pour key est effective), ainsi que la commande "cd/autojump --purge num" qui permet de supprimer toutes les entrées dont le nombre est inférieur ou égal à num.

En résumé, quelle que soit la version utilisée, il faut absolument essayer cet outil !

La version 2 d'Autojump est disponible