Skip to content

Commit cc41577

Browse files
DaveBuggclaude
andcommitted
release: v1.4.12
Hotfix: the update agent's systemd unit exec'd pitun-update.sh directly, but scripts ship non-executable (100644) and a source re-extraction on update drops +x — so the next update failed with status=203/EXEC and the UI Update button went dead. The unit now runs the script via bash, and pitun-update.sh is tracked executable so extraction preserves the bit. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 77be869 commit cc41577

4 files changed

Lines changed: 23 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,23 @@ All notable user-facing changes to PiTun. Full per-release detail lives in the
44
[GitHub Releases](https://github.com/DaveBugg/PiTun/releases); this file is the
55
committed summary.
66

7+
## v1.4.12 — 2026-08-04
8+
9+
Hotfix.
10+
11+
### Fixed
12+
13+
- **Self-update could brick itself after the first update.** The update
14+
agent's systemd unit executed `pitun-update.sh` directly, but the repo
15+
ships its scripts non-executable (`100644`) and a source re-extraction on
16+
update drops any `+x` bit — so the *next* update failed to spawn the agent
17+
with `status=203/EXEC` (`Permission denied`) and the UI Update button went
18+
dead. The unit now invokes the script via `bash` (no `+x` needed, matching
19+
every other script here), and `pitun-update.sh` is additionally tracked
20+
executable so extraction preserves the bit. Already-affected boxes need a
21+
one-time `chmod +x /opt/pitun/scripts/pitun-update.sh` (or the bash-unit
22+
edit) before they can update again.
23+
724
## v1.4.11 — 2026-08-04
825

926
Hotfix.

backend/app/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# OpenAPI metadata, `/health` response, and `/system/status` so the
66
# frontend can display it next to the xray version. Bump this on each
77
# release — frontend keeps its own version in `frontend/package.json`.
8-
APP_VERSION = "1.4.11"
8+
APP_VERSION = "1.4.12"
99

1010

1111
class Settings(BaseSettings):

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pitun-frontend",
33
"private": true,
4-
"version": "1.4.11",
4+
"version": "1.4.12",
55
"license": "BSD-3-Clause",
66
"type": "module",
77
"scripts": {

scripts/pitun-update.sh

100644100755
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,10 @@ After=network-online.target docker.service
460460
461461
[Service]
462462
Type=oneshot
463-
ExecStart=${self} --agent
463+
# Invoke via bash, not a direct exec: the repo ships scripts non-executable
464+
# (100644) and a source re-extraction on update drops any +x bit, which would
465+
# otherwise brick the agent with status=203/EXEC on the next update.
466+
ExecStart=/bin/bash ${self} --agent
464467
EOF
465468
cat >"/etc/systemd/system/pitun-update-agent.path" <<EOF
466469
[Unit]

0 commit comments

Comments
 (0)