#! /bin/bash
#
# The System Manager
# An Administration Tool For UNIX
#
# Copyright (c) 1994 Stuart Herbert
# Released under the GNU GPL v2
#
# Bugs/comments/contributions to S.Herbert@Sheffield.ac.uk

function Aborted()
{
  Abort "User will not be created."
}

function GetUserName()
{
  while [ 0 ]; do
    Dialog --inputbox "Please enter the user name (ALPHANUMERICS only) :" 8 71 2> $SysmanFile1
    if [ -s $SysmanFile1 ]; then
      UserName="`cat $SysmanFile1`"
      InfoBox "Making sure that $UserName doesn't exist ..."
      grep ^$UserName: /etc/passwd > $SysmanFile1
      if [ -s $SysmanFile1 ]; then
	MsgBox "$UserName exists.  Please select a different user name."
      else
        return 0
      fi
    else
      Aborted
      return 1
    fi
  done
}

function GetRealName()
{
  Dialog --inputbox "Please enter their real name (ALPHANUMERICS only) :" 8 71 2> $SysmanFile1
  if [ -s $SysmanFile1 ]; then
    RealName="`cat $SysmanFile1`"
    return 0
  else
    Aborted
    return 1
  fi
}

function GetInitialGroup()
{
  SelectGroup "OneOfAll" "Which group will be $UserName's main group?" "$SysmanFile1" "$InitialGroup"
  if [ -s $SysmanFile1 ]; then
    InitialGroup="`cat $SysmanFile1`"
    return 0
  else
    Aborted
    return 1
  fi
}

function GetHomeDir()
{
  Dialog --inputbox "Please enter where $UserName's home directory will be created,\nor press ENTER for $HomeDir" 9 71 2> $SysmanFile1
  if [ -s $SysmanFile1 ]; then
    HomeDir="`cat $SysmanFile1`"
  fi
  return 0
}

function GetInitialShell()
{
  if [ -f $SysmanFile1 ]; then
    rm -f $SysmanFile1
  fi
  cat /etc/shells | while read x; do
    echo -n "$x $x " >> $SysmanFile1
  done
  Dialog --menu "Please select $UserName's shell." 20 71 13 `cat $SysmanFile1` 2> $SysmanFile1
  if [ -s $SysmanFile1 ]; then
    Shell="`cat $SysmanFile1`"
    return 0
  else
    Aborted
    return 1
  fi
}

function GetOtherGroups()
{
  SelectGroup "ManyOfAll" "Which groups will $UserName belong to?" "$SysmanFile1" "$GroupList"
  if [ -s $SysmanFile1 ]; then
    GroupList="`cat $SysmanFile1`"
    return 0;
  else
    Aborted
    return 1
  fi
}

function GetUID()
{
  if YesOrNo "Do you want to $UserName to have a particular user ID?" ; then
    Dialog --inputbox "Enter the user ID number, or press ENTER for the default." 8 71 2> $SysmanFile1
    if [ -s $SysmanFile1 ]; then
      UserID="`cat $SysmanFile1`"
      return
    fi
  fi
  UserID=""
}

function GetDefaults()
{
  InitialGroup="users"
  GroupList="users"
  HomeDir="/home/users"
}

function main()
{
  GetDefaults
  
  while [ 0 ]; do
    GetUserName ;     if [ $? -eq 1 ]; then return ; fi
    GetRealName ;     if [ $? -eq 1 ]; then return ; fi
    GetInitialGroup ; if [ $? -eq 1 ]; then return ; fi
    GetOtherGroups ;  if [ $? -eq 1 ]; then return ; fi
    GetHomeDir ;      if [ $? -eq 1 ]; then return ; fi
    GetInitialShell ; if [ $? -eq 1 ]; then return ; fi
    GetUID ;
  
    while [ 0 ]; do
      Dialog --menu "Please select an option." 16 71 9 \
      " USERNAME "     " $UserName " \
      " REALNAME "     " $RealName " \
      " INITIALGROUP " " $InitialGroup " \
      " GROUPS "       " $GroupList " \
      " HOMEDIR "      " $HomeDir " \
      " SHELL "        " $Shell " \
      " USERID "       " $UserID " \
      " CREATE "       " Create This User " \
      " ABORT "        " Quit And Don't Create " 2> $SysmanFile1
      if [ ! -s $SysmanFile1 ]; then
        Aborted
        return
      fi
      MenuSelection="`cat $SysmanFile1`"
      case "$MenuSelection" in
        " USERNAME ")
          GetUserName ; if [ $? -eq 1 ]; then return ; fi
          ;;
        " REALNAME ")
          GetRealName ; if [ $? -eq 1 ]; then return ; fi
 	  ;;
        " INITIALGROUP ")
          GetInitialGroup ; if [ $? -eq 1 ]; then return ; fi
	  ;;
        " GROUPS ")
          GetOtherGroups ; if [ $? -eq 1 ]; then return ; fi
	  ;;
        " HOMEDIR ")
          GetHomeDir ; if [ $? -eq 1 ]; then return ; fi
  	  ;;
        " SHELL ")
          GetInitialShell ; if ] $? -eq 1 ]; then return ; fi
	  ;;
        " USERID ")
          GetUID
	  ;;
        " CREATE ")
          InfoBox "Creating $UserName ... please wait"
          echo -n "useradd -d $HomeDir/$UserName -g $InitialGroup -m -s $Shell -c \"$RealName\" " > $SysmanFile1
	  if [ ! "$GroupList" = "" ]; then
	    echo -n "-G \"`echo $GroupList | tr "\040" ","`\" " >> $SysmanFile1
	  fi
	  if [ ! "$UserID" = "" ]; then
	    echo -n "-u $UserID" >> $SysmanFile1
	  fi
	  echo "$UserName" >> $SysmanFile1
	  . $SysmanFile1
	  if [ -f $HomeDir/$UserName.tar.gz ]; then
	    if YesOrNo "Restore $UserName's saved files?" ; then
	      InfoBox "Restoring files ... please wait"
	      pushd . > /dev/null
	      cd $HomeDir
	      tar zxf $UserName.tar.gz
	      cd $UserName
	      find . ! -user "root" -exec chown $UserName.$InitialGroup {} \;
	      MsgBox "Files have been restored."
	    else
	      MsgBox "Files have not been restored."
	    fi
	  else
	    MsgBox "Files have not been restored."
 	  fi
	  clear
	  echo "Please set $UserName's password"
	  passwd $UserName
	  if YesOrNo "Do you want to create another user?" ; then
	    break
	  else
	    return
	  fi
	  ;;
        " ABORT ")
          Aborted
          return
	  ;;
        *)
          return
	  ;;
      esac
    done
  done
}

# main code
if [ -n "$1" ]; then
  case "$1" in
    --SysmanInstall)
      echo "Y : Y : CREATE : Create A New User :$0"
      exit
      ;;
    --SysmanAuthor)
      echo "CREATE : Create A New User"
      echo "Copyright (c) 1994 Stuart Herbert"
      exit
      ;;
  esac
else
  main
fi

# clean up here
for x in $SysmanFile1 $SysmanFile2 $SysmanFile3 ; do
  if [ -f $x ]; then rm -f $x ; fi
done

# that's it, folks
