Pour les scripts : c'est ici

Bon ben voila je me suis fais un petit script pour compiler et recompiler mon noyau :

#!/bin/sh

case "$1" in
    compil )
echo "Compilation kernel :"

cd /usr/src/linux

if make-kpkg --append-to-version "$2" --initrd kernel_image modules_image kernel_headers > /dev/null >& /dev/null ; then
    echo "Compilation réussie."
else
    echo "Compilation échouée."
    exit 1
fi

echo "Installation :"
dpkg -i /usr/src/linux-*.deb
exit 0
;;
    clean )
echo "Nettoyage des sources:"

if make clean > /dev/null >& /dev/null && make-kpkg clean > /dev/null >& /dev/null ; then
    echo "Nettoyage fini."
    exit 0
else
    echo "Nettoyage échoué."
    exit 1
fi

echo "Suppression des paquets :"

rm -v /usr/src/*.deb
;;
    recompil )
    "$0" clean && "$0" compil "$2"
esac

Il s’utilise très simplement (il est pas très commenté parce qu’il y a des echo à chaque point important) :

$ sudo compil_ker compil "-emt64" # pour compiler le noyau et l'installer
$ sudo compil_ker clean # pour nettoyer les sources et supprimer les paquets
$ sudo compil_ker recompil "-emt64" # pour faire un nettoyage avant de recompiler puis d'installer le noyaux

C’est surtout pour donner des idées.

J’en profite pour poster mes quelques scripts tant qu’a faire.

en voilà un autre pour recompiler son kernel c’est assez basique mais je suis en train de l’améliorer. C’est la version dispo sur mon site :wink:

##############################
# @author : Ashgenesis
# @version : 0.1
# @contact : ashgenesis@gmail.com
# Utilisation
# kernel.sh [nom_noyau] [nom_personnalisation]
# Exemple
# kernel.sh linux-source-2.6.15 seal
##############################
echo "Mise à jour de la config actuelle"
apt-get update && apt-get upgrade
cd /usr/src/
echo "Installation des sources"
sleep 3
apt-get install $1
sleep 3
echo "Decompression des sources"
tar -xvjf $1.tar.bz2
rm linux
ln -s $1 linux
echo "Copie de la config"
cp /boot/config-`uname -r` /usr/src/linux/.config
cd linux
sleep 3
echo "Lancement de la compilation"
make-kpkg --append-to-version "-$2" --initrd buildpackage --config menuconfig
echo "Compilation Terminée !\nInstallation en cours\nPlease wait !!"

Et voilà un script qui récupère la vitesse de connexion d’après le site de mire.ipadsl.net

#!/usr/bin/perl -w
use strict;
use Carp;
use LWP::Simple;
use HTML::Parser;
my $url = "http://mire.ipadsl.net/speedtest.php";
my $content = get($url);
defined $content or die "Can't fetch HTML from mireip";
$content =~ /([0-9]{4}\.[0-9]{0,4})\w+/;
my $val = $1;
if($val ne ''){
  open(my $fd, ">>debit.txt");
  print $fd $val."\n";
  close($fd);
}

Il doit sûrement pouvoir être amélioré mais il a l’avantage de fonctionner pour le moment et de faire ce que je lui demande. Une fois le fichier créé on peux le récupérer pour en faire un tableau et créér par la suite un graphique.

Un autre petit script pour savoir quand la nouvelle version d’un kernel est dispo :wink:

#!/bin/sh
sudo apt-get update >> /dev/null
var=$(sudo aptitude search linux-source-2.6.23 | awk '{print $2}')
if [ $var ]; then
	DISPLAY=:0.0 xmessage -center $var est disponible&
fi

un script pour les gouverner tous :

~$ cat bin/coolnquiet
#!/bin/bash

SYSPATH=/sys/devices/system/cpu/cpu0/cpufreq
AVAL_GOV=$(cat $SYSPATH/scaling_available_governors)

echo "Current governor:    "$(cat $SYSPATH/scaling_governor)
echo "Current frequency:   "$(expr $(cat $SYSPATH/scaling_cur_freq) / 1000)" MHz"
echo
echo "Available governors: "$AVAL_GOV
while [ "x$resp" = "x" ]; do
  select resp in $AVAL_GOV; do
    break
  done
done
sudo sh -c "echo $resp > $SYSPATH/scaling_governor"
echo "New governor:    "$(cat $SYSPATH/scaling_governor)
echo "New frequency:   "$(expr $(cat $SYSPATH/scaling_cur_freq) / 1000)" MHz"

il les gouverne tous, oui, mais qu’est ce qu’il fait. du paramétrage de powernowd, en changeant le power governor (je ne me rappelait jamais des chemins, vaeleurs, noms etc). J’hésitais à y ajouter une interface en Xdialog et à lancer le tout en gksudo/gksu, vous en pensez quoi ?

il y a même mieux (à mon avis), à une époque, j’avais fait un truc similaire mais pour l’intégré à munin, qui produit le graph directement, sauf qu’à l’époque ma machine n’était pas sauvegardée et qu’aujourd’hui ma bande passante est relativement stable)

Je n’en doute pas qu’il y a mieux mais je n’avais pas envie d’un truc complexe déjà tous fait :wink: et puis comme ça j’exporte les données comme je veux ça fonctionne très bien avec ma classe de conception de graphique en php :smiley:

ok, cool, dit je peux avoir un aperçu de ta classe php, ou de son résultat quelque part.

Aucun problème je te fait ça cette après midi avec différents tableaux et différents type de graphiques proposé :wink:

C’est une classe qui a été développée rapidement, il y a encore des choses à améliorer :wink:

j’avais personnellement fait un truc en 100% css : hypercube.dynalias.org/grapher/index.php

C’est sympa ton graphe tiens voilà le résultat pour les classes je les metterais en ligne un peu plus tard car je suis un peu occupé

ashgenesis.free.fr/graphe/

excellent …

Hello

Qui n’a pas fait une foi le gag d’un chmod 0777 -R /etc :astonished:

bref c’est la qu’on ce dit comment faire ?
Ben avec ce petit script facilement adaptable.

#!/bin/sh
#Tester le 11.08.2007 en root

#Repertoire a scanner !
ScanRep=(/etc /usr /boot /lib /opt /sbin /root /srv /var /initrd /proc /selinux /home /bin /dev /sys /vmlinuz /initrd.img /tmp)

for TB in ${ScanRep[*]} ;do
#Modifier ici le répertoire de sauvgarde (par défaut c'est sur le bureau de l'utilisateur en cours)
Filesave1="$HOME/Desktop${ScanRep["$i"]}.acl.sav1"
FULLSAVE=${ScanRep["$i"]}
echo "Demarrage : " `date` " pour $FULLSAVE"
getfacl -R  --absolute-names $FULLSAVE  > $Filesave1
echo "Opération terrminée : " `date` " pour $FULLSAVE"
i=$(($i+1))
done
echo "ctrl+c pour sortire"
sleep 3600

#Pour la restauration
# setfacl --restore=$Filesave1

Sa peux servire, a vos clavier :smiley:
Note de Ricardo :
5 fautes sur 6 mots, tu vas être ds le livre Guinness. :laughing:
Ça peut servir, à vos claviers

Voila un petit script qui permet de monter ou démonter des ressources distantes en utilisant sshfs+fuse. Il faut avoir sshfs et fuse installés et configurés et avoir un accés distant (en ssh bien sûr) pour monter un répertoire… Il faut aussi avoir zenity, un utilitaire pour afficher des boites de dialogue…
J’ai fait ça pasque je voulais le faire, et pasque je me suis dit que ça serait sympa. Pour ce qui est de l’utilité de mettre des boites de dialogue graphique à un truc qui se lance en ligne de commande, c’est vrai que c’est discutable. Je compte le faire évoluer! Par exemple ajouter une gestion des favoris (montage déja efféctués…)
Pour ceux qui sont attachés au dépendances de KDE et qui souhaitent éviter les dépendances de GNOME; sachez que l’installation de zenity va vous donner quelques dépendances… Tant pis pour vous :slightly_smiling: ou alors ne testez pas ce script tout pourri…

J’espère que vous parviendrez à le faire fonctionner. En tout cas je remercie d’avance ceux qui le testeront… Pour ma part chez moi ça marche même si il y a encore des trucs à prendre en compte.

#!/bin/bash
ENCFS=`which sshfs`

monter() {

if [ ! -e $HOME/.monteur ] 
then
	touch $HOME/.monteur
fi

if [ -d $HOME/fuse ]
then
	echo $HOME/fuse "existe"
else
mkdir $HOME/fuse
fi

#if [ `less $HOME/.monteur | wc -l` -eq `echo 0` ] 
#then
	NUSER=`zenity --entry --text="Nom d'utilisateur" --entry-text=USER`
	NHOST=`zenity --entry --text="Nom de l'hôte ou adresse IP" --entry-text=HOST`
	ARBO=`zenity --entry --text="Point dans l'arborescence distante (chemin Absolu impératif! c'est encfs qui le dit.)" --entry-text=ARBO`
	echo $ARBO > temp
	NOMARBO=`sed 's/\/\([^$]\)/-\1/g' temp`
	rm -f temp

if [ -d $HOME/fuse/$NUSER-$NHOST$NOMARBO ]

then

	echo "Le répertoire de montage existe"
	if [ `ls $HOME/fuse/$NUSER-$NHOST$NOMARBO | wc -l` -eq `echo 0` ]
		then
		echo "Le répertoire de montage est vide - OK"
		sshfs $NUSER@$NHOST:$ARBO  $HOME/fuse/$NUSER-$NHOST$NOMARBO && exit 0
		else
		echo "Le repertoire" $HOME/fuse/$NUSER-$NHOST$NOMARBO "n'est pas vide, il faut qu'il soit vide!" && exit 1
	fi

else

	mkdir $HOME/fuse/$NUSER-$NHOST$NOMARBO
        echo "Le répertoire de montage est crée"
	sshfs $NUSER@$NHOST:$ARBO  $HOME/fuse/$NUSER-$NHOST$NOMARBO && exit 0
fi

#else
	#dansle cas ou on veut monter un "favoris"
	#lire le fichier monteur et faire ce qu'il faut... 
	#echo "joe"

#fi
}

demonter() { 
 
mount | grep sshfs > tmp2 
sed 's/.*\(\/home\/[a-z]*\/fuse[^ ].*\) type.*/\1/g' tmp2 > tmp3 
sed 's/^\(\/home\)/FALSE \1/g' tmp3 > tmp4 

 
#construction de LISTE 

N0=`cat tmp4 | wc -l` 
while [ "$N0" -ne 0 ] 
do 
	LISTE=`head -n 1 tmp4`" "`echo $LISTE` 
	N0=`expr $N0 - 1` 
	sed '1d' tmp4 > tmp5 
	rm -f tmp4 
	mv tmp5 tmp4
done 
 
DOSSIER=$(zenity  --list  --text "Choisir le dossier à démonter" --radiolist  --column "Choix" --column "Dossier" `echo $LISTE`) ; echo $DOSSIER 
fusermount -u $DOSSIER
}

CHOIX=`zenity --list --text "Choisissez votre option" --radiolist --column "Choix" --column "Action" TRUE 
Monter FALSE Demonter`

case $CHOIX in
        'Monter')
        monter
        ;;
        'Demonter')
        demonter
        ;;
        *)
        zenity --text="taper un pour monter et deux pour démonter"
esac

Hop un petit script pour générer ma signature dans les mails evolution
(il faut renvoyer du HTML) :

#!/bin/sh

echo "_____________<br />"
# Version du noyau
echo "$(cat /proc/version | awk '{ print $11" "$1" "$3 }' | sed -e "s/(\(.\)/\1/g")<br />"
# Version de Evolution
echo -n "$(evolution --version | sed "s/evolution-[0-9.]*/Evolution/g")"
# Version de Firefox
echo " && $(iceweasel --version | sed -e "s/\(.\),.*/\1/g")<br />"

Encore une fois je pense que c’est optimisable.

Script qui encode tous les wav d’un répertoire en ogg et les renomme en piste-1.ogg, piste-2.ogg, piste…

#!/bin/bash
for i in *.wav
do
if [ -f "$i" ]; then
let "j += 1";
oggenc "$i" -o "piste-$j.ogg"
fi
done

Encore un autre script celui-ci n’est pas vraiment très utile mais bon :smiley:

#!/bin/bash
if [ ! -d avi ]; then
  mkdir avi
fi

for i in *.flv
do
if [ -f "$i" ]; then
mencoder "$i" -ofps 25 -ovc lavc -oac mp3lame -o "avi/$i.avi"
fi
done

A exécuter dans le répertoire contenant les fichiers flash (téléchargé sous youtube par exemple), ce script les converti en fichier avi avec un encodage du son en mp3. Il créé un répertoire avi dans lequel sera stocké les fichiers encodé. Nécessite mencoder et lame

[edit] Je crois qu’un script dans le même genre à déjà du être posté.[/edit]

Pour extraire des pistes audio depuis un cd et les encoder en ogg

#!/bin/sh

# Passer au script les 4 arguments suivants séparés par des espaces et encadrés par des guillemets si
#besoin : le numéro de la 1ère piste à extraire, celui de la dernière piste, le répertoire de
#destination sans slash final et le nom générique des pistes à extraire

eject -t /media/cdrom0
x=$1;n=$2
mkdir -p "$3"

while [ $x -le $n ]
do
cdparanoia -vwYd /dev/hdc $x "$3/$4"_$x.wav
        f="$3/$4"_$x.wav
        o=`echo "$f"|sed 's|\.wav$|.ogg|'`

        if test ! -r "$o" ; then
         echo "$f -> $o"
         oggenc -q 10 "$f" -o "$o"
         rm -f "$f"
        fi

x=`expr $x + 1`
done

eject  /media/cdrom0

il y a une possibilité avec cdparanoia de récupérer les infos sur les pistes (auteur/titre/etc) mais sa façon de les écrire ne m’a jamais plu…

Pour convertir des ogg en mp3 en gardant les noms de fichiers

#!/bin/sh

# Passer en arguments le répertoire source, sa profondeur (/a/b/c.ogg vaut 4) et le répertoire de destination sans slash final

mkdir -p "$3"

for f in "$1"/*.ogg
do
    n=`echo "$f"|sed 's|\.ogg$|.wav|'`
    if test ! -r "$n" ; then
        echo "$f -> $n"
        ogg123 -d wav -f "$n" "$f"

        o=`echo "$n"|cut -f $2- -d / |sed 's|\.wav$|.mp3|'`
          if test ! -r "$o" ; then
             echo "$n -> $3/$o"
             bladeenc -br 320 -del -outdir="$3" "$n"
          fi
    fi
done

Voila j’ai fait un petit script python pour me simplifier la vie pour la gestion des modules rsync.

Supposant que vous ayez défini les modules rsync à sauvegarder à partir d’un ou plusieurs serveurs, le script suivant vous permettra d’automatiser leur sauvegarde incémentale.
A présent ce script permet de définir le nombre de jours maximum d’archive, le délais minimum entre deux backups, l’adresse et le module distant à sauvegarder, le répertoire de sauvegarde sur la machine dédiée, et si oui ou non la sauvegarde est autorisée.

J’ai encore pas mal de choses en tête pour améliorer le script que ce soit au niveau layout ou options à ajouter …

Voici un exemple de fichier de configuration “config”:

[diamond.stones.lan]
  comment = Sauvegarde de Produit
  enable = yes
  path = /mnt/backup
  address = diamond.stones.lan
  module = produit
  days = 30
  hours = 24 

[emerald.stones.lan]
  comment = Sauvegarde des base de données
  enable = yes;
  path = /mnt/backup
  address = emerald.stones.lan
  module = mysql
  days = 5
  hours = 6
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# =============================================================================
#
# File .....: bckmg.py - Gestionnaires de backup
# Date .....: 23/05/2008
# Author....: Franck Joncourt <franck 
#		!rtsp		  Dot Joncourt
#		..*q..			AT Wanadoo Dot Fr>
#
# Le script est largement inspiré de celui de Leland Elie (roller.py) et du 
# travail fait sur http://www.mikerubel.org/computers/rsync_snapshots/
#
#                    -------------------------------
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to :
#
#                   the Free Software Foundation, Inc.,
#                      51 Franklin St, Fifth Floor,
#                      Boston, MA  02110-1301  USA
#
#                     -------------------------------
#
# =============================================================================

# Importation des librairies
import os
import time
import sys
from optparse import OptionParser

# Déclaration des constantes
NAME = "lbm4r"
DESC = "Mise à jour de la sauvegarde des modules via rsync."
VERSION = "0.4"
PIDFILE = "/var/run/" + NAME + ".pid"

# Déclaration des variables globales
Servers = []
OptionsList = ["name",
               "comment",
               "enable",
               "path",
               "address",
               "module",
               "days",
               "hours"]

#*******************************************************************************
# Parser le fichier de configuration
#
# Cette fonction permet de lire le fichier de configuration afin
# d'obtenir les informations utile au backup
def ParseConfigFile():

  print "Chargement de la configuration à partir du fichier /etc/lbm4r.conf\n"
  CurrentServer = {}

  # Ouvrir le fichier
  try:
    fh = open("/etc/lbm4r.conf", 'r')
    data = fh.readlines()
    fh.close();
  except :
    print ("ERROR: Unable to access config file")
    sys.exit()

  # Parcourir le fichier de configuration
  for line in data:

    line = line.strip()
   
    # Obtenir le nom du serveur et sauvegarder la configuration précédente
    if line.find('[') == 0:

      # Sauvegarder la configuration précédente si elle existe
      if len(CurrentServer) > 0:
        Servers.append(CurrentServer)
        CurrentServer = {}

      # Obtenir le nom de la nouvelle configuration
      if len(line) > 2:
        CurrentServer['name'] = line.replace('[', '').replace(']', '')

    # Obtenir les informations du serveur, pas les commentaires
    elif line.find('#') != 0:
      if len(line) > 2:
        key = line.split('=')
        if len(key) == 2:
          CurrentServer[key[0].strip().lower()] = key[1].strip().lower()

  # Sauvegarder la dernière configuration obtenue
  if len(CurrentServer) != 0:
    Servers.append(CurrentServer)

#*******************************************************************************
# Vérifier la configuration obtenue
#
# Cette fonction permet de vérifier la configuration obtenue en parsant le
# fichier de configuration de l'application
#
# \return  0 si la configuration serveur est valide
#         -1 si une option est manquante
#         -2 si la configuration n'est pas autorisée
def CheckConfig(server):

  # Vérifier que toutes les options sont présentes
  for option in OptionsList:
    if server.has_key(option) == 0:
      return -1

  # Vérifier que le backup est autorisé
  if server['enable'].find('yes') == 0:
    print "* Configuration pour %s validée" % server['name']
    return 0
 
  else:
    return -2

#*******************************************************************************
# Effectuer le traitement des anciens backups
#
# Cette fonction se déplace dans le répertoire de backup et le crée si
# nécessaire. Esnuite, il vérifie que le backup peut-être effectué en fonction
# du délais autorisé entre les backups. De la même manière, le plus ancien
# sera supprimé si nécessaire. Pour finir, une copie du plus récent backup
# sera faîte afin de recevoir la nouvelle sauvegarde incrémentale.
#
#   - server.: nom du serveur
#   - path ..: le chemin de sauvegarde pour le serveur
#   - module : nom du module à sauvegarder
#   - days...: nombre de jours maximum de sauvegarde
#   - hours..: nombre d'heures minimum entre deux backups
#
# \return  0 si l'opération a été effectuée avec succès
#         -1 si une erreur s'est produite
def ProcessLastBackups(server, path, module, days, hours):

  # Se placer dans le répertoire racine associé au serveur
  try:
    os.chdir(path)

  except OSError:
    print "   [ERROR] Impossible d'accéder au répertoire racine %s " % path,
    print "associé au server %s." % server
    return -1

  # Se placer dans le répertoire racine du module
  try:
    os.chdir(module)

  except OSError:
    try:
      os.mkdir(module)

    except OSError:
      print "   [ERROR] Impossible de créer le répertoire racine",
      print "%s/%s associé au module %s" % (path, module, module),
      return -1

    try:
      os.chdir(module)

    except OSError:
      print "   [ERROR] Impossible d'accéder au répertoire racine",
      print "%s/%s associé au module %s" % (path, module, module),
      return -1

  # Obtenir la liste des précédentes sauvegardes
  backupList = os.listdir('./')
  for directory in backupList:
    if os.path.isdir(directory) == False:
      backupList.remove(directory)
  backupList.sort(reverse=True)

  # En déduire la plus ancienne et la plus récente sauvegarde
  # et effectuer le traitement nécessaire
  if len(backupList) > 0:
    lastBackup  = int(time.mktime(time.strptime("%s" % backupList[0],
                         "%Y%m%d%H")))
    thisBackup  = int(time.time())

    # Vérifier que le backup respecte le délais minimum
    calcul = (thisBackup - lastBackup) / 3600.0
    if calcul <= 0:
      print "   [ERROR] Sauvegarde dans le futur détectée"
      return -1

    elif int(calcul) < int(hours):
      print "   [ERROR] Dernière sauvegarde trop récente"
      return -1

    # Supprimer les plus anciennes archives
    for directory in backupList:
      lastBackup  = int(time.mktime(time.strptime("%s" % directory,
                         "%Y%m%d%H")))
      calcul = (thisBackup - lastBackup) / (3600.0 * 24.0)
      if calcul >= int(days):
        print "   Suppression de l'archive %s" % directory
        pipe = os.popen("rm -Rf %s" % directory)
        pipe.close()
        sys.stdout.flush()

    # Faire une copie du plus récent backup pour recevoir la nouvelle
    # sauvegarde incrémentale si il existe après nettoyage
    if os.path.isdir(backupList[0]) == True:
      directory = time.strftime('%Y%m%d%H')
      cde = "cp -al %s %s" % (backupList[0], directory)
      pipe = os.popen(cde)
      pipe.close()
      sys.stdout.flush()
      return 1

  return 0

#******************************************************************************* 
# Effectuer le backup d'un module
#
# Cette fonction permet de faire le backup d'un module pour un serveur donné
# via rsync. Pour ce faire il est nécessaire de fournir les différents
# arguments :
#
#   - serverName : nom ou adresse du serveur auquel se connecter
#   - module ....: nom du module à sauvegarder
#   - path ......: chemin où sauvegarder le module sur le serveur local
#
# \return  0 si le backup c'est bien déroulé
#         <0 si une erreur est survenue
def DoBackup(serverName, module, path, days, hours):

  print "|-> " + time.strftime("%a, %d %b %Y %I:%M:%S %p"),
  print " : Sauvegarde du module %s ..." % module

  # Gérer les anciens backups
  directory = time.strftime('%Y%m%d%H')
  retval = ProcessLastBackups(serverName, path, module, days, hours)
  if retval < 0:
    return retval

  elif retval == 0:
    os.mkdir(directory)
 
  # Faire la sauvegarde incrémentale
  print "   Création de l'archive %s" % directory
  cde = "rsync -vrlptgoW --numeric-ids --delete "
  cde = cde + "%s::%s " % (serverName, module)
  cde = cde + "%s/%s/%s" % (path, module, directory)
  sys.stdout.flush()
  pipe = os.popen(cde)
  data = pipe.readlines()
  pipe.close()
  sys.stdout.flush()
  print "   Done"

#******************************************************************************* 
# Gérer le verrou de l'application
#
# Cette fonction permet de positionner/enlever le verrou de l'application afin
# d'éviter que plusieurs instances s'éxécutent en même temps.
#
#   - mode ..: 1 pour créer le verrou
#              0 pour l'enlever
#   - verrou : nom du verrou
#
# \return  0 si l'opération a été effectuée avec succès
#         -1 si une erreur s'est produite
def SetVerrou(mode, verrou):

  # Créer le verrou
  if mode == 1:

    # Afficher une erreur si un verrou existe
    try:
      fh = open(verrou, 'r')
      fh.close()
      print "[ERROR] Le verrou %s a été trouvé signifiant qu'une autre" % verrou,
      print "instance est en cours ou que la précédente éxécution s'est mal",
      print "terminée."
      return -1

    # Autrement créer le verrou avec la date courante
    except IOError:
      fh = open(verrou, 'w')
      fh.write(time.strftime("%a, %d %b %Y %I:%M:%S %p\n"))
      fh.close()
      return 0

  # Supprimer le verrou
  else:

    # Supprimer le verrou si il existe
    try:
      fh = open(verrou, 'r')
      fh.close()
      pipe = os.popen("rm -f %s" % verrou)
      pipe.close()
      return 0

    # Afficher une erreur si le verrou n'existe pas
    except IOError:
      print "[ERROR] Impossible de supprimer le verrou %s !"
      return -1

#*******************************************************************************
# Quitter l'application
#
# Cette fonction permet de quitter l'application
#
#   - errorCode : valeur du code d'erreur à retourner
def Quit(errorCode):

  date = "le " + time.strftime("%a, %d %b %Y %I:%M:%S %p") + " <--"

  if errorCode < 0:
    how = "--> Exécution annulée "

  else:
    how = "--> Fin d'exécution "
   
  print how + date
  
  sys.exit(errorCode)

# Afficher la bannière
#
# Cette fonction a pour seule utilité d'afficher la bannière de l'application
def ShowBanner():

  print "%s version %s" % (NAME, VERSION)
  print "%s\n" % DESC

#*******************************************************************************
# Décomposer les arguments de la ligne de commandes
#
# Cette fonction permet de décomposer la ligne de commandes afin d'obtenir les
# différents arguments passés au script. La liste des options est disponible
# grâce à l'option --help ou -h, et la version courante avec --version
def ParseCmdLine():

  # Vérifier le paramètre verbose
  def checkVerbose(option, opt, value, parser):

    if (value < 0) or (value > 2):
      print "[ERROR] L'option verbose ne peut être que 0, 1 ou 2."
    
    else:
      setattr(parser.values, option.dest, value)

  # Parser la ligne de commande
  parser = OptionParser(version="%prog " + VERSION)
  parser.set_defaults(verbose=1)
  parser.add_option("-d", "--debug",
                    action="callback", callback=checkVerbose, 
                    type="int", dest="verbose",
                    help="Set the debug level")

  (Options, args) = parser.parse_args()

#*******************************************************************************
# Boucle principale du programme
#
def main():

  # Parser les arguments de la ligne de commandes
  ParseCmdLine()

  # Afficher la bannière
  ShowBanner()

  # Parser le fichier de configuration
  ParseConfigFile()

  # Mettre en place le verrou
  retval = SetVerrou(1, PIDFILE)
  if retval < 0:
    Quit(retval)

  # Parcourir toutes les configurations serveur
  for server in Servers:

    # Vérifier la configuration pour la backup
    retval = CheckConfig(server)
    if retval < 0:
      continue

    # Effectuer le backup pour chaque module du serveur
    modules = server['module'].split(' ')
    for mod in modules:
      DoBackup(server['address'], mod, server['path'], server['days'],
               server['hours'])

    print ""
 
  # Supprimer le verrou
  retval = SetVerrou(0, PIDFILE)

  # Terminer l'application
  Quit(retval)


# Point d'entrée de l'application
if __name__ == "__main__":
  main()

Joli travail thialme :slightly_smiling:

Merci, je l’ai pas encore mis sur le wiki, il faut que je le passe en paquet debian pour le mettre tout propre

Euh, non: joli travail Franck.

Je suis grillé ; Va falloir que j’assume toutes mes bétises sur le forum maintenant :slightly_smiling: Non, mais de toute façon cela se trouve facilement je pense.

Dans la fonction ProcessLastBackup, les lignes suivantes :

pipe.close()
sys.stdout.flush() 

se sont décalées avec le copier/coller. Elles ne sont pas difficiles à trouver, elles font bizzares dans le script.