sync-to-usb.sh
changeset 2 782183ddd012
parent 1 7d486f24b873
equal deleted inserted replaced
1:7d486f24b873 2:782183ddd012
     1 #!/bin/sh -e
     1 #!/bin/sh
     2 #
     2 #
     3 # 
     3 # 
     4 # Copyright (C) 2012  Christian Arnold <arnold@schlittermann.de>
     4 # Copyright (C) 2012  Christian Arnold <arnold@schlittermann.de>
     5 #
     5 #
     6 # Schlittermann internet & unix support
     6 # Schlittermann internet & unix support
    45 __
    45 __
    46 }
    46 }
    47 
    47 
    48 debug() {
    48 debug() {
    49     if [ $DEBUG -gt 0 ]; then 
    49     if [ $DEBUG -gt 0 ]; then 
    50 		echo "$@" >&2
    50         echo "$@" >&2
    51 	fi
    51     fi
    52 }
    52 }
    53 
    53 
    54 check_mountpoint() {
    54 check_mountpoint() {
    55     MOUNTPOINT=$1
    55     MOUNTPOINT=$1
    56     if [ ! -d $MOUNTPOINT ]; then
    56     if [ ! -d $MOUNTPOINT ]; then
    70     [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: nothing is mounted on $MOUNTPOINT"
    70     [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: nothing is mounted on $MOUNTPOINT"
    71     return 0
    71     return 0
    72 }
    72 }
    73 
    73 
    74 open_cryptdev() {
    74 open_cryptdev() {
    75 	TYPE=$1
    75     TYPE=$1
    76 	if [ ! $(blkid -U $2) ]; then
    76     if [ ! $(blkid -U $2) ]; then
    77 		debug "ERROR: [$ME] can't get device path for UUID: $2"
    77         debug "ERROR: [$ME] can't get device path for UUID: $2"
    78 		exit 1
    78         exit 1
    79 	fi
    79     fi
    80 	DEV=$(blkid -U $2)
    80     DEV=$(blkid -U $2)
    81 	CRYPTDEV="cbackup.$TYPE.$$"
    81     CRYPTDEV="cbackup.$TYPE.$$"
    82 	KEYFILE=$3
    82     KEYFILE=$3
    83     cryptsetup luksOpen $DEV $CRYPTDEV --key-file $KEYFILE 2>/dev/null
    83     cryptsetup luksOpen $DEV $CRYPTDEV --key-file $KEYFILE 2>/dev/null
    84     if [ ! -h /dev/mapper/$CRYPTDEV ]; then
    84     if [ ! -h /dev/mapper/$CRYPTDEV ]; then
    85         debug "ERROR: [$ME] can't luksOpen cryptdev '$CRYPTDEV'"
    85         debug "ERROR: [$ME] can't luksOpen cryptdev '$CRYPTDEV'"
    86         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't luksOpen cryptdev '$CRYPTDEV'"
    86         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't luksOpen cryptdev '$CRYPTDEV'"
    87         exit 1
    87         exit 1
    91     [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: luksOpen cryptdev $CRYPTDEV"
    91     [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: luksOpen cryptdev $CRYPTDEV"
    92     return 0
    92     return 0
    93 }
    93 }
    94 
    94 
    95 mount_cryptdev() {
    95 mount_cryptdev() {
    96 	TYPE=$1
    96     TYPE=$1
    97 	CRYPTDEV="cbackup.$TYPE.$$"
    97     CRYPTDEV="cbackup.$TYPE.$$"
    98 	MOUNTPOINT=$2
    98     MOUNTPOINT=$2
    99 	MOUNTOPT=""
    99     MOUNTOPT=""
   100 	test "$TYPE" = "source" && MOUNTOPT="--read-only"
   100     test "$TYPE" = "src" && MOUNTOPT="--read-only"
   101     if mount $MOUNTOPT /dev/mapper/$CRYPTDEV $MOUNTPOINT; then
   101     if mount $MOUNTOPT /dev/mapper/$CRYPTDEV $MOUNTPOINT; then
   102         debug "OK: [$ME] mount $CRYPTDEV to $MOUNTPOINT"
   102         debug "OK: [$ME] mount $CRYPTDEV $MOUNTOPT to $MOUNTPOINT"
   103         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: mount $CRYPTDEV to $MOUNTPOINT"
   103         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: mount $CRYPTDEV to $MOUNTPOINT"
   104     else
   104     else
   105         debug "ERROR: [$ME] can't mount $CRYPTDEV to $MOUNTPOINT"
   105         debug "ERROR: [$ME] can't mount $CRYPTDEV to $MOUNTPOINT"
   106         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't mount $CRYPTDEV to $MOUNTPOINT"
   106         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't mount $CRYPTDEV to $MOUNTPOINT"
   107         exit 1
   107         exit 1
   108     fi
   108     fi
   109     return 0
   109     return 0
   110 }
   110 }
   111 
   111 
   112 umount_cryptdev() {
   112 umount_cryptdev() {
   113 	MOUNTPOINT=$1
   113     MOUNTPOINT=$1
   114     if umount $MOUNTPOINT 2>/dev/null; then
   114     if umount $MOUNTPOINT 2>/dev/null; then
   115         debug "OK: [$ME] umount $MOUNTPOINT"
   115         debug "OK: [$ME] umount $MOUNTPOINT"
   116         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: umount $MOUNTPOINT"
   116         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: umount $MOUNTPOINT"
   117     else
   117     else
   118         debug "ERROR: [$ME] can't umount $MOUNTPOINT"
   118         debug "ERROR: [$ME] can't umount $MOUNTPOINT"
   121     fi
   121     fi
   122     return 0
   122     return 0
   123 }
   123 }
   124 
   124 
   125 close_cryptdev() {
   125 close_cryptdev() {
   126 	TYPE=$1
   126     TYPE=$1
   127 	CRYPTDEV="cbackup.$TYPE.$$"
   127     CRYPTDEV="cbackup.$TYPE.$$"
   128     if [ -h /dev/mapper/$CRYPTDEV ]; then
   128     if [ -h /dev/mapper/$CRYPTDEV ]; then
   129         cryptsetup luksClose $CRYPTDEV
   129         cryptsetup luksClose $CRYPTDEV
   130         if [ -h /dev/mapper/$CRYPTDEV ]; then
   130         if [ -h /dev/mapper/$CRYPTDEV ]; then
   131             debug "ERROR: [$ME] can't luksClose cryptdev '$CRYPTDEV'"
   131             debug "ERROR: [$ME] can't luksClose cryptdev '$CRYPTDEV'"
   132             [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't luksClose cryptdev '$CRYPTDEV'"
   132             [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: can't luksClose cryptdev '$CRYPTDEV'"
   138     fi
   138     fi
   139     return 0
   139     return 0
   140 }
   140 }
   141 
   141 
   142 do_sync() {
   142 do_sync() {
   143 	SOURCE=$1
   143     SOURCE=$1
   144 	DESTINATION=$2
   144     DESTINATION=$2
   145 	if rsync -Ha --numeric-ids --delete $SOURCE $DESTINATION; then
   145     VERBOSE=""
   146 		debug "OK: [$ME] sync is done from '$SOURCE' to '$DESTINATION'"
   146     test $DEBUG -gt 0 && VERBOSE="--verbose --progress"
       
   147     if rsync -Ha $VERBOSE --numeric-ids --delete $SOURCE $DESTINATION; then
       
   148         debug "OK: [$ME] sync is done from '$SOURCE' to '$DESTINATION'"
   147         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: sync is done from '$SOURCE' to '$DESTINATION'"
   149         [ $LOGGING -eq 1 ] && logger -p local0.notice -t $ME "OK: sync is done from '$SOURCE' to '$DESTINATION'"
   148 	else
   150     else
   149 		debug "ERROR: [$ME] sync error from '$SOURCE' to '$DESTINATION'"
   151         debug "ERROR: [$ME] sync error from '$SOURCE' to '$DESTINATION'"
   150         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: sync error from '$SOURCE' to '$DESTINATION'"
   152         [ $LOGGING -eq 1 ] && logger -p local0.err -t $ME "ERROR: sync error from '$SOURCE' to '$DESTINATION'"
   151 		exit 1
   153     exit 1
   152 	fi
   154    fi
   153 	return 0
   155    return 0
   154 }
   156 }
   155 
   157 
   156 cleanup() {
   158 cleanup() {
   157     check_mountpoint $SPATH || umount_cryptdev $SPATH
   159     check_mountpoint $SPATH || umount_cryptdev $SPATH
   158     check_mountpoint $DPATH || umount_cryptdev $DPATH
   160     check_mountpoint $DPATH || umount_cryptdev $DPATH
   159     close_cryptdev source
   161     close_cryptdev src
   160     close_cryptdev destination
   162     close_cryptdev dst
   161 }
   163 }
   162 
   164 
   163 # MAIN
   165 # MAIN
   164 
   166 
   165 trap cleanup INT EXIT
   167 trap cleanup INT EXIT
   166 
   168 
   167 if [ $# -ne 5 ]; then
   169 if [ $# -ne 5 ]; then
   168 	usage
   170     usage
   169 	exit 1
   171     exit 1
   170 fi
   172 fi
   171 
   173 
   172 check_mountpoint $SPATH
   174 check_mountpoint $SPATH
   173 check_mountpoint $DPATH
   175 check_mountpoint $DPATH
   174 open_cryptdev src $SUUID $KEY
   176 open_cryptdev src $SUUID $KEY