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

set -h

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = Message to display

function Abort()
{
  if [ "$SysmanDialog" = "0.3" ]; then
    dialog --title "OPERATION ABORTED" --msgbox "\n$1" 7 71
  else
    dialog --title "OPERATION ABORTED" --backtitle "$SysmanBackTitle" --msgbox "\n$1" 7 71
  fi
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $@ = Command line

function Dialog()
{
  if [ "$SysmanDialog" = "0.3" ]; then
    dialog --title "$SysmanTitle" "$@"
  else
    dialog --title "$SysmanTitle" --backtitle "$SysmanBackTitle" "$@"
  fi
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = Message to display

function InfoBox()
{
  Dialog --infobox "\n$1" 5 71
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = Menu to display

function Menu()
{
  while [ 0 ]; do
    . $1
  done
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = Message to display

function MsgBox()
{
  Dialog --msgbox "\n$1" 7 71
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = OneOfAll, ManyOfAll, OneOfMine, ManyOfMine
# $2 = Message To Display
# $3 = File to dump it into
# $4 = Already selected groups

function SelectGroup()
{
  local x
  local y
  
  if [ -f $3 ]; then
    rm -f $3
  fi
  
  touch $3
  
  InfoBox "Creating list of groups ... please wait"
  
  case "$1" in
    "OneOfAll")
      sort /etc/group | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --radiolist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    "ManyOfAll")
      sort /etc/group | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --checklist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    "OneOfMine")
      sort /etc/group | grep $USER | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --radiolist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    "ManyOfMine")
      sort /etc/group | grep $USER | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --checklist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    *)
      Abort "Unknown option $1"
      return
  esac
  if [ -s $3 ]; then
    MenuLine="`cat $3 | tr -d "\042" `"
    `echo "$MenuLine" > $3`
  fi
}
#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = OneOfAll, ManyOfAll
# $2 = Message To Display
# $3 = File to dump it into
# $4 = Already selected users

function SelectUser()
{
  local x
  local y
  
  if [ -f $3 ]; then
    rm -f $3
  fi
  
  touch $3
  
  InfoBox "Creating list of users ... please wait"
  
  case "$1" in
    "OneOfAll")
      sort /etc/passwd | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else 
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --radiolist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    "ManyOfAll")
      sort /etc/passwd | while read x; do
        MenuLine="`echo $x | cut -s -d : -f 1`"
	if [ "$4" = "" ]; then
	  `echo -n "$MenuLine $MenuLine off ">> $3`
	else
	  for y in $4 ; do
	    if [ "$MenuLine" = "$y" ]; then
	      `echo -n "$MenuLine $MenuLine on " >> $3`
	    else
	      `echo -n "$MenuLine $MenuLine off ">> $3`
	    fi
	  done
	fi
      done
      MenuLine="`cat $3`"
      Dialog --checklist "$2" 20 71 13 $MenuLine 2> $3
      ;;
    *)
      Abort "Unknown option $1"
      return
  esac
  if [ -s $3 ]; then
    MenuLine="`cat $3 | tr -d "\042" `"
    `echo "$MenuLine" > $3`
  fi
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = File to display

function TextBox()
{
  Dialog --textbox "$1" 20 76
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# $1 = Question to ask

function YesOrNo()
{
  Dialog --yesno "\n$1" 7 71
}

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# exported functions

export -f Abort				# Display abort dialog
export -f Dialog			# Call dialog(1)
export -f InfoBox			# Display dialog box and continue
export -f Menu				# Walk the menu files
export -f MsgBox			# Display dialog and wait for OK
export -f SelectGroup			# Select a group(s)
export -f SelectUser			# Select a user(s)
export -f TextBox			# Display a file
export -f YesOrNo			# Ask a question

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# create some variables

# directory where required support binaries live
bin="/var/adm/sysman/bin"

#SysmanDialog="0.3"			# uncomment this if using v0.3
SysmanDialog="0.4"			# I use v0.4, which I uploaded to
					# sunsite.unc.edu

# temporary files, for whatever use we can find.
# there must be a better way to create these than calling RANDOM :-)

SysmanFile1="/tmp/sysman.$USER.$RANDOM"
SysmanFile2="/tmp/sysman.$USER.$RANDOM"
SysmanFile3="/tmp/sysman.$USER.$RANDOM"

# directory where the user ran this
SysmanStartDir="`pwd`"

# current version number
SysmanVersion="0.1.1"

# title for dialog boxes
SysmanBackTitle="The System Manager v$SysmanVersion (June 1994) - $USER@$HOST"
SysmanTitle="The System Manager"

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# exported variables

export bin
export SysmanBackTitle
export SysmanDialog				# you shouldn't need this
export SysmanFile1
export SysmanFile2
export SysmanFile3
export SysmanStartDir
export SysmanTitle

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# ok, let's get down to business

pushd . > /dev/null				# we change directory
cd /var/adm/sysman

if [ $# -eq 0 ]; then				# no command line parameters
  cd modules
  if [ $UID -eq 0 ]; then			# you're root
    Menu Root.menu				# run root's menu
  else
    Menu User.menu				# run non-root's menu
  fi
else
  cd "$1"					# change to specified directory
  shift						# get rid of $1
  "$@"						# execute the command line
fi

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
# clear up behind up

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

#--*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*-- --*--
