Site Tools


backup_script

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
backup_script [2025/04/29 23:57] thilobackup_script [2025/05/06 08:08] (current) – little typo thilo
Line 52: Line 52:
  \\  \\
  
-  - Date covers from 1970 - in case Tomato Router has no time. +  - Command line arguments: backup directory, id-file and router /.eg. as IP). If provided, these will be used, else defaults apply (Router IP from `ip r`) 
-  - Sometimes tar fails - cover this error by just cleaning, next cron run may do it +  - Date regex covers from 1970 - in case Tomato Router has no time. 
-  - All ealier backup from the same day are abandoned. +  - Sometimes tar fails.  - cover this error by just cleaning, next cron run may do it 
-  - A configurable number of backups in total is kept. Older ones are deleted.+  - All earlier backups from the same day are abandoned. 
 +  - A total number of backups is kept. This number is configurable. Older ones are deleted.
  
  \\  \\
 +
    #!/bin/bash    #!/bin/bash
        
-   USER=root+   DIR2BACKUP=/home/${LOGNAME}/Router_Backups
    LOCAL_ID_FILE=/home/${LOGNAME}/.ssh/id_tomato_ecdsa    LOCAL_ID_FILE=/home/${LOGNAME}/.ssh/id_tomato_ecdsa
 +   ROUTER=`ip r | grep default | head -1 | cut -d " " -f 3`   
 +   
 +   while [[ $# -gt 0 ]]; do
 +        case $1 in
 +                -d|--dir2backup)
 +                        DIR2BACKUP=$2 ;;
 +                -i|--idfile)
 +                        LOCAL_ID_FILE=$2 ;;
 +                -r|--router)
 +                        ROUTER=$2 ;;
 +        esac
 +        shift; shift
 +   done
 +   
 +   BACKUPHOST=`ip r | grep "${ROUTER%1}0/24" | head -1 | cut -d " " -f 9`
 +   echo
 +   echo "Backup dir:  "${DIR2BACKUP}
 +   echo "id file:     "${LOCAL_ID_FILE}
 +   echo "Backing up:  "${ROUTER}
 +   echo "Backup host: "${BACKUPHOST}
 +   echo
 +   USER=root
    PORT=5555    PORT=5555
-   BACKUP_DIR=/home/${LOGNAME}/Router_Backups 
    SCRIPT_FILE=nvram_save_cfg.sh    SCRIPT_FILE=nvram_save_cfg.sh
    PREFIX=FreshTomato    PREFIX=FreshTomato
-   EXT=.cfg+   EXT=cfg
    TRANSFER_FILENAME=config.tar    TRANSFER_FILENAME=config.tar
        
-   # DATE_REGEX covers back to 1970 and further, in case Tomato Router has no date or date 1970-01-101+   # DATE_REGEX covers back to 1970 and further, in case Tomato Router has no date or date 1970-01-01
    # Total coverage: 1900-01-01 until 2999-12-31 :-)    # Total coverage: 1900-01-01 until 2999-12-31 :-)
-   DATE_REGEX=[12][09][0-9][0-9][01][0-9][0123][0-9]_[012][0-9][0-5][0-9] +   DATE_REGEX=[12][09][0-9][0-9][01][0-9][0123][0-9] 
-   +   TIME_REGEX=[012][0-9][0-5][0-9]
    NO_OF_DIFF_FILES_TO_BE_KEPT=10    NO_OF_DIFF_FILES_TO_BE_KEPT=10
-       +     
-   ROUTER=`ip r | grep default | head -1 | cut -d " " -f 3` +   pushd ${DIR2BACKUP} > /dev/null
-   BACKUPHOST=`ip r | grep default | head -1 | cut -d " " -f 9`+
        
-   pushd ${BACKUP_DIR} +   rm -${TRANSFER_FILENAME} 
-   rm ${TRANSFER_FILENAME} +
-    +
-   (netcat -l -p ${PORT} > ${TRANSFER_FILENAME}) &+
    #    #
    # Thinks like    # Thinks like
-   # VAR=`nvram get os_version`+   # VAR=`nvram get os_version` 
    # seem not to work in bash via here doc, so write results into script file and source it    # seem not to work in bash via here doc, so write results into script file and source it
-   # Furtherthe individual filename is generally not known, so tar it into temp file+   # Further the individual filename is general not known, so tar it into temp file
    #    #
-   ssh ${USER}@${ROUTER} -i ${LOCAL_ID_FILE}<<ENDSSH +   # Kill netcat zombies 
-           rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}${EXT} +   kill -9 `ps -ef | grep -v grep | grep netcat | sed -e "s/ [ ]*/ /g" | cut -d " " -f 2` 2> /dev/null 
-           echo "nvram save ${PREFIX}" >> ${SCRIPT_FILE} +   (netcat -l -p ${PORT} > ${TRANSFER_FILENAME}) & 
-           nvram get os_version | sed -e "s/ .*$//" >> ${SCRIPT_FILE} +   ssh ${USER}@${ROUTER} -i ${LOCAL_ID_FILE} <<ENDSSH 
-           echo "on" >> ${SCRIPT_FILE} +        rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT} 
-           nvram get t_model_name | tr " " "_" >> ${SCRIPT_FILE} +        echo "nvram save ${PREFIX}" >> ${SCRIPT_FILE} 
-           nvram get router_name >> ${SCRIPT_FILE} +        nvram get os_version | sed -e "s/ .*$//" >> ${SCRIPT_FILE} 
-           date +%Y%m%d_%H%M >> ${SCRIPT_FILE} +        echo "on" >> ${SCRIPT_FILE} 
-           sed -e "N;N;N;N;N;s/\n/_/g;s/$/${EXT}/" -i ${SCRIPT_FILE} +        nvram get t_model_name | tr " " "_" >> ${SCRIPT_FILE} 
-           cat ${SCRIPT_FILE} +        nvram get router_name >> ${SCRIPT_FILE} 
-           source ${SCRIPT_FILE} +        date +%Y%m%d_%H%M >> ${SCRIPT_FILE} 
-           tar -cvf ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}${EXT} +        sed -e "N;N;N;N;N;s/\n/_/g;s/$/.${EXT}/" -i ${SCRIPT_FILE} 
-           cat ${TRANSFER_FILENAME} | nc ${BACKUPHOST} ${PORT} +        source ${SCRIPT_FILE} 
-           sleep 5 # just wait a little bit before de +        tar -cvf ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT} > /dev/null 
-           leting the files not needed here any more +        cat ${TRANSFER_FILENAME} | nc ${BACKUPHOST} ${PORT} 
-           rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}${EXT}+        sleep 5 # just wait a little bit before deleting the files not needed here any more 
 +        rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT}
    ENDSSH    ENDSSH
        
-   THIS_BACKUP_FILE=`tar -tvf ${TRANSFER_FILENAME} | sed -e "s/^.*${PREFIX}/${PREFIX}/"`+   THIS_BACKUP_FILE=`tar -xvf ${TRANSFER_FILENAME} | sed -e "s/^.*${PREFIX}/${PREFIX}/"`
    if [ "${THIS_BACKUP_FILE}" ]; then    if [ "${THIS_BACKUP_FILE}" ]; then
-        TODAYS_BACKUP_FILE=${THIS_BACKUP_FILE%_*} +        echo "Saved on this computer in `pwd`:" 
-        OLD_BACKUPS_OF_TODAY=`ls ${TTODAYS_BACKUP_FILEE}_[012][0-9][0-5][0-9]${EXT2> /dev/null+        echo ${THIS_BACKUP_FILE} 
-        if [ "${OLD_BACKUPS_OF_TODAY}]; then +        echo 
-                echo "deleting today's earlier bakups (to keep just one per day):" +        TODAYS_BACKUP_FILES_PREFIX=${THIS_BACKUP_FILE%_*} 
-                rm -v ${OLD_BACKUPS_OF_TODAY}+        ALL_BACKUP_FILES_PREFIX=${TODAYS_BACKUP_FILES_PREFIX%_*} 
 +        DATE=`date +%Y%m%d_%H%M
 +        if [[ `find -cmin 5 | grep ${THIS_BACKUP_FILE}` ]] ; then 
 +                # Date of the new files is more that 5 mins in the past  => seems Tomato Router has no date (or date 1970-01-01
 +                touch ${THIS_BACKUP_FILE}
         fi         fi
-        tar -xvf ${TRANSFER_FILENAME} +        # Keep only one file (the latest) per day delete earlier file of same day     
-        DELETE_OLDER=`ls -t ${TODAYS_BACKUP_FILE%_*}_${DATE_REGEX}${EXT} | sed -e 1,${NO_OF_DIFF_FILES_TO_BE_KEPT}d+        LIST_OLD_BACKUPS_OF_TODAY=`ls -t ${TODAYS_BACKUP_FILES_PREFIX}_${TIME_REGEX}.${EXT} 2> /dev/null | sed -e 1,1d
-        if [ "${DELETE_OLDER}" ]; then +        if [ "${LIST_OLD_BACKUPS_OF_TODAY}" ]; then 
-                echo "keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} in total delete:" +                echo "deleting today's earlier backups (to keep just one per day - the most recent):" 
-                rm -fv ${DELETE_OLDER}+                rm -fv ${LIST_OLD_BACKUPS_OF_TODAY} 
 +                echo
         fi         fi
 +        # In total, keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} files - delete older files (of any day)
 +        OLDER_FILES=`ls -t ${ALL_BACKUP_FILES_PREFIX}_${DATE_REGEX}_${TIME_REGEX}.${EXT} | sed -e 1,${NO_OF_DIFF_FILES_TO_BE_KEPT}d`
 +        if [ "${OLDER_FILES}" ]; then
 +                echo "keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} in total, delete:"
 +                rm -fv ${OLDER_FILES}
 +                echo
 +        fi
 +        # delete transfer file only when tar was successfull, i.e. only here
 +        rm ${TRANSFER_FILENAME}
    else    else
         echo "unknown error while untaring"         echo "unknown error while untaring"
    fi    fi
-   rm ${TRANSFER_FILENAME} +   popd > /dev/null 
-   popd +  
  \\  \\
  
backup_script.1745967467.txt.gz · Last modified: 2025/04/29 23:57 by thilo