This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
interessen:computer:pc_technik:backup [2015/01/30 12:58] tomtom created |
interessen:computer:pc_technik:backup [2015/02/15 11:54] (current) tomtom |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| Damit hatte ich auch die Möglichkeit beim Backup gleichzeitig auf zwei (oder mehr) verschiedenen Server meine Backups zu schreiben. | Damit hatte ich auch die Möglichkeit beim Backup gleichzeitig auf zwei (oder mehr) verschiedenen Server meine Backups zu schreiben. | ||
| + | Da ich das neue Script so flexibel wie möglich machen wollte habe ich mir überlegt, alle Parameter in ein extra File auszulagern. Ich habe wegen der einfachen Lesbarkeit -json als Format gewählt. | ||
| + | |||
| + | ===== Backup-Script ===== | ||
| + | Es sind noch viele " | ||
| + | |||
| + | #!/bin/bash | ||
| + | ############################################################################# | ||
| + | # # | ||
| + | # backup script | ||
| + | # Author : theta-my -> thomas@tuhol.de | ||
| + | # # | ||
| + | # can run with different backup methods, | ||
| + | # please take a look in backup_< | ||
| + | # # | ||
| + | # to make my work easier, i have all my urgent data located in one folder | ||
| + | # and mount this folder or sub folders to the right location in file system # | ||
| + | # # | ||
| + | ############################################################################# | ||
| + | | ||
| + | setup() | ||
| + | { | ||
| + | tstemp=`date +%Y%m%d%H%M` | ||
| + | host=`hostname` | ||
| + | |||
| + | # define definition file and check availability | ||
| + | DATA_FILE=/ | ||
| + | if [ ! -f $DATA_FILE ] | ||
| + | then | ||
| + | logger " < | ||
| + | exit | ||
| + | fi | ||
| + | |||
| + | WORK_DIR=`jq .work_dir $DATA_FILE|sed ' | ||
| + | cd $WORK_DIR | ||
| + | echo " | ||
| + | MOUNT_FS="" | ||
| + | message="" | ||
| + | ERR_STOP=0 | ||
| + | ERR_COUNT=0 | ||
| + | ERR_HIGH_COUNT=0 | ||
| + | ERR_MEDIUM_COUNT=0 | ||
| + | ERR_LOW_COUNT=0 | ||
| + | LOG_DIR=`jq .log_dir $DATA_FILE|sed ' | ||
| + | LOG_FILE=$LOG_DIR/ | ||
| + | LOG_CHECK_FILE=$LOG_DIR/ | ||
| + | } | ||
| + | | ||
| + | error_check() | ||
| + | { | ||
| + | echo "job ' | ||
| + | IGNOR=`jq .jobs.error_check.err_ignore $DATA_FILE|sed ' | ||
| + | echo "error to ignor : " | ||
| + | | ||
| + | HIGH=`jq .jobs.error_check.err_high $DATA_FILE|sed ' | ||
| + | MEDIUM=`jq .jobs.error_check.err_medium $DATA_FILE|sed ' | ||
| + | LOW=`jq .jobs.error_check.err_low $DATA_FILE|sed ' | ||
| + | | ||
| + | for FILE in `cat $LOG_CHECK_FILE | grep '< | ||
| + | do | ||
| + | echo "check line "$FILE | ||
| + | if [[ $IGNOR = "" | ||
| + | then | ||
| + | error_check_sub | ||
| + | else | ||
| + | for TYPE in ${IGNOR[@]} | ||
| + | do | ||
| + | if ( ! $FILE| grep $TYPE ) | ||
| + | then | ||
| + | error_check_sub | ||
| + | fi | ||
| + | done | ||
| + | fi | ||
| + | done | ||
| + | } | ||
| + | | ||
| + | error_check_sub() | ||
| + | { | ||
| + | if ( cat $LOG_FILE | grep $FILE ) | ||
| + | then | ||
| + | echo "check line "$FILE | ||
| + | for i in ${HIGH[@]} | ||
| + | do | ||
| + | if ( $FILE|grep $i ) | ||
| + | then | ||
| + | (($ERR_HIGH_COUNT++)) | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | for i in ${MEDIUM[@]} | ||
| + | do | ||
| + | if ( $FILE|grep $i ) | ||
| + | then | ||
| + | (($ERR_MEDIUM_COUNT++)) | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | for i in ${LOW[@]} | ||
| + | do | ||
| + | if ( $FILE|grep $i ) | ||
| + | then | ||
| + | (($ERR_LOW_COUNT++)) | ||
| + | fi | ||
| + | done | ||
| + | | ||
| + | (($ERR_COUNT++)) | ||
| + | echo $ERR_COUNT | ||
| + | fi | ||
| + | } | ||
| + | | ||
| + | messaging() | ||
| + | { | ||
| + | echo "job ' | ||
| + | if [ $ERR_COUNT -gt 0 ] | ||
| + | then | ||
| + | if [ $ERR_HIGH_COUNT -eq 0 ] | ||
| + | then | ||
| + | pre_massage=' | ||
| + | else | ||
| + | pre_message=' | ||
| + | fi | ||
| + | message=$pre_message' | ||
| + | echo " | ||
| + | else | ||
| + | message=' | ||
| + | | ||
| + | if [[ `jq .log_remove $DATA_FILE|sed ' | ||
| + | then | ||
| + | rm $LOG_DIR/* | ||
| + | fi | ||
| + | fi | ||
| + | } | ||
| + | | ||
| + | replicate() | ||
| + | { | ||
| + | echo "job ' | ||
| + | TARGET_DIR=`jq .jobs.replicate.remote_folder $DATA_FILE|sed ' | ||
| + | REPL_OPT=`jq .jobs.replicate.repli_opt $DATA_FILE|sed ' | ||
| + | METHOD=`jq .jobs.replicate.method $DATA_FILE|sed ' | ||
| + | if [[ ! $REPL_OPT = "" | ||
| + | then | ||
| + | if [[ $REPL_OPT = " | ||
| + | then | ||
| + | DESTIN=$MOUNT_P/ | ||
| + | PASSFILE="" | ||
| + | if [ ! -d $DESTIN ] | ||
| + | then | ||
| + | echo $DESTIN" | ||
| + | mkdir $DESTIN | ||
| + | fi | ||
| + | DESTIN=$DESTIN/ | ||
| + | echo "local sync target " | ||
| + | else | ||
| + | SERVER=`jq .jobs.replicate.sync_server $DATA_FILE` | ||
| + | if( ! ping -c 3 $SERVER > /dev/null ) | ||
| + | then | ||
| + | (($ERR_STOP++)) | ||
| + | message="< | ||
| + | break | ||
| + | fi | ||
| + | |||
| + | USER=`jq .jobs.replicate.sync_user $DATA_FILE|sed ' | ||
| + | PASS_OPT=`jq .jobs.replicate.pass_option $DATA_FILE` | ||
| + | DESTIN=$USER@$SERVER::/ | ||
| + | echo " | ||
| + | fi | ||
| + | |||
| + | FOLDERS=`jq .jobs.replicate.sync_folders $DATA_FILE|sed ' | ||
| + | echo $FOLDERS | ||
| + | |||
| + | date >> $LOG_FILE | ||
| + | date >> $LOG_CHECK_FILE | ||
| + | |||
| + | for DIR in ${FOLDERS[@]} | ||
| + | do | ||
| + | echo $DIR | ||
| + | echo "run : " | ||
| + | echo " | ||
| + | $METHOD `jq .jobs.replicate.run_options $DATA_FILE|sed ' | ||
| + | echo " | ||
| + | $METHOD `jq .jobs.replicate.log_options $DATA_FILE|sed ' | ||
| + | echo " | ||
| + | echo " | ||
| + | done | ||
| + | |||
| + | date >> $LOG_FILE | ||
| + | date >> $LOG_CHECK_FILE | ||
| + | error_check | ||
| + | else | ||
| + | (($ERR_STOP++)) | ||
| + | message=" | ||
| + | fi | ||
| + | } | ||
| + | | ||
| + | mount_fs() | ||
| + | { | ||
| + | echo "job ' | ||
| + | # check if target host available | ||
| + | TARGET_SRV=`jq .jobs.mount_fs.ping_target $DATA_FILE|sed ' | ||
| + | echo " | ||
| + | MOUNT_P=`jq .jobs.mount_fs.mount_point $DATA_FILE|sed ' | ||
| + | if( ping -c 3 $TARGET_SRV > /dev/null ) | ||
| + | then | ||
| + | echo $TARGET_SRV" | ||
| + | if [[ `jq .jobs.mount_fs.mount_def $DATA_FILE|sed ' | ||
| + | then | ||
| + | echo "mount "`jq .jobs.mount_fs.mount_opt $DATA_FILE|sed ' | ||
| + | mount `jq .jobs.mount_fs.mount_opt $DATA_FILE|sed ' | ||
| + | else | ||
| + | CONNECT=`jq .jobs.mount_fs.mount_srv $DATA_FILE|sed ' | ||
| + | echo "mount "`jq .jobs.mount_fs.mount_opt $DATA_FILE|sed ' | ||
| + | mount `jq .jobs.mount_fs.mount_opt $DATA_FILE|sed ' | ||
| + | fi | ||
| + | sleep 10 # be sure mount is completed or timed out | ||
| + | if ( mount | grep $MOUNT_P > /dev/null ) | ||
| + | then | ||
| + | MOUNT_FS=`jq .jobs.mount_fs.mount_point $DATA_FILE|sed ' | ||
| + | echo " | ||
| + | else | ||
| + | (($ERR_STOP++)) | ||
| + | message=" | ||
| + | fi | ||
| + | else | ||
| + | (($ERR_STOP++)) | ||
| + | message=" | ||
| + | fi | ||
| + | } | ||
| + | | ||
| + | # master function | ||
| + | main() | ||
| + | { | ||
| + | # select job sequence | ||
| + | |||
| + | SEQUENCE=`jq .job_seq $DATA_FILE|sed ' | ||
| + | echo "job sequence are : " | ||
| + | |||
| + | if [[ $SEQUENCE = "" | ||
| + | then | ||
| + | message=" | ||
| + | else | ||
| + | for JOB in ${SEQUENCE[@]} | ||
| + | do | ||
| + | if ( echo $JOB | grep add_tasks ) | ||
| + | then | ||
| + | SUB_TASK=${JOB## | ||
| + | TARGET=$WORK_DIR`jq .jobs.add_tasks.$SUB_TASK.folder $DATA_FILE|sed ' | ||
| + | echo "sub task target " | ||
| + | echo "run sub task : "`jq .jobs.$JOB.task $DATA_FILE|sed ' | ||
| + | `jq .jobs.$JOB.task $DATA_FILE|sed ' | ||
| + | else | ||
| + | echo "run main job : "$JOB | ||
| + | $JOB | ||
| + | fi | ||
| + | if [[ $ERR_STOP -gt 0 ]] | ||
| + | then | ||
| + | logger $message | ||
| + | exit | ||
| + | fi | ||
| + | done | ||
| + | fi | ||
| + | |||
| + | echo "clean up" | ||
| + | |||
| + | if [[ ! $MOUNT_FS = "" | ||
| + | then | ||
| + | echo " | ||
| + | umount $MOUNT_FS | ||
| + | fi | ||
| + | |||
| + | logger $message | ||
| + | } | ||
| + | | ||
| + | # don't change sequence below | ||
| + | setup | ||
| + | main | ||
| + | exit | ||
| + | |||
| + | ===== Parameter-File ===== | ||
| + | Das dazu gehörende ParameterFile sieht dann so aus bei mir: | ||
| + | |||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | "< | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | Die Jobs " | ||
| + | |||
| + | " | ||