shadow's commonio_open() refuses to modify a user/group database whose
last line has no trailing newline, failing with a misleading
"cannot open /etc/passwd". Under 'set -e' this aborted the whole setup
at the fish step (and would later break docker's groupadd/usermod too).
- add ensure_db_trailing_newlines() to normalize /etc/passwd, /etc/group
and /etc/shadow before any user/group modification
- switch default shell via 'usermod -s' with a 'chsh' fallback, warning
instead of aborting the script on failure
Detect insufficient swap from RAM heuristics, suggest additional size,
and let the user create a persistent /swapfile during server setup.
Co-authored-by: Cursor <cursoragent@cursor.com>
Run visudo validation and sudoers.d checks with sudo so Debian no longer
fails with a false validation error. Prompt before installing Docker and
move AOSC Docker packages into the same optional install path.
Co-authored-by: Cursor <cursoragent@cursor.com>
Ubuntu 26.04+ ships Docker in its own repositories, so install
docker.io, docker-compose-v2, and docker-buildx directly from apt
instead of adding Docker's official repository. Falls back to the
official repo method for older Ubuntu versions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GIL contention after fork in ThreadPoolExecutor can cause os.execvp to fail.
Catch the exception so subprocess proceeds with its own exec, keeping
transcoding functional even if process renaming fails.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
execve with explicit paths fails on this system (linuxbrew symlink issue).
os.execvp in preexec_fn uses PATH lookup which works, and since it replaces
the child process before subprocess's own exec runs, pipes are inherited correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
/bin/sh doesn't exist on this system, sh is at /usr/bin/sh.
Use shutil.which to locate the shell at runtime.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
subprocess.Popen with executable= fails on linuxbrew due to symlink/execve
incompatibility. Use bash exec -a so ffmpeg is resolved via PATH instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop the setproctitle dependency. Use prctl(PR_SET_NAME) to change
/proc/self/comm and directly overwrite argv memory via Py_GetArgcArgv
to clear /proc/self/cmdline, so ps aux shows no arguments.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add -n/--process-name flag to set ffmpeg argv[0] alias (exec -a equivalent)
- Show real-time per-file progress via ffmpeg -progress pipe:1
- Use slot queue to manage per-worker tqdm bars (position 1..N)
- Add -pix_fmt yuv420p10le for 10-bit output
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Split curl download from bash execution so network errors are caught
explicitly. Add post-install verification that brew is actually
available before reporting success.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>