• Note: La version francaise de ce site est tres peu a jour et contient beaucoup de fautes d'orthographe. Vous pouvez acceder a la version anglaise via le lien en haut a droite.

Scripts

Sauve Mes VMs

Publié par manu
Mise à jour

Les machines virtuelles c'est bien, en abuser c'est mieux... . les sauvegarder, c'est utile. Alors un jour j'ai décidé de me priver du plaisir de tout faire à la main et j'ai écrit un petit script tout con pour m'ôter toute la joie des tâches ménagères.

Prends le, casse le, répare le, distribue le, fourche le (ça sonne moins bien en français tiens). Juste ne le revendez pas sinon malheur à ton serveur et a tout ses sous machines et ce durant 8 générations...

Mise a jour: Une nouvelle version de ce script est disponible, il utilise rsync, ce qui permet d'optimiser bien des choses et de gagner pas mal de temps du coup.

Téléchargement directe ("t'as vu"): Save My VMs v.0.2

#!/bin/bash # save_my_vms.sh - Backup script for xen virtual machines that use LVM # Version 0.2 # (c) 2011 Emmanuel Revah - manu-at-manurevah.com # This script makes snapshots of Xen virtual machines, mounts them # and then copies their content to a backup directory on Dom0 # You should test this script before using it, as always. # I WILL NOT BE RESPONSIBLE FOR ANY OF YOUR FUTURE MISFORTUNES. # This 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 3 of the License, or # (at your option) any later version. # # save_my_vms.sh 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 save_my_vms.sh. If not, see <http://www.gnu.org/licenses/>. ################## # General config # ################## # LVM group to use (later on in life might be added to per VM setting) LVGRP="vga" # global backup dir BACKUPDIR="/home/backups" # default number of copies the backup should reatain DEFAULT_COPIES="3" # default size of LVM snapshots, unless your systems read/write like crazy 10G should be more than enough SNAPSHOTSIZE="10G" ############### # VMs to save # ############### # VMs settings (the important stuff): # # - The configuration of VMs to backup uses arrays, so each VM should have a unique # ID (that would be the number in the square brackets). # - VM:is the name you want to use to refer to the VM, it will become the name of the directory # in which its backups are stored. Don't use spaces and other weird stuff, unless you like breakage. # - LVMS: are the names of the LVM partitions associated with the VM. These should be # in /dev/$LVGRP/. You can add as many LVM partitions that should be backed up. # Values should be space separated. # - COPIES: the amount of copies to keep. Every time you run the script a new copy is made. # # example: # VM[2]="name_of_vm" # LVMS[2]="vm-part1 vm-part2" # COPIES[2]="3" # optional, uses default value of DEFAULT_COPIES if undefined ############### # Mail config # ############### TO="wtbackup@example.com" FROM="root@example.com" MAILDATE=$(date +%Y-%m-%d_%H:%M:%S) SUBJECT="VM Backup ${MAILDATE} on `hostname -f`" SENDMAIL="/usr/lib/sendmail -t" XMAILER="Save my VMs" ### End of config ### EMAIL="Save my VMs has (hopefully) done the following (correctly):" # This is where things actually happen # for each VM for INDEX in ${!VM[*]}; do echo -e "\nVM: ${VM[$INDEX]}\t\tID: ${INDEX}" echo "LVMS: ${LVMS[$INDEX]}" EMAIL+="\n\n\n--> ${VM[$INDEX]} backup start: `date +%H:%M:%S`\n" # New report for each VM REPORT="Backup report for ${VM[$INDEX]} using 'save_my_ms.sh' on `date +%Y-%m-%d_%H:%M:%S`:" REPORT+="\n\n-> backup start: `date +%H:%M:%S`\n" # define retention if [[ ${COPIES[$INDEX]} -gt 0 ]]; then RETENTION=${COPIES[$INDEX]} else RETENTION=$DEFAULT_COPIES fi echo "Keep $RETENTION copies" # Move backups - Copy backups from previous... .. I mean.. . BACKUP_NUMBER=$RETENTION while [[ ${BACKUP_NUMBER} -gt 0 ]]; do BACKUP_PREV_NUMBER=`expr ${BACKUP_NUMBER} - 1` mkdir -p ${BACKUPDIR}/${VM[$INDEX]}/backup_${BACKUP_NUMBER}/ rsync -avu --delete ${BACKUPDIR}/${VM[$INDEX]}/backup_${BACKUP_PREV_NUMBER}/ ${BACKUPDIR}/${VM[$INDEX]}/backup_${BACKUP_NUMBER}/ BACKUP_NUMBER=`expr ${BACKUP_NUMBER} - 1` done # Create a TMP dir for this VM VMTMPDIR="${BACKUPDIR}/${VM[$INDEX]}/TMP" # For each LVM for LVM in ${LVMS[$INDEX]}; do DATE=$(date +%Y-%m-%d_%H-%M-%S) echo -e "\n --> Backup $LVM date: ${DATE}.. ." EMAIL+="\n\t$LVM: `date +%H:%M:%S` start" REPORT+="\n\t$LVM: `date +%H:%M:%S` start" # create lvm snapshot TMPLVM="${VM[$INDEX]}-${LVM}-BACKUP" lvcreate -L${SNAPSHOTSIZE} -s -n ${TMPLVM} /dev/${LVGRP}/${LVM} # create tmp dir to mount snapshot TMPDIR="${VMTMPDIR}/${LVM}" mkdir -p ${TMPDIR} mount /dev/${LVGRP}/${TMPLVM} ${TMPDIR} # create backup dir and copy data LVMBACKUPDIR="${BACKUPDIR}/${VM[$INDEX]}/backup_0/${LVM}" mkdir -p ${LVMBACKUPDIR} ionice -c 3 rsync -avu --delete ${TMPDIR}/ ${LVMBACKUPDIR}/ # umount and remove tmp dir and snapshot umount ${TMPDIR} rmdir ${TMPDIR} lvremove -f /dev/${LVGRP}/${TMPLVM} echo -e " . ..Backup $LVM done <--\n" EMAIL+="\n\t$LVM: `date +%H:%M:%S` done\n" REPORT+="\n\t$LVM: `date +%H:%M:%S` done\n" done # Remove TMP dir rmdir ${VMTMPDIR} EMAIL+="\n${VM[$INDEX]} backup done: `date +%H:%M:%S` <-" REPORT+="\n${VM[$INDEX]} -> backup done: `date +%H:%M:%S`" # Post report (per VM) echo -e "${REPORT}" > ${BACKUPDIR}/${VM[$INDEX]}/backup_0/Backup_report done # Send email echo -e "From: $FROM\nTo: $TO\nReply-To: $FROM\nSubject: $SUBJECT\nX-Mailer: $XMAILER\n$EMAIL" |$SENDMAIL exit

Createur de fichiers aleatoire

Publié par manu

Si vous avez déjà eu besoin d’écrire une quantité précise de fichiers avec du contenu aléatoire et de taille aléatoire (mais dans une marge précise) le tout contenu dans un nombre précis de répertoires alors ce script pourra peut être vous aider.

Cela dit, si vous êtes du genre a prendre plaisir a résoudre de énigmes faciles sachez que ce truc est vraiment facile a faire, alors pourquoi pas essayer avant de regarder comment j'ai fait... Vous trouverez peut être un moyen plus sympa ou varié.

#!/bin/bash # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE # Version 2, December 2004 # # Copyright (C) 2011 Emmanuel Revah <manu@manurevah.com> # # Everyone is permitted to copy and distribute verbatim or modified # copies of this license document, and changing it is allowed as long # as the name is changed. # # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION # # 0. You just DO WHAT THE FUCK YOU WANT TO. ##### Config (uration) ##### # QTY of files to create QTY=1000000 # Where to create new files ? OUTPUT="/home/herebefiles" # Min and Max size per file in kB MIN=1 MAX=10 # Max number of directories to create MAXDIR=500 ############## END CONFIG ############# # Correct MIN and MAX and check MAX=`expr $MAX - $MIN + 1` if [[ ${MAX} < 0 ]]; then echo "ERROR: MAX is lower than MIN, and vice versa." exit fi for i in $(seq 1 $QTY); do echo "File number -> $i" DDCOUNT=$[ ( $RANDOM % $MAX ) + $MIN ] DIR=$[ ( $RANDOM % $MAXDIR ) + 1 ] # uncomment and use "$OUTPUT/$DIR/${i}_$FILENAME" to avoid rewriting over previous random files #FILENAME=`head -n1 /dev/urandom | md5sum| awk {'print $1'}` if [ ! -d $OUTPUT/$DIR ]; then mkdir -p $OUTPUT/$DIR fi dd bs=1024 count=$DDCOUNT skip=0 if=/dev/urandom of=$OUTPUT/$DIR/${i} 2> /dev/null done

sauvegarde

Publié par manu

un script de sauvegarde

ce script a pour but de faire une sauvegarde sur une machine dans un dossier dédié a cela, puis de télécharger la sauvegarde vers un serveur FTP, il est simple et il faut son petit truc plutôt bien... . évidement il est modifiable pour mieux accommoder vos envies et besoins

ce qu'il faut :

pour que ce script fonctionne "tel que" il faudra le choses suivantes :

  • NCFTP : il faut donc installer ncftp, puis créer un "bookmark" en enregistrant le mot de passe. ATTENTION il faut faire ça sous l'utilisateur qui va exécuter le script de sauvegarde, dans mon cas j'ai peur de rien, c'est root.. .. .
  • bzip2 : ce truc va nous servir a compresser les archives, on peut s'en passer si on veut juste faire des ".tar.gz" a la place, pour cela il faudra changer "tar jcfp" en "tar zcf" dans le script

paramétrage

la ça va être simple, mais bon c'est en anglais donc je comment ici en fr_FR

  • BACKUPROOT : ceci est le répertoire racine pour stocker les sauvegardes.NOTE: dans ce répertoire le script va créer un lien "current" vers le répertoire de la dernière sauvegarde effectué.
  • DAYS : ici on défini le nombre de jours qu'on sauvegarde, c'est a dire que ce qui est plus vieux que ce qui est défini ici sera supprimé, c'est un bon moyen de ne pas explosé l'espace disque
  • BACKUPDIRS : c'est la qu'on va (enfin) définir les répertoires a sauvegardé, suffit de mettre les répertoires séparé par un espace
  • NCFTPBOOKMARK : ici mettre le nom du bookmark ncftp a utiliserIMPORTANT : pour indiquer a ncftp ce qu'il doit faire, je fait un fichier /root/ftpcommands qui contient les commandes a exécuter, j'ai mis un exemple dans le script (dans mon cas je me connecte au serveur ftp, j'efface ce qui y est, et ensuite j'upload la sauvegarde courant

utilisation

le plus simple est de mettre le script dans /usr/local/sbin/backup.sh et de simplement exécuter le script. encore mieux serait de dire a crontab de le faire tout seul régulièrement par exemple ainsi (tout les jours a 5h du matin) :

echo "0 5 * * * root /usr/local/sbin/backup.sh"

le script

alors le script est la ci-dessous pour les fans du copie collage, sinon y'a moyen de le télécharger directement pour les fans de wget

#!/bin/bash # this script creates tar.bz2 archives and places them in a backup folder ordered by date # where the latest is linked to a folder called "current" # DEPENDS: bunzip2 ncftp (for ncftp create a bookmark with saved password) # TODO: - simplify ftp uploading # - do something about scp/rsync maybe # AUTHOR: Emmanuel REVAH manu-AT-manurevah.com http://manurevah.com/ # i'm not sure about a licence so whatever, just don't sue me.. . ... :] # o/ logger "backup script: started" DATE=$(date +%a_%d_%b_%Y_%Hh%Mm%S) MONTH=$(date +%B_%Y) ########### configuration options ############## # where we keep all the backups BACKUPROOT="/home/backup/mybackup" BACKUP="${BACKUPROOT}/${MONTH}/backup_${DATE}/" # how many days worth of backups do we need to keep ? DAYS="5" # folders to backup: space separated values BACKUPDIRS="/etc /var/log" BACKUPDIRS=`ls -d ${BACKUPDIRS}` # ncftp (create a bookmark with saved password) # you will also need a file with ftp commands in /root/ftpcommands mine contains: # cd backup # rm -rf current # put -r /home/backup/current # quit NCFTPBOOKMARK="ftpbookmark" # either place a file containing ONLY the password in clear text (chmod 600 and chown root of course) # or just replace the password here MYSQL_USER_PASS="--user=root --password=`cat /root/.sqlpasswd`" ############ end of configuration ################ # cleanup up the "current" folder and link the new one rm -f ${BACKUPROOT}/current test -d ${BACKUP} || mkdir -p ${BACKUP}/mysql ln -s ${BACKUP} ${BACKUPROOT}/current # make some archive files for DIRS in ${BACKUPDIRS}; do DIRNAME=`echo ${DIRS}|sed 's///_/g'` tar jcfp ${BACKUP}/${DATE}${DIRNAME}.tar.bz2 ${DIRS}; done # mysql: please test this line to make sure it correctly lists the names of the databases MYBASES="`ls -1 /var/lib/mysql |grep -v ib_* |grep -v debian-5.0.flag | grep -v mysql_upgrade_info`" for DBS in ${MYBASES};do mysqldump --databases ${DBS} ${MYSQL_USER_PASS} > ${BACKUP}/${DATE}_${DBS}.sql done logger "backup script: local backup done :]" ncftp ${NCFTPBOOKMARK} < /root/ftpcommands logger "backup script: upload current backup to ${NCFTPBOOKMARK}" # erase older data find ${BACKUPROOT} -type f -mtime +${DAYS} -exec rm -rf {} ; rmdir -p ${BACKUPROOT}/*/*/* logger "backup script: removed backups older than ${DAYS} days" exit

photos.sh

Publié par manu

decharger et classer les photos depuis un appareil photo

ce script a pour but de copier (ou déplacer) les photos d'un appareil photo (mounté en tant que disque de type "masse storage") dans un système de dossiers classé par date du jour de ponte de la photo. pour cela il faut avoir exiv2 installé sur votre machine.

le principe

le principe est la suivante, il suffit de:

  • aller dans le dossier ou se trouvent les photos a classer, normalement ce sera l'appareil photo lui même, mais vous pouvez tout a fait utiliser le script pour classer des photos déjà prises
  • exécuter le script "photo_save.sh"

le script va:

  • pour chaque photo présente ainsi que celles dans les répertoires enfants
  • trouver la date de prise de photo via les informations EXIF
  • créer un dossier du jour dans un répertoire prédéfini et y copier la photo

paramétrage

voici les paramètres possibles :

  • UNLOAD : ceci défini le répertoire "parent" ou stocker les photos
  • METHOD : on peut faire du récursif ou pas.. . c'est a dire qu'on peut lui dire de ne PAS aller voir dans les sous-répertoires
  • EXTENSIONS : selon la méthode choisi la syntaxe change, voir les exemples donner dans le script

perso j'utilise une copie du script par appareil photo que je renomme, par exemple j'ai photo-save-d50.sh pour mon "D50".. .. .. mais libre a chacun de faire comme il veut, bien évidment

le script

vous pouvez télécharger le script via ce lien ou alors la copier coller depuis cette page. . .. .. .

#!/bin/bash # script designed to help unload photos from camera/cd/or_whatever # to folders ordered by date based on EXIF info. # USAGE: cd /to/the/folder/where/the/files/are # sh photo-save.sh # DEPENDS on: exiv2 # HINTS: if you have multiple cameras you can: # - copy this script accordingly: ex. cp photo-save.sh photo-save-d50.sh # - make sure that UNLOAD parameter is set: ex. /home/user/unload/d50/ # - now use photo-save-d50.sh instead of photo-save.sh # - repeat the same for as many cameras you need to.. # if you didn't already know, you can chmod +x photo-save.sh and copy it # to a "bin" folder (ex /usr/local/bin/) # # AUTHOR: Emmanuel REVAH manu-AT-manurevah.com http://manurevah.com/ # i'm not sure about a licence so whatever, just don't sue me.. . ... :] # o/ # root folder for unloading pictures to UNLOAD='/home/manu/toph/unload/d50/' # the script can either work on files in current directory OR # work on files in current directory AND recursively # 1=current ; 2=recursive METHOD=2 if [ ${METHOD} == 1 ]; then # Methode 1 options # types of files we want to move/copy (space separated values) # HINT: you might need to add uppercase extensions EXTENSIONS="*.jpg *.nef" # list files based on EXTENSIONS FILETYPES=`ls ${EXTENSIONS} 2>/dev/null` fi if [ ${METHOD} == 2 ]; then # Method 2 options # you'll have to add the extensions accordingly # default line (you can replace "name" by "iname" for removing case sensitivity) # FILETYPES=`find . -name "*.jpg" -or -name "*.nef"` FILETYPES=`find . -name "*.jpg" -or -name "*.nef"` # avec regex: find ./ -regex ".*(jpg|nef)$" fi # for every file we will find out the EXIF date and put the file into the # apropriate dated folder (created if needed) for i in ${FILETYPES}; do YEAR=`exiv2 $i 2>/dev/null |grep timestamp|cut -d " " -f 4|cut -c 1-4` MONTH=`exiv2 $i 2>/dev/null |grep timestamp|cut -d " " -f 4|cut -c 6,7` DAY=`exiv2 $i 2>/dev/null |grep timestamp|cut -d " " -f 4|cut -c 9,10` WHEREIGO=${UNLOAD}/${YEAR}/${MONTH}_${YEAR}/${DAY}_${MONTH}_${YEAR} # test if value year is empty if [ -z ${YEAR} ] then echo "$i: No Exif data found in the file" else mkdir -p ${WHEREIGO} cp $i ${WHEREIGO} fi; done exit