alarm-tegra-x1 / rootfs/alarm-init.sh

raw file 3700 bytes
#!/bin/sh
# ALARM post-handover init, run as PID 1 after /sbin/init has mounted the
# filesystems and built the USB console gadget.
#
# Installed into the root filesystem by alarm-build. Everything is logged to
# /dev/kmsg (so it appears in dmesg and in the ramoops pstore region) and to
# /var/log/alarm-init.log on the root filesystem, and the full state is
# published to the FAT boot partition where a PC can read it.

LOG=/var/log/alarm-init.log
FAT=/mnt/boot

mkdir -p /var/log 2>/dev/null

say() {
	echo "[alarm-up] $*" > /dev/kmsg 2>/dev/null
	echo "[alarm-up] $*" >> "$LOG" 2>/dev/null
}

publish() {
	mkdir -p "$FAT" 2>/dev/null
	if mount /dev/mmcblk0p1 "$FAT" 2>/dev/null; then
		{
			echo "=== alarm-up: $1 ==="
			echo "uptime : $(cat /proc/uptime)"
			echo
			echo "--- processes ---"
			for p in /proc/[0-9]*; do
				printf '%-8s %s\n' "${p#/proc/}" "$(cat "$p/comm" 2>/dev/null)"
			done
			echo
			echo "--- ttyGS ---"
			ls -l /dev/ttyGS* 2>&1
			echo
			echo "--- UDC state ---"
			cat /sys/class/udc/*/state 2>&1
			echo
			echo "--- log ---"
			cat "$LOG" 2>/dev/null
			echo
			echo "--- dmesg tail ---"
			dmesg | tail -40
		} > "$FAT/ALARM_UP.txt" 2>&1
		sync
		umount "$FAT" 2>/dev/null
	fi
}

say "starting, uptime $(cat /proc/uptime)"
say "ttyGS nodes: $(ls /dev/ttyGS* 2>&1)"

# --- serial console ---------------------------------------------------------
# Run an interactive shell with stdin, stdout and stderr all bound explicitly to
# the gadget serial port.
#
# This replaces `agetty -n -l /bin/bash ttyGS0`, which produced a prompt but no
# command output: input reached the shell, but its output never came back down
# the port. Binding the three descriptors explicitly is far more predictable.
#
# stty sane restores the default line discipline, including ICRNL, so a carriage
# return from the host terminal is translated to a newline and actually submits
# the line. Without it a CR-only terminal leaves every command unsubmitted.
if [ -e /dev/ttyGS0 ]; then
	if command -v stty >/dev/null 2>&1; then
		stty -F /dev/ttyGS0 sane 2>/dev/null
		say "stty sane applied to ttyGS0"
	fi

	# A startup file for the console shell. Bash enables bracketed paste by
	# emitting ESC[?2004h; minicom echoes that partially and the stray fragment
	# gets executed as a command (it shows up as a bogus ":s" substitution
	# error on connect). Turning it off keeps the session clean.
	printf "bind 'set enable-bracketed-paste off' 2>/dev/null\n" \
		> /etc/alarm-console.bashrc 2>/dev/null

	if command -v setsid >/dev/null 2>&1; then
		setsid /bin/bash --rcfile /etc/alarm-console.bashrc -i \
			< /dev/ttyGS0 > /dev/ttyGS0 2>&1 &
		say "started bash on ttyGS0 via setsid"
	else
		( /bin/bash --rcfile /etc/alarm-console.bashrc -i \
			< /dev/ttyGS0 > /dev/ttyGS0 2>&1 ) &
		say "started bash on ttyGS0 in the background"
	fi
else
	say "no /dev/ttyGS0 - the USB gadget produced no serial port"
fi

publish "after console start"

# --- network ----------------------------------------------------------------
say "bringing up WiFi"
modprobe brcmfmac 2>/dev/null
if [ -f /etc/wpa_supplicant/wpa_supplicant.conf ]; then
	pkill wpa_supplicant 2>/dev/null
	wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
	say "wpa_supplicant started"
else
	say "no /etc/wpa_supplicant/wpa_supplicant.conf - skipping WiFi"
fi
# dhcpcd blocks until it has a lease, so run it detached.
( dhcpcd wlan0 >/dev/null 2>&1 & )
say "dhcpcd started detached"

# --- ssh --------------------------------------------------------------------
mkdir -p /run/sshd
pkill sshd 2>/dev/null
/usr/sbin/sshd 2>/dev/null
say "sshd exit code: $?"

publish "final"

say "ALARM up at $(date)"
exec /bin/sh