zfs-on-linux / CentOS und Replizierung der Daten
Hallo zusammen,
ich betreibe selber in einem kleinen Rechenzentrum ein ZFS-Storage, welches aus zwei Servern und einem Direct-Attached-Shelf besteht. Die beiden Server sind als Cluster/HA konfiguriert und können jeweils die ZFS-Pools übernehmen, sofern der Partner nicht mehr sauber arbeitet.
Für das eigentliche ZFS Cluster/HA kann ich nur den folgenden Artikel empfehlen – hier steht eigentlich alles wichtige soweit drin:
https://github.com/ewwhite/zfs-ha/wiki
Um hier jedoch noch ein weiteres Netz an Sicherheit einzubinden, habe ich mir kleine Skripte geschrieben. Diese sorgen dafür, dass eine regelmäßige Replizierung der Daten stattfindet (zu einem weiteren Host mit ZFS-Pools). Die Skripte sind leider nicht zu 100% komplett, jedoch möchte ich diese nicht vorenthalten.
Es gibt zwei grundlegende Dateien:
zfs-sync-cron – Wird in den Crontab eingebaut und für eine Ausführung alle 10 Minuten markiert (Executer)
zfs-sync-config – Auf der CLI, dennoch „Möchtegern-Grafische“ Konfiguration der Jobs
#!/bin/sh myconfig=/etc/zfs-sync.conf lockfile=/tmp/zfs-sync.lock debug=false checklock=true runsnapshots=true runreplication=true runscrub=true forcefullsync=false backtitle="ZFS STORAGE MANAGEMENT - CRON SCRIPT WITH Debug ENABLED" outlog="" #### #### Check Requirements for Execution #### if [ ! -f /usr/bin/dialog ] then echo echo "Could not found requirement 'dialog'." echo "Please install package using 'yum install dialog'." echo exit 1 fi if [ ! -f $myconfig ] then echo echo "Could not found requirement '$myconfig'." echo "Please first run zfs-sync-config to create a configuration file." echo exit 1 fi showhelp () { echo echo "Usage: $0 [OPTION]" echo echo "Options for Execution:" echo " -d --debug Enables Debug Output" echo " -h --help Prints this help message" echo " -f --force Run Script without checking Lock-File (be careful!)" echo " -R --remove Removes Lock-File BEFORE run" echo " -s --snapshot Only runs Snapshotting" echo " -r --replication Only runs Replication" echo " -S --scrub Only runs Scrubbing" echo " -F --fullsync Runs Replication in Full-Sync Mode (Initial!)" echo echo "Report Bugs to: simon(a)brecht.email" echo "Homepage: http://brecht.systems/" echo exit 1 } removelock () { rm -rf "$lockfile" } #### #### Parse Arguments #### for args in "$@" do case "$args" in --debug) debug=true ;; -d) debug=true ;; --help) showhelp ;; -h) showhelp ;; --force) checklock=false ;; -f) checklock=false ;; --remove) removelock ;; -R) removelock ;; --snapshot) runreplication=false runscrub=false ;; -s) runreplication=false runscrub=false ;; --replication) runsnapshots=false runscrub=false ;; -r) runsnapshots=false runscrub=false ;; -S) runsnapshots=false runreplication=false ;; --scrub) runsnapshots=false runreplication=false ;; --fullsync) forcefullsync=true ;; -F) forcefullsync=true ;; esac done if [ "$checklock" == "true" ] then if [ -f $lockfile ] then if [ "$debug" == "true" ] then echo echo "There is an existing lockfile. Please check operation or" echo "wait until existing process have been done." echo echo "Lockfile is located: $lockfile" echo echo fi exit 1 else touch "$lockfile" fi fi aborted () { if [ "$debug" == "true" ] then dialog --backtitle "$backtitle" \ --infobox "Aborted by user request..." 30 80 sleep 3 fi } showinfo () { outlog+="$1\n" if [ "$debug" == "true" ] then dialog --backtitle "$backtitle" \ --infobox "$outlog" 30 80 sleep 1 fi } if [ "$runsnapshots" == "true" ] then #### #### Looping through Snapshots #### showinfo "Looping through Snapshots..." cat $myconfig | grep -o "SNAPSHOT=.*" | cut -d "=" -f 2 | while read snap do # Check if Volume for Snapshot is Local Managed snapvol=$(echo $snap | cut -d " " -f 1) snapdelta=$(echo $snap | cut -d " " -f 2) snapkeep=$(echo $snap | cut -d " " -f 3) showinfo "\nChecking if Volume ($snapvol) is locally managed..." if [ "`zfs list | cut -d " " -f 1 | grep -c "$snapvol"`" == "1" ] then # Volume is local and Snapshots are configured # lets check Delta showinfo "Snapshot ($snapvol) is locally managed. Comparing Dates..." mytime="`date +"%Y-%m-%d_%H-%M-%S"`" if [ "`zfs list -t snapshot | grep -c "$snapvol@auto-"`" == "0" ] then lasttime=NONE else while read -r exsnap do lasttime=$(echo $exsnap | cut -d"@" -f2 | cut -d"-" -f2-) done <<< "`zfs list -t snapshot | cut -d " " -f 1 | grep -o "$snapvol@auto-.*" | sort`" showinfo "Local Time: $mytime - Last Snapshot Time: $lasttime" fi snapdo=no if [ "$lasttime" == "NONE" ] then showinfo "No Snapshots found, creating new one..." snapdo=yes fi if [ "$lasttime" != "NONE" ] then comparenow=$(echo $mytime | sed "s/_/ /g") read Y M D h m s <<< ${comparenow//[-: ]/ } comparenow=$(date -d "$Y$M$D $h:$m:$s" "+%s") comparesnap=$(echo $lasttime | sed "s/_/ /g") read Y M D h m s <<< ${comparesnap//[-: ]/ } comparesnap=$(date -d "$Y$M$D $h:$m:$s $snapdelta hours" "+%s") showinfo "CompareNow: $comparenow" showinfo "CompareSnap: $comparesnap" if [ $comparenow -ge $comparesnap ] then showinfo "Snapshot found, but is too old - creating new one..." snapdo=yes fi fi if [ "$snapdo" == "yes" ] then # create snapshot zfs snapshot -r $snapvol@auto-$mytime fi # check cleanup snapcount=$(zfs list -t snapshot | grep -o "$snapvol@auto-" | sort | wc -l) if [ $snapcount -gt $snapkeep ] then showinfo "Time to Cleanup... Existing Snapshots: $snapcount (Keep: $snapkeep)" snapremove=$((snapcount-snapkeep)) showinfo "Have to remove $snapremove Snapshots..." count=0 while read -r snap do if [ $snapremove -gt $count ] then showinfo "Removing Snapshot: $snap" zfs destroy $snap else showinfo "Enough cleaning up ;-)" break; fi count=$((count+1)) done <<< "`zfs list -t snapshot | grep -o "$snapvol@auto-.*" | cut -d " " -f 1 | sort`" fi fi done fi if [ "$runreplication" == "true" ] then showinfo "Looping through Replications..." cat $myconfig | grep -o "REPLICATION=.*" | cut -d "=" -f 2 | while read replsnap do # Check if Volume for Snapshot is Local Managed snapvol=$(echo $replsnap | cut -d " " -f 1) snapdsthost=$(echo $replsnap | cut -d " " -f 2) snapdstvol=$(echo $replsnap | cut -d " " -f 3) snapdstname=$(echo $snapvol | cut -d"/" -f2-) snapinitial=no snapinkremental=no snaplastnamelocal= snaplastnameremote= snapexisting=0 showinfo "\nChecking if Volume ($snapvol) is locally managed..." if [ "`zfs list | cut -d " " -f 1 | grep -c "$snapvol"`" == "1" ] then showinfo "Volume ($snapvol) is locally managed... Checking Replication..." if [ "$forcefullsync" == "true" ] then showinfo "Full-Sync Flag is SET, cleaning up old Replications..." ssh $snapdsthost "zfs list -t snapshot | cut -d\" \" -f1 | grep \"$snapdstvol/$snapdstname@auto-\" | xargs -n1 zfs release -r keep" < /dev/null >/dev/null ssh $snapdsthost "zfs list -t snapshot | cut -d\" \" -f1 | grep \"$snapdstvol/$snapdstname@auto-\" | xargs -n1 zfs destroy" < /dev/null >/dev/null zfs list -t snapshot | cut -d" " -f1 | grep "$snapvol@auto-" | xargs -n1 zfs release -r keep fi if [ "`ssh $snapdsthost "zfs list -t snapshot" < /dev/null | grep -c "$snapdstvol/$snapdstname@auto-"`" == "0" ] then showinfo "Doing initial Sync of Snapshots..." snapinitial=yes else showinfo "Doing inkremental Sync of Snapshots..." snapinkremental=yes fi if [ "$snapinitial" == "yes" ] then # get first snapshot of volume firstsnap=$(zfs list -t snapshot | grep "$snapvol@auto-" | cut -d " " -f 1 | sort -r | tail --line=1) showinfo "Sending First Snapshot: $firstsnap to volume $snapdstvol" zfs send -R "$firstsnap" | ssh "$snapdsthost" zfs recv -Fdu "$snapdstvol" snaplastnamelocal="$firstsnap" snaplastnameremote=$(ssh $snapdsthost "zfs list -t snapshot" < /dev/null| grep "$snapdstvol/$snapdstname" | cut -d " " -f 1) zfs hold keep $firstsnap ssh "$snapdsthost" "zfs hold keep $snaplastnameremote" # check if more snapshots available countsnap=$(zfs list -t snapshot | grep -c "$snapvol@auto-") if [ "$countsnap" != "1" ] then showinfo "More Snapshots available... Setting Inkremental to YES..." snapinkremental=yes fi else snaplastnamelocal=$(ssh $snapdsthost "zfs list -t snapshot" < /dev/null| grep "$snapvol@auto-" | cut -d " " -f 1 | sort | tail --line=1) fi if [ "$snapinkremental" == "yes" ] then # fetching all local snapshots showinfo "Inkremental sending of Snapshots $snapvol..." while read -r localsnap do # check if snapshot is available on remote site snaptimestamp=$(echo "$localsnap" | cut -d"@" -f2- | cut -d"-" -f2-) remotesnap="$snapdstvol/$snapdstname@auto-$snaptimestamp" showinfo "$localsnap <> $remotesnap" if [ "`ssh $snapdsthost "zfs list -t snapshot" < /dev/null | grep -c "$remotesnap"`" != "1" ] then showinfo "Snapshot $localsnap not found, sending inkremental (last snaps: $snaplastnamelocal)" zfs send -R -I "$snaplastnamelocal" "$localsnap" | ssh "$snapdsthost" zfs recv -Fdu "$snapdstvol" zfs release -r keep $snaplastnamelocal zfs hold keep $localsnap ssh "$snapdsthost" "zfs release -r keep $snaplastnameremote ; zfs hold keep $remotesnap" < /dev/null fi snaplastnamelocal="$localsnap" snaplastnameremote="$remotesnap" done <<< "`zfs list -t snapshot | grep -o "$snapvol@auto-.*" | cut -d " " -f 1 | sort`" fi fi done fi if [ "$runscrub" == "true" ] then #### #### Looping through Volumes #### showinfo "Looping through Volumes for Scrubbing..." cat $myconfig | grep -o "SCRUB=.*" | cut -d "=" -f 2 | while read snap do # Check if Volume for Snapshot is Local Managed scrubdo=no scrubvol=$(echo $snap | cut -d " " -f 1) scrubtime=$(echo $snap | cut -d " " -f 2) mytime="`date +"%Y-%m-%d_%H-%M-%S"`" showinfo "\nChecking if Volume ($scrubvol) is locally managed..." if [ "`zpool list -H -o "name" | grep -c "$scrubvol"`" == "1" ] then # Volume is local and Scrubbing is configured lastscrub=$(zpool status $scrubvol | grep scan) if [ "`echo $lastscrub | grep -c "progress"`" == "1" ] then showinfo "Scrubbing already in progress..." else if [ "`echo $lastscrub | grep -c "none"`" == "1" ] then scrubdo=yes showinfo "Scrubbing was never done. Setting Up Task for it..." else comparenow=$(echo $mytime | sed "s/_/ /g") read Y M D h m s <<< ${comparenow//[-: ]/ } comparenow=$(date -d "$Y$M$D $h:$m:$s" "+%s") comparescrub=$(echo $lastscrub | grep -o -E "on\W(.*)" | cut -d " " -f 2-) scrubtime=$((scrubtime*24)) comparescrub=$(date -d "$comparescrub $scrubtime hours" +"%s") showinfo "CompareNow : $comparenow" showinfo "CompareScrub: $comparescrub" if [ $comparenow -ge $comparescrub ] then showinfo "Scrub found, but is too old - task a new one..." scrubdo=yes fi fi fi if [ "$scrubdo" == "yes" ] then zpool scrub $scrubvol fi fi done fi if [ "$checklock" == "true" ] then removelock fi
Und nun noch die zfs-sync-config:
#!/bin/sh #### #### Check Requirements for Execution #### if [ ! -f /usr/bin/dialog ] then echo echo "Could not found requirement 'dialog'." echo "Please install package using 'yum install dialog'." echo exit 1 fi submenu () { case "$1" in 1) # Send Authorized Key to Remote-Host subret=$(dialog --stdout --title "Send Authorized Key to Remote-Host" \ --backtitle "$backtitle" \ --inputbox "Enter Remote Host" 8 50) case $? in 0) # Pressed OK showinfo "Exchanging Hostkeys..." if [ ! -f /root/.ssh/id_rsa ] then ssh-keygen -t rsa fi cat .ssh/id_rsa.pub | ssh root@$subret "mkdir -p .ssh ; cat >> .ssh/authorized_keys" showinfo "Command completed." ;; *) # Pressed Cancel aborted ;; esac ;; 2) # Manage Snapshot subret=$(dialog --stdout --title "Manage Snapshot" \ --backtitle "$backtitle" \ --no-cancel \ --menu "Please choose an option:" 15 80 10 \ 1 "ZFS: List all local Snapshots" \ 2 "ZFS: Remove dedicated Snapshot" \ 3 "ZFS: Remove ALL Snapshots" \ 4 "ZFS: Create manual Snapshot (recursive)" \ 5 "ZFS: Schedule automatic Snapshot (recursive)" \ 6 "ZFS: Un-Schedule automatic Snapshot" \ 0 "Back to Main Menu" \ ) if [ $subret -eq 0 ] || [ $? -eq 255 ] then echo else myret=$((subret+200)) submenu $myret fi ;; 201) # 2->1 List all local Snapshots showinfo "Retrieving local snapshots..." tempfile=$(mktemp) zfs list -t snapshot > "$tempfile" dialog --title "zfs list -t snapshot" \ --backtitle "$backtitle" \ --textbox "$tempfile" 15 80 rm "$tempfile" submenu 2 ;; 202) # 2->2 Remove dedicated Snapshot showinfo "Retrieving local snapshots..." snapret=$(zfs list -t snapshot | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Remove dedicated Snapshot" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $snapret ]) then submenu 2 else zfs list -t snapshot | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | while read snap do snapid=`echo $snap | cut -d" " -f1` snapname=`echo $snap | cut -d" " -f2` if [ "$snapid" == "$snapret" ] then showinfo "Removing snapshot: $snapname" zfs destroy -r "$snapname" fi done submenu 202 fi ;; 203) # 2->3 Remove all local Snapshots showinfo "Removing all local Snapshots..." zfs list -t snapshot | cut -d " " -f 1 | grep -v -E "NAME" | xargs zfs destroy -r submenu 2 ;; 204) # 2->4 Create manual snapshot showinfo "Retrieving local zfs volumes..." volret=$(zfs list | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Create manual Snapshot" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $volret ]) then submenu 2 else zfs list | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | while read zfsvol do volid=`echo $zfsvol | cut -d" " -f1` volname=`echo $zfsvol | cut -d" " -f2` if [ "$volid" == "$volret" ] then subret=$(dialog --stdout --title "Create manual Snapshot ($volname)" \ --backtitle "$backtitle" \ --inputbox "Enter Snapshot Name" 8 50) case $? in 0) # Pressed OK showinfo "Creating manual Snapshot (vol: $volname, name: $subret)" zfs snapshot -r $volname@manual-$subret showinfo "Command completed." ;; *) # Pressed Cancel aborted ;; esac fi done submenu 2 fi ;; 205) # 2->5 Schedule automatic Snapshot showinfo "Retrieving local zfs volumes..." volret=$(zfs list | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Create manual Snapshot" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $volret ]) then submenu 2 else zfs list | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | while read zfsvol do volid=`echo $zfsvol | cut -d" " -f1` volname=`echo $zfsvol | cut -d" " -f2` if [ "$volid" == "$volret" ] then if [ "`grep -c "SNAPSHOT=$volname" $myconfig`" == "0" ] then subretinterval=$(dialog --stdout --title "Schedule automatic Snapshot ($volname)" \ --backtitle "$backtitle" \ --menu "Select Interval:" 15 80 10 \ 1 "1 hour" \ 2 "6 hours" \ 3 "12 hours" \ 4 "1 day" \ ) case $? in 0) # Pressed OK subretkeep=$(dialog --stdout --title "Schedule automatic Snapshot ($volname)" \ --backtitle "$backtitle" \ --menu "Keep X existing Snapshots:" 15 80 10 \ 1 "Keep 1 Snapshot" \ 2 "Keep 5 Snapshots" \ 3 "Keep 7 Snapshots" \ 4 "Keep 30 Snapshots" \ ) case $? in 0) # Pressed OK showinfo "Creating Configuration..." case $subretinterval in 1) snapint=1 ;; 2) snapint=6 ;; 3) snapint=12 ;; *) snapint=24 ;; esac case $subretkeep in 1) snapkeep=1 ;; 2) snapkeep=5 ;; 3) snapkeep=7 ;; *) snapkeep=30 ;; esac echo "SNAPSHOT=$volname $snapint $snapkeep" >> $myconfig showinfo "Command completed." ;; *) # Pressed Cancel aborted ;; esac ;; *) # Pressed Cancel aborted ;; esac else showinfo "Could not create task! Please check configuration, there is another task for this volume." sleep 5 fi fi done submenu 2 fi ;; 206) # 2->6 Unschedule automatic Snapshot showinfo "Retrieving local zfs volumes..." volret=$(cat $myconfig | grep -o "SNAPSHOT=.*" | cut -d "=" -f 2 | cut -d " " -f 1 | awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Unschedule automatic Snapshot" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $volret ]) then submenu 2 else cat $myconfig | grep -o "SNAPSHOT=.*" | cut -d "=" -f 2 | awk -F\; '{print FNR" "$1""}' | while read zfsvol do volid=`echo $zfsvol | cut -d" " -f1` volname=`echo $zfsvol | cut -d" " -f2` if [ "$volid" == "$volret" ] then if [ "`grep -c "$volname" $myconfig`" == "0" ] then showinfo "Could not found any scheduled Snapshot for Volume $volname !" else tempfile=$(mktemp) cat $myconfig | grep -v "SNAPSHOT=$volname" > $tempfile cat $tempfile > $myconfig rm $tempfile showinfo "Scheduled Snapshot removed." fi fi done submenu 2 fi ;; 3) # Manage Replication subret=$(dialog --stdout --title "Manage Replication" \ --backtitle "$backtitle" \ --no-cancel \ --menu "Please choose an option:" 15 80 10 \ 1 "List all Replications" \ 2 "Add Replication Configuration" \ 3 "Remove Replication Configuration" \ 0 "Back to Main Menu" \ ) if [ $subret -eq 0 ] || [ $? -eq 255 ] then echo else myret=$((subret+300)) submenu $myret fi ;; 301) # Show Replications showinfo "Retrieving configuration file..." tempfile=$(mktemp) cat $myconfig | grep -o "REPLICATION=.*" | cut -d "=" -f 2 > $tempfile dialog --title "Show Replication Config" \ --backtitle "$backtitle" \ --textbox "$tempfile" 15 80 rm $tempfile submenu 3 ;; 302) # 3->2 Add Replication Config showinfo "Retrieving snapshot configuration..." if [ "`grep -c "SNAPSHOT=" $myconfig`" == "0" ] then showinfo "Please configure automatic Snapshot first - this is mandatory to configure replication!" sleep 5 return fi volret=$(cat $myconfig | grep -o "SNAPSHOT=.*" | cut -d "=" -f 2 | cut -d " " -f 1 | awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Add Replication Configuration" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $volret ]) then submenu 3 else cat $myconfig | grep -o "SNAPSHOT=.*" | cut -d "=" -f 2 | awk -F\; '{print FNR" "$1""}' | while read zfsvol do volid=`echo $zfsvol | cut -d" " -f1` volname=`echo $zfsvol | cut -d" " -f2` if [ "$volid" == "$volret" ] then subrethost=$(dialog --stdout --title "Add Replication Configuration ($volname)" \ --backtitle "$backtitle" \ --inputbox "Enter Remote Host:" 8 50) case $? in 0) # Pressed OK subretvol=$(ssh root@$subrethost "zfs list" | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Add Replication Configuration ($volname to host $subrethost)" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if [ -z $subretvol ] then # Pressed Cancel aborted submenu 3 else # Pressed OK ssh root@$subrethost "zfs list" | cut -d " " -f 1 | grep -v -E "NAME"| awk -F\; '{print FNR" "$1""}' | while read zfsvol2 do vol2id=`echo $zfsvol2 | cut -d" " -f1` vol2name=`echo $zfsvol2 | cut -d" " -f2` if [ "$vol2id" == "$subretvol" ] then showinfo "Creating Replication Configuration..." echo "REPLICATION=$volname $subrethost $vol2name" >> $myconfig showinfo "Command completed." fi done fi ;; *) # Pressed Cancel aborted ;; esac fi done submenu 3 fi ;; 303) # 3->3 Remove Replication Config showinfo "Retrieving configuration..." replret=$(cat $myconfig | grep -o "REPLICATION=.*" | cut -d "=" -f 2 | awk -F\; '{print FNR" \""$1"\""}' | xargs dialog \ --stdout \ --title "Remove Replication Config" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $replret ]) then submenu 3 else cat $myconfig | grep -o "REPLICATION=.*" | cut -d "=" -f 2 | awk -F\; '{print FNR" \""$1"\""}' | while read repl do replid=`echo $repl | cut -d" " -f1` replname=`echo $repl | cut -d" " -f2- | sed s/\"//g` if [ "$replid" == "$replret" ] then if [ "`grep -c "$replname" $myconfig`" == "0" ] then showinfo "Could not found any replication entry: $replname !" sleep 5 else tempfile=$(mktemp) cat $myconfig | grep -v "REPLICATION=$replname" > $tempfile cat $tempfile > $myconfig rm $tempfile showinfo "Replication Configuration removed." fi fi done submenu 3 fi ;; 4) # Manage Cluster showinfo "Retrieving Cluster Status..." tempfile=$(mktemp) pcs status > $tempfile dialog --title "Cluster Status (pcs status)" \ --backtitle "$backtitle" \ --textbox "$tempfile" 15 80 rm $tempfile ;; 5) # Show Configuration showinfo "Retrieving configuration file..." dialog --title "$myconfig" \ --backtitle "$backtitle" \ --textbox "$myconfig" 15 80 ;; 6) # Sync Configuration subret=$(dialog --stdout --title "Sync Configuration to Remote-Host" \ --backtitle "$backtitle" \ --inputbox "Enter Remote Host" 8 50) case $? in 0) # Pressed OK showinfo "Synchronizing Configuration..." scp $myconfig root@$subret:$myconfig showinfo "Command completed." ;; *) # Pressed Cancel aborted ;; esac ;; 8) # Command Line /bin/bash ;; 9) # Manage ZFS Scrubs subret=$(dialog --stdout --title "Manage ZFS Scrubs" \ --backtitle "$backtitle" \ --no-cancel \ --menu "Please choose an option:" 15 80 10 \ 1 "List all Scrubs" \ 2 "Add Scrub Configuration" \ 3 "Remove Scrub Configuration" \ 0 "Back to Main Menu" \ ) if [ $subret -eq 0 ] || [ $? -eq 255 ] then echo else myret=$((subret+900)) submenu $myret fi ;; 901) # Show Scrubs showinfo "Retrieving configuration file..." tempfile=$(mktemp) cat $myconfig | grep -o "SCRUB=.*" | cut -d "=" -f 2 > $tempfile dialog --title "Show Scrub Config" \ --backtitle "$backtitle" \ --textbox "$tempfile" 15 80 rm $tempfile submenu 9 ;; 902) # 9->2 Add Scrub Config showinfo "Retrieving scrub configuration..." if [ "`zpool list -H -o "name" | wc -l`" == "0" ] then showinfo "Please configure an zfs pool first - it is mandatory for scrubbing!" sleep 5 return fi scrubret=$(zpool list -H -o "name" | cut -d " " -f 1 | awk -F\; '{print FNR" "$1""}' | xargs dialog \ --stdout \ --title "Add Scrub Configuration" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $scrubret ]) then submenu 9 else zpool list -H -o "name" | cut -d " " -f 1 | awk -F\; '{print FNR" \""$1"\""}' | while read scrub do scrubid=`echo $scrub | cut -d" " -f1` scrubname=`echo $scrub | cut -d" " -f2 | sed s/\"//g` if [ "$scrubid" == "$scrubret" ] then subretinterval=$(dialog --stdout --title "Schedule automatic Scrubbing ($scrubname)" \ --backtitle "$backtitle" \ --menu "Select Interval:" 15 80 10 \ 1 "1 day" \ 2 "7 days" \ 3 "30 days" \ 4 "90 days" \ ) case $? in 0) # Pressed OK showinfo "Creating Configuration..." case $subretinterval in 1) scrubtime=1 ;; 2) scrubtime=7 ;; 3) scrubtime=30 ;; *) scrubtime=90 ;; esac echo "SCRUB=$scrubname $scrubtime" >> $myconfig showinfo "Command completed." ;; *) # Pressed Cancel aborted ;; esac fi done submenu 9 fi ;; 903) # 9->3 Remove Scrub Config showinfo "Retrieving configuration..." scrubret=$(cat $myconfig | grep -o "SCRUB=.*" | cut -d "=" -f 2 | cut -d " " -f 1 | awk -F\; '{print FNR" \""$1"\""}' | xargs dialog \ --stdout \ --title "Remove Scrub Config" \ --backtitle "$backtitle" \ --menu "Please choose an option:" 15 80 10 ) if ([ -z $scrubret ]) then submenu 9 else cat $myconfig | grep -o "SCRUB=.*" | cut -d "=" -f 2 | cut -d " " -f 1 | awk -F\; '{print FNR" \""$1"\""}' | while read scrub do scrubid=`echo $scrub | cut -d" " -f1` scrubname=`echo $scrub | cut -d" " -f2- | sed s/\"//g` if [ "$scrubid" == "$scrubret" ] then if [ "`grep -c "$scrubname" $myconfig`" == "0" ] then showinfo "Could not found any scrub entry: $replname !" sleep 5 else tempfile=$(mktemp) cat $myconfig | grep -v "SCRUB=$scrubname" > $tempfile cat $tempfile > $myconfig rm $tempfile showinfo "Scrub Configuration removed." fi fi done submenu 9 fi ;; esac } aborted () { dialog --backtitle "$backtitle" \ --infobox "Aborted by user request..." 5 60 sleep 1 } showinfo () { dialog --backtitle "$backtitle" \ --infobox "$1" 5 60 sleep 1 } exitcode=-1 myhostname=`hostname` backtitle="ZFS STORAGE MANAGEMENT (Node: `echo $myhostname`)" myconfig=/etc/zfs-sync.conf if [ ! -f $myconfig ] then touch $myconfig fi while [ $exitcode -lt 0 ] do ret=$(dialog --stdout --title "Main Menu" \ --backtitle "$backtitle" \ --no-cancel \ --menu "Please choose an option:" 15 80 10 \ 1 "Send Authorized Key to Remote-Host" \ 2 "Manage Snapshot" \ 3 "Manage Replication" \ 4 "Manage Cluster (Pakemaker/Corosync)" \ 5 "Display Configuration" \ 6 "Synchronize Configuration" \ 7 "Install Cron-Daemon File" \ 8 "Command Line Interface" \ 9 "Manage ZFS Scrubs" \ 0 "Logout" \ ) if [ $ret -eq 0 ] || [ $? -eq 255 ] then exitcode=0 else submenu $ret fi done
Fröhliches Synchronisieren wünsche ich! ;-)