This commit is contained in:
Ste Vaidis 2023-01-09 20:36:01 +02:00
parent 1f7f84f090
commit 7074822870
3 changed files with 110 additions and 106 deletions

View File

@ -4,7 +4,7 @@ PID=$$
NOW=$(date +"%Y-%m-%d_%H:%M") NOW=$(date +"%Y-%m-%d_%H:%M")
LOG="/root/backup_$NOW.log" LOG="/root/backup_$NOW.log"
LUKS_PASS_URL="192.168.1.199:9999/andthepasswordis" LUKS_PASS_URL="192.168.2.202:9999/andthepasswordis"
LUKS_PASS="" LUKS_PASS=""
USB_DISK="" USB_DISK=""

214
backup.sh
View File

@ -6,8 +6,8 @@ cd $SCRIPT_DIR
. ./backup.config . ./backup.config
function log() { function log() {
echo -e "\e[96m`date +'%d/%m/%Y %H:%M:%S'` \e[39m| $1" echo -e "\e[96m`date +'%d/%m/%Y %H:%M:%S'`\e[39m $1"
echo -e "`date +'%d/%m/%Y %H:%M:%S'` | $1" >> $LOG echo -e "`date +'%d/%m/%Y %H:%M:%S'` $1" >> $LOG
} }
function usage() { function usage() {
@ -15,6 +15,7 @@ function usage() {
echo -e "./backup.sh \e[93m--help \e[39m" echo -e "./backup.sh \e[93m--help \e[39m"
echo -e "./backup.sh \e[93m--mount \e[39m" echo -e "./backup.sh \e[93m--mount \e[39m"
echo -e "./backup.sh \e[93m--umount \e[39m" echo -e "./backup.sh \e[93m--umount \e[39m"
echo -e "./backup.sh \e[93m--format=\e[39m/dev/sda"
echo echo
echo "Local directories" echo "Local directories"
echo -e "./backup.sh \e[92m--src=\e[39m/mnt/data \e[96m--dst=\e[39m/backup" echo -e "./backup.sh \e[92m--src=\e[39m/mnt/data \e[96m--dst=\e[39m/backup"
@ -30,49 +31,48 @@ function usage() {
} }
function mount_smb() { function mount_smb() {
if mkdir /mnt/$PID; then if mkdir /mnt/${PID}; then
log "[ OK ] creating /mnt/$PID" log "[ OK ] creating /mnt/${PID}"
exit if mount -t cifs //${HOST}/${SHARE} /mnt/${PID} -o username=${USER},password=${PASS}; then
if mount -t cifs //$HOST/$SHARE /mnt/$PID -o username=$USER,password=$PASS; then log "[ OK ] mount //${HOST}/${SHARE} to /mnt/${PID}"
log "[ OK ] mount //$HOST/$SHARE to /mnt/$PID"
return 0 return 0
else else
log "[FAIL] mount //$HOST/$SHARE to /mnt/$PID" log "[FAIL] mount //${HOST}/${SHARE} to /mnt/${PID}"
return 1 return 1
fi fi
else else
log "[FAIL] to create /mnt/$PID" log "[FAIL] to create /mnt/${PID}"
return 1 return 1
fi fi
} }
function mount_ssh() { function mount_ssh() {
if mkdir /mnt/$PID; then if mkdir /mnt/${PID}; then
if ssh -q -o BatchMode=yes -o ConnectTimeout=10 $USER@$HOST exit; then if ssh -q -o BatchMode=yes -o ConnectTimeout=10 ${USER}@${HOST} exit; then
if ssh $USER@$HOST ls -l $DIR 2> /dev/null; then if ssh ${USER}@${HOST} ls -l ${DIR} 2> /dev/null; then
if sshfs -o ro $USER@$HOST:$SOURCE /mnt/$PID; then if sshfs -o ro ${USER}@${HOST}:${SOURCE} /mnt/${PID}; then
return 0 return 0
else else
log "[FAIL] mount $USER@$HOST:$SOURCE to /mnt/$SRC" log "[FAIL] mount ${USER}@${HOST}:${SOURCE} to /mnt/${SRC}"
return 1 return 1
fi fi
else else
log "[FAIL] remote dir $DIR not found" log "[FAIL] remote dir ${DIR} not found"
return 1 return 1
fi fi
else else
log "[FAIL] ssh $USER@$HOST" log "[FAIL] ssh ${USER}@${HOST}"
return 1 return 1
fi fi
else else
log "[FAIL] to create /mnt/$PID" log "[FAIL] to create /mnt/${PID}"
return 1 return 1
fi fi
} }
function get_luks_password() { function get_luks_password() {
LUKS_PASS=$(curl -s $LUKS_PASS_URL | jq -r ".password") LUKS_PASS=$(curl --connect-timeout 10 -s ${LUKS_PASS_URL} | jq -r ".password")
if [ -z "$LUKS_PASS" ]; then if [ -z "${LUKS_PASS}" ]; then
log "[FAIL] to get LUKS password" log "[FAIL] to get LUKS password"
return 1 return 1
else else
@ -81,20 +81,16 @@ function get_luks_password() {
fi fi
} }
function find_usb() { function find_luks() {
for DISK in `ls -l /dev/disk/by-id/usb* | grep -v part | awk -F/ '{print $NF}'`; do for DEV in `ls -1 /dev/disk/by-id/usb*`; do
DEV="/dev/$DISK" if cryptsetup isLuks ${DEV}; then
for PARTITION in `ls -1 $DEV* | grep "[0-9]$"`; do USB_DEV=${DEV}
/usr/sbin/cryptsetup isLuks $PARTITION LOGDEV=$(echo $DEV | cut -c21- )
if [ $? = 0 ]; then log "[ OK ] find encrypted ${LOGDEV}"
USB_PARTITION=$PARTITION return 0
return 0 fi
fi
done
log "[FAIL] to find encrypted USB partition"
return 1
done done
log "[FAIL] to find encrypted USB disk" log "[FAIL] to find encrypted disk"
return 1 return 1
} }
@ -103,46 +99,37 @@ function mount_luks() {
waiting=$(grep 'Dirty\|Writeback' /proc/meminfo | grep Writeback: | awk {'print $2'}) waiting=$(grep 'Dirty\|Writeback' /proc/meminfo | grep Writeback: | awk {'print $2'})
if [[ wating -eq "0" ]]; then if [[ wating -eq "0" ]]; then
for n in `seq 0 9`; do for n in `seq 0 9`; do
echo $1 | /usr/sbin/cryptsetup luksOpen $2 crypted_usb echo $1 | cryptsetup luksOpen $2 crypted_usb
if [ $? = 0 ]; then if [ $? = 0 ]; then
log "[ OK ] created /dev/mapper/crypted_usb" log "[ OK ] luksOpen crypted_usb"
return 0 return 0
fi fi
sleep 60 sleep 60
done done
log "[FAIL] to create /dev/mapper/crypted_usb (error)" log "[FAIL] luksOpen crypted_usb (error)"
return 1 return 1
fi fi
sleep 60 sleep 60
done done
log "[FAIL] to create /dev/mapper/crypted_usb (timeout)" log "[FAIL] luksOpen crypted_usb (timeout)"
return 1 return 1
} }
function mount_usb() { function mount_usb() {
mount_luks $LUKS_PASS $USB_PARTITION if mount /dev/mapper/crypted_usb /mnt/usb; then
if [ $? = 0 ]; then log "[ OK ] mount crypted_usb to /mnt/usb"
log "[ OK ] $USB_PARTITION decrypted" return 0
/usr/bin/mount /dev/mapper/crypted_usb /mnt/usb
if [ $? = 0 ]; then
log "[ OK ] $USB_PARTITION mounted"
return 0
else
log "[FAIL] $USB_PARTITION mounted"
return 1
fi
else else
log "[FAIL] $USB_PARTITION decrypted" log "[FAIL] to mount crypted_usb to /mnt/usb"
return 1 return 1
fi fi
exit
} }
function check_space () { function check_space () {
src_size=$(du -s "$SRC" | awk '{print $1}') src_size=$(du -s /mnt/${PID} | awk '{print $1}')
dst_size=$(df $MNT | grep "^/" | awk {'print $4'}) dst_size=$(df /mnt/usb | grep "^/" | awk {'print $4'})
log "$SRC usage size: $src_size" log "USB usage size: $src_size"
log "$MNT$DIR available size: $dst_size" log "USB available size: $dst_size"
if [ "$dst_size" -gt "$src_size" ]; then if [ "$dst_size" -gt "$src_size" ]; then
log "[ OK ] enought available space" log "[ OK ] enought available space"
return 0 return 0
@ -153,10 +140,14 @@ function check_space () {
} }
function sync_files() { function sync_files() {
SRC_PATH=`dirname "$SRC"` SRC="/mnt/${PID}${SOURCE}"
SRC_DIR=`basename "$SRC"` DST="/mnt/usb${DESTINATION}"
DST_DIR=$USB_MOUNT$DST
log "SOURCE : ${SRC}"
log "DESTINATION : ${DST}"
log "DELETE : ${DELETE:-"No (default)"}"
log "------------ RSYNC STARTED ---------" log "------------ RSYNC STARTED ---------"
cd $SRC_PATH cd $SRC_PATH
if [ "$DELETE" == "yes" ]; then if [ "$DELETE" == "yes" ]; then
rsync -av --stats \ rsync -av --stats \
@ -167,7 +158,7 @@ function sync_files() {
--no-group \ --no-group \
--include ".*" \ --include ".*" \
--delete \ --delete \
"$SRC_DIR" "$DST_DIR" | sed '/sending\ incremental\ file\ list/d' | tee -a $LOG "${SRC}" "${DST}" | sed '/sending\ incremental\ file\ list/d' | tee -a $LOG
else else
rsync -av \ rsync -av \
--stats \ --stats \
@ -177,15 +168,16 @@ function sync_files() {
--human-readable \ --human-readable \
--no-owner \ --no-owner \
--no-group \ --no-group \
"$SRC_DIR" "$DST_DIR" | sed '/sending\ incremental\ file\ list/d' | tee -a $LOG "${SRC}" "${DST}" | sed '/sending\ incremental\ file\ list/d' | tee -a $LOG
fi fi
cd /root
cd -
log "------------ RSYNC ENDED -----------" log "------------ RSYNC ENDED -----------"
return 0 return 0
} }
function check_copy () { function check_copy () {
cd ${SRC} cd ${SOURCE}
find * -type f -exec ls -s {} \; > /root/backup-src.log find * -type f -exec ls -s {} \; > /root/backup-src.log
cd ${DST_DIR}/${SRC_DIR} cd ${DST_DIR}/${SRC_DIR}
find * -type f -exec ls -s {} \; > /root/backup-dst.log find * -type f -exec ls -s {} \; > /root/backup-dst.log
@ -200,42 +192,42 @@ function check_copy () {
return 0 return 0
} }
function umount_usb() {
if umount /mnt/usb; then
log "[ OK ] umount /mnt/usb"
return 0
else
log "[FAIL] umount /mnt/usb"
return 1
fi
}
function luks_close() { function luks_close() {
for n in `seq 1 12`; do for n in `seq 1 12`; do
/usr/sbin/cryptsetup close crypted_usb cryptsetup close crypted_usb
if [ $? = 0 ]; then if [ $? = 0 ]; then
log "[ OK ] luksClose /dev/mapper/crypted_usb" log "[ OK ] luksClose /dev/mapper/crypted_usb"
return 0 return 0
fi fi
sleep 300 sleep 10
done done
log "[FAIL] luksClose (timeout)" log "[FAIL] luksClose (timeout)"
return 1 return 1
} }
function umount_usb() {
if /usr/bin/umount $USB_MOUNT; then
log "[ OK ] umount usb disk"
return 0
else
log "[FAIL] to find mounted usb disk"
return 1
fi
}
function statistics_usb() { function statistics_usb() {
USBTOTAL=$(df -h | grep $USB_MOUNT | awk '{print $2}') USBTOTAL=$(df -h | grep /mnt/usb | awk '{print $2}')
USBUSAGE=$(df -h | grep $USB_MOUNT | awk '{print $5}') USBUSAGE=$(df -h | grep /mnt/usb | awk '{print $5}')
USBUSED=$(df -h | grep $USB_MOUNT | awk '{print $3}') USBUSED=$(df -h | grep /mnt/usb | awk '{print $3}')
USBFREE=$(df -h | grep $USB_MOUNT | awk '{print $4}') USBFREE=$(df -h | grep /mnt/usb | awk '{print $4}')
log "USB DISK Total : ${USBTOTAL}" log "USB DISK Total : ${USBTOTAL}"
log "USB DISK Usage : ${USBUSAGE}" log "USB DISK Usage : ${USBUSAGE}"
log "USB DISK Used : ${USBUSED}" log "USB DISK Used : ${USBUSED}"
log "USB DISK Free : ${USBFREE}" log "USB DISK Free : ${USBFREE}"
} }
function mount() { function mount_only() {
if find_usb; then if find_luks; then
if get_luks_password; then if get_luks_password; then
mount_usb mount_usb
fi fi
@ -243,11 +235,6 @@ function mount() {
exit exit
} }
function umount() {
umount_usb
exit
}
function send_mail() { function send_mail() {
COPIED=$( cat ${LOG} | grep "Number of created files:" | awk {'print $5'} ) COPIED=$( cat ${LOG} | grep "Number of created files:" | awk {'print $5'} )
DELETED=$( cat ${LOG} | grep "Number of deleted files:" | awk {'print $5'} ) DELETED=$( cat ${LOG} | grep "Number of deleted files:" | awk {'print $5'} )
@ -268,7 +255,7 @@ function free_to_run() {
} }
function umount_remote() { function umount_remote() {
if umount /mnt/$PID then if umount /mnt/$PID; then
log "[ OK ] umount /mnt/${PID}" log "[ OK ] umount /mnt/${PID}"
if rmdir /mnt/$PID; then if rmdir /mnt/$PID; then
log "[ OK ] rmdir /mnt/${PID}" log "[ OK ] rmdir /mnt/${PID}"
@ -280,22 +267,34 @@ function umount_remote() {
fi fi
} }
function format() {
if [ -b ${FORMAT} ]; then
if cryptsetup -y -v luksFormat ${FORMAT}; then
log "[ OK ] formating ${FORMAT}"
else
log "[FAIL] formating ${FORMAT}"
fi
else
log "[FAIL] ${FORMAT} not found"
fi
exit
}
function main () { function main () {
log "SOURCE : $SRC"
log "DESTINATION : $USB_MOUNT$DST"
log "DELETE : ${DELETE:-"No (default)"}"
if get_luks_password; then if get_luks_password; then
if find_usb; then if find_luks; then
if mount_usb; then if mount_luks $LUKS_PASS $USB_DEV; then
sync_files if mount_usb; then
statistics_usb sync_files
if umount_usb; then statistics_usb
luks_close if umount_usb; then
luks_close
fi
fi fi
fi fi
send_mail
fi fi
fi fi
send_mail
} }
for i in "$@" for i in "$@"
@ -305,10 +304,15 @@ do
usage usage
;; ;;
--mount) --mount)
mount mount_only
;; ;;
--umount) --umount)
umount umount_x
;;
--format=*)
FORMAT="${i#*=}"
format
shift
;; ;;
--src=*) --src=*)
SRC="${i#*=}" SRC="${i#*=}"
@ -345,13 +349,13 @@ if [[ -n "$CONFIG" ]]; then
if [ "$PROTO" = "smb" ]; then if [ "$PROTO" = "smb" ]; then
if mount_smb; then if mount_smb; then
echo "mount_smb" main
fi fi
fi fi
if [ "$PROTO" = "ssh" ]; then if [ "$PROTO" = "ssh" ]; then
if mount_ssh; then if mount_ssh; then
echo "mount_ssh" main
fi fi
fi fi
@ -360,8 +364,8 @@ fi
exit exit
[ -z "$SRC" ] && usage "option \e[92m'--src'\e[39m is missing" [ -z "$SOURCE" ] && usage "option \e[92m'--src'\e[39m is missing"
[ -z "$DST" ] && usage "option \e[92m'--dst'\e[39m is missing" [ -z "$DESTINATION" ] && usage "option \e[92m'--dst'\e[39m is missing"
main main

0
password-api/password.py Normal file → Executable file
View File