diff --git a/restore.sh b/restore.sh index 4fc09930ccb4ca2ae69875d8b7f50b77964b0a91..f3981597197caf124f7a97e0ee14d44e8a0cf17e 100755 --- a/restore.sh +++ b/restore.sh @@ -21,6 +21,7 @@ # 2017-10-11 ah,ds v1.1 added support for duplicity param --ssh-backend # 2018-08-27 ah,ds v1.2 fix restore target with a given selection; handle '*' placeholder # 2019-06-05 ah,ds v1.3 add custom cache dir +# 2021-05-19 ah,ds, v2.0 plugin driven # ================================================================================ @@ -33,39 +34,42 @@ . `dirname $0`/jobhelper.sh . `dirname $0`/inc_bash.sh - STORAGE_BASEDIR=`_j_getvar ${STORAGEFILE} "storage"` + STORAGE_BIN=`_j_getvar ${STORAGEFILE} "bin"` + if [ -z "$STORAGE_BIN" ]; then + STORAGE_BIN=restic + # STORAGE_BIN=duplicity + fi + + . `dirname $0`/plugins/transfer/$STORAGE_BIN.sh || exit 1 - # check + STORAGE_BASEDIR=`_j_getvar ${STORAGEFILE} "storage"` if [ -z $STORAGE_BASEDIR ]; then echo ERROR: missing config for backup target. echo There must be an entry storage in ${STORAGEFILE} exit 1 fi + + # ----- read something from config files RESTORE_BASEDIR=`_j_getvar ${STORAGEFILE} "restore-path"` - PASSPHRASE=`_j_getvar ${STORAGEFILE} "gnupg-passphrase"` + PASSPHRASE=`_j_getvar ${STORAGEFILE} "passphrase"` export PASSPHRASE - sFileSshPrivkey=`_j_getvar ${STORAGEFILE} "ssh-privatekey"` - - sParams= - - # task#1623 - fallback ssh backend for Debian 8 - sSshBackend=`_j_getvar ${STORAGEFILE} "ssh-backend"` - if [ ! -z $sSshBackend ]; then - sParams="${sParams} --ssh-backend $sSshBackend" - fi + t_setVars || exit 1 + # ----- init default vars + sParams="$( t_getParamDefault $1 $2 )" sFileSshPrivkey=`_j_getvar ${STORAGEFILE} "ssh-privatekey"` if [ ! -z $sFileSshPrivkey ]; then - sParams="${sParams} --ssh-options="""-oIdentityFile=${sFileSshPrivkey}""" " + sParams="${sParams} $( t_getParamSshKey $sFileSshPrivkey )" fi + # task#3046 - add custom cache dir sCacheDir=`_j_getvar ${STORAGEFILE} "cachedir"` if [ ! -z $sCacheDir ]; then - sParams="${sParams} --archive-dir=$sCacheDir" + sParams="${sParams} $( t_getParamCacheDir $sCacheDir )" fi # ----- what to restore ... @@ -73,7 +77,7 @@ sRestoreItem= sDate=`date +%Y-%m-%d` - # duplicity target + # target directory of directory specifi repository sTarget= # -------------------------------------------------------------------------------- @@ -94,7 +98,7 @@ function enterBackupDir(){ echo "Enter the full path; marked entries with (*) do not exist on this machine" echo - sDirs="`j_getDirs2Backup`" + local sDirs="`j_getDirs2Backup`" for mydir in $sDirs do if [ ! -d "$mydir" ]; then @@ -115,196 +119,6 @@ function enterBackupDir(){ } -# ---------------------------------------------------------------------- -# enter date to restore from; menu item -# ---------------------------------------------------------------------- -function enterDate(){ - - h2 "edit date to restore" - - echo "The acceptible time strings are intervals (like \"3D64s\"), w3-datetime" - echo "strings, like \"2002-04-26T04:22:01-07:00\" (strings like" - echo "\"2002-04-26T04:22:01\" are also acceptable - duplicity will use the" - echo "current time zone), or ordinary dates like 2/4/1997 or 2001-04-23" - echo "(various combinations are acceptable, but the month always precedes" - echo "the day)." - echo - echo "today in YYYY-MM-DD: `date +%Y-%m-%d`" - echo - color input - echo -n "[$sDate] >" - color reset - read sNewDate - if [ ! -z $sNewDate ]; then - sDate=$sNewDate - fi -} - -# ---------------------------------------------------------------------- -# enter relative path to restore; menu item -# ---------------------------------------------------------------------- -function enterRestoreitem(){ - - h2 "set restore item (path)" - - echo "enter a relative path behind ${sDir2restore}/" - echo "empty means: all data" - echo - color input - echo -n "[$sRestoreItem] >" - color reset - read sNewsRestoreItem - - if [ ! -z $sNewsRestoreItem ]; then - sRestoreItem=$sNewsRestoreItem - setVars - fi - getRemoteFiles -} - - -# ---------------------------------------------------------------------- -# search a file in backup; menu item -# ---------------------------------------------------------------------- -function searchFile(){ - h2 "search a file in backup --time $sDate" - - echo "Enter something that was backuped from ${sDir2restore}" - echo "searchtext matches anywhere in filename or path - it is a grep grep in" - echo "duplicity list-current-files --time $sDate [target]" - echo "Press just Return to exit" - echo - color input - echo -n "search for >" - color reset - read sSearch - if [ ! -z $sSearch ]; then - getRemoteFiles $sSearch - fi -} - -# ---------------------------------------------------------------------- -# verify backup set with local files; menu item -# ---------------------------------------------------------------------- -function verify(){ - - h2 "verify" - - echo duplicity verify ${sParams} ${sTarget} -v4 $sDir2restore - color cmd - duplicity verify ${sParams} ${sTarget} -v4 $sDir2restore - fetchrc - color reset - -} - -# ---------------------------------------------------------------------- -# show file changes in backupsets; menu item -# work in progress ... I don't know how to match a file... -# ---------------------------------------------------------------------- -function showFilechanges(){ - - tmpcache=~/.cache/duplicity-changes-${sSafeName}.txt - - h2 "show file changes" - - egrep "\ \ (changed|deleted|new)\ \ " `fgrep -l "Localdir ${sDir2restore}" ~/.cache/duplicity/*/*.manifest` >$tmpcache - # ls -l $tmpcache - # head $tmpcache - - echo "I hope you made a search first" - echo "Enter filename with complete path that was backuped from ${sDir2restore}" - echo "Press just Return to exit" - echo - color input - echo -n "search for >" - color reset - read sSearch - if [ ! -z "${sSearch}" ]; then - echo grep "${sSearch}" - color cmd - # duplicity collection-status --file-changed "`basename ${sSearch}`" ${sParams} ${sTarget}/`dirname "${sSearch}"` - cat $tmpcache | grep "${sSearch}" | while read line - do - sManifest=`echo $line | cut -f 1 -d ":"` - - # duplicity-inc.20161111T152106Z.to.20161111T152141Z.manifest - sTime=`basename "${sManifest}" | cut -f 2 -d "."` - sOut=`echo $line | cut -f 2- -d ":"` - - echo $sTime $sOut | sed "s#new#new #" - done | sort - echo - color reset - fi -} - -# ---------------------------------------------------------------------- -# show remote volumes with incremental and full backups -# ---------------------------------------------------------------------- -function getRemoteVolumes(){ - tmpoutVolumes=/tmp/outvolumelist_$$ - - h2 "volumes for $sDir2restore" - - echo duplicity collection-status ${sParams} ${sTarget} - color cmd - duplicity collection-status ${sParams} ${sTarget} | tee -a $tmpoutVolumes - fetchrc - color reset - echo - - if [ `cat $tmpoutVolumes | egrep "(Full|Incremental)" | wc -l` -eq 0 ]; then - color error - echo "ERROR: no backup sets were found for directory [$sDir2restore]" - echo - color reset - sDir2restore= - setVars - else - color ok - echo "OK, `cat $tmpoutVolumes | grep "Full" | wc -l` Full and `cat $tmpoutVolumes | grep "Incremental" | wc -l` incremental backups" - color reset - fi - - rm -f $tmpoutVolumes - -} - -# ---------------------------------------------------------------------- -# list files from backupset -# ---------------------------------------------------------------------- -function getRemoteFiles(){ - iLines=50 - tmpout=/tmp/outfilelist_$$ - sSearch=$1 - if [ -z $sSearch ]; then - sSearch="^...\ ...\ ..\ ........\ ....\ $sRestoreItem" - fi - echo - echo - echo --- files ... filtered for date [$sDate] by [$sSearch] - echo duplicity list-current-files --time $sDate ${sParams} ${sTarget} - color cmd - duplicity list-current-files --time $sDate ${sParams} ${sTarget} 2>&1 | grep "$sSearch" | tee -a $tmpout | head -$iLines - fetchrc - color reset - if [ `cat $tmpout | wc -l` -eq 0 ]; then - color error - echo ERROR: your file does not match ... try another time ... or another search string - color reset - else - echo ... max $iLines lines ... maybe the output was cut - echo - if [ -z $1 ]; then - echo - doRestoreDryRun - echo - echo - fi - fi - rm -f $tmpout -} # ---------------------------------------------------------------------- # set backup dir .. called when using cli parameter or enterBackupDir @@ -335,20 +149,18 @@ function setBackupDir(){ sDir2restore=$1 setVars - getRemoteVolumes - fi fi } # ---------------------------------------------------------------------- -# internal: set variables for target path and backup set to make -# duplicity calls +# internal: set variables for target path and backup set # ---------------------------------------------------------------------- function setVars(){ sSafeName=`j_getSafename "$sDir2restore"` - sTarget=`j_getFullTarget "$sDir2restore"` + sTarget="$( t_sd_getTarget $sDir2restore )" + # sTarget=`j_getFullTarget "$sDir2restore"` sRestorepath="${RESTORE_BASEDIR}/${sSafeName}" if [ ! -z $sRestoreItem ]; then @@ -365,32 +177,50 @@ function setVars(){ fi } -# ---------------------------------------------------------------------- -# restore dry run ... called in getRemoteFiles -# ---------------------------------------------------------------------- -function doRestoreDryRun(){ - echo "--- dry run" - echo duplicity restore --dry-run --file-to-restore "$sRestoreItem" --time $sDate ${sParams} ${sTarget} ${sRestorepath} - color cmd - duplicity restore --dry-run --file-to-restore "$sRestoreItem" --time $sDate ${sParams} ${sTarget} ${sRestorepath} - fetchrc - color reset -} +# -------------------------------------------------------------------------------- +# MAIN +# -------------------------------------------------------------------------------- -# ---------------------------------------------------------------------- -# restore and finish the script; menu item -# ---------------------------------------------------------------------- -function doRestore(){ - mkdir -p $sRestorepath +h1 "RESTORE - GET FILES FROM STORAGE" - h2 "RESTORE" - echo duplicity restore --file-to-restore "$sRestoreItem" --time $sDate ${sParams} ${sTarget} ${sRestorepath} +# ----- set a directory to restore to have a useful initial point + + setBackupDir $1 + if [ -z $sDir2restore ]; then + enterBackupDir + fi + +# ----- make inputs + + t_restoreSelect + t_restoreFilter + +# ----- get restore command: + + restorecmd=$( t_cmdRestore ) + if [ -z "$restorecmd" ]; then + color error + echo "ERROR: no restore command ... " + echo "A developer must check t_inputs4Restore and t_cmdRestore in plugins/transfer/$STORAGE_BIN.sh" + color reset + exit 1 + fi + + echo + echo --- Restore: + echo $restorecmd + echo "RETURN to start restore ... or Ctrl + C to abort" + read dummy + mkdir -p "${sRestorepath}" color cmd - duplicity restore --file-to-restore "$sRestoreItem" --time $sDate ${sParams} ${sTarget} ${sRestorepath} + $restorecmd fetchrc color reset + + t_rcCheckRestore + echo echo echo Restore is finished. @@ -398,29 +228,9 @@ function doRestore(){ echo "The restore path has `find ${sRestorepath} -type f | wc -l` files (`du -hs ${sRestorepath} | awk '{ print $1 }'`)" echo echo find ${sRestorepath} + exit - echo - exit 0 -} - - -# -------------------------------------------------------------------------------- -# MAIN -# -------------------------------------------------------------------------------- - -h1 "RESTORE - GET FILES FROM STORAGE" -# ----- Check requirements - - j_requireUser "root" - j_requireBinary "duplicity" - -# ----- set a directory to restore to have a useful initial point - - setBackupDir $1 - if [ -z $sDir2restore ]; then - enterBackupDir - fi # ----- menu and loop @@ -434,18 +244,18 @@ h1 "RESTORE - GET FILES FROM STORAGE" echo echo " D - directory to restore: $sDir2restore" - echo " T - time : $sDate" - echo " W - what to restore : $sRestoreItem" - echo - echo " C - show file changes" - echo " S - search file" - echo " V - verify" - echo " B - Bash (Shell)" + echo " W - time or snapshot ID : $RESTORE_ITEM" + echo " F - what to restore : $RESTORE_FILTER" echo + # echo " C - show file changes" + # echo " S - search file" + # echo " V - verify" + # echo " B - Bash (Shell)" + # echo echo " R - start restore" echo - echo " retore from : $sTarget" - echo " retore to : $sRestorepath" + echo " restore from : $sTarget" + echo " restore to : $sRestorepath" echo -n " " ls -d $sRestorepath >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -469,8 +279,8 @@ h1 "RESTORE - GET FILES FROM STORAGE" d|D) enterBackupDir ;; - t|T) - enterDate + w|W) + t_restoreSelect ;; c|C) showFilechanges @@ -486,8 +296,8 @@ h1 "RESTORE - GET FILES FROM STORAGE" export PS1="[`basename $0` \u@\h \w]\$ " bash ;; - w|W) - enterRestoreitem + f|F) + t_restoreFilter ;; r|R) doRestore