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 " | ||
+ | |||
+ | " |