Permalink
executable file 177 lines (150 sloc) 5.44 KB
#!/bin/sh
getFullPath() {
specDir="$(dirname "$1")"
if cd "$specDir" 2>/dev/null; then
OutputFile="$(pwd)/$(basename "$1")"
else
echo "Unable to locate specified directory '$specDir'"
exit 1
fi
}
setup(){
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "Usage: backup [--full] [filename]"
echo ""
echo " e.g. ./backup << Makes a file with a timed filename"
echo " ./backup myBackup.zip << Makes a file called myBackup.zip"
echo " ./backup --full << Makes a full backup file with a timed filename"
echo " ./backup --full myBackup.zip << Makes a full backup file called myBackup.zip"
echo ""
echo "Use this script to backup your openHAB configuration, you can use the 'restore' script"
echo "from any machine to transfer your configuration across to another instance."
echo ""
echo "A full backup includes the tmp and cache directories that are normally excluded."
echo ""
echo "Set $OPENHAB_BACKUPS to change the default backup directory."
echo "Set $OPENHAB_BACKUPS_TEMP to change the default backup temporary directory."
exit 0
fi
## Ask to run as root to prevent us from running sudo in this script.
if [ "$(id -u)" -ne 0 ]; then
echo "Please run this script as root! (e.g. use sudo)" >&2
exit 1
fi
command -v zip >/dev/null 2>&1 || {
echo "'zip' program was not found, please install it first." >&2
exit 1
}
## Set path variables
if [ -r /etc/profile.d/openhab2.sh ]; then
. /etc/profile.d/openhab2.sh
elif [ -r /etc/default/openhab2 ]; then
. /etc/default/openhab2
fi
WorkingDir="$(cd "$(dirname "$0")" && cd ../.. && pwd -P)"
if [ -z "$OPENHAB_CONF" ]; then OPENHAB_CONF="$WorkingDir/conf"; fi
if [ -z "$OPENHAB_USERDATA" ]; then OPENHAB_USERDATA="$WorkingDir/userdata"; fi
if [ -z "$OPENHAB_BACKUPS" ]; then OPENHAB_BACKUPS="$WorkingDir/backups"; fi
if [ -z "$OPENHAB_RUNTIME" ]; then OPENHAB_RUNTIME="$WorkingDir/runtime"; fi
echo "Using '$OPENHAB_CONF' as conf folder..."
echo "Using '$OPENHAB_USERDATA' as userdata folder..."
echo "Using '$OPENHAB_RUNTIME' as runtime folder..."
fileList="$OPENHAB_RUNTIME/bin/userdata_sysfiles.lst"
## Parse arguments
if [ "$1" = "--full" ]; then
echo "including cache"
INCLUDE_CACHE="true"
shift
fi
timestamp=$(date +"%y_%m_%d-%H_%M_%S")
## Set the filename
if [ -z "$1" ]; then
echo "Using '$OPENHAB_BACKUPS' as backup folder..."
OutputFile="$OPENHAB_BACKUPS/openhab2-backup-$timestamp.zip"
else
getFullPath "$1"
fi
echo "Writing to '${OutputFile}'..."
## Check two of the standard openHAB folders to make sure we're backing up the right thing.
if [ ! -d "$OPENHAB_USERDATA" ] || [ ! -d "$OPENHAB_CONF" ]; then
echo "Configuration paths are invalid..." >&2
echo "Try setting OPENHAB_USERDATA and OPENHAB_CONF environment variables." >&2
exit 1
fi
## Find the group and user of the current openHAB folders.
OHUser=$(ls -ld "$OPENHAB_USERDATA" | awk '{print $3}')
OHGroup=$(ls -ld "$OPENHAB_USERDATA" | awk '{print $4}')
CurrentVersion="$(awk '/openhab-distro/{print $3}' "$OPENHAB_USERDATA/etc/version.properties")"
## Store anything in temporary folders
# Check if we should use TempDir from env $OPENHAB_BACKUPS_TEMP
if [ -n "${OPENHAB_BACKUPS_TEMP}" ]; then
TempDir="$OPENHAB_BACKUPS_TEMP";
else
TempDir="/tmp/openhab2/backup"
fi
echo "Making Temporary Directory if it is not already there"
if [ ! -d "$TempDir" ]; then
mkdir -p "$TempDir" || {
echo "Failed to make temporary directory: $TempDir" >&2
exit 1
}
fi
echo "Using $TempDir as TempDir"
## Clear older stuff if it exists
rm -rf "${TempDir:?}/"*
}
echo " "
echo "#########################################"
echo " openHAB 2.x.x backup script "
echo "#########################################"
echo " "
setup "$1" "$2"
## Set backup properties file.
{
echo "version=$CurrentVersion"
echo "timestamp=$timestamp"
echo "user=$OHUser"
echo "group=$OHGroup"
} > "$TempDir/backup.properties"
## Copy userdata and conf folders
echo "Copying configuration to temporary folder..."
mkdir -p "$TempDir/userdata"
if [ -z "$INCLUDE_CACHE" ]; then
find "${OPENHAB_USERDATA:?}/"* -prune -not -path '*/tmp' -and -not -path '*/cache' | xargs -I % cp -R % "$TempDir/userdata"
else
cp -a "${OPENHAB_USERDATA:?}/"* "$TempDir/userdata"
fi
mkdir -p "$TempDir/conf"
cp -a "${OPENHAB_CONF:?}/"* "$TempDir/conf"
## Remove non-transferable userdata files
echo "Removing unnecessary files..."
if [ -f "$fileList" ]; then
while IFS= read -r fileName
do
rm -rf "$TempDir/userdata/etc/$fileName"
done < "$fileList"
else
echo "System Filelist not found, exiting..."
exit 1
fi
## If the backup directory is inside userdata folder do not include it
## Mainly for apt/rpm automatic
if [ "$OPENHAB_BACKUPS" = "$OPENHAB_USERDATA/backups" ]; then
echo "Backup Directory is inside userdata, not including in this backup!"
rm -rf "$TempDir/userdata/backups"
fi
## Create archive
mkdir -p "$OPENHAB_BACKUPS"
echo "Zipping folder..."
## Jump into directory before making zip
## Cleans file structure
( cd "$TempDir" || exit
zip -qr "$OutputFile" . || {
echo "zip failed to store a backup."
exit 1
}
) || exit 1
echo "Removing temporary files..."
rm -rf $TempDir
echo "Success! Backup made in $OutputFile"
echo ""