#!/usr/bin/env bash set -eu set -x DRY=0 SYSTEMS="" FORCE=0 DDISK=0 synopsis() { cat << EOF Usage : `basename $0` [-hdf] system... `basename $0` -t disk EOF } help() { cat << EOF `basename $0` télécharge les disques associés au(x) système(s). `synopsis` Les disques utilisés par les systèmes spécifiés sont téléchargés. Remarque : les fichiers "*.disk.gz" sont automatiquement decompressés. -h : affiche cette aide -d : dry run -f : pas de demande de confirmation EOF } usage() { synopsis exit 1 } args() { local opt while getopts "hdft" opt; do case $opt in h) help; exit 0;; d) DRY=1;; f) FORCE=1;; t) DDISK=1;; ?) usage;; esac done shift $(($OPTIND-1)) SYSTEMS=$@ if [ -z "$SYSTEMS" ]; then SYSTEMS=$(vdn-list | grep -v '^#') fi #[ $# -lt 1 ] && usage } download() { local i echo "start download func" for i in $@; do echo "loop" file=$(basename $i .gz) echo "file:$file" if [[ $i =~ \.gz ]]; then if [ $DRY = 1 ]; then echo "Dry run : download $i" else echo "Download to $VDN_PATH/files/$file..." wget -c -O - $i | { gzip -d -c || error "Problème de téléchargement"; } | \ dd of=$VDN_PATH/files/$file conv=sparse bs=512 || \ error "Problème de téléchargement" fi if [ "$(stat -c %s $VDN_PATH/files/$file)" = "0" ]; then error "Problème de téléchargement" fi else echo "no gz" if [ $DRY = 1 ]; then echo echo "Dry run : download $i" else wget -c -O $VDN_PATH/files/$file $i fi fi done } downloadDisks() { local error=0 absent=0 r LIST="" LIST_DISKS="" # find all files (uniq) for i; do GUEST_NAME="$i" if echo $GUEST_NAME | grep -q '/'; then error "$GUEST_NAME est un nom de système invalide" fi DISKS_REPOSITOY=""; CDROM_REPOSITORY=""; HDA=""; HDB=""; CDROM=""; BOOT_CDROM="0"; KERNEL=""; INITRAMFS="" loadGuestVars $GUEST_NAME [ "$MODE" = "tgz" ] && { [ -n "$KERNEL" ] && LIST="$LIST $DISKS_REPOSITORY/$KERNEL" [ -n "$INITRAMFS" ] && LIST="$LIST $DISKS_REPOSITORY/$INITRAMFS" } #[ -n "$CDROM" -a "$BOOT_CDROM" = 1 ] && [ -n "$CDROM" ] && \ LIST="$LIST $CDROM_REPOSITORY/$CDROM" [ -n "$HDA" ] && LIST_DISKS="$LIST_DISKS $DISKS_REPOSITORY/$HDA.gz" [ -n "$HDB" ] && LIST_DISKS="$LIST_DISKS $DISKS_REPOSITORY/$HDB.gz" done #set -x LIST_DISKS=$(echo $LIST_DISKS | tr -s ' ' '\n' | sort -u | grep -v '^$') LIST=$(echo $LIST | tr -s ' ' '\n' | sort -u | grep -v '^$' || :) LIST="$LIST $LIST_DISKS" #echo "LIST :" #echo $LIST | tr -s ' ' '\n' # test dates LIST_DOWNLOAD="" for i in $LIST; do file=$(basename $i .gz) locDate=0 [ -e $VDN_PATH/files/$file ] && \ locDate=$(stat -c %Y $VDN_PATH/files/$file) set +e reInfos="$(wget --spider -S $i 2>&1)" r=$? set -e if [ $r -ne 0 ]; then warning "$(basename $i) not found on server !" error=1 [ ! -e $VDN_PATH/files/$file ] && absent=1 continue fi reDate=$(echo "$reInfos" | grep "Last-Modified:" | cut -d ':' -f 2-) reDate=$(date -d "$reDate" +%s) #echo $locDate $reDate [ $locDate -lt $reDate ] && LIST_DOWNLOAD="$LIST_DOWNLOAD $i" done if [ $error = 1 ]; then if [ -n "$LIST_DOWNLOAD" ]; then if [ $FORCE = 0 ]; then request "Tous les fichiers ne peuvent être téléchargés !\nTélécharger quand même ceux qui peuvent l'être ?" [ $? -ne 0 ] && exit 0 fi fi fi [ -n "$LIST_DOWNLOAD" ] && { echo echo "LIST_DOWNLOAD :" echo echo $LIST_DOWNLOAD | tr -s ' ' '\n' echo NEW="" for i in $(echo $LIST_DOWNLOAD | tr -s ' ' '\n'); do request "Télécharger le fichier : $i ?" [ $? -eq 0 ] && NEW="$NEW $i" || : done LIST_DOWNLOAD=$NEW } if [ -n "$LIST_DOWNLOAD" -a $FORCE = 0 ]; then request "Télécharger les fichiers ?" [ $? -ne 0 ] && exit 0 fi # download echo "LIST_DOWNLOAD:$LIST_DOWNLOAD" download $LIST_DOWNLOAD echo "End of download" for i in $LIST; do file=$(basename $i .gz) if [ ! -e $VDN_PATH/files/$file ]; then warning "$file absent" absent=1 fi done [ $absent = 1 ] && error "Fichiers manquants" || : } # Programme principal GUEST_OWNER=$USER VDN_PATH=$(readlink -f $(dirname $0)/..); . $VDN_PATH/bin/functions.sh args "$@" if [ $DDISK = 1 ]; then download http://opale.u-clermont1.fr/vdn/files/$SYSTEMS else downloadDisks $SYSTEMS fi