>  > I also was looking around for examples of standard "adduser" 
>  > scripts that had been modified for use with qmail.


Do you want the whole thing or just the relevant parts?

BTW: *DO* *NOT* run this script on your system -- it's is completely
customized for an ISP.  I don't have a way of having tthe script show
the commands that it is issuing without actually issuing them (ie: set
-x) -- I guess I should build that into the script.  This script took an
ISP from manually creating accounts that required work on 2 or more
machines to one machine and the time required down from 30+ minutes per
account to mere seconds.  The best part is that all the accounts are
created the same way -- no mistakes from manual effort.

People seem to get a kick out of my shell scripting "technique" ...  so
I thought I'd pass this along.  Of course, this script isn't finished --
but it's been in use for a while now. 

I'm having a bit of trouble getting a value from a sub processes with a
timeout (ie: wait/kill/signal -- ie get the dns servers from internic --
when internic of the net is slow).  Other than that, this script has
served me well for a while now.  You said you wanted an example -- and
there might be some useful tidbits here if you're into shell scripting
and willing to dig a little. 

Scott
ps: *enjoy*

--------[ CUT HERE 8< ]--------------------------------------------------


#!/bin/sh -                                     # mongo

CREDITS="
    _________ __________  _____.___.     ________    __________    ________
   /   _____/ \______   \ \__  |   |     \_      \   \______   \  /  _____/
   \_____  \   |     ___/  /   |   |      /   |   \   |       _/ /   \  ___
   /        \  |    |      \____   |     /    |    \  |    |   \ \    \_\  \ 
  /_______  /  |____|      / ______|  /\ \_______  /  |____|_  /  \______  /
          \/               \/         \/         \/          \/          \/
 (C) Copyright 1998 Scott D. Yelich                    ALL RIGHTS RESERVED
 P.O. Box 5178, Santa Fe, NM 87502-5178
 E-Mail [EMAIL PROTECTED] URL http://www.spy.org

 mongo v0.12 08/20/98 - 09/30/98
"
                                                # 
case " $@ " in                                  # quick hack to get debug on
 *" -debug "* | *" -bug "* |*" -d "*) set -x;;  #  debug parameter passed?
esac                                            # end of case
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
# v0.01                                         # Mon Aug 10 16:34:52 MDT 1998
# v0.02                                         # Thu Aug 27 10:39:13 MDT 1998
# v0.03                                         # Fri Sep  4 13:51:38 MDT 1998
#       menu
# v0.04                                         # Wed Sep  9 11:52:32 MDT 1998
#       setupDNS, lcase, ucase, promptinput
#       pressreturn, MONGOLIB

#
# v0.05                                         # Thu Sep 10 11:31:45 MDT 1998
# v0.06  change from rcpthosts.save to rcpthosts# Jan 16


#       checkAccount, getHomeDir, getUserShell

#       checkFile, checkDir, checkLink
#       getDOTQmail, getDNSSERVERS, getMX
#       checkZoneFile, checkQMVD, getIP
#       checkMDNSConf, checkSDNSConf,
#       checkHTTPDConf, checkIPMatches
#       check IPAlias
#       
# v0.06                                         # Thu Sep 10 11:31:45 MDT 1998
#       setupHomeDir
# v0.07                                         # Mon Sep 14 14:25:18 MDT 1998
#       getNextUID
# v0.08                                         # Tue Sep 15 10:21:56 MDT 1998
#       setupQMVD
# v0.09                                         # Thu Sep 17 12:47:00 MDT 1998
#       checkEtcHosts, addToEtcHosts, setMX
#       getTheIP
# v0.10                                         # Fri Sep 18 14:47:00 MDT 1998
#       checkEtcHosts, addToEtcHosts, setMX
#       getTheIP
# v0.11                                         # Tue Sep 22 16:58:53 MDT 1998
#       setupDOTQmail, setupDOTQmailDefault     
# v0.12                                         # Wed Sep 30 12:05:46 MDT 1998
#       getNextIP major fix! checkEtcHosts
#       menu, mainMenu, extMenu, swapMenu
#       QMAIL/HTTPD/NAMED fixes/logger/etc
#       getVirtAfD, getVirtDfA
#
# v0.13                                         # Thu Dec  3 14:45:42 MST 1998
#       Fixed account substring bug...
#
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
#
# TODO / IDEAS
#
# (1) Make a -x or some option per function to over-ride checks and
#     simply do what the function was meant to do.  This means
#     things like setupQMVD doesn't just echo>>file, but first take
#     out old data with an egrep -v and then echo>>file.
# (2)
#
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
initialize () {                                 # FUNCTION: INITIALIZE
 PATH=                                          #  do not trust passed path
 MYPATH="/usr/bin /usr/ucb"                     #  set my preferred path
 OFS="$IFS"                                     #  old file separators
 TRUE='1'                                       #  test evaluates to true
 FALSE=''                                       #  test evaluates to false
 findBin LS ls                                  #  find ls binary
 findBin RM rm                                  #  find rm binary
 findBin TR tr                                  #  find tr binary
 findBin CAT cat                                #  find cat binary
 findBin ECHO echo /usr/ucb $MYPATH             #  find echo binary
 findBin KILL kill                              #  find kill binary
 findBin DATE date                              #  find date binary
 findBin MKDIR mkdir                            #  find mkdir binary
 findBin CHMOD chmod                            #  find chmod binary
 findBin BASENAME basename                      #  find basebane binary
 wProg="$0"                                     #  whole path program name
 lProg=`$BASENAME $wProg`                       #  lowercae program name
 uProg=`$BASENAME $lProg | $TR "[a-z]" "[A-Z]"` #  uppercase program name
 NOOPTS="$TRUE"                                 #  set noopts  
 test $# -gt 0 && NOOPTS="$FALSE"               #  if anything, reset noopts
 getOpts "$@"                                   #  get options from passed
 UNIQ=$$                                        #  A unique string
 PID=$$                                         #  This process's id
 TMP=/tmp                                       #  temporary file directory
 TEMPTEMP="$TMP/$uProg.$USER.$PID_";            #  temporary file name start
 NULL=/dev/null                                 #  null device
 STDOUT=""                                      #  Standard output
 STDERR="/dev/tty"                              #  Standard error
 ECODE=0                                        #  Error/Exit code
 test "x$NOOPTS" != "x" && {                    # 
  toggle DOHELP                                 # 
 }                                              # 
 test "x$DOHELP" != "x" && help                 #  do help?
 progInit                                       #  Initialize program specifics
}                                               # end of initialize
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
default () {                                    # FUNCTION: DEFAULT
 set x "$@"; shift                              #  set passed to positional
 VARIABLE=$1                                    #  VARIABLE is first, then
 shift                                          #  move positional params
 VALUE="$@"                                     #  VALUE is rest
 eval DEFAULT=\$$VARIABLE                       #  get VALUE of VARIABLE
 test "x$DEFAULT" = "x" && {                    #  if VARIABLE not set, then
  eval $VARIABLE="$VALUE"                       #   make VARIABLE = VALUE
 }                                              #  endif
}                                               # end of default
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
verbose () {                                    # FUNCTION: VERBOSE
 test "x$VERBOSE" != "x" && {                   #  if VERBOSE set, then
  TD=`$DATE +"%m/%d/%y %H:%M:%S"`               #  set TD to current date/time
  $ECHO "$uProg- $TD : $@" >>$STDERR            #  output progname + text
 }                                              #  endif
}                                               # end of verbose
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
error () {                                      # FUNCTION: ERROR
 $ECHO "$uProg*ERROR- $@" >>$STDERR             #  output progname + error
}                                               # end of error
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
fatalError () {                                 # FUNCTION: FATALERROR
 $ECHO "$uProg*FATAL-ERROR! $@" >>$STDERR       #  output progname + 
 endProgram                                     #  call: endProgram
}                                               # end of fatal error 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
endProgram () {                                 # FUNCTION: ENDPROGRAM
 cleanUp                                        #   call: cleanUp
 verbose "Exiting ..."                          #   call: verbose w/ output
#   test "$KILL" && $KILL -9 0                  #   if kill set, kill this proc
#  $KILL -TERM 0                                #   kill this proc
  exit $ECODE                                   #   exit with error code
}                                               # end of endProgram
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
cleanUp () {                                    # FUNCTION: CLEANUP
 verbose "Cleaning up."                         #  call: verbose w/ output
 test "x$RM" != "x" && {                        #  if RM set, then
  $RM -rf $TMP/$TEMPTEMP*                       #   remove these files
 }                                              #  end if RM set
}                                               # end of cleanUp
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getOpts () {                                    # FUNCTION: GETOPTS
 test $# -gt 0 && {                             #  if passed, then
  set x "$@"; shift                             #  set passed to positional
  while test $# -gt 0                           #  while positional left
  do                                            #   do
   case "$1" in                                 #   check first positional
    "-verbose"     |"-verb"    |"-v") toggleVerbose           ; shift 1 ;;
    "-help"        |"-help"    |"-h") toggle DOHELP           ; shift 1 ;;
    "-debug"       |"-bug"     |"-d")                           shift 1 ;;
    "-background"  |"-back"    |"-b") toggle BACKGROUND       ; shift 1 ;;
    "-accountid"   |"-account" |"-1") ACCOUNT="$2"            ; shift 2 ;;
    "-domainname"  |"-domain"  |"-2") setDomainName "$2"      ; shift 2 ;;
    "-interactive" |"-inter"   |"-i") toggle INTERACTIVE      ; shift 1 ;;
    * ) error "\"$1\" unrecognized command line option."      ; shift 1 ;;
   esac                                         #   end case/check
  done                                          #  done while
 }                                              #  end test passwd
}                                               # end getOpts
                                                #  
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
findBin () {                                    # FUNCTION: FINDBIN
 VARIABLE=$1                                    #  VARIABLE is first passed
 PROGRAM=$2                                     #  PROGRAM is second passed
 shift 2;                                       #  move positional 2 spots
 test $# = 0 && { set x $MYPATH; shift; }       #  if no passed path, set
 NOTFOUND=""                                    #  initialize
 while test -z "$NOTFOUND" -a $# -gt 0          #  while not found, 
 do                                             #  do
  test -x "$1/$PROGRAM" && {                    #   if path/program, then
   eval $VARIABLE="$1/$PROGRAM"                 #    set VARIABLE and
   toggle NOTFOUND                              #    toggle NOTFOUND
  }                                             #   end if path/program
  shift                                         #   move positional params
 done                                           #  done while
 test -z "$NOTFOUND" && fatalError "$PROGRAM not found ..."
}                                               # end findbin
                                                #  
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
toggle () {                                     # FUNCTION: TOGGLE
 eval ONOFF=\$$@                                #  set ONOFF to passed var
 test "x$ONOFF" != "x" && {                     #  is VARIABLE on or off?
  eval $@="$FALSE"                              #   if on, set to off
 } || {                                         #  or else
  eval $@="$TRUE"                               #   if off, set to on
 }                                              #  end of variable on or off
}                                               # end toggle
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
help () {                                       # FUNCTION: HELP
 test "x$DOHELP" != "x" && {                    #  do help?
 $CAT <<EOHELP                                  #   yes, do help, display:
$CREDITS

USAGE: $lProg [options]
  -verbose    |-verb  |-v --> show program operations
  -help       |-help  |-h --> 
  -debug      |-bug   |-d --> debug ... make program noisy!
  -background |-back  |-b --> daemon / run in background.

EOHELP
 
 endProgram                                     #  exit program
 }                                              #  end if do help
}                                               # end help
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
finish () {                                     # FUNCTION: finish
 verbose "Finishing ..."                        #  call: verbose w/ params
}                                               # end finish
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
progInit () {                                   # FUNCTION: progInit
 verbose "Initializing ..."                     #  output if verbose
 findBin CP cp                                  #  find cp binary
 findBin ID id                                  #  find id binary
 findBin LN ln                                  #  find ln binary
 findBin WC wc                                  #  find wc binary
 findBin SED sed                                #  find sed binary
 findBin AWK awk                                #  find awk binary
 findBin SORT sort                              #  find sort binary
 findBin EXPR expr                              #  find expr binary
 findBin EGREP egrep                            #  find egrep binary
 findBin CLEAR clear                            #  find clear binary
 findBin SLEEP sleep                            #  find sleep binary
 findBin CHOWN chown                            #  find chown binary
 findBin RUNAS runas /export/home/system/bin    #  find runas binary
 findBin LOGGER logger                          #  find logger binary
 findBin USERADD useradd /usr/sbin /sbin        #  find useradd binary
 findBin IFCONFIG ifconfig /usr/sbin            #  find ifconfig binary
 findBin NSLOOKUP nslookup /usr/sbin /sbin      #  find nslookup binary
 DONIC="1"                                      #  do whois lookups
 ERRDELAY="1"                                   #  sleep on error delay
 WAITNIC="3"                                    #  wait for internic to reply
 WAITGIP="2"                                    #  wait for dns server to reply
 WAITMX="2"                                     #  wait for dns server to reply
 MENU="1"                                       #  menu to start with
 HOSTFILE="/etc/hosts"                          #  password file
 PASSWORDFILE="/etc/passwd"                     #  password file
 IPBASE="208.136.89"                            # 
 DMX="mail1.lobodirect.com"                     # 
 DCONTACT="Mark Biernacki"                      # 
 IPDEFAULT="208.136.89.10"                      # 
 IPSTART="100"                                  # 
 IPSTOP="250"                                   # 
 TAB="  "                                       #  a "TAB" (\t) inside ""'s
 NETINT="hme0"                                  #  set network alias interface
 default DEFAULT default                        #  set DEFAULT or use default
 DEFAULTGID=100                                 # 
 USERSHELL="/bin/false"                         # 
 LOWUID=1000                                    #  lowest valid user id
 HIGHUID=9999                                   #  highest valid uiser id
 RC_QMAIL="/etc/init.d/qmail"                   #  rc.qmail
 RC_HTTPD="/etc/init.d/httpd"                   #  rc.httpd
 RC_NAMED="/usr/sbin/ndc"                       # 
 LOGPRIORITY="auth.err"                         #  auth.err --> /adm/messages
 INTERNIC="/export/home/system/bin/internic"    #  set INTERNIC bin path
 MONGOLIB="/export/home/system/lib/mongo"       #
 DNSTEMPLATE="$MONGOLIB/dnstemplate.txt"        # 
 MDNSTEMPLATE="$MONGOLIB/namedmt.txt"           # 
 SDNSTEMPLATE="$MONGOLIB/namedst.txt"           # 
 HTTPVIRT="$MONGOLIB/httpvirt.txt"              # 
 HTTPDCONF="/usr/local/etc/httpd/conf/httpd.conf"       # 
 HTTPIDX="$MONGOLIB/ldindex.html"               # 
 DNSDIR="/var/named"                            # 
 MDNSCONF="$DNSDIR/etc/master"                  # 
 SDNSCONF="$DNSDIR/etc/slave"                   # 
 test "x$BACKGROUND" != "x" && BACKGROUND="&"   #  alter BACKGROUND value
 COMMANDS="$COMMANDS rootcheck mongo"           #  program commands
 QMD="/var/qmail"                               # 
 QMCVD="$QMD/control/virtualdomains"            # 
 QMCRH="$QMD/control/rcpthosts"                 # changed from rcpthosts.save 
 WEBSERVER="/usr/local/etc/httpd"               # 
 HTTPDCONF="$WEBSERVER/conf/httpd.conf"         # 
 LINKHOME="/export/home"                        # 
 HOMEDIRS="/usr/local/etc/home"                 # 
 HOMEUSER="/export/home/system/lib/user"        #  example home directory
 FS='
}                                               # end progInit
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
HTTPD () {                                      # FUNCTION: HTTPD
 verbose "HTTPD [$@]"                           # 
 set x $*; shift                                #  dequote 
 while test $# -gt 0                            # 
 do                                             # 
  case "$1" in                                  # 
   status  )  $RC_HTTPD status                  # 
              PAUSE="$TRUE"                     # 
            ;;                                  # 
   stop    )  $RC_HTTPD stop                    # 
              logger "HTTPD: stop"              # 
            ;;                                  # 
   start   )  $RC_HTTPD start                   # 
              logger "HTTPD: start"             # 
            ;;                                  # 
   restart )  $RC_HTTPD restart                 # 
              logger "HTTPD: restart"           # 
            ;;                                  # 
   nothing )  :                                 # 
            ;;                                  # 
   *       ) error "HTTPD: Unrecognized: $1"    # 
            ;;                                  # 
  esac                                          # 
  shift                                         # 
 done                                           # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
QMAIL () {                                      # FUNCTION: QMAIL
 verbose "QMAIL [$@]"                           # 
 set x $*; shift                                #  dequote 
 while test $# -gt 0                            # 
 do                                             # 
  case "$1" in                                  # 
   status  )  $RC_QMAIL status                  # 
              PAUSE="$TRUE"                     # 
            ;;                                  # 
   stop    )  $RC_QMAIL stop                    # 
              logger "QMAIL: stop"              # 
            ;;                                  # 
   start   )  $RC_QMAIL start                   # 
              logger "QMAIL: start"             # 
            ;;                                  # 
   restart )  $RC_QMAIL restart                 # 
              logger "QMAIL: restart"           # 
            ;;                                  # 
   nothing )  :                                 # 
            ;;                                  # 
   *       ) error "QMAIL: Unrecognized: $1"    # 
            ;;                                  # 
  esac                                          # 
  shift                                         # 
 done                                           # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
NAMED () {                                      # FUNCTION: NAMED_RESTART
 verbose "NAMED [$@]"                           # 
 set x $*; shift                                #  dequote 
 while test $# -gt 0                            # 
 do                                             # 
  case "$1" in                                  # 
   status  )  $RC_NAMED status                  # 
              PAUSE="$TRUE"                     # 
            ;;                                  # 
   stop    )  $RC_NAMED stop                    # 
              logger "NAMED: stop"              # 
            ;;                                  # 
   start   )  $RC_NAMED start                   # 
              logger "NAMED: start"             # 
            ;;                                  # 
   restart )  $RC_NAMED restart                 # 
              logger "NAMED: restart"           # 
            ;;                                  # 
   nothing )  :                                 # 
            ;;                                  # 
   *       ) error "NAMED: Unrecognized: $1"    # 
            ;;                                  # 
  esac                                          # 
  shift                                         # 
 done                                           # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
promptinput () {                                # 
 test $# -gt 0 && P="$1" || P="Input: "         # 
 test $# -gt 1 && V="$2" || V="_"               # 
 $ECHO -n "$P"                                  #  Prompt for input
 read INPUT                                     #  Read/Get input 
 set x "$INPUT"; shift                          # 
 eval $V=\"$@\"                                 # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
lcase () {                                      # 
 verbose "lcase"                                #  blah
 test $# = 0 && {                               # 
  P="Word to convert to lowercase"              # 
  promptinput "$P"                              # 
  set x "$_"; shift                             # 
 }                                              # 
 set x `$ECHO "$@" | $TR "[A-Z]" "[a-z]"`;shift # 
 $ECHO "$@"                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
ucase () {                                      # 
 verbose "lcase"                                #  blah
 test $# = 0 && {                               # 
  P="Word to convert to uppercase"              # 
  promptinput "$P"                              # 
  set x "$_"; shift                             # 
 }                                              # 
 set x `$ECHO "$@" | $TR "[a-z]" "[A-Z]"`;shift # 
 $ECHO "$@"                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
cls () {                                        # FUNCTION: CLS
 $CLEAR                                         #  clear screen
}                                               # end CLS
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
pressreturn () {                                # 
 test "x$NOPAUSE" = "x" && {                    # 
  $ECHO -n "Press [RETURN] to continue:"        # 
  read INPUT                                    # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
pausereturn () {                                # 
 X="$NOPAUSE"                                   # 
 NOPAUSE=""                                     # 
 test "x$PAUSE" != "x" && pressreturn           # 
 NOPAUSE="$X"                                   # 
 PAUSE=""                                       # 
}                                               # 
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
logger () {                                     # FUNCTION: LOGGER
 verbose "logger [$@]"                          # 
 $LOGGER -p $LOGPRIORITY "[DEBUGGING] $uProg- $@"               # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
toggleVerbose () {                              # FUNCTION: TOGGLEVERBOSE
 verbose "verbose"                              # 
 toggle VERBOSE                                 #
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
toggleDebug () {                                # FUNCTION: TOGGLEDEBUG
 verbose "debug"                                # 
 toggle DEBUG                                   # 
 test "x$DEBUG" != "x" && {                     # 
  set -x                                        # 
 } || {                                         # 
  set +x                                        # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getVirtAfD () {                                 # FUNCTION: GETVIRTAFD
 local _gVA X                                   # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "getVirtAfD [$X]"                      # 
 test "x$X" != "x" && {                         # 
  IFS=":"                                       # 
  set x `$EGREP "^$X:" $QMCVD`; shift           # 
  IFS="$OFS"                                    # 
  test "x$1" != "x" && shift                    # 
 } || {                                         # 
  set x; shift                                  # 
 }                                              # 
 test "x$1" != "x" && {                         # 
  ACCOUNT="$@"                                  # 
 }                                              # 
 _="$@"; echo "$_"                              # 
 eval $_gVA                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getVirtDfA () {                                 # FUNCTION: GETVIRTDFA
 local _gVD X                                   # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "getVirtDfA [$X]"                      # 
 test "x$X" != "x" && {                         # 
  IFS=":$IFS"                                   # 
  set x `$EGREP ":$X^" $QMCVD`; shift           # 
  IFS="$OFS"                                    # 
  test "x$1" != "x" && {                        # 
   set x "$1"; shift                            # 
  }                                             # 
 } || {                                         # 
  set x; shift                                  # 
 }                                              # 
 test "x$1" != "x" && {                         # 
  DOMAIN="$@"                                   # 
 }                                              # 
 _="$@"; echo "$_"                              # 
 eval $_gVD                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getNextUID () {                                 # FUNCTION: GETNEXTUID
 verbose "getNextUID"                           # 
 set x `$AWK -F: '$3>'$LOWUID' && $3<'$HIGHUID' {u=$3} END {print u}'< $PASSWORDFILE`; 
shift    # 
 set x `$EXPR $1 + 1`; shift                    # 
 _="$@"; echo "$_"                              # 
}                                               # 
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getNextIP () {                                  # FUNCTION: GETNEXTIP
 test $# -gt 0 && X="$1" || X="$IPBASE"         # 
 test $# -gt 1 && Y="$2" || Y="$IPSTART"        # 
 test $# -gt 2 && Z="$3" || Z="$IPSTOP"         # 
 verbose "getNextIP [$X] [$Y] [$Z]"             # 
 set x `echo "$IPBASE" | $WC -c`; shift         # 
 BASEL="$1"                                     # 
 $SORT -n +0.$BASEL $HOSTFILE | $AWK '
  {print "["$0"]"; printf ""}
 ' >>/tmp/g
 set x `$SORT -n +0.$BASEL $HOSTFILE |  $AWK '
  BEGIN {
         BASE    = "'$X'";
         IPSTART = "'$Y'";
         IPSTOP  = "'$Z'";
         FREE    = "'$Y'"
        }
  substr($1,0,length(BASE)) == BASE {
    IP=substr($1,length(BASE)+2,3);
    if ( int(IP) >= int(IPSTART) && \
    int(IP) <= int(IPSTOP) ) {
      if ( int(IP) > int(FREE)) {
        exit
      };
      if ( int(IP) != DUPIP ) {
       FREE=FREE+1
      }
    }
    DUPIP = IP
  }
  END { if (int(FREE) <= int(IPSTOP)) print FREE }
  '`; shift                                     # 
 case "$X" in                                   # 
  *"." ) set x "$X$1" ; shift ;;                # 
  *    ) set x "$X.$1"; shift ;;                # 
 esac                                           # 
 _="$@"                                         # 
}                                               # 
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
freeIP () {                                     # FUNCTION: GETNEXTIP
 verbose "freeIP"                               # 
 getNextIP; set x "$_"; shift                   # 
 echo "Next Available IP: $@"                   # 
 PAUSE="$TRUE"                                  # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
addToEtcHosts () {                              # FUNCTION: ADDTOETCHOSTS
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$IP"             # 
 test $# -gt 2 && Z="$3" || Z="$DCONTACT"       # 
 verbose "AddToEtcHosts [$X] [$Y]"              # 
 checkEtcHosts "$X" "$Y"; set x "$_"; shift     # 
 test "x$1" = "x" && {                          # 
  O="$Y $X      $TWOLDOM                # $Z"   # 
  echo "$O" >>$HOSTFILE                         # 
 } || {                                         # 
  error "$X already in $HOSTFILE!"              # 
  PAUSE="$TRUE"                                 # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getTheIP () {                                   # FUNCTION: GETTHEIP
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "getTheIP [$X]"                        # 
 checkEtcHosts "$X"; set x "$_"; shift          # 
 test "x$1" = "x" && {                          # 
  getNextIP; set x "$_"; shift                  # 
 } || {                                         # 
  set x "$_"; shift                             # 
  set x $*; shift                               #  dequote
  set x $1; shift                               # 
 }                                              # 
 setIP "$@";                                    #  
 _="$@"
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
makeUserAccount () {                            # FUNCTION: MAKEUSERACCOUNT
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "makeUserAccount [$X]"                 # 
 set x `$EGREP "^$X:" $PASSWORDFILE`; shift     # bah! fixed 12/03/98
 test $# = 0 && {                               # 
  NUID=`getNextUID`                             # 
  MSG="Creating:  Account=$X UID=$NUID"         # 
  verbose "$MSG"                                #
  logger "$MSG"                                 # 
#  $LN -s "$HOMEDIRS/$X" $LINKHOME/$X           # not needed after 12/09/98
 # $USERADD -u $NUID -g $DEFAULTGID -d "$LINKHOME/$X" -s $USERSHELL -m -k $HOMEUSER $X 
>>/dev/tty
  $USERADD -u $NUID -g $DEFAULTGID -d "$LINKHOME/$X" -s $USERSHELL $X >>/dev/tty
  setupHomeDir "$X"                             # 
 } || {                                         # 
  error "Account $X already exists!"            # 
  PAUSE="$TRUE"                                 # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                #
swapMenu () {                                   # FUNCTION: SWAPME
 local _sMnu X                                  # 
 test $# -gt 0 && X="$1" || X="$MENU"           # 
 verbose "swapMenu [$X]"                        #   call: verbose w/ output
 case "x$MENU" in                               # 
  x"1" ) MENU="2" ;;                            # 
  *    ) MENU="1" ;;                            # 
 esac                                           # 
 eval $_sMnu                                    # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                #
menu () {                                       # FUNCTION: MAINMENU
 local _mnu X                                   # 
 test $# -gt 0 && X="$1" || X="$MENU"           # 
 verbose "Menu [$X]"                            #   call: verbose w/ output
 case "x$X" in                                  # 
  x"2" ) extMenu  ;;                            # 
  *    ) mainMenu ;;                            # 
 esac                                           # 
 eval $_mnu                                     # 
}                                               # 
                                                #
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
mainMenu () {                                   # FUNCTION: MENU
 cls
 $CAT <<EOF


              _____   ________    _______    ________ ________    
             /     \  \_____  \   \      \  /  _____/ \_____  \   
            /  \ /  \  /   |   \  /   |   \/   \  ___  /   |   \  
           /    Y    \/    |    \/    |    \    \_\  \/    |    \ 
           \M___|__  /\O______  /\N___|__  /\G_____  /\O______  / 
                   \/         \/         \/        \/     (TM)\/ 

         ----------==========[ MONGO MAIN MENU ]==========----------

    (1,a) Set Account ID                        ( v ) Verbose [$VERBOSE]
    (2,d) Set Domain name                       (bug) Debug   [$DEBUG]
    (3,i) Set IP                                ( x ) eXtended Menu

    (svd) Setup Virtual Domain                  (fip) Get next free IP
    (mka) Make Account                          ( ip) Get IP (match/next)
    (shd) Setup Home Directory                  (cps) Check /etc/passwd
    (dns) Setup DNS                             (gva) Get domain account
                      Account : $ACCOUNT
                      Domain  : $DOMAIN
                      IP      : $IP

 (Q,q) Quit, (0) Check Everything, (00) Do everything... start praying!
EOF
}                                               #
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
extMenu () {                                    # FUNCTION: EXTMENU
 cls
 $CAT <<EOF


              _____   ________    _______    ________ ________    
             /     \  \_____  \   \      \  /  _____/ \_____  \   
            /  \ /  \  /   |   \  /   |   \/   \  ___  /   |   \  
           /    Y    \/    |    \/    |    \    \_\  \/    |    \ 
           \M___|__  /\O______  /\N___|__  /\G_____  /\O______  / 
                   \/         \/         \/        \/     (TM)\/ 
      ----------==========[ MONGO EXTENDED MENU ]==========----------

 (1,a) Set Account ID       (4,?) ?                   (7,?) Get DNS Servers
 (2,d) Set Domain name      (5,?) ?                   (8, ) Mongo Sys Status
 (3,i) Set IP               (6,?)                     (9,?) Mongo Sys Whacker
 (svd) Setup Virtual Domain ( x ) Swap Menus          ( v ) Verbose [$VERBOSE]
 (mka) Make Account         (fip) Get next free IP    (bug) Debug   [$DEBUG]
 (shd) Setup Home Directory ( ip) Get IP (match/next) (gvd) Get account domain
 (dns) Setup DNS            (cps) Check /etc/passwd   (gva) Get domain account
 (gmx) Get MX record info   (ath) add to /etc/hosts   (sys) Mongo Sys Whacker

 (www) HTTPD [Re]start      (qm ) QMAIL [Re]start     (ndc) NAMED [Re]start
 (wws) HTTPD Status         (qms) QMAIL Status        (dns) NAMED Status
 (wwx) HTTPD Stop           (qmx) QMAIL Stop          (dnx) NAMED Stop

 Account=[$ACCOUNT] Domain=[$DOMAIN] IP=[$IP]
 (Q,q) Quit, (0) Check Everything, (00) Do everything... start praying!
EOF
}                                               #
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupDOTQmail () {                              # 
 local _sDQM X                                  # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "setupDOTQmail [$X]"                   # 
 getHomeDir "$X"; HOMEDIR="$_"                  # 
 test "x$HOMEDIR" != "x" && {                   # 
  test -s "$HOMEDIR/.qmail" || {                # 
   verbose "Creating: $HOMEDIR/.qmail"          # 
   $CP -p $HOMEUSER/.qmail $HOMEDIR             # 
   $CHOWN "$X" $HOMEDIR/.qmail                  # 
  }                                             # 
 }                                              # 
 eval $_sDQM                                    # 
}                                               # 
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupDOTQmailDefault () {                       # 
 local _sDQMD X                                 # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "setupDOTQmailDefault [$X]"            # 
 setupDOTQmail "$X"                             # 
 test "x$HOMEDIR" != "x" && {                   # 
  test ! -s "$HOMEDIR/.qmail-default" -a \
      ! -h "$HOMEDIR/.qmail-default" && {       # 
   verbose "Creating: $HOMEDIR/.qmail-default"  # 
   $RUNAS -"$X" $LN -s "$HOMEDIR/.qmail" "$HOMEDIR/.qmail-default"      # 
#   $CP -p $HOMEUSER/.qmail-default $HOMEDIR    # 
#   $CHOWN "$X" $HOMEDIR/.qmail-default         # 
  }                                             # 
 }                                              # 
 eval $_sDQMD                                   # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupHomeDir () {                               # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 test $# -gt 1 && X="$2" || Y="$HOMEDIRS"       # 
 verbose "setupHomeDir [$X] [$Y]"               # 
 HOME="$Y/$X"                                   # 
 GROUP="none"                                   # 
 getHomeDir "$X"; HOMEDIR="$_"                  # 
# test -h "$LINKHOME/$X" || {                   # not needed after 12/09/98
#  verbose "Linking: $LINKHOME/$X --> $HOME"    # not needed after 12/09/98
#  $LN -s "$HOME" "$LINKHOME/$X"                # not needed after 12/09/98
# }                                             # not needed after 12/09/98
 test -d "$HOME" || {                           # 
  verbose "Creating Directory: $HOME"           # 
  $MKDIR "$HOME"                                # 
  $CHOWN "$X" "$HOME"                           # 
 }                                              # 
 test -d "$HOME/public_html" || {               # 
  verbose "Creating: $HOME/public_html"         # 
  $CP -Rp $HOMEUSER/public_html $HOME           # 
  $CHOWN -R "$X" $HOME/public_html              # 
 }                                              # 
 test -d "$HOME/Maildir" || {                   # 
  verbose "Creating: $HOME/Maildir"             # 
  $CP -Rp $HOMEUSER/Maildir $HOME               # 
  $CHOWN -R "$X" $HOME/Maildir                  # 
 }                                              # 
 setupDOTQmail "$X"                             # 
 setupDOTQmailDefault "$X"                      # 
# test -s "$HOMEDIR" || {                       # not needed after 12/09/98
#  verbose "Linking: $HOMEDIR --> $HOME"        # not needed after 12/09/98
#  $LN -s "$LINKHOME/$X" "$HOMEDIR"             # not needed after 12/09/98
# }                                             # not needed after 12/09/98
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupDNS () {                                   # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$IP"             # 
 test $# -gt 2 && Z="$3" || Z=""                # 
 test $# -gt 3 && V="$4" || V="$ACCOUNT"        # 
 verbose "setupDNS [$X] --> [$Y] [$Z] [$V]"     # 
 _X="$X"; _Y="$Y"; _Z="$Z";                     # 
 test "x$Y" = "x" && {                          # 
  getTheIP "$X"; _Y="$_"                        # 
 }                                              # 
 X="$_X"; Y="$_Y"; Z="$_Z";                     # 
 verbose "setupDNS [$X] --> [$Y] [$Z] [$V]"     # 
 test "x$Z" = "x" && {                          # 
  setMX "$DMX"; Z="$_"                          # 
 }                                              # 
 U="$V, $DCONTACT"                              # FIX CONTACT
 TD=`$DATE +"%m/%d/%y %H:%M:%S"`                #  set TD to current date/time
 W="$TD - $TD $uProg"                           # 
 verbose "setupDNS [$X] [$Y] [$Z] [$U] [$V] [$W]"               # 
 test "x$X" = "x" && {                          # 
  error "No domain provided???"                 # 
 }                                              # 
 test "x$Y" = "x" && {                          # 
  error "No IP provided???"                     # 
 }                                              # 
 test "x$Z" = "x" && {                          # 
  error "No MX provided???"                     # 
 }                                              # 
 test "x${X}x${Y}x${Z}x" != "xxx" && {          # 
  FILE="$DNSDIR/master/$X"                      # assumes domain is file name
  test ! -s "$FILE" && {                        # 
   verbose "$X --> $FILE"                       # 
   PROG="s/%D%/$X/g; s/%IP%/$Y/g; s/%MX%/$Z/g; "        # 
   PROG="$PROG s/%C%/$U/g; s/%A%/$V/g; "        # 
   PROG="$PROG s|%T%|$W|g; "                    # 
   $SED -e "$PROG" <$DNSTEMPLATE >$FILE         # 
  } || {                                        # 
   error "$FILE already exists!"                # 
   PAUSE="$TRUE"                                # 
  }                                             # 
  PAT="zone .$X. in {"                          # 
  set x `$EGREP "$PAT" $MDNSCONF`; shift        # 
  test $# = 0 && {                              # 
   verbose "$X --> $MDNSCONF"                   # 
   $SED -e "$PROG" <$MDNSTEMPLATE >>$MDNSCONF   # 
  }                                             # 
  set x `$EGREP "$PAT" $SDNSCONF`; shift        # 
  test $# = 0 && {                              # 
   verbose "$X --> $SDNSCONF"                   # 
   $SED -e "$PROG" <$SDNSTEMPLATE >>$SDNSCONF   # 
  }                                             # 
  NAMED restart 1>/dev/null 2>/dev/null         # 
  addToEtcHosts "$X" "$Y" "$U"                  # 
 }                                              # 
}                                               # 
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupIPAlias () {                               # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "setupIPAlias [$X]"                    # 
 _X="$X"                                        # 
 getTheIP "$X"; Y="$_"                          # 
 X="$_X"                                        # 
 IFS="."                                        # 
 set x $Y; shift                                # 
 IFS="$OFS"                                     # 
 Z="$4"                                         # 
 echo "CHECK --> IP[$IP] Y[$Y]"
 IPAF="/etc/hostname.$NETINT:$Z"                # 
 set x `$CAT $IPAF 2>/dev/null`; shift          # 
 test $# -gt 0 && {                             # 
  error "Wrote over $IPAF --> $1"               # 
  PAUSE="$TRUE"                                 # 
 }                                              # 
 verbose "Creating: $IPAV --> $X"               # 
 echo "$X" >$IPAF                               # 
 verbose "ifconfig: $NETINT:$Z $Y up"           # 
 logger "$X ==> ifconfig: $NETINT:$Z --> $Y up" # 
 $IFCONFIG $NETINT:$Z $Y up                     # 
 _="$@"                                         # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
sub () {                                        # 
 verbose "sub"                                  #  blah
 X=""
 Y="Y BEFORE"
 echo "0 before X[$X] Y[$Y]"
 getPWENT "$ACCOUNT" 7                          # 
 echo "1 after X[$X] Y[$Y]"
echo "SUB _pWE [$_pWE]"
 eval $_pWE
 echo "2 after X[$X] Y[$Y]"
 echo "pw res --> [$_]" >>/dev/tty                              # 
 PAUSE="$TRUE"                                  # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
interactive () {                                # FUNCTION: COMMAND
 verbose "interactive"                          #  blah
 DONE=""                                        # 
 while test "x$DONE" = "x"                      # 
 do                                             # 
  PAUSE="$VERBOSE"                              # 
  STAT=""                                       # 
  menu                                          # 
  $ECHO -n " Choice: "                          # 
  read COMMAND                                  # 
  BAD=""                                        # 
  test "x$COMMAND" = "xz" && COMMAND="sub"      # used for quick menu testing
  case "$COMMAND" in                            # 
   "everything"|"0" |"0") checkEverything    ;; # 
   "check"     |"00"    ) doEverything       ;; # 
   "account"   |"a" |"1") setAccountID       ;; #
   "domain"    |"2" |"d") setDomainName      ;; # 
   "setip"     |"3" |"i") setIP              ;; # 
   "sdomain"   |"D" |"D") setDomainName      ;; # 
   "cdomain"   |"d" |"d") setDomainName      ;; # 
   "quit"      |"Q" |"q") DONE="1"           ;; # 
   "verbose"   |"V" |"v") toggleVerbose      ;; # 
   "bug"       |"." |".") toggleDebug        ;; # 
   "whodns"    |"7" |"7") getVal getDNSServ  ;; # 
   "sys"       |"8" |"8") sysStatus          ;; # 
   "whack"     |"9" |"9") sysWhack           ;; # 
   "menu"      |"X" |"x") swapMenu           ;; # 
   "sub"                ) sub                ;; # 
   "cps"                ) checkPasswdString  ;; # 
   "shd"                ) setupHomeDir       ;; # 
   "sqmvd"              ) setupQMVD          ;; # 
   "wvirt"              ) setupHTTPVirt      ;; # 
   "svd"                ) setupVD            ;; # 
   "ip"                 ) getTheIP           ;; # 
   "gva"                ) getVirtAfD         ;; # 
   "gvd"                ) getVirtDfA         ;; # 
   "gmx"                ) getVal getMX       ;; # 
   "ath"                ) addToEtcHosts      ;; # 
   "mka"                ) makeUserAccount    ;; # 
   "fip"                ) freeIP             ;; # 
   "mx"                 ) setMX              ;; # 
   "dns"                ) setupDNS           ;; # 
   "ndc"                ) NAMED restart      ;; # 
   "nds"                ) NAMED status       ;; # 
   "ndx"                ) NAMED stop         ;; # 
   "qm"                 ) QMAIL restart      ;; # 
   "qms"                ) QMAIL status       ;; #
   "qmx"                ) QMAIL stop         ;; #
   "www"                ) HTTPD restart      ;; # 
   "wws"                ) HTTPD status       ;; # 
   "wwx"                ) HTTPD status       ;; # 
   * ) echo "Command unrecognized: $COMMAND"; $SLEEP $ERRDELAY ;;       # 
  esac                                          # 
  pausereturn                                   # 
 done                                           # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
#xcxc
formOUT () {                                    # FUNCTION: formOUT
# $CLEAR                                                # 
 test "x$ACCOUNT" != "x" && {                   # 
  $CAT <<EOF

ACCOUNT:
User Name       : $ACCOUNT
Account Info    : $SACCOUNT
Home Directory  : $HOMEDIR
Shell           : $SSHELL
Home Dir Info   : $SHOMEDIR
Home Dir Link   : $LHOMEDIR
Account .qmail  : $SDOTQM
EOF
 }                                              # 
 test "x$DOMAIN" != "x" && {                    # 
  $CAT <<EOF

DOMAIN:
Domain          : $DOMAIN = $IP
IP Config       : $SINT $SIPM
DNS Servers     : $DNSSERVERS
MX Servers      : $SMX
Zone File       : $ZONEFILE
Master/Slave    : $SMDNS/$SSDNS
Qmail V Domain  : $QMVD

WEB:
Virtual Web     : $SVWWW
WWW Domain Link : $SDWLINK
Server index    : $SINDEX
Server logs     : $SLOGS
Server cgi-bin  : $SCGI
EOF
 }                                              # 
$CAT <<EOF

STATUS          : $STAT

EOF
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
formMark () {                                   # FUNCTION: formMark
 $CLEAR
 $CAT <<EOF
User Name                               : $ACCOUNT
Password                                : $passwd
HOST                                    : $host
~$ACCOUNT/public_html/logs/             : 
~$ACCOUNT/public_html/cgi-bin/          : 
~$ACCOUNT/public_html/index.html/       : 
Account Verified                        :
Mail Host                               : 
MX Record                               : 
Send Welcome Email                      :
NIC ID#                                 : 
Whois Verified                          : 
IP #                                    : 
Named.conf                              : 
zone file                               : 
DNS Verified                            : 
WWW, and A                              : 
Host.conf entry                         : 
Restart WWW Verified                    : 
Browse Same Index Page                  : 
FTP Upload sample Image                 :
EOF
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
local () {                                      # FUNCTION: LOCAL
 _l="$1"; shift                                 # 
 while test $# -gt 0                            # 
 do                                             # 
  eval __l="$1=\'\$$1\'"                        # -
  ___l="$___l${___l:+;}$__l"
  shift                                         # -
 done                                           # 
 eval $_l=\"$___l\"                             # 
 ___l=""                                        # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getPWENT () {                                   # FUNCTION: GETPWENT
 local _pWE X Y                                 # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 test $# -gt 1 && Y="$2" || Y="@"               # 
 IFS=""                                         # 
 set x `$EGREP "^$X:" $PASSWORDFILE`; shift     # 
 IFS="$OFS"                                     # 
 test "$Y" != '@' && {                          # 
  case "$@" in                                  # 
   *"::"* ) set x `$ECHO "$@" | $SED 's/::/:BLANK:/g'`; shift ;;        # 
  esac
  IFS=":"                                       # 
  set x $@; shift                               # 
  IFS="$OFS"                                    # 
 }                                              # 
 eval _=\"\$$Y\"                                # 
 eval $_pWE                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getHomeDir () {                                 # FUNCTION: GETPWENT
 local _gHD X                                   # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "getHomeDir [$X]"                      # 
 getPWENT "$X" 6; set x "$_"; shift             # 
 _="$@"                                         # 
 eval $_gHD
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getUserShell () {                               # FUNCTION: GETUSERSHELL
 local _gUS X                                   # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "getUserShell [$X]"                    # 
 getPWENT "$X" 7; set x "$_"; shift             # 
 _="$@"                                         # 
 eval $_gUS                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkPasswdString () {                          # FUNCTION: CHECKPASSWDSTRING
 test $# -gt 0 && X="$@" || X="$ACCOUNT"        # 
 verbose "checkPasswdString [$X]"               # 
 test "x$X" != "x" && {                         # 
  set x "$X"; shift                             # 
 }                                              # 
 test $# = 0 && {                               # 
  $ECHO -n "String: "                           # 
  read INPUT                                    # 
  test "x$INPUT" != "x" && {                    # 
   set x "$INPUT"; shift                        # 
  }                                             # 
 }                                              # 
 test $# -gt 0 && {                             # 
  set x $*; shift                               # 
  while test $# -gt 0                           # 
  do                                            # 
   echo ""                                      # 
   echo "Searching: \`\`$1'' in $PASSWORDFILE"  # 
   $EGREP "$1" $PASSWORDFILE                    # 
   shift                                        # 
  done                                          # 
  test "x$VERBOSE" = "x" && pressreturn         # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkZoneFile () {                              # FUNCTION: CHECKZONEFILE
 local _cZF X                                   # 
 test $# -gt 0 && X="$@" || X="$DOMAIN"         # 
 verbose "checkZoneFile [$X]"                   # 
 FILE="$DNSDIR/master/$X"                       # assumes domain is file name
 test -f "$FILE" && {                           # 
  set "$FILE"                                   # 
 } || {                                         # 
  set "MISSING"                                 # 
  stat "NOZONE"                                 # 
 }                                              # 
 _="$@"                                         # 
 eval $_cZF                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkDir () {                                   # FUNCTION: CHECKDIR
 local _cD X                                    # 
 test $# -gt 0 && X="$1" || X="$DIR"            # 
 verbose "checkDir [$X]"                        #  blah
 set x `$LS -ld $X/. 2>&1`; shift               #  ls dir, not link!
 test $# = 9 && {                               # 
  set x "$1 $3 $4 $5 $X"; shift                 # 
 } || {                                         # 
  set x "MISSING --> $X"; shift                 # 
 }                                              # 
 _="$@"                                         # 
 eval $_cD                                      # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkFile () {                                  # FUNCTION: CHECKFILE
 local _cF X                                    # 
 test $# -gt 0 && X="$@" || X="$FILE"           # 
 verbose "checkFile [$X]"                       #  blah
 set x `$LS -ld $X 2>&1`; shift                 #  ls dir, not link!
 test $# = 9 && {                               # 
  set x "$1 $3 $4 $5 $9"; shift                 # 
 } || {                                         # 
  set x "MISSING --> $X"; shift                 # 
 }                                              # 
 _="$@"                                         # 
 eval $_cF                                      # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkLink () {                                  # FUNCTION: CHECKFILE
 local _cL X                                    # 
 test $# -gt 0 && X="$@" || X="$FILE"           # 
 verbose "checkLink [$X]"                       #  blah
 set x `$LS -ld $X 2>/dev/null`; shift          #  ls dir, not link!
 test $# = 11 && {                              # 
  shift 8                                       # 
  set x "$@"; shift                             # 
 } || {                                         # 
  checkFile "$X"; set x $_; shift               # 
 }                                              # 
 _="$@"                                         # 
 eval $_cL                                      # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
stat () {                                       # FUNCTION: STAT
 STAT="$STAT${STAT:+ }$@"                       # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkAccount () {                               # FUNCTION: CHECKACCOUNT
 local _cA X                                    # 
 test $# -gt 0 && X="$@" || X="$ACCOUNT"        # 
 verbose "checkAccount [$X]"                    #  blah
 getPWENT "$X"                                  # 
 test "x$_" = "x" && {                          # 
  set x "NO ACCOUNT"; shift                     # 
  stat "NOACCOUNT"                              # 
 } || {                                         # 
  IFS=":"                                       # 
  set x $_; shift                               # 
  IFS="$OFS"                                    # 
  set x "$5, $3 $4"; shift                      # 
 }                                              # 
 _="$@"                                         # 
 eval $_cA                                      # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkHomeDir () {                               # FUNCTION: CHECKHOMEDIR
 local _cHD X Y Z V F                           # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "checkHomeDir [$X]"                    # 
# set x `$INTERNIC -n $X`; shift 2              # 
 getHomeDir "$X"; HOMEDIR="$_"                  # 
 V=""                                           #  OWNER
 Y=""                                           #  PERMS
 Z=""                                           #  FILES
 F="$HOMEDIR/."                                 # 
 verbose "Checking: $F"                         # 
 test -d "$F" || {                              # 
  Z="$HOMEDIR"                                  # 
 } && {                                         # 
  checkDir "$F"; set x $_; shift                # 
  case "$1" in                                  # 
   "drwx"?????"x" ) :           ;;              # 
   *              ) Y="$Y${Y:+ }homedir"        #  chmod here?
  esac                                          # 
  test "x$2" = "x$X" || {                       # 
   V="$V${V:+ }homedir"                         #  chown here?
  }                                             # 
  F="$HOMEDIR/.qmail"                           # 
  verbose "Checking: $F"                        # 
  test -s "$HOMEDIR/.qmail" && {                # 
   checkFile "$F"; set x $_; shift              # 
   test "x$2" = "x$X" || {                      # 
    V="$V${V:+ }.qmail"                         #  chown here?
   }                                            # 
  } || {                                        # 
   Z="$Z${Z:+ }.qmail"                          # 
  }                                             # 
  F="$HOMEDIR/public_html/."                    # 
  verbose "Checking: $F"                        # 
  test -d "$F" && {                             # 
   checkDir "$F"; set x $_; shift               # 
   case "$1" in                                 # 
    "drwx"?????"x" ) :           ;;             # 
    *              ) Y="$Y${Y:+ }public_html"   #  chmod here?
   esac                                         # 
   test "x$2" = "x$X" || {                      # 
    V="$V${V:+ }public_html"                    #  chown here?
   }                                            # 
   F="$HOMEDIR/public_html/logs/."              # 
   verbose "Checking: $F"                       # 
   test -d "$F" && {                            # 
    checkDir "$F"; set x $_; shift              # 
    test "x$2" = "x$X" || {                     # 
     V="$V${V:+ }public_html/logs"              #  chown here?
    }                                           # 
   } || {                                       # 
    Z="$Z${Z:+ }public_html/logs"               # 
   }                                            # 
   F="$HOMEDIR/public_html/cgi-bin/."           # 
   verbose "Checking: $F"                       # 
   test -d "$F" && {                            # 
    checkDir "$F"; set x $_; shift              # 
    test "x$2" = "x$X" || {                     # 
     V="$V${V:+ }public_html/cgi-bin"           #  chown here?
    }                                           # 
   } || {                                       # 
    Z="$Z${Z:+ }public_html/cgi-bin"            # 
   }                                            # 
   F="$HOMEDIR/public_html/index.html"          # 
   verbose "Checking: $F"                       # 
   test -f "$F" && {                            # 
    checkFile "$F"; set x $_; shift             # 
    test "x$2" = "x$X" || {                     # 
     V="$V${V:+ }public_html/index.html"        #  chown here?
    }                                           # 
   } || {                                       # 
    Z="$Z${Z:+ }public_html/index.html"         # 
   }                                            # 
  } || {                                        # 
   Z="$Z${Z:+ }public_html"                     # 
  }                                             # 
 }                                              # 
 test "x$Z" = "x" && {                          # 
  test "x$V$Y" != "x" || {                      # 
   Z="ok, whew!"                                # 
  }                                             # 
 } || {                                         #   
  Z="MISSING --> $Z"                            # 
 }                                              # 
 test "x$Y" = "x" || {                          # 
  Z="$Z${Z:+, }PERMS --> $Y"                    # 
 }                                              # 
 test "x$V" = "x" || {                          # 
  Z="$Z${Z:+, }OWNER --> $V"                    # 
 }                                              # 
 set x "$Z"; shift                              # 
 _="$@"                                         # 
 eval $_cHD                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getDNSServ () {                                 # FUNCTION: GETDNSSERV
 local _gDNSS X                                 # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "getDNSServ [$X]"                      # 
# set x `( ( $INTERNIC -n "$X" 2>&1 ) & ( $SLEEP $WAITNIC; kill $! 2>/dev/null) & )`; 
shift 
 set x `( ( $INTERNIC -n "$X" ) & ( $SLEEP $WAITNIC; kill $! ) & )`; shift 
echo "$# = $@"
test "x$1" != "x" && shift
echo "done!"
 _="$@"                                         # 
 eval $_gDNSS                                   # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getDOTQmail () {                                # FUNCTION: GETDOTQMAIL
 local _gDQM X                                  # 
 test $# -gt 0 && X="$1" || X="$ACCOUNT"        # 
 verbose "getDOTQmail [$X]"                     # 
 getHomeDir "$X"; HOMEDIR="$_"                  # 
 Y="$HOMEDIR"                                   # 
 test -f "$Y/.qmail" && {                       # 
  set x `$CAT $Y/.qmail`; shift                 # 
 } || {                                         # 
  set x "MISSING --> $Y/.qmail"; shift          # 
 }                                              # 
 _="$@"                                         # 
 eval $_gDQM                                    # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getVal () {                                     # FUNCTION: GETVAL
 local _gVAL X                                  # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "getVal [$X]"                          # 
 eval $X                                        # 
 echo "$_"                                      # 
 test "x$VERBOSE$PAUSE" = "x" && pressreturn    # 
 eval $_gVAL                                    # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
sysStatus () {                                  # FUNCTION: SYSSTATUS
 verbose "sysStatus"                            # 
 cls
 $CAT <<EOF


              _____   ________    _______    ________ ________    
             /     \  \_____  \   \      \  /  _____/ \_____  \   
            /  \ /  \  /   |   \  /   |   \/   \  ___  /   |   \  
           /    Y    \/    |    \/    |    \    \_\  \/    |    \ 
           \M___|__  /\O______  /\N___|__  /\G_____  /\O______  / 
                   \/         \/         \/        \/     (TM)\/ 

       ----------==========[ MONGO SYSTEM STATUS ]==========----------
EOF
 PAUSE="$TRUE"                                  # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
sysWhack () {                                   # FUNCTION: SYSWHACK
 cls                                            # 
 verbose "sysWhack"                             # 
 echo ""                                        # 
 $ECHO -n "WARNING!!! ARE YOU SURE YOU REALLY WANNA RM -RF /? [N] "
 $SLEEP 2                                       # 
 echo "Yes"                                     # 
 $ECHO  "ok, man, you asked for it!  Hope you have a backup!"   # 
 $ECHO -n "Whacking system ..."                 # 
 for x in 1 2 3 4 5                             # 
 do                                             # 
  $ECHO -n "."                                  # 
  $SLEEP 1                                      # 
 done                                           # 
 echo "JUST KIDDING! h0h0h0 ..."               # 
 PAUSE="$TRUE"                                  # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getMX () {                                      # FUNCTION: GETMX
 local _gMX X Y                                 # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "getMX [$X]"                           # 
 Y=""
 IFS=",$OFS"                                    # 
 set x `( ( $NSLOOKUP -q=mx "$X" 2>&1 ) & ( $SLEEP $WAITNIC; kill $! 2>/dev/null) & 
)`; shift 
 IFS="$OFS"                                     # 
 test "x$1" != "x" && shift
 while test $# -gt 0                            # 
 do                                             # 
  case "$2 $3 $5 $6 $7" in                      # 
   "preference = mail exchanger =" ) Y="$4=$8${Y:+, }$Y" ;;     # 
   * ) : ;;                                     # 
  esac                                          # 
  shift                                         # 
 done                                           # 
 set x "$Y"; shift                              # 
 _="$@"                                         # 
 eval $_gMX                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
getIP () {                                      # FUNCTION: GETIP
 local _gIP X                                   # 
 test $# -gt 0 && X="$1" || X="$HOST"           # 
 verbose "getIP [$X]"                           # 
 set x `( ( $NSLOOKUP "$X" 2>&1 ) & ( $SLEEP $WAITGIP; kill $! 2>/dev/null) & )`; 
shift 
 while test $# -gt 0                            # 
 do                                             # 
  case "$1 $2" in                               # 
   "$DOMAIN Address:" ) Y="$3"; set x        ;; # 
   * ) : ;;                                     # 
  esac                                          # 
  shift                                         # 
 done                                           # 
 set x "$Y"; shift                              # 
 _="$@"                                         # 
 eval $_gIP                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,

checkEtcHosts () {                              # FUNCTION: CHECKETCHOSTS
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$IP"             # 
 verbose "checkEtcHosts [$X] [$Y]"              # 
 test "x$X" != "x" && {                         # 
  test "x$IP" = "x" && IPP="[0-9]+"             # 
  IFS="$OFS."                                   # 
  set x $X; shift                               # 
  TWOLDOM="$1"                                  # 
  IFS="$OFS"                                    # 
  PAT="$IPP[ $TAB]+$X[ $TAB]+$TWOLDOM[ $TAB]+"  # check /etc/hosts format!
  set x `$EGREP "$PAT" $HOSTFILE`; shift        # 
  } || {                                        # 
   set x; shift                                 # 
  }                                             # 
  _="$@"                                        # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkIPMatches () {                             # FUNCTION: CHECKIPMATCHES
 local _cIPM X Y                                # 
 test $# -gt 0 && X="$1" || X="$HOST"           # 
 test $# -gt 1 && Y="$2" || Y="$IP"             # 
 verbose "checkIPMatches [$X] [$Y]"             # 
 checkEtcHosts "$X" "$Y"; set x "$_"; shift     # 
 test $# = 0 && {                               # 
  set x "CHECK-HOSTS"; shift                    # 
  stat "CHECK-HOSTS"                            # 
 } || {                                         # 
  set x; shift                                  # 
 }                                              # 
 _="$@"                                         # 
 eval $_cIPM                                    # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkIPAlias () {                               # FUNCTION: CHECKIPALIAS
 local _cIPA X Y                                # 
 test $# -gt 0 && X="$1" || X="$HOST"           # 
 test $# -gt 1 && Y="$2" || Y="$IP"             # 
 verbose "checkIPAlias [$X] [$Y]"               # 
 IFS="."                                        # 
 set x $IP; shift                               # 
 IFS="$OFS"                                     # 
 Z="$4"                                         # 
 IPAF="/etc/hostname.$NETINT:$Z"                # 
 set x `$CAT $IPAF 2>/dev/null`; shift          # 
 MSG="CHECK-$NETINT:$Z --> $1"                  # 
 test $# = 0 && {                               # 
  set x "$MSG"; shift                           # 
 } || {                                         # 
  test "x$@" = "x$DOMAIN" && {                  # 
   set x "alias-ok"; shift                      # 
  } || {                                        # 
   set x "$MSG"; shift                          # 
   stat "$NETINT:$Z"                            # 
  }                                             # 
 }                                              # 
 _="$@"                                         # 
 eval $_cIPA                                    # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkQMVD () {                                  # FUNCTION: checkQMVD
 local _cQMVD X Y                               # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 verbose "checkQMVD [$X] [$Y]"                  # 
 set x `$EGREP "^$DOMAIN:" $QMCVD`; shift       # 
 test $# = 0 && {                               # 
  set x "NOVIRT"; shift                         # 
  stat "NOVIRT"                                 # 
 } || {                                         # 
  test "x$Y" != "x" && {                        # 
   case "$@" in                                 # 
    *"$Y" ) : ;;                                # 
    *     ) set x "$@ CHECK-ACCOUNT"; shift ; stat "QVIRT-ACCT";;       # 
   esac                                         # 
  }                                             # 
 }                                              # 
 Z="$@"                                         # 
 set x `$EGREP "^$DOMAIN\$" $QMCRH`; shift      # 
 test $# = 0 && {                               # 
  Z="$Z NORCPT"                                 # 
  stat "NORCPT"                                 # 
 }                                              # 
 set "$Z"                                       # 
 _="$@"                                         # 
 eval $_cQMVD                                   # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupVD () {                                    # FUNCTION: setupVD
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 verbose "setupVD [$X] [$Y]"                    # 
 test "x$X" !=  "x" -a "x$Y" != "x" && {        # 
  setupQMVD "$X" "$Y"                           # 
  setupHTTPVirt "$X" "$Y"                       # 
 } || {                                         # 
  error "Must provide account and domain"       # 
 }                                              # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupQMVD () {                                  # FUNCTION: setupQMVD
 local _sQMVD X Y                               # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 verbose "setupQMVD [$X] [$Y]"                  # 
 test "x$X" !=  "x" -a "x$Y" != "x" && {        # 
  set x `$EGREP "^$DOMAIN:" $QMCVD`; shift      # 
  test $# = 0 && {                              # 
   verbose "Adding $X to $QMCVD"                # 
   echo "$DOMAIN:$ACCOUNT" >>$QMCVD             # 
  } || {                                        # 
   :                                            # 
  }                                             # 
  set x `$EGREP "^$DOMAIN\$" $QMCRH`; shift     # 
  test $# = 0 && {                              # 
   verbose "Adding $X to $QMCRH"                # 
   echo "$DOMAIN" >>$QMCRH                      # 
  } || {                                        # 
   :                                            # 
  }                                             # 
  getHomeDir "$Y"; HOMEDIR="$_"                 # 
  setupDOTQmailDefault                          # 
  QMAIL restart                                 # 
 } || {                                         # 
  error "No account and domain!???"             # 
 }                                              # 
 set x;  shift                                  # 
 _="$@"                                         # 
 eval $_sQMVD                                   # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkMDNSConf () {                              # FUNCTION: CHECKMDNSCONF
 local _cMDNSC X                                # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "checkMDNSConf [$X]"                   # 
 PAT="zone .$X. in {"                           # 
 set x `$EGREP "$PAT" $MDNSCONF`; shift         # 
 test $# = 0 && {                               # 
  set x "MISSING"; shift                        # 
  stat "NOMASTER"                               # 
 } || {                                         # 
  set x "present"; shift                        # 
 }                                              # 
 _="$@"                                         # 
 eval  $_cMDNSC                                 # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkSDNSConf () {                              # FUNCTION: CHECKSDNSCONF
 local _cSDNSC X                                # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "checkSDNSConf [$X]"                   # 
 PAT="zone .$X. in {"                           # 
 set x `$EGREP "$PAT" $SDNSCONF`; shift         # 
 test $# = 0 && {                               # 
  set x "MISSING"; shift                        # 
  stat "NOSLAVE"                                # 
 } || {                                         # 
  set x "present"; shift                        # 
 }                                              # 
 _="$@"                                         # 
 eval $_cSDNSC                                  # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkHTTPDConf () {                             # FUNCTION: CHECKHTTPDCONF
 local _cHC X                                   # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 verbose "checkHTTPDConf [$X]"                  # 
 PAT="^ *servername *www.$X\$"                  # 
 set x `$EGREP -i "$PAT" $HTTPDCONF`; shift     # 
 test $# = 0 && {                               # 
  set x "MISSING"; shift                        # 
  stat "HTTPDCONF"                              # 
 } || {                                         # 
  set x "present"; shift                        # 
 }                                              # 
 _="$@"                                         # 
 eval $_cHC                                     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setupHTTPVirt () {                              # FUNCTION: SETUPHTTPVIRT
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 verbose "setupHTTPVirt [$X] [$Y]"              # 
 test "x$X" != "x" && {                         #
  PAT="^ *servername *www.$X\$"                 # 
  set x `$EGREP -i "$PAT" $HTTPDCONF`; shift    # 
  test $# = 0 && {                              # 
   set x "$X" "$Y"; shift                       # 
   FILE="$HTTPDCONF"                            # 
   PROG="s/%D%/$1/g;"                           # 
   TMPF="${TEMPTEMP}HTTPDCONF";                 #  temporary file name start
   $SED -e "$PROG" <$HTTPVIRT >>$FILE           # 
   getHomeDir "$2"; set x "$@" "$_"; shift      # 
   FILE="$3/public_html/index.html"             # 
   verbose "Linking: /www/$1 --> $3/public_html"        # 
   $LN -s "$3/public_html" "/www/$1"            # 
   FILE="$3/public_html/index.html"             #  index
   test -f "$FILE" || {                         # 
    verbose "Creating: $FILE "                  # 
    $SED -e "$PROG" <$HTTPIDX >$FILE            #  overwrite old index
   }                                            # 
   HTTPD restart                                # 
  } || {                                        # 
   :                                            # 
  }                                             # 
 }                                              # 
 _="$@"                                         # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
checkEverything () {                            # FUNCTION: CHECKEVERYTHING
 local _cE X Y                                  # 
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 MSG="Check everything: Account=$Y Domain=$X"   # 
 echo ""                                        # 
 echo "$MSG"                                    # 
 test "x$Y" != "x" && {                         # 
  echo "Checking account: Account --> [$Y] ..." # 
  checkAccount "$Y"; SACCOUNT="$_"              # 
  getHomeDir "$Y"; HOMEDIR="$_"                 # 
  checkHomeDir "$Y"; SHOMEDIR="$_"              # 
  getUserShell "$Y"; SSHELL="$_"                # 
  checkLink "/export/home/$Y"; LHOMEDIR="$_"    # 
  getDOTQmail "$Y"; SDOTQM="$_"                 # 
 }                                              # 
 test "x$X" != "x" && {                         # 
  echo "Checking domain : Domain  --> [$X] ..." # 
  getDNSServ "$X"; DNSSERVERS="$_"              # 
  checkZoneFile "$DOMAIN";  ZONEFILE="$_"       # 
  checkQMVD "$X"; QMVD="$_"                     # 
  checkMDNSConf "$X"; SMDNS="$_"                # 
  checkSDNSConf "$X"; SSDNS="$_"                # 
  getMX "$X"; SMX="$_"                          # 
  getIP "$X"; IP="$_"                           # 
  checkIPMatches "$X" "$IP"; SIPM="$_"          # 
  checkIPAlias "$X" "$IP"; SINT="$_"            # 
  checkLink "/www/$DOMAIN"; SDWLINK="$_"        # 
  checkHTTPDConf "$X"; SVWWW="$_"               # 
  checkDir "/www/$DOMAIN/cgi-bin"; SCGI="$_"    # 
  checkFile "/www/$DOMAIN/index.html"; SINDEX="$_"      # 
  checkDir "/www/$DOMAIN/logs"; SLOGS="$_"      # 
 }                                              # 
 formOUT                                        # 
 pressreturn                                    # 
 eval $_cE                                      # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
doEverything () {                               # FUNCTION: DOEVERYTHING
 test $# -gt 0 && X="$1" || X="$DOMAIN"         # 
 test $# -gt 1 && Y="$2" || Y="$ACCOUNT"        # 
 verbose "doEverything [$X] [$Y]"               #  blah
 test "x$X" !=  "x" -a "x$Y" != "x" && {        # 
  echo "Doing everything, please wait ..."      # 
  set x "$X" "$Y"; shift                        # 
  makeUserAccount "$2"                          # 
  setupDNS "$1" "$IP" "" "$2"                   # 
  setupQMVD "$1" "$2"                           # 
  setupHTTPVirt "$1" "$2"                       # 
  setupIPAlias "$1"                             # 
 } || {                                         # 
  error "Must provide account and domain"       # 
  PAUSE="$TRUE"                                 # 
 }                                              # 
 _="$@"                                         # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setAccountID () {                               # FUNCTION: SETACCOUNTID
 verbose "setAccountID"                         #  blah
 test $# = 0 && {                               # 
  $ECHO -n "Account ID: "                       # 
  read INPUT                                    # 
  set x "$INPUT"; shift                         # 
 }                                              # 
 test $# -gt 0 && {                             # 
  ACCOUNT="$@"                                  # check validity of ID? FIX
 }                                              # 
}                                               #
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setDomainName () {                              # FUNCTION: SETDOMAINNAME
 verbose "setDomainName"                        #  blah
 test $# = 0 && {                               # 
  promptinput "Domain Name: "                   #
  set x "$_"; shift                             # 
 }                                              # 
 test $# -gt 0 && {                             # 
  DOMAIN="$@"                                   # check validity of DN? FIX
 }                                              # 
 DOMAIN=`lcase "$DOMAIN"`                       # 
}                                               #
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setIP () {                                      # FUNCTION: SETIP
 verbose "setIP [$@]"                           #  blah
 test $# = 0 && {                               # 
  $ECHO -n "IP: "                               # 
  read INPUT                                    # 
  set x "$INPUT"; shift                         # 
 }                                              # 
 test `echo "$@" | $WC -c` -lt 8 && {           # 
  case "$@" in                                  # 
   *"." ) set x "$IPBASE$1" ; shift ;;          # 
   ""   ) set x             ; shift ;;          # 
   *    ) set x "$IPBASE.$1"; shift ;;          # 
  esac                                          # 
 }                                              # 
 _="$@"                                         # 
 IP="$_"                                        # 
}                                               #
                                                # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
setMX () {                                      # FUNCTION: SETIP
 verbose "setMX [$@]"                           #  blah
 test $# = 0 && {                               # 
  $ECHO -n "MX: "                               # 
  read INPUT                                    # 
  set x "$INPUT"; shift                         # 
 }                                              # 
 case "$@" in                                   # 
  *"."* ) :                         ;;          # 
  *     ) set x "$@."$DOMAIN; shift ;;          # 
 esac                                           # 
 _="$@"                                         # 
 MX="$_"                                        # 
}                                               #
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
rootcheck () {                                  # FUNCTION: COMMAND
 verbose "rootcheck"                            #  blah
 set x `$ID`; shift                             # 
 case "$@" in                                   # 
  *"uid=0("* ) :                             ;; # 
  *          ) fatalError "Must run as root!";; # 
 esac                                           # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
mongo () {                                      # FUNCTION: COMMAND
 verbose "mongo"                                #  blah
 test "x$INTERACTIVE" != "x" && interactive     # 
}                                               # 
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
command () {                                    # FUNCTION: COMMAND
 verbose "*BEGIN* $@"                           #  blah
 eval "$@"                                      #  evaluate/exec command!
 verbose "* END * $@"                           #  blah
}                                               # end command
                                                # 
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                # 
doProgram () {                                  # FUNCTION: doProgram
 verbose "Running ..."                          #  call: verbose w/ params
 set x $COMMANDS; shift                         #  set values
 while test $# -gt 0                            #  while things to do
 do                                             #  do
  command "$1"                                  #   things
  shift                                         #   one less thing to do
 done                                           #  done doing things
 finish                                         #  call: finish
}                                               # end doProgram
                                                #  
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                #  
main () {                                       # FUNCTION: main 
 initialize "$@"                                #  call: initialize
 eval doProgram $BACKGROUND                     #  call: doProgram
}                                               # end main
                                                #  
# ,-*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~*-, # ,-*~'`^`'~*-,._.,-*~'`^`'~*-,
                                                #  
main "$@"                                       #  call: main w/ passed params
                                                #  

#
# !NOT WORKING! WARNING - DO NOT RUN ANY OF THE BELOW OPTIONS!
# (F) Forward Email Address             (MX) Check MX
# (V) Virtual Email Domain              (W) Web domain.
# (I) IP                                        (v) Verbose : $VERBOSE
# (0) Check Everything! Do Everything! Bwahahahahahahahahab!
# (9) Display DNS servers
# (qm ) QMAIL restart                   (qms) QMAIL status
# (www) HTTPD restart                   (wws) HTTPD status
# 




#
#  _______  _____  __   _  ______  _____ 
#  |  |  | |     | | \  | |  ____ |     |
#  |  |  | |_____| |  \_| |_____| |_____|
#


#  \|/ ____ \|/
#   @~/ ,. \~@
#  /_( \__/ )_\
#     \__U_/

#
#              _____   ________    _______    ________ ________    
#             /     \  \_____  \   \      \  /  _____/ \_____  \   
#            /  \ /  \  /   |   \  /   |   \/   \  ___  /   |   \  
#           /    Y    \/    |    \/    |    \    \_\  \/    |    \ 
#           \M___|__  /\O______  /\N___|__  /\G_____  /\O______  / 
#                   \/         \/         \/        \/     (TM)\/ 
#

Reply via email to