Permalink
#!/bin/bash | |
# Script by AndrewS to make it easier to enable/disable the serial console | |
# (which allows the UART to be used by other programs) | |
# version 1.1 - better error handling | |
ACTION=$1 | |
BAUDRATE=${2:-115200} | |
UART=ttyAMA0 | |
CMDLINE=/boot/cmdline.txt | |
INITTAB=/etc/inittab | |
if [[ ! -f "$CMDLINE" ]]; then | |
echo "$CMDLINE is missing" 1>&2 | |
exit 1 | |
fi | |
if [[ ! -f "$INITTAB" ]]; then | |
echo "$INITTAB is missing" 1>&2 | |
exit 1 | |
fi | |
CMDLINE_STATUS=disabled | |
if [[ $(grep $UART "$CMDLINE") ]]; then | |
CMDLINE_STATUS=enabled | |
fi | |
INITTAB_STATUS=disabled | |
if [[ $(grep -v ^# "$INITTAB" | grep $UART) ]]; then | |
INITTAB_STATUS=enabled | |
fi | |
LIVE_STATUS=disabled | |
if [[ $(grep $UART /proc/cmdline) ]]; then | |
LIVE_STATUS=enabled | |
fi | |
if [[ $CMDLINE_STATUS != $INITTAB_STATUS ]]; then | |
echo "Inconsistent status! $CMDLINE is $CMDLINE_STATUS, but $INITTAB is $INITTAB_STATUS" 1>&2 | |
exit 1 | |
fi | |
if [[ "$ACTION" != "enable" && "$ACTION" != "disable" && "$ACTION" != "status" ]]; then | |
echo "Missing / incorrect command-line argument. Use enable, disable or status" 1>&2 | |
exit 1 | |
fi | |
if [[ $ACTION == status ]]; then | |
if [[ $CMDLINE_STATUS != $LIVE_STATUS ]]; then | |
echo "Serial console on /dev/$UART will be $CMDLINE_STATUS after the next reboot" | |
else | |
echo "Serial console on /dev/$UART is $CMDLINE_STATUS" | |
fi | |
else | |
if [[ $EUID -ne 0 ]]; then | |
echo "Serial console can only be ${ACTION}d by root user" 1>&2 | |
exit 1 | |
fi | |
if [[ ${ACTION}d == $CMDLINE_STATUS ]]; then | |
echo "Serial console is already ${ACTION}d" | |
else | |
if [[ ! -f "${CMDLINE}.bak" ]]; then | |
cp "$CMDLINE" "${CMDLINE}.bak" | |
fi | |
if [[ ! -f "${INITTAB}.bak" ]]; then | |
cp "$INITTAB" "${INITTAB}.bak" | |
fi | |
CMDLINE_CONTENTS=$(cat "$CMDLINE") | |
TMPFILE="${INITTAB}.tmp" | |
grep -v $UART "$INITTAB" > "$TMPFILE" | |
if [[ $ACTION == enable ]]; then | |
echo "T0:23:respawn:/sbin/getty -L $UART $BAUDRATE vt100" >> "$TMPFILE" | |
mv "$TMPFILE" "$INITTAB" | |
echo "$CMDLINE_CONTENTS console=$UART,$BAUDRATE kgdboc=$UART,$BAUDRATE" > "$CMDLINE" | |
else | |
echo "#serial getty on $UART removed by "$(basename $0) >> "$TMPFILE" | |
mv "$TMPFILE" "$INITTAB" | |
NEW_CMDLINE_CONTENTS= | |
for p in $CMDLINE_CONTENTS; do | |
if [[ ${p%%=*} == console || ${p%%=*} == kgdboc ]]; then | |
if [[ $(echo ${p#*=} | grep $UART) ]]; then | |
continue | |
fi | |
fi | |
if [[ "$NEW_CMDLINE_CONTENTS" != "" ]]; then | |
NEW_CMDLINE_CONTENTS="$NEW_CMDLINE_CONTENTS " | |
fi | |
NEW_CMDLINE_CONTENTS="$NEW_CMDLINE_CONTENTS$p" | |
done | |
echo "$NEW_CMDLINE_CONTENTS" > "$CMDLINE" | |
fi | |
REBOOT_NEEDED= | |
if [[ ${ACTION}d != $LIVE_STATUS ]]; then | |
REBOOT_NEEDED=", a reboot is required to make this take effect" | |
fi | |
echo "Serial console has been ${ACTION}d$REBOOT_NEEDED" | |
fi | |
fi |