Files
duplicati/Installer/Synology/make-binary-package.sh
T

149 lines
4.0 KiB
Bash

#!/bin/bash
if [ ! -f "$1" ]; then
echo "Please provide the filename of an existing zip build as the first argument"
exit
fi
FILENAME=$(basename $1)
DIRNAME=$(echo "${FILENAME}" | cut -d "_" -f 1)
VERSION=$(echo "${DIRNAME}" | cut -d "-" -f 2)
DATE_STAMP=$(LANG=C date -R)
BASE_FILE_NAME="${FILENAME%.*}"
TMPDIRNAME="${BASE_FILE_NAME}-extract"
MONO=/Library/Frameworks/Mono.framework/Commands/mono
GPG_KEYFILE="${HOME}/.config/signkeys/Duplicati/updater-gpgkey.key"
# Sort on macOS does not have -V / --version-sort
# https://stackoverflow.com/questions/4493205/unix-sort-of-version-numbers
SORT_OPTIONS="-t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n"
if [ -d "${DIRNAME}" ]; then
rm -rf "${DIRNAME}"
fi
if [ -d "${TMPDIRNAME}" ]; then
rm -rf "${TMPDIRNAME}"
fi
if [ -f "package.tgz" ]; then
rm -rf "package.tgz"
fi
if [ -f "${BASE_FILE_NAME}.spk" ]; then
rm -rf "${BASE_FILE_NAME}.spk"
fi
if [ -f "${BASE_FILE_NAME}.spk.tmp" ]; then
rm -rf "${BASE_FILE_NAME}.spk.tmp"
fi
if [ -f "${BASE_FILE_NAME}.signature" ]; then
rm -rf "${BASE_FILE_NAME}.spk.signature"
fi
TIMESERVER="http://timestamp.synology.com/timestamp.php"
unzip -q -d "${DIRNAME}" "$1"
for n in "../oem" "../../oem" "../../../oem"
do
if [ -d $n ]; then
echo "Installing OEM files"
cp -R $n "${DIRNAME}/webroot/"
fi
done
for n in "oem-app-name.txt" "oem-update-url.txt" "oem-update-key.txt" "oem-update-readme.txt" "oem-update-installid.txt"
do
for p in "../$n" "../../$n" "../../../$n"
do
if [ -f $p ]; then
echo "Installing OEM override file"
cp $p "${DIRNAME}"
fi
done
done
cd "${DIRNAME}"
# Remove items unused on the Synology platform
rm -rf ./win-tools
rm -rf ./SQLite/win64
rm -rf ./SQLite/win32
rm -rf ./MonoMac.dll
rm -rf ./alphavss
rm -rf ./OSX\ Icons
rm -rf ./OSXTrayHost
rm ./AlphaFS.dll
rm ./AlphaVSS.Common.dll
rm -rf ./licenses/alphavss
rm -rf ./licenses/MonoMac
rm -rf ./licenses/gpg
# Install extra items for Synology
cp -R ../web-extra/* webroot/
cp ../dsm.duplicati.conf .
DIRSIZE_KB=$(BLOCKSIZE=1024 du -s | cut -d '.' -f 1)
let "DIRSIZE=DIRSIZE_KB*1024"
tar cf ../package.tgz ./*
cd ..
rm -rf "${DIRNAME}"
ICON_72=$(openssl base64 -A -in PACKAGE_ICON.PNG)
ICON_256=$(openssl base64 -A -in PACKAGE_ICON_256.PNG)
git checkout INFO
echo "version=\"${VERSION}\"" >> "INFO"
MD5=$(md5 "package.tgz" | awk -F ' ' '{print $NF}')
echo "checksum=\"${MD5}\"" >> "INFO"
echo "extractsize=\"${DIRSIZE_KB}\"" >> "INFO"
echo "package_icon=\"${ICON_72}\"" >> "INFO"
echo "package_icon_256=\"${ICON_256}\"" >> "INFO"
chmod +x scripts/*
tar cf "${BASE_FILE_NAME}.spk" INFO LICENSE *.PNG package.tgz scripts conf WIZARD_UIFILES
git checkout INFO
rm package.tgz
if [ -f "${GPG_KEYFILE}" ]; then
if [ "z${KEYFILE_PASSWORD}" == "z" ]; then
echo -n "Enter keyfile password: "
read -s KEYFILE_PASSWORD
echo
fi
GPGDATA=$("${MONO}" "../../BuildTools/AutoUpdateBuilder/bin/Debug/SharpAESCrypt.exe" d "${KEYFILE_PASSWORD}" "${GPG_KEYFILE}")
if [ ! $? -eq 0 ]; then
echo "Decrypting GPG keyfile failed"
exit 1
fi
GPGID=$(echo "${GPGDATA}" | head -n 1)
GPGKEY=$(echo "${GPGDATA}" | head -n 2 | tail -n 1)
else
echo "No GPG keyfile found, skipping gpg signing"
fi
if [ "z${GPGID}" != "z" ]; then
# Now codesign the spk file
mkdir "${TMPDIRNAME}"
tar xf "${BASE_FILE_NAME}.spk" -C "${TMPDIRNAME}"
cat $(find ${TMPDIRNAME} -type f | sort ${SORT_OPTIONS}) > "${BASE_FILE_NAME}.spk.tmp"
gpg2 --ignore-time-conflict --ignore-valid-from --yes --batch --armor --detach-sign --default-key="${GPGID}" --output "${BASE_FILE_NAME}.signature" "${BASE_FILE_NAME}.spk.tmp"
rm "${BASE_FILE_NAME}.spk.tmp"
curl --silent --form "file=@${BASE_FILE_NAME}.signature" "${TIMESERVER}" > "${TMPDIRNAME}/syno_signature.asc"
rm "${BASE_FILE_NAME}.signature"
rm "${BASE_FILE_NAME}.spk"
tar cf "${BASE_FILE_NAME}.spk" -C "${TMPDIRNAME}" $(ls -1 ${TMPDIRNAME})
rm -rf "${TMPDIRNAME}"
fi