You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IUT/vdn/bin/vdn-download-disks

238 lines
4.4 KiB

#!/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