Skip to content

Instantly share code, notes, and snippets.

@dale3h
Created August 27, 2020 03:53
Show Gist options
  • Save dale3h/a7b7e70770b0eed9b23466641aa6969b to your computer and use it in GitHub Desktop.
Save dale3h/a7b7e70770b0eed9b23466641aa6969b to your computer and use it in GitHub Desktop.

Revisions

  1. dale3h created this gist Aug 27, 2020.
    166 changes: 166 additions & 0 deletions autocopy.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,166 @@
    #!/usr/bin/env bash
    ################################################################
    # Auto-Copy Script for unRAID Unassigned Devices Plugin
    # Original script: https://gitlab.com/snippets/1737763
    ################################################################

    PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

    # Available variables:
    #
    # AVAIL : Available space.
    # USED : Used space.
    # SIZE : Partition size.
    # SERIAL : Disk serial number.
    # ACTION : If mounting, ADD; if unmounting, REMOVE.
    # MOUNTPOINT : Where the partition is mounted.
    # FSTYPE : Partition filesystem.
    # LABEL : Partition label.
    # DEVICE : Partition device, e.g /dev/sda1.
    # OWNER : "udev" if executed by UDEV, otherwise "user".
    # PROG_NAME : Program name of this script.
    # LOGFILE : Log file for this script.

    # Configuration variables.
    enableAdd=1 # 1 | 0 : Easily turn on or off ADD action.
    enableBackup=1 # 1 | 0 : Easily turn on or off automatic backup.
    enableDryRun=0 # 1 | 0 : Easily turn on or off dry run (test) mode.
    enableUmount=1 # 1 | 0 : Disable umount in ADD action for testing.
    enableRemove=1 # 1 | 0 : Easily turn on or off REMOVE action.
    showVars=1 # 1 | 0 : Easily show Vars in ADD action.

    srcPath="${MOUNTPOINT}"
    srcLabel="${LABEL}"
    backupPath="/mnt/user/backup/autocopy"
    backupFolder="${srcLabel}_$(date +%Y%m%d)"
    destPath="${backupPath}/${backupFolder}"
    excludeFile="${srcPath}/exclude.txt"

    # Function to set custom settings based on drive serial.
    customSettings() {
    case "${SERIAL}" in
    'easystore_04BA_B8E1CE999933A6944C1B40E595EF')
    # This overrides the backup path for a specific drive.
    backupPath="/mnt/disk5/Backup"
    destPath="${backupPath}/${backupFolder}"
    writeLog "backupPath override: ${backupPath}"
    writeLog "destPath override: ${destPath}"
    ;;
    esac
    }

    # Function to email.
    sendNotifyNormal() {
    # Call with sendNotify "Subject" "Description".
    /usr/local/emhttp/webGui/scripts/notify -i normal -s "${1}" -d "${2}"
    }

    sendNotifyError() {
    # Call with sendNotify "Subject" "Description".
    /usr/local/emhttp/webGui/scripts/notify -i error -s "${1}" -d "${2}"
    }

    clearLog() {
    echo -n > "${LOGFILE}"
    }

    writeLog() {
    args=("[$(date)]")
    args+=("$@")
    echo "${args[@]}" >> "${LOGFILE}"
    }

    echoVars() {
    cat <<EOT >> "${LOGFILE}"
    ################################################################################
    showVars enabled:
    AVAIL : ${AVAIL}
    USED : ${USED}
    SIZE : ${SIZE}
    SERIAL : ${SERIAL}
    ACTION : ${ACTION}
    MOUNTPOINT : ${MOUNTPOINT}
    FSTYPE : ${FSTYPE}
    LABEL : ${LABEL}
    DEVICE : ${DEVICE}
    OWNER : ${OWNER}
    PROG_NAME : ${PROG_NAME}
    LOGFILE : ${LOGFILE}
    srcPath : ${srcPath}
    srcLabel : ${srcLabel}
    backupPath : ${backupPath}
    backupFolder : ${backupFolder}
    destPath : ${destPath}
    excludeFile : ${excludeFile}
    ################################################################################
    EOT
    }

    case "${ACTION}" in
    'ADD')
    writeLog "device mounted: ${srcLabel} (${srcPath})"

    # Check for custom setting overrides.
    customSettings

    # Show all available variables.
    if [[ "${showVars}" -eq "1" ]]; then
    echoVars
    fi

    writeLog "backup destination: ${destPath}"

    # Backup the contents of drive.
    if [[ "${enableAdd}" -eq "1" ]]; then
    # See: https://linux.die.net/man/1/rsync
    rsyncArgs=("-Cav")

    # Add dry run argument.
    if [[ "${enableDryRun}" -eq "1" ]]; then
    writeLog "dry-run enabled"
    rsyncArgs+=("--dry-run")
    fi

    # Add exclude file argument.
    if [[ -n "${excludeFile}" ]] && [[ -f "${excludeFile}" ]]; then
    writeLog "exclude list file: ${excludeFile}"
    rsyncArgs+=("--exclude-from" "${excludeFile}")
    fi

    # Add source and destination arguments.
    rsyncArgs+=("${srcPath}/" "${destPath}")

    writeLog "backup command: rsync ${rsyncArgs[*]}"

    if [[ "${enableBackup}" -eq "1" ]]; then
    if rsync "${rsyncArgs[@]}" >> "${LOGFILE}" 2>&1; then
    writeLog "backup finished: ${srcPath} -> ${destPath}"
    writeLog "ready to unmount: ${srcPath}"

    # Call function to email.
    sendNotifyNormal "" "Backup finished: ${srcPath} -> ${destPath}"

    if [[ "${enableUmount}" -eq "1" ]]; then
    /usr/local/sbin/rc.unassigned umount "${DEVICE}"
    writeLog "device unmounted: ${srcPath} (${DEVICE})"
    else
    writeLog "unmount disabled"
    fi

    else
    writeLog "backup failed: ${srcPath} -> ${destPath}"
    sendNotifyerror "" "Backup failed: ${srcPath} -> ${destPath}"
    fi
    else
    writeLog "backup disabled"
    fi
    fi
    ;;

    'REMOVE')
    if [[ "${enableRemove}" -eq "1" ]]; then
    writeLog "device removed: ${DEVICE}"
    fi
    ;;
    esac