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/05/04 21:12] – own IP w/o "default" thilobackup_script [2025/09/10 15:45] (current) – Key issue fixec thilo
Line 5: Line 5:
  \\  \\
  
-  - You want to schedule a backup done via a cron job.  +  - You want to schedule a backup to be done via a cron job.  
-  - You want the script initiated from, and stored in a safe location  \\ on a server on the network(not on the router).+  - You want the script initiated from, and stored in a safe location  \\ on a server on the network (not on the router).
   - You do not wish to install SFTP just for these backups.   - You do not wish to install SFTP just for these backups.
  
Line 13: Line 13:
 The script at the bottom of this page will create and download the backup without needing to have SFTP enabled on the router. The script at the bottom of this page will create and download the backup without needing to have SFTP enabled on the router.
  
-We could, of course, create the backup as a cron job on the router itself, and then use the mechanism applied in the script below to download the backup file. However, let's assume you want everything done in just one run of the script. To achieve this, the script covers creation of the backup in an individual file with timestamp and download.+You could, of course, create the backup as a cron job on the router itself, and then use the mechanism applied in the script below to download the backup file. However, let's assume you want everything done in just one run of the script. To achieve this, the script covers creation of the backup in an individual file with timestamp and download.
  
 In this way, just one run of the script on the backup server will create the backup and download it to to a safe location. In this way, just one run of the script on the backup server will create the backup and download it to to a safe location.
- 
-Action is based on using a here doc to execute commands on the router. 
  
  \\ \\ The backup is created using the "//nvram save//" command. This is how backups are done "under the hood" in the web interface.  \\ \\ The backup is created using the "//nvram save//" command. This is how backups are done "under the hood" in the web interface.
  
-You may cross-check that the backups are identical to the ones via the GUI using the following steps (last tested at 22.04.2025):+You may cross-check that the backups are identical to the ones via the GUI using the following steps (last tested at 2025-04-22):
  
  \\  \\
Line 28: Line 26:
   - Create a backup via a script   - Create a backup via a script
   - Copy both files to router   - Copy both files to router
-  - Convert both files via the command "//nvram convert// <filename1/2>  > result_file1/2.txt"+  - Convert both files via the command: \\  ''"nvram convert <filename1/2>  > result_file1/2.txt"''
   - Perform a diff between the two resulting text files.   - Perform a diff between the two resulting text files.
  
  \\  \\
  
-The script then archives the resulting data in a tar file and sends it through the netcat command, transferring it over the network. +The script then archives the resulting data in a tar file and sends it through the netcat command, transferring it over the network. Restore a backup file uses the same procedure as restoring an archive created in the web interface. This was last tested on 2025-04-29.
-Restore a backup file is the same procedure as resorting an archive created in the WEB-GUI (last tested 29.04.2025).+
  
  \\  \\
Line 44: Line 41:
  
   - The netcat command must be available on the backup server.   - The netcat command must be available on the backup server.
-  - The router's root user must have access to the public SSH key of the user executing the script on backup server.+  - The user executing the script on backup server must have access to the router's root user via SSH key.
  
  \\  \\
Line 52: Line 49:
  \\  \\
  
-  - 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`) +  - Command line arguments: backup directory, id-file and router (as IP address). \\ If provided, these will be used. Otherwisethe defaults will apply \\ (search Router IP from "ip r"). 
-  - Date regex covers from 1970 - in case Tomato Router has no time+  - Sometimes tar may failYou can solve this by just cleaning. The next \\ cron run may do that.
-  - Sometimes tar fails - cover this error by just cleaningnext cron run may do it+
   - All earlier backups from the same day are abandoned.   - All earlier backups from the same day are abandoned.
-  - A total number of backups is kept. This number is configurable. Older ones are deleted.+  - A total number of backups is kept. This number is configurable. \\ Older backups are deleted.
  
  \\  \\
  
    #!/bin/bash    #!/bin/bash
 +   
 +   DATE_REGEX=20[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
        
    DIR2BACKUP=/home/${LOGNAME}/Router_Backups    DIR2BACKUP=/home/${LOGNAME}/Router_Backups
Line 74: Line 74:
                 -r|--router)                 -r|--router)
                         ROUTER=$2 ;;                         ROUTER=$2 ;;
 +                -*|--*)
 +                        echo "Unknown option $1" ;;
 +                -h|--help)
 +                        echo "usage $0 <option argument> 
 +                        echo "options are:"
 +                        echo "  -d \| --dir2backup      directory to save backup,               default: ${DIR2BACKUP} "
 +                        echo "  -r \| --router          router ostname or IP to be saved,       default: ${ROUTER}"
 +                        echo "  -i \| --idfile          directory to save backuip,              default: ${ROUTER}
 +                        exit ;;
         esac         esac
         shift; shift         shift; shift
Line 92: Line 101:
    TRANSFER_FILENAME=config.tar    TRANSFER_FILENAME=config.tar
        
-   # DATE_REGEX covers back to 1970 and furtherin case Tomato Router has no date or date 1970-01-01 +   # It may happenthat Tomato router has no or other, wrong time 
-   # Total coverage: 1900-01-01 until 2999-12-31 :-+   # take date from localhost (i.e. backup serverinto backup filename 
-   DATE_REGEX=[12][09][0-9][0-9][01][0-9][0123][0-9] +   DATE=`date +%Y%m%d_%H%M` 
-   TIME_REGEX=[012][0-9][0-5][0-9] +   
-   NO_OF_DIFF_FILES_TO_BE_KEPT=10 +
-    +
    pushd ${DIR2BACKUP} > /dev/null    pushd ${DIR2BACKUP} > /dev/null
        
Line 104: Line 111:
    # 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. 
-   # Further the individual filename is general not known, so tar it into temp file+   # Further the individual filename is generally not known, so tar it into temp file.
    #    #
    # Kill netcat zombies    # Kill netcat zombies
    kill -9 `ps -ef | grep -v grep | grep netcat | sed -e "s/ [ ]*/ /g" | cut -d " " -f 2` 2> /dev/null    kill -9 `ps -ef | grep -v grep | grep netcat | sed -e "s/ [ ]*/ /g" | cut -d " " -f 2` 2> /dev/null
    (netcat -l -p ${PORT} > ${TRANSFER_FILENAME}) &    (netcat -l -p ${PORT} > ${TRANSFER_FILENAME}) &
 +   # Create the backup file on the router by executing the following commands (indented lines) there
    ssh ${USER}@${ROUTER} -i ${LOCAL_ID_FILE} <<ENDSSH    ssh ${USER}@${ROUTER} -i ${LOCAL_ID_FILE} <<ENDSSH
         rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT}         rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT}
Line 117: Line 125:
         nvram get t_model_name | tr " " "_" >> ${SCRIPT_FILE}         nvram get t_model_name | tr " " "_" >> ${SCRIPT_FILE}
         nvram get router_name >> ${SCRIPT_FILE}         nvram get router_name >> ${SCRIPT_FILE}
-        date +%Y%m%d_%H%M >> ${SCRIPT_FILE}+        echo ${DATE} >> ${SCRIPT_FILE}
         sed -e "N;N;N;N;N;s/\n/_/g;s/$/.${EXT}/" -i ${SCRIPT_FILE}         sed -e "N;N;N;N;N;s/\n/_/g;s/$/.${EXT}/" -i ${SCRIPT_FILE}
         source ${SCRIPT_FILE}         source ${SCRIPT_FILE}
         tar -cvf ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT} > /dev/null         tar -cvf ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT} > /dev/null
         cat ${TRANSFER_FILENAME} | nc ${BACKUPHOST} ${PORT}         cat ${TRANSFER_FILENAME} | nc ${BACKUPHOST} ${PORT}
-        sleep 5 # just wait a little bit before deleting the files not needed here any more+        sleep 5 # just wait a little while before deleting the files not needed here any more
         rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT}         rm -f ${SCRIPT_FILE} ${TRANSFER_FILENAME} ${PREFIX}_*_${DATE_REGEX}_${TIME_REGEX}.${EXT}
    ENDSSH    ENDSSH
Line 133: Line 141:
         TODAYS_BACKUP_FILES_PREFIX=${THIS_BACKUP_FILE%_*}         TODAYS_BACKUP_FILES_PREFIX=${THIS_BACKUP_FILE%_*}
         ALL_BACKUP_FILES_PREFIX=${TODAYS_BACKUP_FILES_PREFIX%_*}         ALL_BACKUP_FILES_PREFIX=${TODAYS_BACKUP_FILES_PREFIX%_*}
-        DATE=`date +%Y%m%d_%H%M` +        # Keep only one file (the latest) per day - delete earlier file of same day 
-        if ! [[ `find -cmin 5 | grep ${THIS_BACKUP_FILE}` ]] ; then +        LIST_OLD_BACKUPS_OF_TODAY=`ls ${TODAYS_BACKUP_FILES_PREFIX}_${TIME_REGEX}.${EXT} 2> /dev/null | grep -v ${THIS_BACKUP_FILE}`
-                # Date of the new files is more that 5 mind in the past  => seems Tomato Router has no date (or date 1970-01-01) +
-                touch ${THIS_BACKUP_FILE} +
-        fi +
-        # Keep only one file (the latest) per day - delete earlier file of same day     +
-        LIST_OLD_BACKUPS_OF_TODAY=`ls -t ${TODAYS_BACKUP_FILES_PREFIX}_${TIME_REGEX}.${EXT} 2> /dev/null | sed -e 1,1d`+
         if [ "${LIST_OLD_BACKUPS_OF_TODAY}" ]; then         if [ "${LIST_OLD_BACKUPS_OF_TODAY}" ]; then
-                echo "deleting today'earlier backups (to keep just one per day - the most recent):"+                echo "deleting earlier backups from today (to keep just one per day - the most recent):"
                 rm -fv ${LIST_OLD_BACKUPS_OF_TODAY}                 rm -fv ${LIST_OLD_BACKUPS_OF_TODAY}
                 echo                 echo
         fi         fi
         # In total, keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} files - delete older files (of any day)         # 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`+        OLDER_FILES=`ls ${ALL_BACKUP_FILES_PREFIX}_${DATE_REGEX}_${TIME_REGEX}.${EXT} | sort -r | sed -e 1,${NO_OF_DIFF_FILES_TO_BE_KEPT}d`
         if [ "${OLDER_FILES}" ]; then         if [ "${OLDER_FILES}" ]; then
                 echo "keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} in total, delete:"                 echo "keep only ${NO_OF_DIFF_FILES_TO_BE_KEPT} in total, delete:"
Line 152: Line 155:
                 echo                 echo
         fi         fi
-        # delete transfer file only when tar was successfull, i.e. only here+        # delete transfer file only when tar was successful, i.e. only here
         rm ${TRANSFER_FILENAME}         rm ${TRANSFER_FILENAME}
    else    else
Line 158: Line 161:
    fi    fi
    popd > /dev/null    popd > /dev/null
-  +
  \\  \\
  
backup_script.1746389567.txt.gz · Last modified: by thilo