Format: ## YYYY-MM-DD (username) followed by bullet list of changes.
- Disabled broken ookla/speedtest-cli apt repo (no Release file for noble) → /etc/apt/sources.list.d/ookla_speedtest-cli.list.disabled
- Added Claude Code session detection to 05-pwrlab-sysinfo (MOTD) and pwrlab-status
Initial node setup and hardening
- Installed monitoring tools: btop, ncdu, iotop, vnstat, nethogs, smartmontools
- Installed security tools: fail2ban (SSH brute-force protection)
- Installed Node.js LTS and Claude Code (
@anthropic-ai/claude-code) - Enabled SSH keepalive (
ClientAliveInterval 60,ClientAliveCountMax 10) — fixes dropped connections - Configured fail2ban for SSH (5 failures / 10 min → 1h ban)
- Enabled vnstat (network traffic accounting on eno3)
- Enabled smartd (disk S.M.A.R.T. monitoring)
- Replaced MOTD with custom PWRLAB banner + dynamic sysinfo (01-pwrlab-banner, 05-pwrlab-sysinfo)
- Disabled noisy MOTD scripts: 00-header, 10-help-text, 50-landscape-sysinfo, 50-motd-news, 91-contract-ua-esm-status, 91-release-upgrade, 97-overlayroot
- Added admin scripts: pwrlab-status, pwrlab-maintenance, pwrlab-check-alerts, pwrlab-claude
- Added hourly health check cron job (/etc/cron.d/pwrlab-alerts → kagnapathy@ucsd.edu)
- Added /etc/skel dotfiles: .bashrc (aliases, git prompt, history), .vimrc, .tmux.conf
- Added /etc/profile.d/claude-code.sh (claude-list alias)
- Created lab user guide at /usr/local/share/pwrlab/user-guide.md
- Initialized this pwrlab-admin git repo for tracking all node changes
- Fixed
cat: /run/motd.dynamic: No such file or directoryerror on login - Removed broken
if whoami=pwrlabadmin; cat /run/motd.dynamicblock from /etc/profile - Changed PAM /etc/pam.d/sshd from
pam_motd.so noupdate→pam_motd.soso it actually runs the update-motd.d scripts and generates the file
- Set PrintMotd no in /etc/ssh/sshd_config Ubuntu's OpenSSH 9.6 suppresses PAM's pam_motd.so when PrintMotd yes to avoid double-printing; since /etc/motd is now empty, MOTD was silently dropped. Setting PrintMotd no lets PAM handle display exclusively via pam_motd.so.
- Added motd=/run/motd.dynamic to pam_motd.so line in /etc/pam.d/sshd