pacman 5 les hooks

un hook ?

le hook est un déclencheur d’action en fonction de fichier(s) ou paquet(s). cette action est en fonction de l’événement sur le fichier ou paquet.

Il existe 3 types d’événements pacman :
Install
Upgrade
Remove
ces événements peuvent êtres combinés dans un seul hook.

Les hooks sont déclenchés deux fois par pacman, un pré installation (après téléchargement) et un autre post installation.

Les fichiers :

les hooks sont des fichiers textes de type .ini avec une extension (obligatoire) « .hook ». pacman pour les lancer recherche dans le répertoire /usr/share/libalpm/hooks/ et /etc/pacman.d/hooks/.
Donc nous plaçons nos fichiers .hook dans /etc/pacman.d/hooks/ et les scripts dans /etc/pacman.d/hooks.bin/

La structure générale du fichier est :

[Trigger]
Type = File ou Package
Operation = Upgrade ou Install ou Remove
Target = etc/systemd/system/*.service

[Action]
Description = texte affiché automatiquement en console
when = PostTransaction ou PreTransaction
Depends = systemd
Exec = /usr/bin/echo ".."

[Trigger] est le déclencheur
Operation : 3 valeurs sont possibles Install, Upgrade ou Remove; plusieurs valeurs sont possibles
Type : le contexte, une des deux valeurs File ou Package
Target : liste des fichiers ou paquets (voir Type) qui déclenchent l’action, valeur négative possible

[Action]
Description : est le texte affiché en console
When : pré ou post installation : PreTransaction ou PostTransaction
Exec : la commande à exécuter
Depend : optionnel, une ou plusieurs dépendances obligatoire

voir le man alpm-hooks

Par la suite, je vais vous présenter quelques hooks, attention ce ne sont que des exemples, ils sont ici à titre de démonstration et donc n’ont pas obligatoirement d’utilité. le but est de faire un tour des possibilités et non de donner de nouvelles fonctionnalités à pacman.

Hooks avant installation :

Exemple d’un hook qui se déclenche une unique fois pré installation
/etc/pacman.d/hooks/pre-install.hook

[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = *

[Action]
Description = paquet pre-install!
When = PreTransaction
Exec = /usr/bin/sh -c 'echo "sauve..."; /usr/bin/pacman -Qq > /tmp/pacman.save'    
#Exec = /etc/pacman.d/pre.sh

A noter que même si pacman upgrade/installe plusieurs paquets, le hook n’est déclenché qu’une seule fois.

———————

Autre hook pré-installation, ici nous refusons de désinstaller certains paquets :
/etc/pacman.d/hooks/obligatoire.hook

[Trigger]
Operation = Remove
Type = Package
Target = pacman
Target = bash
Target = yaourt-git
Target = zsh

[Action]
Description = OBLIGATOIRE, pas de désinstallation possible
When = PreTransaction
Exec = /usr/bin/false
AbortOnFail

A noter ici que nous avons plusieurs Target. Dans [Action], le mot clé AbortOnFail est ajouté pour fermer pacman au cas ou un de ces Target est rencontré.

———————

Autre hook qui va cette fois ci s’appliquer sur les fichiers:
/etc/pacman.d/hooks/securite.hook

[Trigger]
Operation = Install
Operation = Upgrade
Type = File
Target = home/*
Target = usr/local/*
Target = tmp/*

[Action]
Description = destination NON conforme !
When = PreTransaction
Exec = /usr/bin/false
AbortOnFail

avec le mot clé AbortOnFail, ce hook refuse certaines destinations.

Hooks après installation :

un hook général sur les fichiers post installation
/etc/pacman.d/hooks/mylocales.hook

[Trigger]
Operation = Install
Operation = Upgrade
Type = File
Target = usr/share/locale/*.mo
Target = !usr/share/locale/fr*
Target = !usr/share/locale/en*

[Action]
Description = fichiers de traduction
When = PostTransaction
Exec = /bin/sh -c 'while read fichier; do truncate -s 0 "/${fichier}" ; done'
NeedsTargets
#meme resultat que pacman.conf
#NoExtract = usr/share/locale/* !usr/share/locale/fr*

ce hook utilise des target négatifs
le mot clé NeedsTargets permet de parcourir les fichiers qui vont déclencher l’action.

———————

autre hook sur les fichiers des paquets; dont seul intérêt est technique !
/etc/pacman.d/hooks/news.hook

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = *

[Action]
Description = nouveautes ?.
When = PostTransaction
Exec = /etc/pacman.d/hooks.bin/news.sh
NeedsTargets

/etc/pacman.d/hooks.bin/news.sh

#!/bin/bash
echo '----------'
while read -r package; do
   echo "paquet: $package"
   pacman -Ql "${package}" 2>/dev/null | grep -Ei "news|readme"
done

ici le hook utilise un script perso
le hook parcours les paquets, mais ensuite, le script parcourt les fichiers des paquets

———————

Il nous reste le hook attaché à un seul paquet, sans doute celui qui sera le plus utilisé.

/etc/pacman.d/hooks/mirrorlist.hook

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = pacman-mirrorlist

[Action]
Description = lancement de reflector
When = PostTransaction
Depends = reflector
Exec = /etc/pacman.d/hooks.bin/mirrorlist.sh

/etc/pacman.d/hooks.bin/mirrorlist.sh

#!/bin/sh
echo "[$(date +'%F %H:%I')] [HOOK] pacman-mirrorlist" >>/var/log/pacman.log
reflector --verbose --country France -l 5 -p http --sort rate --save /etc/pacman.d/mirrorlist
if (($?==0)); then
    if [ -f "/etc/pacman.d/mirrorlist.pacnew" ]; then
       rm /etc/pacman.d/mirrorlist.pacnew
    else
       echo "pas de .pacnew ?"
    fi
fi

A noter , ici le hook utilise Depends

———————

autre exemple, uniquement à la mise à jour, relancer automatiquement un service
/etc/pacman.d/hooks/apache.hook

[Trigger]
Operation = Upgrade
Type = Package
Target = apache

[Action]
Description = relance de apache ?
When = PostTransaction
Depends = systemd
Exec = /etc/pacman.d/hooks.bin/apache.sh

/etc/pacman.d/hooks.bin/apache.sh

#!/bin/sh
if [ -f "/etc/httpd/conf/httpd.conf.pacnew" ]; then
   echo "PAS de relance, veuillez a gérer votre .pacnew"
else
   systemctl restart httpd
fi

les scripts :

pacman met à disposition une variable d’environnement. Elle peut-être testée pour être certain d’être dans le bon environnement.

[[ "${HTTP_USER_AGENT:0:6}" != 'pacman' ]] && exit 2

La liste des fichiers ou paquets est passée en input au script; pour les récupérer directement :

declare -a paquets=($(cat -))
echo " ${#paquets[@]} paquets traités"

———————
Pour plus de code, quelques hooks de Andrew Gregory sont disponibles.

Share Button

Vous devriez aimer...