diff --git a/modules/pi_control/pages/hosts.php b/modules/pi_control/pages/hosts.php index 5251de2..5200afb 100644 --- a/modules/pi_control/pages/hosts.php +++ b/modules/pi_control/pages/hosts.php @@ -47,10 +47,10 @@ if (isset($_GET['update_json'])) { $strictHostKey = !empty($settings['terminal_strict_hostkey']); $updateCmd = <<<'SH' -sh -lc 'if ! command -v apt-get >/dev/null 2>&1; then echo "__ERR__NO_APT"; exit 2; fi; if sudo apt update -qq >/dev/null 2>&1; then count=$(apt-get -s dist-upgrade | grep -c "^Inst "); if [ "$count" -gt 0 ]; then echo "__UPDATE__=1"; else echo "__UPDATE__=0"; fi; echo "__COUNT__=$count"; else echo "__ERR__APT_UPDATE"; exit 3; fi' +sh -lc 'if ! command -v apt-get >/dev/null 2>&1; then echo "__ERR__NO_APT"; exit 2; fi; if sudo -n apt update -qq >/dev/null 2>&1; then echo "__APT_UPDATE__=1"; else echo "__APT_UPDATE__=0"; fi; count=$(apt-get -s dist-upgrade 2>/dev/null | grep -c "^Inst "); echo "__COUNT__=$count"' SH; $upgradeCmd = <<<'SH' -sh -lc 'id="$(. /etc/os-release 2>/dev/null && echo "${ID:-}")"; current="$(. /etc/os-release 2>/dev/null && echo "${VERSION_CODENAME:-}")"; if [ "$id" != "debian" ] || [ -z "$current" ]; then echo "__ERR__NO_CODENAME"; exit 2; fi; latest="$( (command -v curl >/dev/null 2>&1 && curl -fsSL https://deb.debian.org/debian/dists/stable/Release) || (command -v wget >/dev/null 2>&1 && wget -qO- https://deb.debian.org/debian/dists/stable/Release) )"; latest="$(printf "%s" "$latest" | awk -F": " "/^Codename:/{print $2}")"; if [ -z "$latest" ]; then echo "__ERR__NO_LATEST"; exit 3; fi; if [ "$current" != "$latest" ]; then echo "__UPGRADE__=1"; else echo "__UPGRADE__=0"; fi' +sh -lc 'id="$(. /etc/os-release 2>/dev/null && echo "${ID:-}")"; current="$(. /etc/os-release 2>/dev/null && echo "${VERSION_CODENAME:-}")"; if [ "$id" != "debian" ] || [ -z "$current" ]; then echo "__UPGRADE__=0"; exit 0; fi; latest="$( (command -v curl >/dev/null 2>&1 && curl -fsSL https://deb.debian.org/debian/dists/stable/Release) || (command -v wget >/dev/null 2>&1 && wget -qO- https://deb.debian.org/debian/dists/stable/Release) )"; latest="$(printf "%s" "$latest" | awk -F": " "/^Codename:/{print $2}")"; if [ -z "$latest" ]; then echo "__UPGRADE__=0"; echo "__RAW__=NO_FETCH"; exit 0; fi; if [ "$current" != "$latest" ]; then echo "__UPGRADE__=1"; else echo "__UPGRADE__=0"; fi' SH; [$updExit, $updOut, $updErr] = runSshCommandCapture($host, $updateCmd, $strictHostKey, 20); @@ -58,7 +58,8 @@ SH; $updErrStr = (string)$updErr; $updateCount = null; $updatePreview = ''; - if ($updExit === 0 && !str_contains($updOutStr, '__ERR__')) { + $updateErr = str_contains($updOutStr, '__ERR__NO_APT'); + if ($updExit === 0 && !$updateErr) { if (preg_match('/^__COUNT__=(\d+)$/m', $updOutStr, $m)) { $updateCount = (int)$m[1]; } @@ -68,7 +69,8 @@ SH; $upgOutStr = (string)$upgOut; $upgErrStr = (string)$upgErr; $upgradeAvailable = null; - if ($upgExit === 0 && !str_contains($upgOutStr, '__ERR__')) { + $upgradeErr = str_contains($upgOutStr, '__ERR__'); + if ($upgExit === 0 && !$upgradeErr) { if (preg_match('/^__UPGRADE__=(0|1)$/m', $upgOutStr, $m)) { $upgradeAvailable = $m[1] === '1'; } @@ -77,9 +79,9 @@ SH; $driver = (string)$pdo->getAttribute(PDO::ATTR_DRIVER_NAME); $nowExpr = $driver === 'pgsql' ? 'NOW()' : "DATETIME('now')"; $updCountVal = $updateCount; - $updErrVal = $updExit === 0 && !str_contains($updOutStr, '__ERR__') ? null : trim($updErrStr ?: $updOutStr); + $updErrVal = $updExit === 0 && !$updateErr ? null : trim($updErrStr ?: $updOutStr); $upgAvailVal = $upgradeAvailable; - $upgErrVal = $upgExit === 0 && !str_contains($upgOutStr, '__ERR__') ? null : trim($upgErrStr ?: $upgOutStr); + $upgErrVal = $upgExit === 0 && !$upgradeErr ? null : trim($upgErrStr ?: $upgOutStr); $stmt = $pdo->prepare( 'UPDATE ' . $table('hosts') . ' SET update_checked_at = ' . $nowExpr . ', update_count = :update_count, @@ -106,12 +108,12 @@ SH; 'updates' => [ 'count' => $updateCount, 'preview' => $updatePreview, - 'error' => $updExit === 0 && !str_contains($updOutStr, '__ERR__') ? '' : trim($updErrStr ?: $updOutStr), + 'error' => $updExit === 0 && !$updateErr ? '' : trim($updErrStr ?: $updOutStr), ], 'os' => [ 'available' => $upgradeAvailable, 'raw' => $upgExit === 0 ? trim($upgOutStr) : '', - 'error' => $upgExit === 0 && !str_contains($upgOutStr, '__ERR__') ? '' : trim($upgErrStr ?: $upgOutStr), + 'error' => $upgExit === 0 && !$upgradeErr ? '' : trim($upgErrStr ?: $upgOutStr), ], 'checked_at' => date('c'), ]); diff --git a/tools/pi_control/check_updates.php b/tools/pi_control/check_updates.php index 6af68ed..908bc1f 100644 --- a/tools/pi_control/check_updates.php +++ b/tools/pi_control/check_updates.php @@ -14,10 +14,10 @@ $settings = modules()->settings($module); $strictHostKey = !empty($settings['terminal_strict_hostkey']); $updateCmd = <<<'SH' -sh -lc 'if ! command -v apt-get >/dev/null 2>&1; then echo "__ERR__NO_APT"; exit 2; fi; if sudo apt update -qq >/dev/null 2>&1; then count=$(apt-get -s dist-upgrade | grep -c "^Inst "); if [ "$count" -gt 0 ]; then echo "__UPDATE__=1"; else echo "__UPDATE__=0"; fi; echo "__COUNT__=$count"; else echo "__ERR__APT_UPDATE"; exit 3; fi' +sh -lc 'if ! command -v apt-get >/dev/null 2>&1; then echo "__ERR__NO_APT"; exit 2; fi; if sudo -n apt update -qq >/dev/null 2>&1; then echo "__APT_UPDATE__=1"; else echo "__APT_UPDATE__=0"; fi; count=$(apt-get -s dist-upgrade 2>/dev/null | grep -c "^Inst "); echo "__COUNT__=$count"' SH; $upgradeCmd = <<<'SH' -sh -lc 'id="$(. /etc/os-release 2>/dev/null && echo "${ID:-}")"; current="$(. /etc/os-release 2>/dev/null && echo "${VERSION_CODENAME:-}")"; if [ "$id" != "debian" ] || [ -z "$current" ]; then echo "__ERR__NO_CODENAME"; exit 2; fi; latest="$( (command -v curl >/dev/null 2>&1 && curl -fsSL https://deb.debian.org/debian/dists/stable/Release) || (command -v wget >/dev/null 2>&1 && wget -qO- https://deb.debian.org/debian/dists/stable/Release) )"; latest="$(printf "%s" "$latest" | awk -F": " "/^Codename:/{print $2}")"; if [ -z "$latest" ]; then echo "__ERR__NO_LATEST"; exit 3; fi; if [ "$current" != "$latest" ]; then echo "__UPGRADE__=1"; else echo "__UPGRADE__=0"; fi' +sh -lc 'id="$(. /etc/os-release 2>/dev/null && echo "${ID:-}")"; current="$(. /etc/os-release 2>/dev/null && echo "${VERSION_CODENAME:-}")"; if [ "$id" != "debian" ] || [ -z "$current" ]; then echo "__UPGRADE__=0"; exit 0; fi; latest="$( (command -v curl >/dev/null 2>&1 && curl -fsSL https://deb.debian.org/debian/dists/stable/Release) || (command -v wget >/dev/null 2>&1 && wget -qO- https://deb.debian.org/debian/dists/stable/Release) )"; latest="$(printf "%s" "$latest" | awk -F": " "/^Codename:/{print $2}")"; if [ -z "$latest" ]; then echo "__UPGRADE__=0"; echo "__RAW__=NO_FETCH"; exit 0; fi; if [ "$current" != "$latest" ]; then echo "__UPGRADE__=1"; else echo "__UPGRADE__=0"; fi' SH; $driver = (string)$pdo->getAttribute(PDO::ATTR_DRIVER_NAME); @@ -34,7 +34,8 @@ foreach ($hosts as $host) { $updErrStr = (string)$updErr; $updateCount = null; $updatePreview = ''; - if ($updExit === 0 && !str_contains($updOutStr, '__ERR__')) { + $updateErr = str_contains($updOutStr, '__ERR__NO_APT'); + if ($updExit === 0 && !$updateErr) { if (preg_match('/^__COUNT__=(\d+)$/m', $updOutStr, $m)) { $updateCount = (int)$m[1]; } @@ -44,14 +45,15 @@ foreach ($hosts as $host) { $upgOutStr = (string)$upgOut; $upgErrStr = (string)$upgErr; $upgradeAvailable = null; - if ($upgExit === 0 && !str_contains($upgOutStr, '__ERR__')) { + $upgradeErr = str_contains($upgOutStr, '__ERR__'); + if ($upgExit === 0 && !$upgradeErr) { if (preg_match('/^__UPGRADE__=(0|1)$/m', $upgOutStr, $m)) { $upgradeAvailable = $m[1] === '1'; } } - $updErrVal = $updExit === 0 && !str_contains($updOutStr, '__ERR__') ? null : trim($updErrStr ?: $updOutStr); - $upgErrVal = $upgExit === 0 && !str_contains($upgOutStr, '__ERR__') ? null : trim($upgErrStr ?: $upgOutStr); + $updErrVal = $updExit === 0 && !$updateErr ? null : trim($updErrStr ?: $updOutStr); + $upgErrVal = $upgExit === 0 && !$upgradeErr ? null : trim($upgErrStr ?: $upgOutStr); $stmt = $pdo->prepare( 'UPDATE ' . $table('hosts') . ' SET update_checked_at = ' . $nowExpr . ',