#!/bin/sh

. /usr/lib/lib-fliwi/ymc-common.sh || exit 1


### SOME NEEDED VARS AND TESTS //start
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$

system_titel="Fliwi Console Server"

dialog=$(which dialog)
if [ "$dialog" = '' ]; then
  ymc_exit_fatal "ERROR: Missing command 'dialog'" 1>&2
fi

FLIWI_USER=$(echo "$1" | sed -r 's/[^a-zA-Z0-9_-]//g')
### SOME NEEDED VARS AND TESTS //end


### CHECK IF WE HAVE A USER //start
if [ -z "$FLIWI_USER" ]; then
  ymc_exit_fatal "Can not identify your account"
  exit 1
fi
### CHECK IF WE HAVE A USER //end

ymc_check_for_terminal()
{
  if [ -z "$TERM" ] || \
     [ "$TERM" = "dumb" ] || \
     [ $(env | grep -c -E -e '^TERM=') -ne 1 ]; then
    ymc_exit_fatal "No tty allocated - please re-open the connection providing a a pty"
    exit 1
  fi
}

main()
{
  trap do_sigint INT
  ymc_check_for_terminal

  if [ "$SSH_ORIGINAL_COMMAND" != "" ]; then
    open_console "$SSH_ORIGINAL_COMMAND"
  else
    ask_for_console
  fi
  do_exit 0
}

open_console()
{
  local console_to_open="$1"
  local users_allowed="$(fliwi-get-human-admins --hostname $console_to_open)"
  if [ $? -ne 0 ] || \
     [ -z "$users_allowed" ]; then
    ymc_exit_fatal "Can not get allowed user for '$console_to_open'"
  else
    users_allowed="$(echo $users_allowed)"
  fi


  if [ $(ymc_contains "$FLIWI_USER" "$users_allowed") -ne 1 ]; then
    ymc_exit_fatal "Your user '$FLIWI_USER' is not allowed to access '$console_to_open'"
  fi

  ymc_info_msg "Accessing console '$console_to_open'...
# Once the connection is established, you can press
#    '<ctrl>+e' followed by 'c', followed by '?' for some help or
#     <ctrl>+e c p to playback the latest output or
#     <ctrl>+e c . to close the connection to the console"

   sleep 0.2

  fakechroot -s /usr/sbin/chroot -- /usr/share/fliwi-console-server/fakechroot /usr/bin/console -M 127.0.0.1 -l "$FLIWI_USER" "$console_to_open"
}

ask_for_console()
{
  local retval choice items_for_dialog
  local temp_counter=0

  for info in $(LC_ALL=C console -i -M 127.0.0.1 | \
                           grep -E -e '^([^:]*:){14}\\n' | \
                           cut -d ',' -f 1 --only-delimited | \
                           sort -V | \
                           uniq)
  do
    console=$(echo $info | cut -d : -f 1 -s)
    if [ $(echo $console | grep -c -E -e '^FLIWI-INFO-' ) -eq 1 ] || \
       [ $(echo $console | grep -c -E -e '^FLIWI-LOCAL-' ) -eq 1 ] || \
       [ $(echo $console | grep -c -E -e '^FLIWI-REMOTE-' ) -eq 1 ] || \
       [ $(echo $console | grep -c -E -e '-info$' ) -eq 1 ]; then
      continue
    fi
    temp_counter=$(expr $temp_counter + 1)
    items_for_dialog=$items_for_dialog" $temp_counter $console"
  done

  $dialog --clear \
          --cancel-label 'Exit' \
          --title " $system_titel -> Welcome $YMC_USER " \
          --menu "Please choose a console to connect to:" 0 0 0 \
  ""                    "--- Please choose ----------------------------------------------------------" \
  $items_for_dialog \
  ""             "" 2> $tempfile

  retval=$?
  choice=`cat $tempfile`

  clear

  case $retval in
    0)
      if [ "$choice" != '' ]; then
        choosen_console=$(echo $items_for_dialog | sed -r 's/([0-9]+ [^ ]+)/\n\1/g' | grep -E -e "^$choice[ ]" | cut -d ' ' -f 2)
        if [ -z "$choosen_console" ]; then
          ymc_exit_fatal "Function 'ask_for_console()' is broken [1]"
        fi
        open_console $choosen_console
        do_exit 0
      fi
      ask_for_console
    ;;

    *)
      clear
      do_exit 0
    ;;
  esac

  ymc_exit_fatal "Function 'ask_for_console()' is broken [2]"
}

do_exit()
{
  if [ -f "$tempfile" ]; then
    rm -f $tempfile
  fi
  if [ "$1" = '' ]; then
    exit_code=4
  else
    exit_code=$1
  fi

  case $exit_code in
    0)
      echo "" 1>&2
      echo "Connection ended... Good bye!" 1>&2
      echo "" 1>&2
    ;;

    1)
      echo "" 1>&2
      echo "An error occured...!" 1>&2
      echo "" 1>&2
    ;;

    2)
      echo "" 1>&2
      echo "Aborted by user... Good bye!" 1>&2
      echo "" 1>&2
    ;;

    3)
      echo "" 1>&2
      echo -n "Internal error occured... " 1>&2
      sleep 1
      echo "Aborting to prevent further damage!" 1>&2
      echo "" 1>&2
    ;;

    4)
      echo "" 1>&2
      echo "Ended with internal reason provided..." 1>&2
      echo "" 1>&2
    ;;

    *)
      echo "" 1>&2
      echo "Ended with exit-code $exit_code..." 1>&2
      echo "" 1>&2
    ;;
  esac
  exit $exit_code
}

do_sigint()
{
  do_exit 2
}

main

exit 1

