]> ###&version; - Bind must be an IP; pkill quotes it; do not delete install.plg. ###2026.09.08aa–ae - History vs Delete file; Dashboard one tile; Scan LAN table; overlay install. ###2026.09.06aa–ac - Hashed raw install (SHA256/MD5); restore Logs/Help/Dashboard. ###2026.08.26av–au - Lighter live poll under Pull load; Pull/Host notifications. ###2026.08.26at–ar - Dashboard full paths + stock tile; progress/ETA; Pause/Stop align. ###2026.08.26aq–ap - Logs tab (survives History clear); History/Logs short inline_help. ### Older releases - Full changelog: https://github.com/ibigsnet/NBDExport/blob/main/CHANGELOG.md /dev/null || echo '{"busy":false}') BUSY=$(echo "$BUSY_JSON" | php -r '$j=@json_decode(stream_get_contents(STDIN),true); echo !empty($j["busy"])?"1":"0";' 2>/dev/null || echo 0) SUMMARY=$(echo "$BUSY_JSON" | php -r '$j=@json_decode(stream_get_contents(STDIN),true); echo $j["summary"]??"";') ALLOW=$(php -r ' require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; $c=nbd_load_cfg(); echo (($c["allow_upgrade_while_busy"]??"no")==="yes")?"1":"0"; ' 2>/dev/null || echo 0) if [ "$BUSY" = "1" ] && [ "${NBD_FORCE_UPGRADE:-0}" != "1" ] && [ "$ALLOW" != "1" ]; then echo "NBD Export: REFUSING plugin update while busy ($SUMMARY)." echo "NBD Export: Pause or Stop Hosts/Pulls on the Status tab, then Update again." echo "NBD Export: (Protects scheduled/CA auto-updates from swapping code under a live convert.)" echo "NBD Export: Or: Settings → Allow upgrade while busy = Yes — or: NBD_FORCE_UPGRADE=1 plugin update …" exit 1 fi if [ "$BUSY" = "1" ]; then echo "NBD Export: WARNING — upgrading while busy ($SUMMARY); live qemu/Host processes are left running." echo "NBD Export: Post-install will reconcile UI to those processes (in-flight job keeps its old progress wrapper)." fi fi # One-time legacy flash rename (NbdExport → NBDExport) if [ -d /boot/config/plugins/NbdExport ]; then mkdir -p /boot/config/plugins/NBDExport cp -a /boot/config/plugins/NbdExport/. /boot/config/plugins/NBDExport/ 2>/dev/null || true if [ -f /boot/config/plugins/NBDExport/NbdExport.cfg ] && [ ! -f /boot/config/plugins/NBDExport/NBDExport.cfg ]; then mv /boot/config/plugins/NBDExport/NbdExport.cfg /boot/config/plugins/NBDExport/NBDExport.cfg fi rm -rf /boot/config/plugins/NbdExport echo "NBD Export: migrated flash config NbdExport → NBDExport" fi # Note: do not delete /tmp/plugins/nbd.plg here — Unraid uses it as the install working copy rm -f /boot/config/plugins/nbdexport.plg \ /var/log/plugins/nbdexport.plg 2>/dev/null || true mkdir -p /boot/config/plugins/NBDExport /var/run/nbdexport /var/log/nbdexport # Forget old Slackware txz registration WITHOUT deleting the live tree. # removepkg / rm -rf here ran before GitHub FILE copies; a failed download # left Plugins on "error install" with no NBD Export. for p in /var/log/packages/NBDExport-* /var/log/packages/NbdExport-*; do [ -e "$p" ] || continue echo "NBD Export: forgetting old package $(basename "$p") (overlay files next)" rm -f "$p" done rm -rf /usr/local/emhttp/plugins/NbdExport \ /usr/local/emhttp/plugins/nbdexport 2>/dev/null || true rm -f /boot/config/plugins/NBDExport/NBDExport-*.txz 2>/dev/null || true mkdir -p /usr/local/emhttp/plugins/NBDExport/{include,scripts,event} echo "NBD Export: ready for file install." ]]> &raw;/NBDExport.page?v=&version; 0974e14163869c9100bfca3d43bdef8ded219dd07beef1242fd634d42704ac58 8c27b63167bd412e85eddc55850bb7ec &raw;/NBDStatus.page?v=&version; 55b1be2cf285c223ee25a20ea079df0cea8ff6c2480a205f6d939026753bf9ed 6aacc1abadc0a9a9a51f3ceb45a3fcd8 &raw;/NBDHost.page?v=&version; 47d949e8be730f7c43625f11bc85f67cf1dbb5d7e214fb667c8138e5bc6f5ac7 85238b781cb69c9693b23d7e79b8fea9 &raw;/NBDPull.page?v=&version; 5236ffe5d0e9cc5a34f6c290ff89480230174428a219cd22caa7e1bfcb8be31c 7445bdb4241bfc368500cfe094035fa5 &raw;/NBDLogs.page?v=&version; 1a8740b6637a71b89899ae3723e106b2674050633c720b46fcba2e8fc28c8e33 bb85ca336c98930572af8f169c5e7d97 &raw;/NBDSettings.page?v=&version; 96dc27c5cbc6716bad19538fd6a90358d0bae1798643691048b9e5ada8f79ef9 5c9e35c741b12659de22bd477d6ba3f3 &raw;/NBDHelp.page?v=&version; 8a5af464dced8da128a62fec12c909537e9c89f971301cf6f9d14dc5601eb535 989284f7ca71153dda646667af327d59 &raw;/NBDDashboard.page?v=&version; 83c9ea08834ff04ec075374e0e4fcc2b81ce527167b5c2bb68c49c1fb3a59b38 86a905888d4e76c9194066f61eef25ae &raw;/default.cfg?v=&version; 8b23c9074a13ae3e32e1e3369398d40b0e30fbd97c202b7b36714c6ad4e09ecb 06631ff6d3acb011e6e123eda19c1270 &raw;/README.md?v=&version; 77f618192b54635943fc88da5102518fd9d7b8734d3adf4d892825a66480a1be 230e0a88465afa6412297d4e9b787c1f &raw;/include/nbd-beacon-server.php?v=&version; 8024e04026eea533f2e2828f81ab3e95a1933290dba614bf9d4c7fa5fde0d1bd 034e7d44b951bab2c9e98261f9785fac &raw;/include/nbd-dash-status.php?v=&version; e17fd13e7533e1c1c393e162aaeac0c07846932a3832a57b39f149eeba0e9aff b1673e42497e94223dc8fba5d4398902 &raw;/include/nbd-download-config.php?v=&version; 16886f78f44a006717a3124b4733926ae680c27bae7b903711b1ba3a7a5245d7 18fe9cad9242f2c8476ba96a0feb7649 &raw;/include/nbd-job-card.php?v=&version; 16f8f604f6902ba591771c520c7b7fa68fadb115c4675896867abffb7391f873 db43f886fb488190fedc81307d6166bc &raw;/include/nbd-lib.php?v=&version; 2053ce59762205450fceae4026012e691c06d420bb12607007ec9b609ef52e29 344545966325518877480bb5c3c13e89 &raw;/include/nbd-live-status.php?v=&version; d01e886ddf9ebdb8a8f1145435229d42fb262aaa38306e183905115f1283eecc 7e11e20efbde1c02be6875b439a9b441 &raw;/include/nbd-live-watch.php?v=&version; 3e5745c6c220a47183cbe6e3fa0afa73e046d015a11989c32796ac098bebec9b ed2d8a108711f70ab8d1c7a13a62f90b &raw;/include/nbd-page-boot.php?v=&version; 58145708c27b59fbb3f284c9e7ec19b535a0e137117b406b4ac67fa3f3c3e2dc f34488a0f6b9fcc47851e3a5442c8908 &raw;/include/nbd-page-js.php?v=&version; b8b30958cfd26fc91ebc116a742392277f4ed08865bbf8b9c977d04a301a593d 2d90c41ad6f69d18ab2372f8252ad31e &raw;/include/nbd-reconcile.php?v=&version; ea317e372fc8e572745c7198401cdc3f97cfa1c9304b81ac5b1a63687aa5b9f2 b66d2fac76adc36a8d20b22a58fbfdb7 &raw;/include/nbd-scan.php?v=&version; 469ae9d14cdab91c7c47fff9cb453cc567d9f928dc000a2a7c7a3a25a9b951af be1a5fc219092257f76a49b7e3d751d3 &raw;/include/nbd-ud-head.php?v=&version; 32a25f27aa7a574919e98435a9f03996177d7b6703f36e4017b2b9e3499d3c93 d701046b3bc5d73c0a42af2b0cb71c90 &raw;/include/nbd-ud-overlay.js?v=&version; 7200257303fd4878f5629e56de85c33c823fd190957649f67873efc686d2c095 3fdfcb1fb74af5c8eb86e72b2cca2e56 &raw;/include/nbd-ud-status.php?v=&version; 037f4f2666437cba9501f529e471a69a281c1c6e430d0b09d6709488f4b97b7d fb143ddb3cd8c71e68ebe1c2053464a2 &raw;/include/nbd-update.php?v=&version; 557651afe821e9177a228521bd3639b8f854b18fc64481263a9edd364ed7858e f3aeb41fde25a0cea95d38540d458bbc &raw;/scripts/nbd-export-start?v=&version; a9845abb289852dd7a77e7b23b5ebf19e82f51a85260f4a1cc9d2b4b1c300c04 a7463a63c8535a8c3af859267b1d14dd &raw;/scripts/nbd-export-stop?v=&version; 78f3460702b57e8a63ac5dfbe48f56b7f73342062a9e598100db821725c3d7d7 2b18beb249e6cebece303c068d1753d7 &raw;/scripts/nbd-image-from-url?v=&version; aa55a721811828a6b06139fea1c8d74c967724689de416666bb06852b5899a0b c2aa9bef091d07afe867403c45a9b140 &raw;/event/started?v=&version; b00497f674455034bd5ed5daa6f2e4789191e1027cb2cfb2753f00915ef888e4 2c4e9e45b29df206a1f3828e2ad225a4 /dev/null || true chmod 755 /usr/local/emhttp/plugins/NBDExport/event/started 2>/dev/null || true if [ ! -f /boot/config/plugins/NBDExport/NBDExport.cfg ] \ && [ -f /usr/local/emhttp/plugins/NBDExport/default.cfg ]; then cp -a /usr/local/emhttp/plugins/NBDExport/default.cfg /boot/config/plugins/NBDExport/NBDExport.cfg echo "NBD Export: created default NBDExport.cfg" fi # Companion marker only. UD HeadInline inject only when user enables overlay (Settings). php -r 'require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; nbd_write_companion_marker(); $c=nbd_load_cfg(); if (($c["ud_status_overlay"]??"no")==="yes") { nbd_ud_overlay_inject(); } else { nbd_ud_overlay_uninject(); }' 2>/dev/null || true # Reattach live Hosts/Pulls after upgrade (qemu left running when busy-upgrade allowed) php -r 'require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; if (function_exists("nbd_reconcile_live")) { $r=nbd_reconcile_live(); echo "NBD Export: reconcile hosts=".($r["hosts"]??0)." pulls=".($r["pulls"]??0)." external=".($r["external"]??0)."\n"; }' 2>/dev/null || true echo "NBD Export: packages now: $(ls /var/log/packages/NBDExport-* 2>/dev/null | xargs -n1 basename 2>/dev/null | tr '\n' ' ')" echo "NBD Export: install complete." echo "NBD Export: Settings → Network Services → NBD" echo "NBD Export: Hard-refresh the browser (Ctrl+Shift+R)." ]]> /dev/null 2>&1 php -r 'require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; if (function_exists("nbd_beacon_stop")) nbd_beacon_stop();' >/dev/null 2>&1 echo "NBD Export: stopping managed Hosts and Pulls before wipe..." php -r 'require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; if (function_exists("nbd_stop_all_exports")) nbd_stop_all_exports();' >/dev/null 2>&1 php -r 'require_once "/usr/local/emhttp/plugins/NBDExport/include/nbd-lib.php"; if (!function_exists("nbd_jobs_state")||!function_exists("nbd_image_stop")) exit(0); foreach (nbd_jobs_state() as $j) { if (!empty($j["id"])) { echo "NBD Export: stop ".$j["id"]."\n"; nbd_image_stop($j["id"]); } }' 2>/dev/null || true fi # Strip UD overlay inject from known layout files (StorageGuard pattern) for f in \ /usr/local/emhttp/webGui/include/DefaultPageLayout/HeadInlineJS.php \ /usr/local/emhttp/plugins/dynamix/include/DefaultPageLayout/HeadInlineJS.php \ /usr/local/emhttp/webGui/include/HeadInclude.php \ /usr/local/emhttp/plugins/dynamix/include/HeadInclude.php do [ -f "$f" ] || continue sed -i \ -e '/NBDExport-inject/d' \ -e '/NBDExport UD overlay/d' \ -e '/plugins\/NBDExport\/include\/nbd-ud/d' \ "$f" >/dev/null 2>&1 done # Kill anything we tracked under the run dir (hosts, jobs, beacon) if [ -d /var/run/nbdexport ]; then for pf in /var/run/nbdexport/*.pid; do [ -f "$pf" ] || continue pid=$(tr -cd '0-9' <"$pf" 2>/dev/null) [ -n "$pid" ] || continue if [ -d "/proc/$pid" ]; then kill -TERM -$pid >/dev/null 2>&1 kill -TERM "$pid" >/dev/null 2>&1 sleep 0.2 kill -KILL -$pid >/dev/null 2>&1 kill -KILL "$pid" >/dev/null 2>&1 fi done fi # Beacon php -S can outlive a missing pidfile pkill -f 'nbd-beacon-server.php' >/dev/null 2>&1 pkill -f 'php -S .*10808' >/dev/null 2>&1 rm -rf /var/run/nbdexport /var/log/nbdexport >/dev/null 2>&1 # Packages (current + legacy names) for p in /var/log/packages/NBDExport-* /var/log/packages/NbdExport-* /var/log/packages/nbdexport-*; do [ -e "$p" ] || continue echo "NBD Export: removepkg $(basename "$p")" removepkg "$(basename "$p")" >/dev/null 2>&1 done # Emhttp plugin trees (current + legacy) rm -rf \ /usr/local/emhttp/plugins/NBDExport \ /usr/local/emhttp/plugins/NbdExport \ /usr/local/emhttp/plugins/nbdexport >/dev/null 2>&1 # Flash config + cached .txz (full wipe — reinstall starts clean) rm -rf \ /boot/config/plugins/NBDExport \ /boot/config/plugins/NbdExport \ /boot/config/plugins/nbdexport >/dev/null 2>&1 # Orphan / misnamed plg copies on flash (keep Unraid working copy in /tmp during remove) rm -f \ /boot/config/plugins/nbdexport.plg \ /boot/config/plugins/NBDExport.plg \ /boot/config/plugins/NbdExport.plg >/dev/null 2>&1 rm -f \ /tmp/plugins/nbd.txt \ /tmp/plugins/nbdexport.plg \ /tmp/plugins/NBDExport.plg \ /var/log/plugins/nbdexport.plg \ /var/log/plugins/NBDExport.plg >/dev/null 2>&1 # Note: do not delete /tmp/plugins/nbd.plg here — Unraid install/remove working copy # Note: do not touch /boot/config/plugins-removed/ (Unraid-owned) # Note: user-exported JSON under /boot/config/nbdexport-config-*.json is left alone # Note: user qcow2/raw under /mnt/ are never deleted echo "NBD Export: removed." exit 0 ]]>