mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 06:51:16 +08:00
fix(install+update): add /usr/local/bin PATH guard for RHEL root non-login shells (#16191)
* fix(install): add /usr/local/bin PATH guard for RHEL root non-login shells The FHS-layout branch assumed /usr/local/bin is on PATH for every standard shell. That holds for login shells (via /etc/profile's pathmunge) but breaks on RHEL/CentOS/Rocky/Alma 8+ root in non-login interactive shells (su, sudo -s, tmux panes, some web terminals) — /etc/bashrc does not add /usr/local/bin and /root/.bash_profile doesn't either. Result: hermes command links to /usr/local/bin/hermes but the user has to type the absolute path each time. Probe a fresh 'bash -i -c' (non-login interactive, matching the user scenario) after symlinking. If hermes isn't resolvable, append an idempotent PATH guard to /root/.bashrc and /root/.bash_profile, same grep pattern already used by the ~/.local/bin branch below. No change on distros where /usr/local/bin is already inherited. * fix(update): repair RHEL root PATH on hermes update Existing RHEL/CentOS/Rocky/Alma root installs won't be repaired by the install.sh fix alone because 'hermes update' is an in-place git pull, not a rerun of install.sh. Port the same probe + idempotent .bashrc write into cmd_update so affected users get fixed automatically on next update. _ensure_fhs_path_guard() runs after 'Update complete!': - Linux + root + FHS-layout install (command at /usr/local/bin/hermes) only - Probe: env -i bash -i -c 'command -v hermes' — fresh non-login interactive shell, same scenario the user reports - On failure, append PATH guard to /root/.bashrc and /root/.bash_profile, skipping if any uncommented PATH line already mentions /usr/local/bin - Silent no-op on macOS, non-root, legacy layout, or shells that already resolve hermes
This commit is contained in:
@@ -1055,10 +1055,37 @@ setup_path() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
# FHS layout: /usr/local/bin is on PATH for every standard shell, nothing to inject.
|
||||
# FHS layout: /usr/local/bin is normally on PATH for login shells (via
|
||||
# /etc/profile pathmunge), but on RHEL/CentOS/Rocky/Alma 8+ non-login
|
||||
# interactive root shells (su, sudo -s, tmux panes, some web terminals)
|
||||
# only source /etc/bashrc, which does NOT add /usr/local/bin — and
|
||||
# /root/.bash_profile doesn't either. So verify with `command -v` and
|
||||
# fall back to writing a PATH guard into /root/.bashrc when needed.
|
||||
if [ "$ROOT_FHS_LAYOUT" = true ]; then
|
||||
export PATH="$command_link_dir:$PATH"
|
||||
log_info "/usr/local/bin is already on PATH for all shells"
|
||||
# Probe a fresh non-login interactive bash the way the user will use it.
|
||||
# `bash -i -c` sources ~/.bashrc but NOT ~/.bash_profile or /etc/profile,
|
||||
# which is the exact scenario where RHEL root loses /usr/local/bin.
|
||||
if env -i HOME="$HOME" TERM="${TERM:-dumb}" bash -i -c 'command -v hermes' \
|
||||
>/dev/null 2>&1; then
|
||||
log_info "/usr/local/bin is already on PATH for all shells"
|
||||
log_success "hermes command ready"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "hermes not on PATH in non-login shells (common on RHEL-family)"
|
||||
PATH_LINE='export PATH="/usr/local/bin:$PATH"'
|
||||
PATH_COMMENT='# Hermes Agent — ensure /usr/local/bin is on PATH (RHEL non-login shells)'
|
||||
for SHELL_CONFIG in "$HOME/.bashrc" "$HOME/.bash_profile"; do
|
||||
[ -f "$SHELL_CONFIG" ] || continue
|
||||
if ! grep -v '^[[:space:]]*#' "$SHELL_CONFIG" 2>/dev/null \
|
||||
| grep -qE 'PATH=.*(/usr/local/bin|\$command_link_dir)'; then
|
||||
echo "" >> "$SHELL_CONFIG"
|
||||
echo "$PATH_COMMENT" >> "$SHELL_CONFIG"
|
||||
echo "$PATH_LINE" >> "$SHELL_CONFIG"
|
||||
log_success "Added /usr/local/bin to PATH in $SHELL_CONFIG"
|
||||
fi
|
||||
done
|
||||
log_success "hermes command ready"
|
||||
return 0
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user