#!/bin/bash
# Author: Steven Shiau <steven _at_ nchc org tw>
# License: GPL 
# Description: DRBL utitilty to change plugdev and audio device
# Ref: http://drbl.sourceforge.net/faq/index.php#path=./2_System&entry=05_usb_sound.faq

# Load DRBL setting and functions
. /opt/drbl/sbin/drbl-conf-functions
# Some default setting for Debian
DEBIAN_GID_START="1000"
DEBIAN_PLUGDEV_GID="46"

prog="$(basename $0)"
usage() {
  echo "Enable or disable audio and plugdev open to all users."
  echo "Usage: $0 [Options]"
  echo "Options:"
  language_help_prompt_by_idx_no
  echo "-a, --enable-audio: Enable audio open to all users"
  echo "-d, --disable-audio: Disable audio open to all users"
  echo "-n, --no-update-yp: Do NOT update YP/NIS"
  echo "-p, --enable-plugdev: Enable plugdev open to all users"
  echo "-r, --no-reboot-prompt: Do NOT print the reboot or restart service promt"
  echo "-u, --disable-plugdev: Disable plugdev open to all users"
  echo "-v, --verbose    Prints out verbose information"
  echo 
  echo "Ex:"
  echo "$0 -a -p"
}

# functions
enable_audio_dev() {
# use $drbl_common_root/etc/init.d/udev as a reference for all clients
if [ -e $drbl_common_root/etc/init.d/udev ]; then
  # It's usev for DRBL client
  for ihost in $drbl_common_root/ $drblroot/*; do
    if [ -f "$ihost/etc/udev/permissions.rules" ]; then
      for idev in dsp mixer; do
        if ! grep -q "^[[:space:]]*KERNEL=\"$idev\"" $ihost/etc/udev/permissions.rules; then
          echo "KERNEL=\"$idev\", MODE=\"0666\", GROUP=\"root\"" >> $ihost/etc/udev/permissions.rules
        fi
      done
    fi
  done
else
  # No usev for DRBL client, use dev tarball
  for ihost in $drbl_common_root/ $drblroot/*; do
    mkdir -p $ihost/etc/rc.boot/
    cat <<-EXTRA_RCBOOT_END > $ihost/etc/rc.boot/open_audio
#!/bin/sh
chmod 666 /dev/dsp* /dev/mixer*
EXTRA_RCBOOT_END
    chmod 755 $ihost/etc/rc.boot/open_audio
  done
fi
} # end of enable_audio_dev

#
disable_audio_dev() {
  for ihost in $drbl_common_root/ $drblroot/*; do
    # case 1, udev
    if [ -f "$ihost/etc/udev/permissions.rules" ]; then
      for idev in dsp mixer; do
        if grep -q "^[[:space:]]*KERNEL=\"$idev\"" $ihost/etc/udev/permissions.rules; then
          sub_cmd="s/^(KERNEL=\"$idev\", MODE=\"0666\", GROUP=\"root\")//g"
          perl -p -i -e "$sub_cmd" $ihost/etc/udev/permissions.rules
        fi
      done
    fi
    # case 2, use dev tarball
    [ -f $ihost/etc/rc.boot/open_audio ] && rm -f $ihost/etc/rc.boot/open_audio
  done
} # end of enable_audio_dev

enable_plugdev() {
  # Ref: man pmount
  if [ -z "$(grep "^plugdev" /etc/group)" ]; then
    echo "Group plugdev does NOT exist! Skip open plugdev!"
    return 1
  fi
  if [ ! -x /usr/bin/pmount -o ! -x /usr/bin/pumount ]; then
    echo "/usr/bin/pmount or /usr/bin/pumount does NOT exist! Skip open plugdev!"
    return 1
  fi
  # The original GID is samller than 1000 (in Debian)
  used_GID="$(awk -F ":" '{print $3}' /etc/group | sort -g)"
  gid="$DEBIAN_GID_START"
  while `echo $used_GID | grep -q "$gid"`; do
     gid=$((gid + 1))
  done
  AVAILABLE_GID=$gid
  # Add it, now the GID will > 1000
  groupmod -g $AVAILABLE_GID plugdev
  common_users="$($DRBL_SCRIPT_PATH/bin/get_common_usersname 2>/dev/null)"
  for iuser in $common_users; do
    [ "$iuser" != "nobody" -a -z "$(groups $iuser | grep plugdev)" ] && adduser $iuser plugdev	
  done
  chgrp plugdev /usr/bin/pmount /usr/bin/pumount
  chmod u+s /usr/bin/pmount /usr/bin/pumount
  for ihost in $drbl_common_root/ $drblroot/*; do
    if [ -f $ihost/etc/group ]; then
      perl -p -i -e 's/^(plugdev.*)/#$1/g' $ihost/etc/group
    fi
  done
} # end of enable_plugdev

disable_plugdev() {
  # Ref: man pmount
  if [ -z "$(grep "^plugdev" /etc/group)" ]; then
    echo "Group plugdev does NOT exist! Skip open plugdev!"
    return 1
  fi
  if [ ! -x /usr/bin/pmount -o ! -x /usr/bin/pumount ]; then
    echo "/usr/bin/pmount or /usr/bin/pumount does NOT exist! Skip open plugdev!"
    return 1
  fi
  # Modify it, now the GID is 46 (original one)
  groupmod -g $DEBIAN_PLUGDEV_GID plugdev
  
  chgrp plugdev /usr/bin/pmount /usr/bin/pumount
  chmod u+s /usr/bin/pmount /usr/bin/pumount
  for ihost in $drbl_common_root/ $drblroot/*; do
    if [ -f $ihost/etc/group ]; then
      perl -p -i -e 's/^#(plugdev.*)/$1/g' $ihost/etc/group
    fi
  done
} # end of disable_plugdev

#
check_if_root

#
while [ $# -gt 0 ]; do
  case "$1" in
    -a|--enable-audio) shift; AUDIO_MODE="enable-audio" ;;
    -d|--disable-audio) shift; AUDIO_MODE="disable-audio" ;;
    -l|--language)
			shift; specified_lang="$1"
			shift;;
    -n|--no-update-yp:) shift; YP_UPDATE="no" ;;
    -p|--enable-plugdev:) shift; PLUGDEV_MODE="enable-plugdev" ;;
    -r|--no-reboot-prompt) shift; RESTART_PROMPT="no" ;;
    -u|--disable-plugdev) shift; PLUGDEV_MODE="disable-plugdev" ;;
    -v|--verbose) shift; VERBOSE="on" ;;
    -*)		echo "${0}: ${1}: invalid option" >&2
		usage >& 2
		exit 2 ;;
    *)		break ;;
  esac
done

#
if [ ! -e /etc/debian_version ]; then
   echo "This is not Debian Linux! This program only works in Debian Linux!!! Program terminated!"
   exit 1
fi
#
ask_and_load_lang_set $specified_lang

[ -z "$AUDIO_MODE" -a -z "$PLUGDEV_MODE" ] && usage && exit 1

echo "$msg_delimiter_star_line"
# Part 1: For audio device: dsp mixer
case "$AUDIO_MODE" in
  enable-audio)
     echo "$msg_make_audio_open"
     enable_audio_dev
     ;;
  disable-audio)
     echo "$msg_make_audio_close"
     disable_audio_dev
     ;;
esac
# Part II: For group plugdev
case "$PLUGDEV_MODE" in
  enable-plugdev)
     echo "$msg_make_plugdev_open"
     enable_plugdev
     ;;
  disable-plugdev)
     echo "$msg_make_plugdev_close"
     disable_plugdev
     ;;
esac

# update YP
if [ "$YP_UPDATE" != "no" ]; then
  echo "$msg_delimiter_star_line"
  echo "Updating the YP/NIS for group plugdev..."
  make -C /var/yp &>/dev/null
fi

# restart prompt
if [ "$RESTART_PROMPT" != "no" ]; then
  if [ -n "$AUDIO_MODE" ]; then
    echo "$msg_delimiter_star_line"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
    echo "$msg_restart_prompt_for_audio"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  fi
  if [ -n "$PLUGDEV_MODE" ]; then
    echo "$msg_delimiter_star_line"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
    echo "$msg_restart_prompt_for_plugdev"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  fi
fi

[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
[ -n "$PLUGDEV_MODE" ] && echo "$msg_run_update_plugdev_again: \"$DRBL_SCRIPT_PATH/sbin/$prog -p\"" 
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
