Faire la somme de nombres en shell

Petit pense bête pour la prochaine fois où j'aurai besoin de faire la somme d'une liste de nombres en shell (un nombre par ligne) :

cat my_file | awk '{total+=$1}END{print total}'

Par exemple, pour obtenir la taille totale des tables dans une base de données MySQL :

mysqlshow -i my_db '*' | tr -s ' ' | cut -d ' ' -f 14 | grep [0-9] | awk '{total+=$1}END{print total}'

Supprimer les biiiiips sous Linux

Si il y'a un truc insupportable sous Linux c'est bien le biiiiip si on a le malheur de se tromper de touche. Le pire est probablement celui du mode console (hors X11) mais celui sous X est pas mal non plus. Heureusement comme d'habitude tout cela est configurable.

Sous X11

En général avec un Desktop Manager (environnement de bureau ?) type KDE ou GNOME, il y a une petite case à cocher bien planquée quelque part. Sans environnement de bureau, une simple ligne de commande avec l'utilitaire xset suffit :

$ xset b off

Dans mon cas avec Openbox, je l'a met dans mon fichier .xsession qui lance ma session après le login dans GDM. Simple rapide et efficace :)

En mode console

En mode console deux solutions. il est possible d'utiliser setterm avec la ligne suivante :

$ setterm -blength 0

Cette ligne peut être insérée dans le .bashrc (si vous utiliser bash comme shell évidemment). Il existe cependant une méthode beaucoup plus radicale qui consiste à empêcher le chargement du module pcspkr du noyau qui gère ce fameux bip. Pour cela il suffit de créer un fichier dans /etc/modprob.d, par exemple blacklist-bip avec la ligne suivante à lancer avec sudo (ou en root) :

$ sudo echo "blacklist pcspkr" > /etc/modprobe.d/backlist-bip

Et pour ne pas attendre le prochain démarrage une dernière ligne de commande avec modprobe est possible pour supprimer le module directement :

$ sudo modprobe -r pcspkr

Maintenant, vos lignes de commande seront silencieuses à souhait, reposant et magique !

Tags : Openbox, shell, bash, Linux, KDE, X11, GNOME

Les titres de OuiFM en OSD

J'aime beaucoup écouter la radio parisienne OuiFM. Pour les provinciaux, il est possible de l'écouter directement sur le site via une animation flash qui affiche le titre en cours ou avec son lecteur préféré via le flux MP3 qui est probablement capable d'en faire de même, mais il n'est pas très pratique devoir remettre au premier plan le lecteur (et/ou de changer de bureau virtuel). Je trouve aussi pénible que le lecteur affiche systématiquement le titre comme le font certains, je préfère avoir le titre à la demande. J'ai donc écrit un petit script shell qui va récupèrer le titre sur le site de OuiFM comme le fait l'animation flash et l'affiche en OSD. Pour l'utiliser sous Ubuntu (et probablement Debian), il faut installer le paquet xosd-bin et php (4 ou 5) en mode ligne de commande avec la commande suivante :

$ sudo apt-get install xosd-bin php5-cli

Le paquet xosd-bin fournit le programme osd_cat qui permet de lire un fichier à la manière de cat en affichant le résultat en OSD selon différents paramètres (couleur, police, position, ...). J'ai associé l'exécution de ce script à la touche F9 dans Openbox, ainsi si un titre passe et je ne connais pas l'artiste, je peux connaître rapidement le titre en pressant cette touche.

#! /bin/sh
 
URL_DATA="http://www.ouirock.com/data1.php"
 
TMP_FILE="/tmp/ouifm_data"$$".txt"
DATA_OSD=""
 
OSD_FONT='-bitstream-dejavu sans-bold-r-*-*-17-*-*-*-*-*-*-*'
OSD_VER_POS="bottom"
OSD_HOR_POS="right"
OSD_COLOR="#95b9c8"
OSD_DELAY=30
OSD_LINE_FROM_BOTTOM=2
 
get_infos ()
{
    DATA_SHELL=`wget "$1" -q -O - | sed 's/&/ /g'`
    eval $DATA_SHELL
    DATA_OSD=`echo '<?php echo utf8_decode(urldecode("'$artiste' - '$titre'"))."\n"; ?>' | php`
}
 
display_infos ()
{
    get_infos $URL_DATA
    echo "$DATA_OSD" > $TMP_FILE
    osd_cat -l $OSD_LINE_FROM_BOTTOM  -f "$OSD_FONT" -p "$OSD_VER_POS" -A "$OSD_HOR_POS" -c "$OSD_COLOR" -d "$OSD_DELAY" $TMP_FILE
}
 
touch $TMP_FILE
display_infos $URL_DATA
rm -f $TMP_FILE

Le seul point particulier concerne la fonction get_infos qui récupère les données sur le site de OuiFM puis crée les variables avec eval et les décode avec un tout petit morceau de PHP passé directement à l'interprèteur.

Billet rédigé en écoutant entre autres "Hey Gravity - Risen (She Said)", "Rinocerose - Cubicle", "Green Day - Basket Case", ... :-)

Script de sauvegarde de bases de données sur un FTP

Je continue tranquillement l'installation / la configuration de ma Dedibox sous Ubuntu hébergeant ce site. Après avoir fait cohabiter PHP4 et PHP5, migrer son site utilisant eZ publish, configurer mes statistiques web avec AWStats et m'être battu avec PDO_MySQL (rien que ça :)), j'en viens aux backups. On ne le répètera jamais assez, il est important de faire des backups réguliers et systèmatiques comme il est important de savoir restaurer ses sauvegardes...

En plus, le service Dedibox propose un accès FTP avec un quota de 5Go inclu dans l'offre, il serait dommage de ne pas en profiter. Il est également possible d'augmenter ce quota, moyennant finances. Pour mon serveur, j'ai choisi d'utiliser cet espace pour sauvegarder les bases de données. C'est la partie la plus volumineuse et dans beaucoup de cas, c'est le seul élément à récupèrer. De toute manière, l'ensemble des données est aussi sauvegardé à intervalle régulier sur mon PC de bureau. Bien sûr les informations indiquées dans ce billet fonctionnent également avec n'importe quel autre accès FTP.

Configuration de MySQL

Il faut tout d'abord créer un utilisateur dans MySQL qui aura le droit en lecture sur toutes les bases pour faire un dump. Cela peut se faire via un assistant comme PHPMyAdmin ou bien avec 2 requêtes SQL exécutées en tant que root (de MySQL évidemment) :

 

GRANT SELECT, LOCK TABLES, SHOW DATABASES
  ON * TO 'backup'@'localhost' 
  IDENTIFIED BY 'pass_backup';
FLUSH PRIVILEGES;

 

L'utilisateur backup de MySQL a maintenant les droits en lecture sur toutes bases (il est conseillé de mettre un mot de passe fort...). Pour qu'un script puisse se connecter sans avoir à taper le mot de passe, il faut créer un fichier nommé .my.cnf dans le répertoire personnel de l'utilisateur qui exécutera le script. Ce fichier doit ressembler à :

[client]
 port      = 3306
 user      = backup
 password  = pass_backup 

Attention à bien restreindre les permission sur ce fichier pour que personne ne puisse le lire, sauf l'utilisateur en question avec la commande suivante :

 

> tigrou@dedipwet[88.191.30.29]:~$ chmod 600 .my.cnf

 

Configuration de l'accès FTP

Une fois l'option FTP activée dans la rubrique Sauvegarde de la console Dedibox, comme pour MySQL il faut faire en sorte que l'accès FTP se fasse sans demander de mot de passe. Il faut créer un fichier .netrc toujours à la racine du dossier personnel de l'utilisateur qui fera tourner le script :

 

machine dedibackup.dedibox.fr
login login_ftp_sauvegarde
password mot_de_passe_ftp_sauvegarde

 

Avec ce fichier, les connections FTP sur dedibackup.dedibox.fr se feront avec le login et le mot de passe indiqués avec les clients FTP suivant ce fichier (ftp, lftp, ncftp, ...) sans rien demander. De la même manière que le fichier .my.cnf, il faut faire attention aux permissions sur ce fichier.

Le script

 

#! /bin/bash
# Script de sauvegarde de toutes les bases sur FTP
 
FTP='dedibackup.dedibox.fr'
MYSQL_DIR='/var/lib/mysql'
TMP="/tmp/backup_site"
 
# fenêtre de backup en semaine
ROTATION_WEEK=3 
PREFIX_DATE=`date '+%U'`
PREFIX_DATE_DELETE=`date '+%U' -d "-${ROTATION_WEEK}weeks"`
 
[ ! -d "$MYSQL_DIR" ] && exit 2
[ ! -d "$TMP" ] && mkdir -p "$TMP"
 
cd "$MYSQL_DIR"
for base in `find . -maxdepth 1 -name [a-zA-Z]\* -type d` ; do
    base=`echo $base | sed 's#\./##g'`
    mysqldump --single-transaction "$base" | bzip2 -9 - > "$TMP/$PREFIX_DATE.$base.sql.bz2"
done
cd -
lftp -e "mrm $PREFIX_DATE_DELETE* ; mput $TMP/* ; exit"  "$FTP"
rm -rf "$TMP"

 

Ce script est prévu pour être lancé une fois par semaine avec crontab. Il va faire un dump de toutes les bases, effacer les dumps de plus $ROTATION_WEEK semaines sur le serveur distant et uploader les nouveaux ensuite. Le nombre de semaines sur lequel se fait la rotation peut être modifié via la variable ROTATION_WEEK.

Statistiques web avec AWStats sous Ubuntu en mode CGI

Comme je l'écrivais dans mon précédent billet, après avoir migré mon site en eZ publish, il me restait (entre autres choses) à configurer les statistiques de pwet.fr pour terminer la migration de ce site sur ma Dedibox. Il existe beaucoup d'outils de statistiques web, personnellement j'utilise AWstats car il est assez précis, il peut être consulter via un CGI ou génèrer des pages HTML statiques et il propose pas mal d'autres petites choses sympathiques. Pour faire simple, je l'utilise en mode CGI et mes statistiques sont mises à jour une fois par jour lors de la rotation des logs avec logrotate.

Cette configuration fonctionne sans problèmes sous Ubuntu Edgy Eft et ne devrait pas être très différentes sous les précédentes versions d'Ubuntu, sous Debian et moyennant quelques petites modifications sous tout Unix like.

Installation et configuration de AWStats

Comme d'habitude sous Ubuntu, il existe un paquet pour installer AWStats, il suffit donc de l'installer avec synaptic (ou équivalent) ou de taper dans un terminal :

 

> tigrou@dedipwet[88.191.30.29]:~$ sudo apt-get install awstats

 

AWStats se configure à l'aide d'un fichier texte stocké dans /etc/awstats. Le plus simple pour commencer la configuration est de partir du fichier /etc/awstats/awstats.conf en le copiant :

 

> tigrou@dedipwet[88.191.30.29]:~$ sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.DOMAINECONSULTATION.TLD.conf

 

où DOMAINECONSULTATION.TLD est le domaine par lequel les statistiques seront accessibles. Pour ma part, je les consulte par http://pwet.fr/stats/, mon fichier est donc awstats.pwet.fr.conf. Si je les consultais via http://www.pwet.fr/stats/, ce serait awstats.www.pwet.fr.conf.

Il faut ensuite éditer ce fichier et modifier quelques paramètres pour les adapter à votre configuration (les commentaires dans ce fichier sont très utiles) :

 

  • LogFile : le chemin complet vers le fichier de log d'Apache (par exemple /var/log/apache/access.domaine.tld.log)

  • LogFormat : il faut indiquer le format de log, j'utilise combined dans Apache, donc 1 est la bonne valeur

  • SiteDomain : le domaine principal du site, ici pwet.fr

  • HostAliases : toutes les adresses permettant de contacter le site, pour ma part "pwet.fr www.pwet.fr admin.pwet.fr ez.pwet.fr"

  • DirCgi : mettre "/stats" car les statistiques seront accessibles via http://domaine.tld/stats

  • DirIcons : mettre "/icon" cf. la config d'apache plus bas.

  • AllowFullYearView : 3 pour pouvoir voir les stats sur une année

  • AllowAccessFromWebToAuthenticatedUsersOnly : mettre 1 pour obliger l'identification HTTP

  • AllowAccessFromWebToFollowingAuthenticatedUsers : mettre le ou les logins (séparés par des espaces) des personnes ayant accès aux stats.

 

Dans le cadre de ce document, le reste des options ne nécessite pas de modification ou de valeur particulière. Personnellement, je met mon IP dans SkipHosts pour m'exclure des statistiques.

Rotation des logs avec logrotate et mise à jour des statistiques

Maintenant qu'AWStats est configuré correctement, il faut lui faire génèrer les statistiques. Pour cela, il est possible d'utiliser logrotate qui en plus de faire le ménage dans les logs, va lancer awstats pour génèrer les statistiques. Pour cela, il faut créer un fichier (par exemple "pwet") dans /etc/logrotate.d et y mettre :

 

/home/tigrou/web/pwet.fr/logs/*.log {
        daily
        size 1 # si la taille des logs est > 1octet
        rotate 365 # garder une année de log
        compress # compresser les vieux logs
        dateext # les vieux logs seront datés
        create 640 root root # créer un nouveau fichier avec ces droits
        sharedscripts # lancer prerotate et postrotate une seule fois pour tous les logs
        olddir /home/tigrou/web/pwet.fr/logs/old/
        prerotate
                # Avant de changer de fichier
               /usr/lib/cgi-bin/awstats.pl -config=domaine.tld -update
        endscript
        postrotate
          # après le changment de fichier, on redémarre apache
           if [ -f /var/run/apache.pid ]; then \
             if [ -x /usr/sbin/invoke-rc.d ]; then \
                invoke-rc.d apache reload > /dev/null; \
             else \
                /etc/init.d/apache reload > /dev/null; \
             fi; \
           fi;
          # ajustement des permissions des fichiers de AWStats
           chown -R www-data:www-data /var/lib/awstats/
        endscript
}

 

Il est important de recharger (reload) apache après le changement de fichiers de logs, sinon celui se plaindera de nous pouvoir écrire dans ses fichiers. Pour que la mise à jour fonctionne, il faut biensûr que le paramètre -config de AWStats soit en accord avec le nommage du fichier de configuration.

Petite précision sur la génération des statistiques, si vous avez déjà un stock de logs, il faudra les traiter avant et dans l'ordre chronologique. Si il sont déjà gzippé dans un répertoire, ceci peut se faire avec un morceau de bash du genre :

 

cd LE_REPERTOIRE
for f in *.log.gz ; do
  echo "$f"
  gzip -d "$f"
  /usr/lib/cgi-bin/awstats.pl -config=domaine.tld -update -LogFile=${f/.gz/}
  gzip "${f/.gz/}"
done

 

Consultation en mode CGI

Maintenant que les statistiques sont générées, il ne reste plus qu'à permettre leur consultation via le web. La configuration suivante incorporée au VirtualHost de mon site permet de consulter les statistiques via le /stats :

 

Alias /awstatsclasses "/usr/share/awstats/classes/"
Alias /awstatscss "/usr/share/awstats/css/"
# mêmes paramètres que dans awstats.*.conf
Alias /stats /usr/lib/cgi-bin/
 Alias /icon "/usr/share/awstats/icon/"
<Directory /usr/lib/cgi-bin/>
  DirectoryIndex awstats.pl
  UseCanonicalName off
  AuthName "Statistiques de pwet.fr"
  AuthType Basic
  Require valid-user
  AuthUserFile /home/tigrou/web/pwet.fr/.passwdstats
  Options +ExecCGI
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

 

Pour que cela fonctionne, il faut que les modules alias, auth et cgi soit activée (utiliser apache-modconf facilite les choses), il faut aussi créer le fichier qui stocke les comptes ayant accès aux stats en utilisant htpasswd et en oubliant pas de faire correspondre le(s) login(s) avec ceux indiqués dans le paramètre AllowAccessFromWebToFollowingAuthenticatedUsers de AWStats.

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.