]> ## 2024.03.25.0626 ### This version resolves: - Minor UI fixes - Cleanup of unused scripts name="&name;" version="&version;" API_version="&API_version;" PLGTYPE="&env;" DLHOST=$(echo "&downloadserver;" | awk -F/ '{print $3}') JSHOST=$(echo "&js_dl_server;" | awk -F/ '{print $3}') /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 "${DLHOST}" #dnscheck "${JSHOST}" 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 &downloadserver;/unraid-api/&name;-&version;.txz &MD5; &SHA256; &downloadserver;/unraid-api/unraid-api-&API_version;.tgz &API_MD5; &API_SHA256; MAINTXZ="&source;.txz" /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); ]]> /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); ]]> MAINNAME="&name;" /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/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/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" DIR=/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components && [[ -d "$DIR-" ]] && mv -f "$DIR-" "$DIR" 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" # 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 /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 ]]> PLGTYPE="&env;" MAINTXZ="&source;.txz" /dev/null; then echo "${TEXT}" >>"${FILE}" fi } version= # shellcheck disable=SC1091 source /etc/unraid-version # exit this install block on isUnsupportedVersion if [[ "${version:0:3}" == "6.9" || "${version:0:7}" == "6.10.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 # Preserve in case plugin is removed FILE=/usr/local/emhttp/plugins/dynamix/Registration.page && [[ -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.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/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/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" ]] && cp -f "$FILE" "$FILE-" DIR=/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components && [[ -d "$DIR" ]] && mv -f "$DIR" "$DIR-" 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-" # patch DefaultPageLayout.php # search text: : # : # replacement text: FILE=/usr/local/emhttp/plugins/dynamix/include/DefaultPageLayout.php # get line number matching the search text # shellcheck disable=SC2016 LINENUM=$(grep -n ': ' "$FILE" | cut -d : -f 1) # shellcheck disable=SC2016 [[ -z $LINENUM ]] && LINENUM=$(grep -n ': ' "$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 '' >> "$FILE~" tail +$((LINENUM+1)) "$FILE" >> "$FILE~" # disable these lines: # # # by replacing with: sed -i '/unRAIDServer\/README\.md/c\' "$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 # 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 "_var" "${FILE}" &>/dev/null; then TEXT=$( cat <<'END_HEREDOC' function _var(&$name, $key=null, $default='') { return is_null($key) ? ($name ?? $default) : ($name[$key] ?? $default); } ?> END_HEREDOC ) cp -f "$FILE" "$FILE-" # delete last line of the file if it contains `?>` if test $( tail -n 1 "${FILE}" ) = '?>' ; then sed -i '$ d' "${FILE}" fi echo "${TEXT}" >>"${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/local/bin/unraid-api/unraid-api /usr/local/sbin/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 # 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 ]]>