mirror of
https://github.com/bashclub/zfs-housekeeping.git
synced 2024-11-07 15:31:58 +01:00
Neues Script snpgrpdl.sh
Neue Version des Scriptes sts23.sh
This commit is contained in:
parent
bb39b10719
commit
919e0c76eb
163
snpgrpdl.sh
Normal file
163
snpgrpdl.sh
Normal file
@ -0,0 +1,163 @@
|
||||
#! /bin/sh
|
||||
|
||||
pr_aufruf() {
|
||||
cat <<ENDE
|
||||
|
||||
Aufruf: $(basename $0) [-htf] [-k keep] <Datasetfilter> [Snapshotfilter]
|
||||
|
||||
-h Hilfe Anzeigen
|
||||
-t Testmodus. Simulation von löschen ohne Nachfragen (benötigt -k)
|
||||
-f Echtmodus. Snapshots löschen ohne Nachfragen (benötigt -k)
|
||||
-k <Anzahl> Anzahl der letzten Snapshots die behalten werden sollen.
|
||||
Rest wird gelöscht. Ohne -t oder -f kommt Abfrage ob gelöscht werden soll.
|
||||
|
||||
ENDE
|
||||
}
|
||||
|
||||
# Defaults:
|
||||
# Modi: fragen (default), test (-t) oder echt (-f)
|
||||
MODUS="fragen"
|
||||
|
||||
while getopts ":htfk:" opt
|
||||
do
|
||||
case $opt in
|
||||
h) pr_aufruf
|
||||
exit 0
|
||||
;;
|
||||
t) MODUS="test"
|
||||
TFLAG="1"
|
||||
;;
|
||||
f) MODUS="echt"
|
||||
FFLAG="1"
|
||||
;;
|
||||
k) BEHALTE="$OPTARG"
|
||||
KFLAG="1"
|
||||
;;
|
||||
\?) echo "Unbekannte Option: -$OPTARG" 1>&2;;
|
||||
:) echo "Fehler Option: -$OPTARG benötigt ein Argument" 1>&2;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $((OPTIND -1))
|
||||
|
||||
# Mit der Filter Variable kannst du die Liste der datasets beschränken
|
||||
# Mit der Muster Variable kann man Snapshots nach Muster Filtern
|
||||
FILTER="$1"
|
||||
MUSTER="$2"
|
||||
|
||||
if [ "$1" = "" -o $# -gt 2 ]
|
||||
then
|
||||
pr_aufruf
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$FFLAG" = "1" -a "$TFLAG" = "1" ]
|
||||
then
|
||||
echo "Option -f oder -t können nicht zusammen verwendet werden."
|
||||
pr_aufruf
|
||||
exit 1
|
||||
elif [ "$FFLAG" -o "$TFLAG" ] && [ "$KFLAG" != "1" ]
|
||||
then
|
||||
echo "Option -t oder - f nur zusammen mit -k nutzbar"
|
||||
pr_aufruf
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Prüfen das Behalte eine Zahl >= 0 ist
|
||||
if [ "$KFLAG" = "1" ]
|
||||
then
|
||||
[ $BEHALTE -ge 0 ] 2>/dev/null
|
||||
if [ "$?" != "0" ]
|
||||
then
|
||||
echo "Option -k keine pos. Zahl"
|
||||
pr_aufruf
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
ZFSSETLIST=$(zfs list | grep "$FILTER" | awk '{print $1}')
|
||||
|
||||
echo "# Gefilterte Datasets:"
|
||||
zfs list | grep -e "$FILTER" -e NAME | sed 's/^/ /'
|
||||
echo ""
|
||||
|
||||
for DATASET in $ZFSSETLIST
|
||||
do
|
||||
echo "# Dataset: $DATASET"
|
||||
echo "# Snapfilter: $MUSTER"
|
||||
|
||||
if [ "$MUSTER" = "" ]
|
||||
then
|
||||
SNAPS=$(zfs list -r -t snap -H -o name -s creation | grep "${DATASET}@")
|
||||
else
|
||||
SNAPS=$(zfs list -r -t snap -H -o name -s creation | grep "${DATASET}@" | grep $MUSTER)
|
||||
fi
|
||||
ANZSNAPS=$(echo "$SNAPS"|wc -l|sed 's, ,,g')
|
||||
|
||||
echo "# Anzahl Snaps: $ANZSNAPS"
|
||||
if [ "$KFLAG" = "1" ]
|
||||
then
|
||||
DELSNAPS=$((ANZSNAPS - BEHALTE))
|
||||
echo "# Behalte: $BEHALTE"
|
||||
echo "# Anzahl Del. Snaps: $(if [ $DELSNAPS -lt 0 ];\
|
||||
then echo 0;else echo $DELSNAPS;fi)"
|
||||
else
|
||||
DELSNAPS="0"
|
||||
BEHALTE="$ANZSNAPS"
|
||||
fi
|
||||
|
||||
echo "# Liste Snaps:"
|
||||
echo "$SNAPS" |sed '/^$/d' | awk -v dellines=$DELSNAPS '{
|
||||
if (NR <= dellines){
|
||||
printf(" - %s\n",$0)
|
||||
}
|
||||
else {
|
||||
printf(" + %s\n",$0)
|
||||
}
|
||||
}'
|
||||
|
||||
[ $DELSNAPS -gt 0 -o "$KFLAG" != "1" ] 2>/dev/null
|
||||
if [ "$?" != "0" ]
|
||||
then
|
||||
echo "% Keine Snapshots zum löschen"
|
||||
echo ""
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ $DELSNAPS -gt 0 ]
|
||||
then
|
||||
if [ "$MODUS" = "fragen" ]
|
||||
then
|
||||
printf "> Snapshots (%d von %d) mit J löschen (Return = weiter): " $DELSNAPS $ANZSNAPS
|
||||
read ZDESTROY
|
||||
elif [ "$MODUS" = "echt" ]
|
||||
then
|
||||
ZDESTROY="J"
|
||||
else
|
||||
ZDESTROY="N"
|
||||
echo "# Testmodus - Für folgende Snapshots würde ein destroy ausgeführt:"
|
||||
echo "$SNAPS" | head -n $DELSNAPS | xargs -n 1 zfs get -H creation | sed 's/^/ /'
|
||||
echo ""
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "$ZDESTROY" = "J" ]
|
||||
then
|
||||
echo "% zfs destroy wird ausgeführt:"
|
||||
echo "$SNAPS" | head -n $DELSNAPS | xargs -n 1 zfs destroy -v | sed 's/^/ /'
|
||||
|
||||
echo "% Liste nach zfs destroy:"
|
||||
if [ "$MUSTER" = "" ]
|
||||
then
|
||||
zfs list -r -t snap -o name -s creation | grep "${DATASET}@" | sed 's/^/ + /'
|
||||
else
|
||||
zfs list -r -t snap -o name -s creation | grep "${DATASET}@" | grep $MUSTER | sed 's/^/ + /'
|
||||
fi
|
||||
else
|
||||
echo "% Es wurden keine Snapshots gelöscht"
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
done
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user