#!/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