mirror of
https://github.com/unraid/api.git
synced 2025-12-31 13:39:52 -06:00
827 lines
33 KiB
XML
Executable File
827 lines
33 KiB
XML
Executable File
<?xml version='1.0' standalone='yes'?>
|
||
<!DOCTYPE PLUGIN [
|
||
<!ENTITY name "">
|
||
<!ENTITY launch "Connect">
|
||
<!ENTITY author "limetech">
|
||
<!ENTITY env "">
|
||
<!ENTITY version "">
|
||
<!ENTITY pluginURL "">
|
||
<!ENTITY source "/boot/config/plugins/dynamix.my.servers/&name;">
|
||
<!ENTITY SHA256 "">
|
||
<!ENTITY API_version "">
|
||
<!ENTITY API_SHA256 "">
|
||
<!ENTITY NODEJS_FILENAME "">
|
||
<!ENTITY NODEJS_SHA256 "">
|
||
<!ENTITY NODEJS_TXZ "">
|
||
<!ENTITY NGHTTP3_FILENAME "">
|
||
<!ENTITY NGHTTP3_TXZ "">
|
||
<!ENTITY NGHTTP3_SHA256 "">
|
||
<!ENTITY MAIN_TXZ "">
|
||
<!ENTITY API_TGZ "">
|
||
]>
|
||
|
||
<PLUGIN name="&name;" author="&author;" version="&version;" pluginURL="&pluginURL;"
|
||
launch="&launch;" min="6.9.0-rc1" icon="globe">
|
||
|
||
<CHANGES>
|
||
##a long time ago in a galaxy far far away
|
||
- initial release
|
||
</CHANGES>
|
||
|
||
<!-- prevent prod plugin from installing when staging already installed, and vice versa -->
|
||
<FILE Run="/bin/bash" Method="install">
|
||
<INLINE>
|
||
name="&name;" version="&version;" API_version="&API_version;" PLGTYPE="&env;"
|
||
<![CDATA[
|
||
echo "Installing ${name}.plg ${version} with Unraid API ${API_version}"
|
||
if [ "${PLGTYPE}" = "production" ] && [ -f /boot/config/plugins/dynamix.unraid.net.staging.plg ]; then
|
||
echo "⚠️ Please uninstall the Unraid Connect staging plugin before installing the production version"
|
||
exit 1
|
||
fi
|
||
if [ "${PLGTYPE}" = "staging" ] && [ -f /boot/config/plugins/dynamix.unraid.net.plg ]; then
|
||
echo "⚠️ Please uninstall the Unraid Connect production plugin before installing the staging version"
|
||
exit 1
|
||
fi
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- gzip check, DNS check, then validate files before doing anything destructive -->
|
||
<FILE Run="/bin/bash" Method="install">
|
||
<INLINE>
|
||
<![CDATA[
|
||
version=
|
||
# shellcheck disable=SC1091
|
||
source /etc/unraid-version
|
||
|
||
# ensure gzip is available and executes, is needed by '/etc/rc.d/rc.unraid-api install'
|
||
if [ ! -x /bin/gzip ] || ! /bin/gzip -V &>/dev/null; then
|
||
echo "⚠️ Unable to install as gzip is not available on this system. For help, post your diagnostics.zip to a new support thread in the forum."
|
||
exit 1
|
||
fi
|
||
|
||
dnscheck() {
|
||
HOST=$1
|
||
if [ -x /usr/bin/host ] && ! /usr/bin/host -W 10 "${HOST}" &>/dev/null; then
|
||
echo "⚠️ Warning: Your DNS server (${DNS_SERVER1}) is unable to resolve '${HOST}'"
|
||
DNSERR=yes
|
||
fi
|
||
}
|
||
|
||
# shellcheck disable=SC1090
|
||
source <(grep "DNS_SERVER1" /usr/local/emhttp/state/network.ini 2>/dev/null)
|
||
DNSERR=no
|
||
|
||
echo "Checking DNS..."
|
||
dnscheck "mothership.unraid.net"
|
||
#dnscheck "wanip4.unraid.net"
|
||
#dnscheck "backup.unraid.net"
|
||
|
||
[[ "${DNSERR}" == "yes" && "${DNS_SERVER1}" != "8.8.8.8" ]] && echo " Recommend navigating to Settings -> Network Settings and changing your DNS server to 8.8.8.8"
|
||
# Note: DNS checks will fail if the network is not available at boot. Cannot exit the install when DNS checks fail.
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
# compare expected SHA256 to actual SHA256, if not equal delete file
|
||
# this is needed prior to Unraid 6.11.0
|
||
sha256check() {
|
||
FILE=$1
|
||
EXPECTED=$2
|
||
if [[ -f "${FILE}" ]]; then
|
||
echo -n "Validating ${FILE}... "
|
||
ACTUAL=$(sha256sum "${FILE}" 2>/dev/null | grep -Po '^\S+')
|
||
if [[ "$EXPECTED" != "$ACTUAL" ]]; then
|
||
rm "${FILE}"
|
||
echo " old. Deleted file."
|
||
else
|
||
echo " ok."
|
||
fi
|
||
fi
|
||
}
|
||
]]>
|
||
sha256check "&source;.txz" "&SHA256;"
|
||
sha256check "/boot/config/plugins/dynamix.my.servers/unraid-api.tgz" "&API_SHA256;"
|
||
exit 0
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- download node -->
|
||
<FILE Name="/boot/config/plugins/dynamix.my.servers/&NODEJS_FILENAME;" Run="upgradepkg --install-new"
|
||
max="7.0.0-beta.5">
|
||
<URL>&NODEJS_TXZ;</URL>
|
||
<SHA256>&NODEJS_SHA256;</SHA256>
|
||
</FILE>
|
||
|
||
<!-- download nghttp3 -->
|
||
<FILE name="/boot/config/plugins/dynamix.my.servers/&NGHTTP3_FILENAME;" Run="upgradepkg --install-new"
|
||
max="7.0.0-beta.5">
|
||
<URL>&NGHTTP3_TXZ;</URL>
|
||
<SHA256>&NGHTTP3_SHA256;</SHA256>
|
||
</FILE>
|
||
|
||
<!-- download main txz -->
|
||
<FILE Name="&source;.txz">
|
||
<URL>&MAIN_TXZ;</URL>
|
||
<SHA256>&SHA256;</SHA256>
|
||
</FILE>
|
||
|
||
<!-- download unraid-api -->
|
||
<FILE Name="/boot/config/plugins/dynamix.my.servers/unraid-api.tgz">
|
||
<URL>&API_TGZ;</URL>
|
||
<SHA256>&API_SHA256;</SHA256>
|
||
</FILE>
|
||
|
||
<FILE Run="/bin/bash" Method="install">
|
||
<INLINE>
|
||
MAINTXZ="&source;.txz"
|
||
<![CDATA[
|
||
# before proceeding with install, doubly confirm downloaded files exist. just being pedantic.
|
||
FILE=${MAINTXZ} && [[ ! -f "$FILE" ]] && echo "⚠️ file missing - $FILE" && exit 1
|
||
FILE=/boot/config/plugins/dynamix.my.servers/unraid-api.tgz && [[ ! -f "$FILE" ]] && echo "⚠️ file missing - $FILE" && exit 1
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<FILE Run="/bin/bash" Method="remove">
|
||
<INLINE>
|
||
<![CDATA[
|
||
version=
|
||
# shellcheck disable=SC1091
|
||
source /etc/unraid-version
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- disable features on uninstall -->
|
||
<!-- NOTE: this script is PHP not bash -->
|
||
<FILE Run="/usr/bin/php" Method="remove">
|
||
<INLINE>
|
||
<![CDATA[
|
||
<?
|
||
$msini = @parse_ini_file('/boot/config/plugins/dynamix.my.servers/myservers.cfg', true);
|
||
|
||
# if no_delete_on_uninstall exists on flash drive then skip the rest of the cleanup (useful when switching between staging and production)
|
||
if (file_exists("/boot/config/plugins/dynamix.my.servers/no_delete_on_uninstall")) {
|
||
exit(0);
|
||
}
|
||
|
||
echo "\n";
|
||
echo "**********************************\n";
|
||
echo "🧹 CLEANING UP - may take a minute\n";
|
||
echo "**********************************\n";
|
||
|
||
if (file_exists("/boot/.git")) {
|
||
if (file_exists("/etc/rc.d/rc.flash_backup")) {
|
||
# stop flash backup service
|
||
echo "\nStopping flash backup service. Please wait…";
|
||
exec("/etc/rc.d/rc.flash_backup stop &>/dev/null");
|
||
}
|
||
if (file_exists("/usr/local/emhttp/plugins/dynamix.my.servers/include/UpdateFlashBackup.php")) {
|
||
# deactivate and delete local flash backup
|
||
echo "\nDeactivating flash backup. Please wait…";
|
||
passthru("/usr/bin/php /usr/local/emhttp/plugins/dynamix.my.servers/include/UpdateFlashBackup.php deactivate");
|
||
}
|
||
}
|
||
|
||
# set "Allow Remote Access" to "No" and sign out from Unraid Connect
|
||
if ($msini !== false) {
|
||
# stop unraid-api
|
||
echo "\nStopping unraid-api. Please wait…";
|
||
exec("/etc/rc.d/rc.unraid-api stop &>/dev/null");
|
||
|
||
if (!empty($msini['remote']['username'])) {
|
||
$var = parse_ini_file("/var/local/emhttp/var.ini");
|
||
$keyfile = @file_get_contents($var['regFILE']);
|
||
if ($keyfile !== false) {
|
||
echo "\nSigning out of Unraid Connect\n";
|
||
$ch = curl_init('https://keys.lime-technology.com/account/server/unregister');
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_POST, 1);
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, ['keyfile' => @base64_encode($keyfile)]);
|
||
curl_exec($ch);
|
||
curl_close($ch);
|
||
}
|
||
}
|
||
|
||
# remove myservers.cfg
|
||
unlink('/boot/config/plugins/dynamix.my.servers/myservers.cfg');
|
||
|
||
# reload nginx to disable Remote Access
|
||
echo "\n⚠️ Reloading Web Server. If this window stops updating for two minutes please close it.\n";
|
||
exec("/etc/rc.d/rc.nginx reload &>/dev/null");
|
||
}
|
||
exit(0);
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- disable features when upgrading on unsupported OS versions -->
|
||
<!-- duplicated from above because the script can't distinguish between install and remove -->
|
||
<!-- NOTE: this script is PHP not bash -->
|
||
<FILE Run="/usr/bin/php" Method="install">
|
||
<INLINE>
|
||
<![CDATA[
|
||
<?
|
||
$ver = @parse_ini_file('/etc/unraid-version', true)['version'];
|
||
$msini = @parse_ini_file('/boot/config/plugins/dynamix.my.servers/myservers.cfg', true);
|
||
|
||
// exit this install block if NOT isUnsupportedVersion
|
||
// must be 6.12.0 or higher (not 6.12.0-[beta|rc])
|
||
if (version_compare($ver,'6.12.0','>=')) {
|
||
exit(0);
|
||
}
|
||
|
||
echo "\n";
|
||
echo "**********************************\n";
|
||
echo "🧹 CLEANING UP - may take a minute\n";
|
||
echo "**********************************\n";
|
||
|
||
if (file_exists("/boot/.git")) {
|
||
if (file_exists("/etc/rc.d/rc.flash_backup")) {
|
||
# stop flash backup service
|
||
echo "\nStopping flash backup service. Please wait…";
|
||
exec("/etc/rc.d/rc.flash_backup stop &>/dev/null");
|
||
}
|
||
if (file_exists("/usr/local/emhttp/plugins/dynamix.my.servers/include/UpdateFlashBackup.php")) {
|
||
# deactivate and delete local flash backup
|
||
echo "\nDeactivating flash backup. Please wait…";
|
||
passthru("/usr/bin/php /usr/local/emhttp/plugins/dynamix.my.servers/include/UpdateFlashBackup.php deactivate");
|
||
}
|
||
}
|
||
|
||
# set "Allow Remote Access" to "No" and sign out from Unraid Connect
|
||
if ($msini !== false) {
|
||
# stop unraid-api
|
||
echo "\nStopping unraid-api. Please wait…";
|
||
exec("/etc/rc.d/rc.unraid-api stop &>/dev/null");
|
||
|
||
if (!empty($msini['remote']['username'])) {
|
||
$var = parse_ini_file("/var/local/emhttp/var.ini");
|
||
$keyfile = @file_get_contents($var['regFILE']);
|
||
if ($keyfile !== false) {
|
||
echo "\nSigning out of Unraid Connect\n";
|
||
$ch = curl_init('https://keys.lime-technology.com/account/server/unregister');
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_POST, 1);
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, ['keyfile' => @base64_encode($keyfile)]);
|
||
curl_exec($ch);
|
||
curl_close($ch);
|
||
}
|
||
}
|
||
|
||
# remove myservers.cfg
|
||
unlink('/boot/config/plugins/dynamix.my.servers/myservers.cfg');
|
||
|
||
# reload nginx to disable Remote Access
|
||
echo "\n⚠️ Reloading Web Server. If this window stops updating for two minutes please close it.\n";
|
||
exec("/etc/rc.d/rc.nginx reload &>/dev/null");
|
||
}
|
||
exit(0);
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- uninstall existing plugin during update or removal -->
|
||
<FILE Run="/bin/bash" Method="install remove">
|
||
<INLINE>
|
||
MAINNAME="&name;"
|
||
<![CDATA[
|
||
version=
|
||
# shellcheck disable=SC1091
|
||
source /etc/unraid-version
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
if [ -e /etc/rc.d/rc.unraid-api ]; then
|
||
# stop flash backup
|
||
/etc/rc.d/rc.flash_backup stop &>/dev/null
|
||
# stop the api gracefully
|
||
/etc/rc.d/rc.unraid-api stop &>/dev/null
|
||
# forcibly stop older clients
|
||
kill -9 `pidof unraid-api` &>/dev/null
|
||
# uninstall the api
|
||
/etc/rc.d/rc.unraid-api uninstall &>/dev/null
|
||
# uninstall the main source package
|
||
[[ -f "/var/log/packages/${MAINNAME}" ]] && removepkg --terse "${MAINNAME}"
|
||
# restore stock files
|
||
FILE=/usr/local/emhttp/plugins/dynamix/DisplaySettings.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix/Registration.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix/include/DefaultPageLayout.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix/include/ProvisionCert.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix/include/Wrappers.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/Downgrade.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/Update.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/include/ShowChanges.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/scripts/showchanges && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/scripts/unraidcheck && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.plugin.manager/include/UnraidCheck.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/MyServers.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/Registration.page && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/include/myservers1.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/include/myservers2.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/include/state.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/sbin/upgradepkg && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/include/reboot-details.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" FILE=/usr/local/emhttp/plugins/dynamix.my.servers/include/translations.php && [[ -f "$FILE-" ]] && mv -f "$FILE-" "$FILE" DIR=/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components
|
||
# certain instances where the directory is not present and others where it is, ensure we delete it before we restore it
|
||
if [[ -d "$DIR" ]]; then
|
||
rm -rf "$DIR"
|
||
fi
|
||
if [[ -d "$DIR-" ]]; then
|
||
mv -f "$DIR-" "$DIR"
|
||
fi
|
||
# delete plugin files from flash drive and OS
|
||
rm -f /boot/config/plugins/dynamix.my.servers/.gitignore
|
||
rm -f /etc/rc.d/rc.unraid-api
|
||
rm -f /etc/rc.d/rc.flash_backup
|
||
rm -f /usr/local/sbin/unraid-api
|
||
rm -rf /usr/local/emhttp/plugins/dynamix.unraid.net
|
||
rm -rf /usr/local/emhttp/plugins/dynamix.unraid.net.staging
|
||
rm -f /etc/rc.d/rc6.d/K10_flash_backup
|
||
rm -f /var/log/gitcount
|
||
rm -f /var/log/gitflash
|
||
rm -f /var/log/gitratelimit
|
||
rm -f /usr/local/emhttp/state/flashbackup.ini
|
||
rm -f /usr/local/emhttp/state/myservers.cfg
|
||
# delete any legacy files that may exist
|
||
rm -rf /boot/config/plugins/dynamix.my.servers/libvirt.node
|
||
rm -rf /boot/config/plugins/dynamix.my.servers/segfault-handler.node
|
||
rm -rf /boot/config/plugins/dynamix.my.servers/wc
|
||
rm -f /boot/config/plugins/Unraid.net/unraid-api.tgz
|
||
rm -f /boot/config/plugins/Unraid.net/.gitignore
|
||
rm -rf /boot/config/plugins/Unraid.net/webComps
|
||
rm -rf /boot/config/plugins/Unraid.net/wc
|
||
rm -f /usr/local/emhttp/webGui/javascript/vue.js
|
||
rm -f /usr/local/emhttp/webGui/javascript/vue.min.js
|
||
rm -rf /usr/local/emhttp/webGui/webComps
|
||
rm -rf /usr/local/emhttp/webGui/wc
|
||
# clean up our optional makestate modifications in rc.nginx (on 6.9 and 6.10.0-rc[12])
|
||
sed -i '/scripts\/makestate/d' /etc/rc.d/rc.nginx
|
||
# clean up extra origin for robots.txt
|
||
sed -i '#robots.txt any origin/d' /etc/rc.d/rc.nginx
|
||
fi
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<!-- install all the things -->
|
||
<FILE Run="/bin/bash" Method="install">
|
||
<INLINE>
|
||
PLGTYPE="&env;" MAINTXZ="&source;.txz"
|
||
<![CDATA[
|
||
appendTextIfMissing() {
|
||
FILE="$1" TEXT="$2"
|
||
if test -f "${FILE}" && ! grep -q "${TEXT}" "${FILE}" &>/dev/null; then
|
||
echo "${TEXT}">>"${FILE}"
|
||
fi
|
||
}
|
||
|
||
version=
|
||
# shellcheck disable=SC1091
|
||
source /etc/unraid-version
|
||
# exit this install block on isUnsupportedVersion
|
||
# must be 6.12.0 or higher (not 6.12.0-[beta|rc]x)
|
||
if [[ "${version:0:3}" == "6.9" || "${version:0:4}" == "6.10" || "${version:0:4}" == "6.11" || "${version:0:7}" == "6.12.0-" ]]; then
|
||
echo
|
||
echo "⚠️ Please uninstall this plugin or upgrade to a newer version of Unraid to enjoy Unraid Connect"
|
||
echo
|
||
echo "✅ It is safe to close this window"
|
||
echo
|
||
PLGNAME=dynamix.unraid.net
|
||
[ "${PLGTYPE}" = "staging" ] && PLGNAME=dynamix.unraid.net.staging
|
||
|
||
DIR="/usr/local/emhttp/plugins/${PLGNAME}" && [[ ! -d "$DIR" ]] && mkdir "$DIR"
|
||
cat << EOF > "$DIR/README.md"
|
||
**Unraid Connect**
|
||
|
||
Please uninstall this plugin or upgrade to a newer version of Unraid to enjoy Unraid Connect
|
||
EOF
|
||
# exit 0 or else the original plugin will be reinstalled at boot
|
||
exit 0
|
||
fi
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
# NOTE: any 'exit 1' after this point will result in a broken install
|
||
|
||
# Loop through the array of preserveFilesDirs and perform actions
|
||
# string param format
|
||
# "{move|copy|move_dir}:{path}:{preventDowngrade|skip}"
|
||
# move: move the file to a backup file
|
||
# copy: copy the file to a backup file
|
||
# move_dir: move the directory to a backup directory
|
||
# preventDowngrade: during plg install, if the file exists, do not overwrite it if the plg manifest version is less than the installed webgui version
|
||
# skip: do not perform any action if there is a manifest version difference
|
||
preserveFilesDirs=(
|
||
"move:/usr/local/emhttp/plugins/dynamix/Registration.page:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.plugin.manager/Downgrade.page:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.plugin.manager/Update.page:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.plugin.manager/scripts/unraidcheck:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.plugin.manager/include/UnraidCheck.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/MyServers.page:skip"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page:skip"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/Registration.page:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/include/myservers1.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/include/myservers2.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/include/state.php:preventDowngrade"
|
||
"copy:/sbin/upgradepkg:skip"
|
||
"move_dir:/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components:move_dir:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/data/server-state.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/include/reboot-details.php:preventDowngrade"
|
||
"move:/usr/local/emhttp/plugins/dynamix.my.servers/include/translations.php:preventDowngrade"
|
||
)
|
||
|
||
preserveAction() {
|
||
local action="$1"
|
||
local path="$2"
|
||
|
||
if [[ "$action" == "move" ]]; then
|
||
[[ -f "$path" ]] && mv -f "$path" "$path-"
|
||
elif [[ "$action" == "copy" ]]; then
|
||
[[ -f "$path" ]] && cp -f "$path" "$path-"
|
||
elif [[ "$action" == "move_dir" ]]; then
|
||
[[ -d "$path" ]] && mv -f "$path" "$path-"
|
||
fi
|
||
}
|
||
|
||
# Loop through the array of preserveFilesDirs and perform actions
|
||
for obj in "${preserveFilesDirs[@]}"
|
||
do
|
||
IFS=':' read -r action path preventType <<< "$obj"
|
||
preserveAction "$action" "$path" "$preventType"
|
||
done
|
||
|
||
# patch DefaultPageLayout.php
|
||
# search text: <?=_('Version')?>: <?=_var($var,'version','?')?><?=$notes?>
|
||
# <?=_('Version')?>: <?=$var['version']?><?=$notes?>
|
||
# replacement text: <unraid-i18n-host><unraid-header-os-version></unraid-header-os-version></unraid-i18n-host>
|
||
FILE=/usr/local/emhttp/plugins/dynamix/include/DefaultPageLayout.php
|
||
# get line number matching the search text
|
||
# shellcheck disable=SC2016
|
||
LINENUM=$(grep -n '<?=_('"'Version'"')?>: <?=_var($var,'"'version'"','"'?'"')?><?=$notes?>' "$FILE" | cut -d : -f 1)
|
||
# shellcheck disable=SC2016
|
||
[[ -z $LINENUM ]] && LINENUM=$(grep -n '<?=_('"'Version'"')?>: <?=$var\['"'version'"']?><?=$notes?>' "$FILE" | cut -d : -f 1)
|
||
if [[ -n $LINENUM ]]; then
|
||
# backup the file so it can be restored later
|
||
cp -f "$FILE" "$FILE-"
|
||
# sed should work, but it is very difficult to escape the search text
|
||
# instead, make a new file containing everything before LINENUM, then the replacement text, then everything after LINENUM
|
||
head -$((LINENUM-1)) "$FILE"> "$FILE~"
|
||
echo '<unraid-i18n-host><unraid-header-os-version></unraid-header-os-version></unraid-i18n-host>' >> "$FILE~"
|
||
tail +$((LINENUM+1)) "$FILE">> "$FILE~"
|
||
|
||
# disable these lines: <?$readme = @file_get_contents("$docroot/plugins/unRAIDServer/README.md",false,null,0,20)?:''?>
|
||
# <?$readme = @file_get_contents("$docroot/plugins/unRAIDServer/README.md",false,null,0,20)??'';?>
|
||
# <?$readme = @file_get_contents("$docroot/plugins/unRAIDServer/README.md",false,null,0,20);?>
|
||
# by replacing with: <?$readme ="removed by Connect";?>
|
||
sed -i '/unRAIDServer\/README\.md/c\<?$readme ="removed by Connect";?>' "$FILE~"
|
||
|
||
mv -f "$FILE~" "$FILE"
|
||
fi
|
||
|
||
# patch: showchanges, starting with 6.11.0-rc1
|
||
# ShowChanges.php, in 6.10
|
||
# search text: $valid = ['/var/tmp/','/tmp/plugins/'];
|
||
# replacement text: $valid = ['/var/tmp/','/tmp/plugins/','/boot/previous'];
|
||
FILES=(/usr/local/emhttp/plugins/dynamix.plugin.manager/scripts/showchanges /usr/local/emhttp/plugins/dynamix.plugin.manager/include/ShowChanges.php)
|
||
for FILE in "${FILES[@]}"; do
|
||
if test -f "${FILE}" && ! grep -q "'/boot/previous'" "${FILE}" &>/dev/null; then
|
||
# backup the file so it can be restored later
|
||
cp -f "$FILE" "$FILE-"
|
||
sed -i '/$valid = \[/c$valid = ['"'/var/tmp/'"','"'/tmp/plugins/'"','"'/boot/previous'"'];' "$FILE"
|
||
fi
|
||
done
|
||
|
||
# remove keys.limetechnology.com from hosts file
|
||
# brings older versions of Unraid in sync with 6.12.12
|
||
# no need to restore original file on uninstall
|
||
if grep -q "keys.lime-technology.com" /etc/hosts &>/dev/null; then sed -i "/keys.lime-technology.com/d" /etc/hosts &>/dev/null; fi
|
||
|
||
# patch ProvisionCert.php
|
||
# search text: curl_init("https://keys.lime-technology.com/account/ssl/provisionwildcard")
|
||
# curl_init("https://keys.lime-technology.com/account/ssl/$endpoint");
|
||
# prepend text: see $ADDTEXT4
|
||
ADDTEXT4=$(
|
||
cat <<'END_HEREDOC'
|
||
// added by Unraid Connect
|
||
// ensure keys.lime-technology.com is not hard-coded in the hosts file
|
||
exec('if grep -q "keys.lime-technology.com" /etc/hosts &>/dev/null; then sed -i "/keys.lime-technology.com/d" /etc/hosts &>/dev/null; fi');
|
||
END_HEREDOC
|
||
)
|
||
FILE=/usr/local/emhttp/plugins/dynamix/include/ProvisionCert.php
|
||
# get line number matching the search text
|
||
# shellcheck disable=SC2016
|
||
LINENUM=$(grep -n 'curl_init("https://keys.lime-technology.com/account/ssl/provisionwildcard")' "$FILE" | cut -d : -f 1)
|
||
[[ -z $LINENUM ]] && LINENUM=$(grep -n 'curl_init("https://keys.lime-technology.com/account/ssl/$endpoint")' "$FILE" | cut -d : -f 1)
|
||
if [[ -n $LINENUM ]]; then
|
||
# backup the file so it can be restored later
|
||
cp -f "$FILE" "$FILE-"
|
||
# sed should work, but it is very difficult to escape
|
||
# instead, make a new file containing everything before LINENUM, then the new text, then everything including and after LINENUM
|
||
head -$((LINENUM-1)) "$FILE"> "$FILE~"
|
||
echo "$ADDTEXT4">> "$FILE~"
|
||
echo "">> "$FILE~"
|
||
tail +$LINENUM "$FILE">> "$FILE~"
|
||
mv -f "$FILE~" "$FILE"
|
||
fi
|
||
|
||
# move settings on flash drive
|
||
CFG_OLD=/boot/config/plugins/Unraid.net
|
||
CFG_NEW=/boot/config/plugins/dynamix.my.servers
|
||
[[ -d "$CFG_OLD" ]] && [[ ! -d "$CFG_NEW" ]] && mv "$CFG_OLD" "$CFG_NEW"
|
||
|
||
# relax restrictions on built-in Firefox so it can sign in to Unraid Connect
|
||
# brings older versions of Unraid in sync with 6.12.0
|
||
# no need to restore original file on uninstall
|
||
# note: if file is modified while Firefox is open it will have no effect, reboot to change the file before Firefox is loaded
|
||
# note: prior to 6.12, file will only exist if system is booted in GUI Mode
|
||
FILE=/usr/share/mozilla/firefox/9n35r0i1.default/user.js
|
||
if [[ -f "$FILE" ]]; then
|
||
cp -f "$FILE" "$FILE-"
|
||
appendTextIfMissing "${FILE}" 'user_pref("privacy.firstparty.isolate", false);'
|
||
appendTextIfMissing "${FILE}" 'user_pref("javascript.options.asmjs", true);'
|
||
appendTextIfMissing "${FILE}" 'user_pref("javascript.options.wasm", true);'
|
||
fi
|
||
|
||
# fix update.htm to work in an iframe
|
||
# brings older versions of Unraid in sync with 6.12.0
|
||
# no need to restore original file on uninstall, will cause issues if uninstall from within an iframe
|
||
FILE=/usr/local/emhttp/update.htm
|
||
if test -f "${FILE}" && grep -q "top.document" "${FILE}" &>/dev/null; then
|
||
cp -f "$FILE" "$FILE-"
|
||
sed -i 's/top.document/parent.document/gm' "${FILE}"
|
||
fi
|
||
|
||
# fix logging.htm (openBox) to work in an iframe
|
||
# brings older versions of Unraid in sync with 6.12.0
|
||
# no need to restore original file on uninstall
|
||
FILE=/usr/local/emhttp/logging.htm
|
||
if test -f "${FILE}" && grep -q "top.Shadowbox" "${FILE}" &>/dev/null; then
|
||
cp -f "$FILE" "$FILE-"
|
||
sed -i 's/top.Shadowbox/parent.Shadowbox/gm' "${FILE}"
|
||
fi
|
||
|
||
# ensure _var() is defined, brings older versions of Unraid in sync with 6.12.0
|
||
FILE=/usr/local/emhttp/plugins/dynamix/include/Wrappers.php
|
||
if test -f "${FILE}" && ! grep -q "function _var" "${FILE}" &>/dev/null; then
|
||
ADDTEXT1=$(
|
||
cat <<'END_HEREDOC'
|
||
// backported by Unraid Connect
|
||
function _var(&$name, $key=null, $default='') {
|
||
return is_null($key) ? ($name ?? $default) : ($name[$key] ?? $default);
|
||
}
|
||
END_HEREDOC
|
||
)
|
||
fi
|
||
# ensure my_logger() is defined, brings older versions of Unraid in sync with 6.13.0
|
||
if test -f "${FILE}" && ! grep -q "function my_logger" "${FILE}" &>/dev/null; then
|
||
ADDTEXT2=$(
|
||
cat <<'END_HEREDOC'
|
||
// backported by Unraid Connect
|
||
// ensure params passed to logger are properly escaped
|
||
function my_logger($message, $logger='webgui') {
|
||
exec('logger -t '.escapeshellarg($logger).' -- '.escapeshellarg($message));
|
||
}
|
||
END_HEREDOC
|
||
)
|
||
fi
|
||
# ensure http_get_contents() is defined, brings older versions of Unraid in sync with 6.13.0
|
||
if test -f "${FILE}" && ! grep -q "function http_get_contents" "${FILE}" &>/dev/null; then
|
||
ADDTEXT3=$(
|
||
cat <<'END_HEREDOC'
|
||
// backported by Unraid Connect
|
||
// Original PHP code by Chirp Internet: www.chirpinternet.eu
|
||
// Please acknowledge use of this code by including this header.
|
||
// https://www.the-art-of-web.com/php/http-get-contents/
|
||
// Modified for Unraid
|
||
/**
|
||
* Fetches URL and returns content
|
||
* @param string $url The URL to fetch
|
||
* @param array $opts Array of options to pass to curl_setopt()
|
||
* @param array $getinfo Empty array passed by reference, will contain results of curl_getinfo and curl_error
|
||
* @return string|false $out The fetched content
|
||
*/
|
||
function http_get_contents(string $url, array $opts = [], array &$getinfo = NULL) {
|
||
$ch = curl_init();
|
||
if(isset($getinfo)) {
|
||
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
|
||
}
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
|
||
curl_setopt($ch, CURLOPT_TIMEOUT, 45);
|
||
curl_setopt($ch, CURLOPT_ENCODING, "");
|
||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||
curl_setopt($ch, CURLOPT_REFERER, "");
|
||
curl_setopt($ch, CURLOPT_FAILONERROR, true);
|
||
curl_setopt($ch, CURLOPT_USERAGENT, 'Unraid');
|
||
if(is_array($opts) && $opts) {
|
||
foreach($opts as $key => $val) {
|
||
curl_setopt($ch, $key, $val);
|
||
}
|
||
}
|
||
$out = curl_exec($ch);
|
||
if (curl_errno($ch) == 23) {
|
||
// error 23 detected, try CURLOPT_ENCODING = "deflate"
|
||
curl_setopt($ch, CURLOPT_ENCODING, "deflate");
|
||
$out = curl_exec($ch);
|
||
}
|
||
if (isset($getinfo)) {
|
||
$getinfo = curl_getinfo($ch);
|
||
}
|
||
if ($errno = curl_errno($ch)) {
|
||
$msg = "Curl error $errno: " . (curl_error($ch) ?: curl_strerror($errno)) . ". Requested url: '$url'";
|
||
if(isset($getinfo)) {
|
||
$getinfo['error'] = $msg;
|
||
}
|
||
my_logger($msg, "http_get_contents");
|
||
}
|
||
curl_close($ch);
|
||
return $out;
|
||
}
|
||
END_HEREDOC
|
||
)
|
||
fi
|
||
if [[ -n "${ADDTEXT1}" || -n "${ADDTEXT2}" || -n "${ADDTEXT3}" ]]; then
|
||
TMP="$FILE.$RANDOM"
|
||
cp -f "$FILE" "$TMP"
|
||
cp -f "$FILE" "$FILE-"
|
||
# delete last line of the file if it contains `?>`
|
||
if test $( tail -n 1 "${TMP}" ) = '?>' ; then
|
||
sed -i '$ d' "${TMP}"
|
||
fi
|
||
[[ -n "${ADDTEXT1}" ]] && echo "${ADDTEXT1}">>"${TMP}"
|
||
[[ -n "${ADDTEXT2}" ]] && echo "${ADDTEXT2}">>"${TMP}"
|
||
[[ -n "${ADDTEXT3}" ]] && echo "${ADDTEXT3}">>"${TMP}"
|
||
echo "?>">>"${TMP}"
|
||
mv "${TMP}" "${FILE}"
|
||
fi
|
||
|
||
# install the main txz
|
||
upgradepkg --install-new --reinstall "${MAINTXZ}"
|
||
|
||
# confirm an expected file now exists
|
||
# WARNING: failure here results in broken install
|
||
[[ ! -f /usr/local/emhttp/plugins/dynamix.my.servers/scripts/gitflash_log ]] && echo "⚠️ files missing from main txz" && exit 1
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
# setup env
|
||
if [ "${PLGTYPE}" = "production" ] || [ ! -f /boot/config/plugins/dynamix.my.servers/env ]; then
|
||
echo "env=\"${PLGTYPE}\"">/boot/config/plugins/dynamix.my.servers/env
|
||
fi
|
||
|
||
echo
|
||
echo "⚠️ Do not close this window yet"
|
||
echo
|
||
|
||
# Use myservers.cfg values to help prevent conflicts when installing
|
||
CFG=/boot/config/plugins/dynamix.my.servers/myservers.cfg
|
||
# shellcheck disable=SC1090
|
||
source <(grep 'email\|apikey="unraid_' "${CFG}" 2>/dev/null)
|
||
CFG_CLEANED=0
|
||
# If user is signed in but has no apikey, or if the apikey is not 64 chars, wipe the [remote] section from the cfg
|
||
if ([[ -n "${email}" && (-z "${apikey}" || "${#apikey}" -ne "64") ]]); then
|
||
# remove only the [remote] section
|
||
awk '{
|
||
if($0 ~ /\[remote\]/){output="off"; next}
|
||
if($0 ~ /\[/){output="on"; print; next}
|
||
if(output == "on"){print}
|
||
}' "${CFG}">"${CFG}-new" && mv "${CFG}-new" "${CFG}" CFG_CLEANED=1
|
||
echo "⚠️ Automatically signed out of Unraid.net"
|
||
fi
|
||
# if there wasn't an email or the CFG was cleaned
|
||
if [[ -z "${email}" ]] || [[ CFG_CLEANED -eq 1 ]]; then
|
||
echo "✨ Sign In to Unraid.net to use Unraid Connect ✨"
|
||
fi
|
||
|
||
# make the unraid-api work globally for easy cli access
|
||
ln -s /usr/bin/unraid-api /usr/local/sbin/unraid-api
|
||
ln -s /usr/bin/unraid-api /usr/local/bin/unraid-api
|
||
|
||
# configure flash backup to stop when the system starts shutting down
|
||
[[ ! -d /etc/rc.d/rc6.d ]] && mkdir /etc/rc.d/rc6.d
|
||
[[ ! -h /etc/rc.d/rc0.d ]] && ln -s /etc/rc.d/rc6.d /etc/rc.d/rc0.d
|
||
[[ ! -h /etc/rc.d/rc6.d/K10_flash_backup ]] && ln -s /etc/rc.d/rc.flash_backup /etc/rc.d/rc6.d/K10_flash_backup
|
||
|
||
# allow webgui to be iframed only on Connect dashboard, only applies to 6.10+
|
||
# if needed, restart nginx before installing the unraid-api
|
||
CHANGED=no
|
||
FILE=/etc/nginx/nginx.conf
|
||
# brings older versions of Unraid in sync with 6.12.0
|
||
if grep -q "SAMEORIGIN" "${FILE}"; then
|
||
CHANGED=yes
|
||
cp "$FILE" "$FILE-" OLD="add_header X-Frame-Options 'SAMEORIGIN';" NEW="add_header Content-Security-Policy \"frame-ancestors 'self' https://connect.myunraid.net/\";"
|
||
sed -i "s#${OLD}#${NEW}#" "${FILE}"
|
||
fi
|
||
if [ "${PLGTYPE}" = "staging" ]; then
|
||
# staging plugin allows an additional origin
|
||
if ! grep -q "dev-my.myunraid.net:4000" "${FILE}"; then
|
||
CHANGED=yes
|
||
[[ ! -f "$FILE-" ]] && cp "$FILE" "$FILE-" OLD="add_header Content-Security-Policy \"frame-ancestors 'self' https://connect.myunraid.net/\";" NEW="add_header Content-Security-Policy \"frame-ancestors 'self' https://connect-staging.myunraid.net https://connect.myunraid.net/ https://dev-my.myunraid.net:4000/\";"
|
||
sed -i "s#${OLD}#${NEW}#" "${FILE}"
|
||
fi
|
||
fi
|
||
FILE=/etc/rc.d/rc.nginx
|
||
# brings older versions of Unraid in sync with 6.12.0
|
||
if ! grep -q "#robots.txt any origin" "${FILE}"; then
|
||
CHANGED=yes
|
||
cp "$FILE" "$FILE-" FIND="location = \/robots.txt {"
|
||
# escape tabs and spaces
|
||
ADD="\ \ \ \ \ add_header Access-Control-Allow-Origin *; #robots.txt any origin"
|
||
sed -i "/${FIND}/a ${ADD}" "${FILE}"
|
||
fi
|
||
if [[ "${CHANGED}" == "yes" ]]; then
|
||
if /etc/rc.d/rc.nginx status &>/dev/null; then
|
||
# if nginx is running, reload it to enable the changes above
|
||
# note: if this is being installed at boot, nginx will not yet be running
|
||
echo ""
|
||
echo "⚠️ Reloading Web Server. If this window stops updating for two minutes please close it."
|
||
/etc/rc.d/rc.nginx reload &>/dev/null
|
||
fi
|
||
fi
|
||
|
||
# Prevent web component file downgrade if the webgui version is newer than the plugin version
|
||
# Function to extract "ts" value from JSON file
|
||
extract_ts() {
|
||
local filepath="$1"
|
||
local ts_value=null
|
||
ts_value=$(jq -r '.ts' "$filepath" 2>/dev/null)
|
||
echo "$ts_value"
|
||
}
|
||
|
||
preventDowngradeAction() {
|
||
local action="$1"
|
||
local path="$2"
|
||
local preventType="$3" # preventDowngrade or skip
|
||
|
||
# if skip, do nothing
|
||
if [[ "$preventType" == "skip" ]]; then
|
||
return
|
||
fi
|
||
|
||
# restore the "backup" but keep the original backup for the uninstall plg script
|
||
# otherwise, the uninstall script will NOT be able to restore the original file
|
||
if [[ "$action" == "move" || "$action" == "copy" ]]; then
|
||
[[ -f "$path-" ]] && cp -f "$path-" "$path"
|
||
elif [[ "$action" == "move_dir" ]]; then
|
||
# if directory exists rm the original and copy the backup
|
||
# glob expansion via "$path-/"* …yes the * is necessary as we want to copy the contents of the directory
|
||
[[ -d "$path-" ]] && rm -rf "$path" && mkdir "$path" && cp -rf "$path-/"* "$path"
|
||
fi
|
||
}
|
||
|
||
# Extract "ts" values from both files
|
||
plgWebComponentPath="/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components" backupWebComponentPath="/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components-" plgManifestTs=$(extract_ts "$plgWebComponentPath/manifest.json")
|
||
webguiManifestTs=$(extract_ts "$backupWebComponentPath/manifest.json")
|
||
|
||
# Compare the "ts" values and return the file path of the higher value
|
||
if [[ "$webguiManifestTs" -gt "$plgManifestTs" ]]; then
|
||
# Loop through the array of preserveFilesDirs and perform actions
|
||
for obj in "${preserveFilesDirs[@]}"
|
||
do
|
||
IFS=':' read -r action path preventType <<< "$obj"
|
||
preventDowngradeAction "$action" "$path" "$preventType"
|
||
done
|
||
echo "♻️ Reverted to stock web component files"
|
||
fi
|
||
|
||
# start background process to install/start the api and flash backup
|
||
echo
|
||
if [ -f /var/local/emhttp/var.ini ]; then
|
||
# the system has fully booted, emhttpd and nginx are running
|
||
echo "Installing and starting the Unraid API"
|
||
echo "Starting flash backup (if enabled)"
|
||
echo "/etc/rc.d/rc.unraid-api install; /etc/rc.d/rc.flash_backup start" | at -M now &>/dev/null
|
||
# else
|
||
# the system is booting, emhttpd will install the api and start rc.flash_backup. rc.nginx will start the api.
|
||
# nothing to do here
|
||
fi
|
||
|
||
echo
|
||
echo "✅ Installation is complete, it is safe to close this window"
|
||
echo
|
||
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
<FILE Run="/bin/bash" Method="remove">
|
||
<INLINE>
|
||
<![CDATA[
|
||
version=
|
||
# shellcheck disable=SC1091
|
||
source /etc/unraid-version
|
||
|
||
echo
|
||
echo "✅ Uninstall is complete, it is safe to close this window"
|
||
echo
|
||
|
||
exit 0
|
||
]]>
|
||
</INLINE>
|
||
</FILE>
|
||
|
||
</PLUGIN> |