incron est un programme fonctionnant sur le même principe que cron, mais basé sur des événements dans le système de fichiers plutôt que sur des moments de la journée. C'est très propre: pour l'utiliser, on spécifie un ou des fichiers à surveiller, un type d'action à détecter sur le(s) fichier(s) en question, et une commande à déclencher lorsque l'événement survient. Je me suis dit que c'était l'occasion où jamais de mettre à jour un vieux script que j'avais, qui me met au courant des modifications sur mes logs (je tire l'idée de ce script d'un ancien post sur le planet libre). Après avoir installé incron, j'édite ma table de configuration incron:
incrontab -e
Avec mon éditeur favori, je lui mets la ligne suivante:
/var/log/kernel.log IN_MODIFY sh /home/me/documents/scripts/popLog.sh /var/log/kernel.log
popLog.sh est un script qui prend en argument un log, en extrait la dernière ligne modifiée, la colorise avec `source-highlight`_ et l'envoie en notification par le biais de `notify-send`_. Le but de ce script est donc d'afficher le dernier log dans une bulle, avec coloration syntaxique. Je fournis le script en question, et j'ajoute quelques explications:
- source-highlight a besoin de parler un code couleurs compris par les bulles de notifications. notification-daemon comprend des couleurs de type <span color="couleur">mots à colorier</span>, d'où le fichier supplémentaire awesome.outlang (que j'avais écrit à l'origine pour naughty et donc compatible avec celui-ci, pour les utilisateurs d'awesome wm - à ce propos il y a plusieurs entrées dans le wiki pour faire des choses semblables).
- incron ne comprend pas bien les variables d'environnement, il vaut mieux les redéfinir dans le script, comme je l'ai fait.
- faites attention à ne pas faire n'importe quoi avec incron, il est facile de créer une boucle infinie en surveillant par exemple /var/log/everything.log (vous notifiant du lancement de ce script, et donc générant une nouvelle notification): IN_NO_LOOP est votre ami.
- incron prend des chemins absolus.
Après tous ces avertissements, voici /home/me/documents/scripts/popLog.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #!/usr/bin/env bash
# Usage: popLog /var/log/yourlog
# pops a colored log with the last line of the log
export DISPLAY=":0.0"
export HOME="/home/me"
#Urgency
infoUrgency='low'
warningUrgency='normal'
errorUrgency='critical'
securityUrgency='critical'
#Popup time
infoPopupTime=5000
warningPopupTime=8000
errorPopupTime=11000
securityPopupTime=11000
#Icons
infoIcon='/usr/share/icons/gnome/32x32/status/dialog-information.png'
warningIcon='/usr/share/icons/gnome/32x32/status/dialog-warning.png'
errorIcon='/usr/share/icons/gnome/32x32/status/dialog-error.png'
securityIcon='/usr/share/icons/gnome/32x32/status/security-medium.png'
coloredLog=$(tail -n 1 $1 | \
source-highlight --failsafe \
--src-lang=log \
--style-file=default.style \
--outlang-def=${HOME}/documents/scripts/awesome.outlang)
if [[ $coloredLog!='' ]]; then
if [[ $(echo $1|grep info) ]]; then messageType='info'; fi
if [[ $(echo $1|grep warn) ]]; then messageType='warning'; fi
if [[ $(echo $1|grep err) ]]; then messageType='error'; fi
if [[ $(echo $1|grep auth) ]]; then messageType='security'; fi
if [[ $(echo $1|grep access) ]]; then messageType='security';fi
if [[ $(echo $notification|grep 'UFW BLOCK INPUT') ]]; then
messageType='security'; fi
if [[ $messageType == '' ]]; then messageType='info'; fi
case $messageType in
info)
urgency=$infoUrgency
icon=$infoIcon
popupTime=$infoPopupTime
;;
warning)
urgency=$warningUrgency
icon=$warningIcon
popupTime=$warningPopupTime
;;
error)
urgency=$errorUrgency
icon=$errorIcon
popupTime=$errorPopupTime
;;
security)
urgency=$securityUrgency
icon=$securityIcon
popupTime=$securityPopupTime
;;
esac
notify-send -u $urgency -t $popupTime -i "$icon" "$1" "$coloredLog"
fi
|
Et voici /home/me/documents/scripts/awesome.outlang:
extension "awesome"
color "<span color=\"$style\">$text</span>"
colormap
"green" "#33CC00"
"red" "#FF0000"
"darkred" "#990000"
"blue" "#0000FF"
"brown" "#9A1900"
"pink" "#CC33CC"
"yellow" "#FFCC00"
"cyan" "#66FFFF"
"purple" "#993399"
"orange" "#FF6600"
"brightorange" "#FF9900"
"brightgreen" "#33FF33"
"darkgreen" "#009900"
"black" "#000000"
"teal" "#008080"
"gray" "#808080"
"darkblue" "#000080"
default "#66FFFF"
end
Je vous laisse faire joujou, je suis sûr que vous allez trouver plein d'idées.
Comments !