177 lines
5.4 KiB
Bash
177 lines
5.4 KiB
Bash
#!/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 ""
|