Mon blog-notes à moi que j'ai

Blog personnel d'un sysadmin, tendance hacker

Détecter automatiquement les nouvelles versions amont de logiciels

Il arrive, malheureusment fréquemment, que vous ayez à utiliser des logiciels dont le processus de publication soit assez « discret ».
J’entends par là que certains éditeurs n’annoncent pas, ou mal, les nouvelles versions. Souvent, vous n’aurez pas de moyen simple d’être prévenu de la publication d’une nouvelle version, comme par exemple un flux RSS.
La plupart des éditeurs se contentent malheureusement d’annoncer la nouvelle version sur leur site web, ou éventuellement sur les réseaux sociaux.

Vous en êtes donc réduits à répéter la même procédure, ennuyeuse, qui consiste à télécharger manuellement la nouvelle version.
Je ne sais pas pour vous, mais moi je suis paresseux. Je déteste répéter manuellement encore et encore une procédure, toujours la même.

Ne réinventons pas la roue

En fait, le problème se pose avec quasiment tous les logiciels.

Du côté des distributions Linux, et notamment de GNU/Linux Debian, les développeurs ont résolu le problème en inventant des outils, et notamment uscan pour simplifier la maintenance des paquets.

Le bon côté de uscan est que vous pouvez l’utiliser même si vous ne maintenez pas de paquets Debian.

Fonctionnement

L’utilitaire uscan est fourni dans le paquet devscripts

apt-get install devscripts

Pour la maintenance de paquets Debian, uscan a besoin de 2 fichiers:

  • debian/changelog qui sera utilisé pour déterminer le nom du paquet et la version actuelle
  • debian/watch qui contient les règles à appliquer pour détecter et télécharger la nouvelle version amont

Mais il est possible de fournir manuellement à uscan le nom du paquet, à l’aide de l’option --package, et la version courante, option --upstream-version.
Du coup, vous n’avez besoin que de vous concentrer sur le contenu du fichier watch.

Le « prototype » de la commande uscan ressemble donc à

uscan --package my_fake_package_name --upstream-version 0

Il est également possible d’indiquer un fichier watch spécifique

uscan --package my_fake_package_name --upstream-version 0 --watchfile my_watch_file

Par défaut, uscan va télécharger la nouvelle version amont dans le répertoire parent ../ et créer un lien symbolique <nom_du_paquet>_<version>.orig.tar.gz pointant vers l’archive réelle.
Il va au passage vérifier la présence ou non de la dite version pour ne pas déclencher de téléchargement inutile.

Vous pouvez enfin spécifier de nombreuses autres options. Je vous invite à consulter la page de manuel de uscan

Le fichier watch

Une fois que vous avez déterminé le nom du paquet et la version courante, uscan va examiner le fichier watch et appliquer les règles qui s’y trouvent.

Une fois de plus, la page de manuel contient pas mal d’exemples.
Je me limiterai à en expliquer quelques uns seulement, à l’aide d’exemples concrets.

Tableau Python SDK

Tableau est un logiciel qui permet de construire simplement des rapports. L’éditeur fournit un SDK Python. Malheureusement, le lien vers ce SDK est perdu au fin fond de la documentation.

Les règles uscan sont très simples:

Charge la page indiquée, cherche un lien correspondant au modèle fourni, extrait le numéro de version et télécharge la cible du lien correspondant à la version la plus élevée

Le fichier watch ressemble à

version=4
https://onlinehelp.tableau.com/current/api/sdk/en-us/SDK/tableau_sdk_installing.htm \
    .*/tssoftware/Tableau-SDK-Python-Linux-64Bit-([\d-]+).tar.gz

La première ligne correspond à la version des règles uscan.
La seconde ligne fournit l’URL de la page d’aide en ligne suivi du motif de lien à rechercher. Le motif utilise bien entendu la syntaxe des expressions rationnelles.
Le numéro de version est capturé à l’aide du motif ([\d-]+).

Dataiku studio

Dataiku DSS est une plate-forme d’analyse de données. Une version « communautaire » gratuite est disponible mais malheureusement la page n’est pas très à jour 1. En plus, elle nécessite l’utilisation de Javascript.
Il faut donc aller voir directement sur http://downloads.dataiku.com/public/studio, puis cliquer sur le numéro de version souhaité pour arriver enfin sur la page avec l’archive.

La règle uscan est extrêmement simple

version=4
https://downloads.dataiku.com/public/studio/([\d\.]+)/ \
    dataiku-dss-([\d\.]+).tar.gz

Vous noterez que le motif correspondant au numéro de version est indiqué 2 fois. De plus, l’URL de la page de départ se termine par /. Ceci indique à uscan qu’il doit télécharger la page parent, ici https://downloads.dataiku.com/public/studio, chercher tous les liens qui correspondent au motif, choisir le numéro le plus élevé et ouvrir la page correspondante.
Sur cette page, uscan va chercher le ou les liens correspondant au motif dataiku-dss-([\d\.]+).tar.gz, choisir la version la plus élevée le cas échéant et télécharger l’archive.

Testons

Dans mon cas, je crée 2 répertoires downloads et watch. Dans le répertoire watch je crée un fichier dataiku-dss dont le contenu correspond à l’exemple ci-dessus.

Les règles sont les suivantes:

  • le nom du (faux) paquet Debian correspond au nom du fichier watch. Ici dataiku-dss
  • la version courante correspondra à la dernière téléchargée, telle que détectée dans le répertoire download

Lorsque l’on exécute la commande

uscan --download \
      --package dataiku-dss \
      --upstream-version 0 \
      --destdir downloads \
      --watchfile watch/dataiku-dss

La version 0 est la valeur par défaut que j’utilise lorsqu’aucune version n’a encore été téléchargée.
uscan devrait afficher queque chose comme

uscan: Newest version of dataiku-dss on remote site is 3.0.3, local version is 0
uscan:    => Newer package available from
      https://downloads.dataiku.com/public/studio/3.0.3/dataiku-dss-3.0.3.tar.gz

Le code de sortie doit être 0, indiquant que uscan a trouvé et téléchargé une nouvelle version. Dans le cas contraire, le code de sortie est 1.
L’archive devrait se trouver dans le répertoire downloads

> ls -l downloads/
total 342996
lrwxrwxrwx 1 jbfavre jbfavre        24 juin  11 09:17 dataiku-dss_3.0.3.orig.tar.gz -> dataiku-dss-3.0.3.tar.gz
-rw-r--r-- 1 jbfavre jbfavre 270791663 juin  11 09:17 dataiku-dss-3.0.3.tar.gz

Le lien symbolique permet de normaliser le nom de l’archive, indépendemment du nom utilisé par l’éditeur. C’est évidemment très pratique pour déterminer la version courante, mais également pour gérer le déploiement de la nouvelle version par un système de gestion de configuration.

Automatisons

Évidemment il faut pouvoir traiter automatiquement l’ensemble des fichiers watch.
En l’occurrence, un bête script shell fera l’affaire.

Le nom du (faux) package correspond au nom du fichier watch. En shell

for package in $(ls -1 watch/);
do
    current_version=$(check_version ${package})
    […]do_stuff[…]
done

La version courante est déterminée en recherchant l’archive dans le répertoire downloads. En shell

function check_version() {
    package=$1
    last_archive=$(ls -1 downloads/${package}_*.orig.tar.gz 2>/dev/null)
    version=${last_archive#downloads/${package}_}
    version=${version%.orig.tar.gz}
    if [ "X${version}" == "X" ];
    then
        version=0
    fi
    echo ${version}
}

Enfin, la commande uscan complète devient:

uscan --download \
      --package ${package} \
      --upstream-version ${current_version} \
      --watchfile watch/${package} \
      --destdir ./downloads/

Le tout est disponible sous license GPLv3 sur le dépôt Github du projet irma-uscan.

Vous n’aurez donc plus d’excuse pour avoir raté une nouvelle version de vos logiciels!
Enjoy :)


  1. message à caractère personnel: laissez tomber le RSS dont on avait parlé il y a quelques mois, je n’en ai plus besoin :-D