#!/bin/sh
# Copyright 2008 Hewlett-Packard Development Company, L.P.
#

export LANG=C

CLEARSCREEN=$(/usr/bin/tput clear)
PIDOF=$(which pidof)

get_tty() 
{
   # $1 contains the ENV for tty
   # Return 0 when succeed
   TMP=/dev/tty
   <$TMP >/dev/null 2>&1
   if [ $? = 0 ]; then
      eval $1="$TMP"
      return 0
   fi
   eval $1=""
   return 1
}

get_installmode() 
{
   # $1 contains the ENV for installation mode
   # $2 contains the ENV for tty
   # Always return 0 with install mod: (INTERACTIVE or SILENT)
 
   #HPHTTPSERVEROVERWRITE=`echo $HPHTTPSERVEROVERWRITE | tr [a-z] [A-Z]`
   CMASILENT=$(echo $CMASILENT | tr '[a-z]' '[A-Z]')
   CMAFDTNSILENT=$(echo $CMAFDTNSILENT | tr '[a-z]' '[A-Z]')
   if [ "$CMASILENT" = "YES" -o "$CMAFDTNSILENT" = "YES" ]; then
      eval $1="SILENT"
      eval $2=""
      return 0
   fi

   HPLSPINSTALL=$(echo $HPLSPINSTALL | tr '[a-z]' '[A-Z]')
   HPPSPINSTALL=$(echo $HPPSPINSTALL | tr '[a-z]' '[A-Z]')
   if [ "$HPLSPINSTALL" = "TRUE" -o "$HPPSPINSTALL" = "TRUE" ]; then
      eval $1="LSP"
      eval $2=""
      return 0
   fi

   get_tty TMPTTY
   if [ ! -z "$TMPTTY" ]; then
      eval $1="INTERACTIVE"
      eval $2="$TMPTTY"
   else
      eval $1="SILENT"
      eval $2=""
   fi
   return 0
}

env_manager () 
{
   # $1: opcode - INIT, ENVUSED, ENVREJECTED, PRINT
   # $2: environment variable name
   case "$1" in
      INIT)
         ENVUSEDLIST=""
         ENVREJECTEDLIST=""
      ;;
      ENVUSED)
         ENVUSEDLIST="$ENVUSEDLIST $2"
      ;;
      ENVREJECTED)
         ENVREJECTEDLIST="$REJECTEDLIST $2"
      ;;
      PRINT)
         if [ ! -z "$ENVUSEDLIST" ]; then
            echo
            echo "Following environment variables were used to configure snmpd/agents: "
            for i in $ENVUSEDLIST; do
               echo "    $i"
            done
            echo
         fi
         if [ ! -z "$ENVREJECTEDLIST" ]; then
            echo "Following environment variables contain invalid data: "
            for i in $ENVREJECTEDLIST; do
               echo "    $i"
            done
         fi
      ;;
   esac
   return 0
}

validate_data () 
{
   # $1 contains Data
   # $2 contains NOBLANK or BLANKOK
   # $3 contains NOSPACE or SPACEOK or YESNO
   [ $2 = "NOBLANK" -a -z "$1" ] && return 1
   if [ $3 = "NOSPACE" ]; then
      echo $ANS | egrep ' |       ' >/dev/null 2>&1
      [ $? = 0 ] && return 2
   fi
   if [ $3 = "YESNO" ]; then
      if [ ! -z "`echo $ANS | tr -d 'yn'`" ]; then
         return 3
      fi
   fi
   return 0
}

get_userinput () 
{
   # $1 contains the user prompt
   # $2 contains the TTY device node
   # $3 contains NOBLANK or BLANKOK
   # $4 contains NOSPACE or SPACEOK
   # $5 contains ECHO or NOECHO
   # $6 contains CLSCR or NOCLSCR
   # Always return 0
   if [ "$CMAINSTALL" = "yes" ]; then
      echo "" > $2
      CMAINSTALL=""
   fi
   if [ "$5" = NOECHO ]; then
      stty -F $2 -echo
#    echo "NOTE: keyboard input echo has been turned off." > $2
   fi
   while true; do
      while true; do
         if [ "$6" != "NOCLSCR" ]; then
            echo "$CLEARSCREEN" > $2
         fi
         printf "$1" "" > $2
         read ANS < $2
         [ "$5" = NOECHO ] && echo "" > $2
         validate_data "$ANS" "$3" "$4"
         case "$?" in
            1)
                continue
            ;;
            2)
                echo -n "ERROR: Space and tab are not allowed, press ENTER to continue ..." > $2
                read ANS < $2
                [ "$5" = NOECHO ] && echo "" > $2
                continue
            ;;
            3)
               echo -n "ERROR: You must type 'y' or 'n', press ENTER to continue ..." > $2
               read ANS < $2
               [ "$5" = NOECHO ] && echo "" > $2
               continue
         esac
      break
      done
      [ ! "$5" = NOECHO ] && break
      [ -z "$ANS" ] && break
      echo -n "Re-enter the same input to confirm: " > $2
      read ANS1 < $2
      echo "" > $2
      if [ "$ANS1" = "$ANS" ]; then
         printf "ACCEPTED: inputs match!\n\n" > $2
         break
      fi
      echo "ERROR: inputs mismatch! Press ENTER to try again." > $2
      read ANS < $2
   done
   if [ "$5" = NOECHO ]; then
      stty -F $2 echo
#    echo "NOTE: keyboard input echo has been turned on." > $2
   fi
   echo $ANS
   return 0
}

# Add minimum configuration required by HP Insight Management Agents
rancomm () {
  RANCOMM=""
  RANCOMMLEN=""
  COUNTER=0
  while true; do
    COUNTER=`expr $COUNTER + 7`
    DATE=`date 2>/dev/null`
    HOSTNAME=`hostname 2>/dev/null`
    IFCONFIG=`ifconfig 2>/dev/null`
    PROCSTAT=`cat /proc/stat 2>&1`
    if [ -z "$RANCOMMLEN" ]; then
      EXPR=`echo $COUNTER $DATE $HOSTNAME $IFCONFIG $PROCSTAT $COUNTER | md5sum | \
        sed 's/^[^4567]*\([4567]\).*\([4567]\)[^4567]*$/expr \1 + \2/'`
      [ ${#EXPR} -lt 10 ] && continue
      RANCOMMLEN=`$EXPR 2>/dev/null`
      continue
    fi
    MAXLEN=`expr $RANCOMMLEN - ${#RANCOMM}`
    RANCOMM=${RANCOMM}`echo $COUNTER $DATE $HOSTNAME $IFCONFIG $PROCSTAT $COUNTER | md5sum | \
      awk 'BEGIN { MAXLEN='$MAXLEN'
                   A["30"]="0"; A["31"]="1"; A["32"]="2"; A["33"]="3";
                   A["34"]="4"; A["35"]="5"; A["36"]="6"; A["37"]="7";
                   A["38"]="8"; A["39"]="9"
                   A["41"]="A"; A["42"]="B"; A["43"]="C"; A["44"]="D";
                   A["45"]="E"; A["46"]="F"; A["47"]="G"; A["48"]="H";
                   A["49"]="I"; A["4a"]="J"; A["4b"]="K"; A["4c"]="L";
                   A["4d"]="M"; A["4e"]="N"; A["4f"]="O"; A["50"]="P";
                   A["51"]="Q"; A["52"]="R"; A["53"]="S"; A["54"]="T";
                   A["55"]="U"; A["56"]="V"; A["57"]="W"; A["58"]="X";
                   A["59"]="Y"; A["5a"]="Z"; A["61"]="a"; A["62"]="b";
                   A["63"]="c"; A["64"]="d"; A["65"]="e"; A["66"]="f";
                   A["67"]="g"; A["68"]="h"; A["69"]="i"; A["6a"]="j";
                   A["6b"]="k"; A["6c"]="l"; A["6d"]="m"; A["6e"]="n";
                   A["6f"]="o"; A["70"]="p"; A["71"]="q"; A["72"]="r";
                   A["73"]="s"; A["74"]="t"; A["75"]="u"; A["76"]="v";
                   A["77"]="w"; A["78"]="x"; A["79"]="y"; A["7a"]="z";
           }
           {
             LEN=length($0)
             for (i=0; i< LEN-1 && MAXLEN > 0; i=i+2) {
               HEX=substr($0,i,2)
               if (HEX in A) {
                 printf "%s", A[HEX];
                 MAXLEN--;
               }
             }
           }'`
    RANCOMM=`echo $RANCOMM | sed 's/^[0-9]*//'`
    [ ${#RANCOMM} -ge $RANCOMMLEN ] && break;
  done

  echo "$RANCOMM"
  return 0
}


which_snmpd_conf() 
{
   CMACONFFILE=/opt/hp/hp-snmp-agents/cma.conf

   SNMPDCONFDEFPATH="/etc/snmp:/etc:/usr/share/snmp:/usr/lib/snmp:~/.snmp"
   if [ -d /etc/snmp/ ]; then
      SNMPDCONFFILE="/etc/snmp/snmpd.conf"
   else
      SNMPDCONFFILE="/etc/snmpd.conf"
   fi
}

get_configs () 
{
   SNMPDCONF=snmpd.conf
   SNMPDCONFUSED=""
   [ -z "$SNMPCONFPATH" ] && SNMPCONFPATH=$SNMPDCONFDEFPATH
   TMPPATH=`echo $SNMPCONFPATH | sed 's/:/ /g'`
   for i in $TMPPATH; do
      #echo "$i/$SNMPDCONF"
      [ -f "$i/$SNMPDCONF" ] && SNMPDCONFUSED="$SNMPDCONFUSED $i/$SNMPDCONF"
      [ -f "$i/ucd$SNMPDCONF" ] && SNMPDCONFUSED="$SNMPDCONFUSED $i/ucd$SNMPDCONF"
      [ -f "$i/net$SNMPDCONF" ] && SNMPDCONFUSED="$SNMPDCONFUSED $i/net$SNMPDCONF"
   done

   SNMPDLOCALWRITECOMMUSED=""
   SNMPDLOCALREADCOMMUSED=""
   SNMPDNONLOCALWRITECOMMUSED=""
   SNMPDNONLOCALREADCOMMUSED=""
   SNMPDTRAPDEFCOMM=""
   SNMPDTRAPDESTANDCOMM=""
   SNMPDSYSCONTACT=""
   SNMPDXLOCATION=""
   SNMPDLOCATION=""
   SNMPDAGENTAEXCLUDE=""

   # bail if no snmp conf file found.
   if [ -z "$SNMPDCONFUSED" ]; then
      return
   fi

   TMPPATH=/tmp/tmp$$

   egrep -h '^[  ]*rwcommunity[  ].*$' $SNMPDCONFUSED > $TMPPATH
   while read TEMPSTR1 TEMPSTR2 TEMPSTR3; 
   do
      if [ -z "$TEMPSTR3" ]; then
         SNMPDLOCALWRITECOMMUSED="${SNMPDLOCALWRITECOMMUSED}rwcommunity $TEMPSTR2 localhost\\n"
         SNMPDNONLOCALWRITECOMMUSED="${SNMPDNONLOCALWRITECOMMUSED}rwcommunity $TEMPSTR2\\n"
         continue
      fi
      if [ "$TEMPSTR3" = "127.0.0.1" -o "$TEMPSTR3" = "localhost" ]; then
         SNMPDLOCALWRITECOMMUSED="${SNMPDLOCALWRITECOMMUSED}rwcommunity $TEMPSTR2 $TEMPSTR3\\n"
      else
         SNMPDNONLOCALWRITECOMMUSED="${SNMPDNONLOCALWRITECOMMUSED}rwcommunity $TEMPSTR2 $TEMPSTR3\\n"
      fi
   done < $TMPPATH

   egrep -h '^[  ]*rocommunity[  ].*$' $SNMPDCONFUSED > $TMPPATH

   while read TEMPSTR1 TEMPSTR2 TEMPSTR3; do
      if [ -z "$TEMPSTR3" ]; then
         SNMPDLOCALREADCOMMUSED="${SNMPDLOCALREADCOMMUSED}rocommunity $TEMPSTR2 localhost\\n"
         SNMPDNONLOCALREADCOMMUSED="${SNMPDNONLOCALREADCOMMUSED}rocommunity $TEMPSTR2\\n"
         continue
      fi
      if [ "$TEMPSTR3" = "127.0.0.1" -o "$TEMPSTR3" = "localhost" ]; then
         SNMPDLOCALREADCOMMUSED="${SNMPDLOCALREADCOMMUSED}rocommunity $TEMPSTR2 $TEMPSTR3\\n"
      else
         SNMPDNONLOCALREADCOMMUSED="${SNMPDNONLOCALREADCOMMUSED}rocommunity $TEMPSTR2 $TEMPSTR3\\n"
      fi
   done < $TMPPATH

   SNMPDTRAPDEFCOMM=`egrep -h '^[        ]*trapcommunity.*$' $SNMPDCONFUSED | sed -e 's/$/\\\\n/' | tr -d '\n'`

   SNMPDTRAPDESTANDCOMM=`egrep -h '^[    ]*trapsink.*$' $SNMPDCONFUSED | sed -e 's/$/\\\\n/' | tr -d '\n'`

   SNMPDSYSCONTACT=`egrep -h '^[         ]*syscontact' $SNMPDCONFUSED | sed -e 's/$/\\\\n/' | tr -d '\n'`

   SNMPDXLOCATION=`egrep -h '^[   ]*dlmod[        ]*cmaX' $SNMPDCONFUSED | sed -e 's/$/\\\\n/' | tr -d '\n'`

   SNMPDLOCATION=`egrep -h '^[   ]*syslocation' $SNMPDCONFUSED | sed -e 's/$/\\\\n/' |  tr -d '\n'`

   SNMPDAGENTEXCLUDE=""
   [ -f $CMACONFFILE ] && SNMPDAGENTEXCLUDE="`egrep -h '^exclude.*$' $CMACONFFILE >/dev/null| sed -e 's/$/\\\\n/'`"

   [ -f $CMACONFFILE ] && SNMPDNOTAINTEDKERNEL="`egrep -h '^notaint' $CMACONFFILE >/dev/null| awk '{print $1}'`"

   return 0
}

configure_snmp() {
SNMP_INTRO="This configuration script will configure SNMP to integrate with the HP SIM and\nthe HP System Management Homepage by editting the snmpd.conf file. The HP-SNMP-Agents can also exist in a more secure\nSNMP environment (e.g. VACM) that you have previously configured. See the\nhp-snmp-agents(4) man page for specific details on how to configure the VACM entries\nin the 'snmpd.conf' file. You may press <ctrl+c> now to exit now if needed."

TEMPSTR1=""
if [ ! -z "$CMASKIPSNMPCONFIG" ]; then
   validate_data "$CMASKIPSNMPCONFIG" NOBLANK YESNO
   TEMPSTR1=$?
else
   CMASKIPSNMPCONFIG="n"
fi
if [ "$TEMPSTR1" = "0" ]; then
   env_manager ENVUSED CMASKIPSNMPCONFIG
else
   [ ! -z "$TEMPSTR1" ] && env_manager ENVREJECTED CMASKIPSNMPCONFIG
   if [ "$INSTMODE" = "INTERACTIVE" ]; then
      TEMPSTR1=`get_userinput "$SNMP_INTRO\n\nDo you wish to use an existing snmpd.conf (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO CLSCR`
      if [ ! -z "$TEMPSTR1" ]; then
         CMASKIPSNMPCONFIG=$TEMPSTR1
      else
         CMASKIPSNMPCONFIG="n"
      fi
   fi
fi
}

get_comm_string() {
   SNMP_INTRO="You will now be asked a series of SNMP configuration questions.  How you answer\nthese question will affect the way SNMP behaves.  Configuring SNMP could have\nsecurity implications on your system. If you are not sure how to answer a\nquestion, you can abort by pressing <Ctrl-c> and no changes will be made to\nyour SNMP configuration."

   TEMPSTR1=""
   if [ ! -z "$CMALOCALHOSTRWCOMMSTR" ]; then
      validate_data "$CMALOCALHOSTRWCOMMSTR" NOBLANK NOSPACE
      TEMPSTR1=$?
   fi
   if [ "$TEMPSTR1" = "0" ]; then
      env_manager ENVUSED CMALOCALHOSTRWCOMMSTR
      echo "rwcommunity  $CMALOCALHOSTRWCOMMSTR  127.0.0.1" >>$TMPFILE
      LINES=`expr $LINES + 1`
   else
      [ ! -z "$TEMPSTR1" ] && env_manager ENVREJECTED CMALOCALHOSTRWCOMMSTR
      if [ "$INSTMODE" = "INTERACTIVE" ]; then
         if [ ! -z "$SNMPDLOCALWRITECOMMUSED" ]; then
            TEMPSTR1=`get_userinput "$SNMP_INTRO\n\nLocalhost SNMP Read/Write community strings are already known.\nDo you wish to change it (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO CLSCR`
            [ "$TEMPSTR1" = "y" ] &&  SNMPDLOCALWRITECOMMUSED=
         fi
         if [ -z "$SNMPDLOCALWRITECOMMUSED" ]; then
            TEMPSTR1=`get_userinput "$SNMP_INTRO\n\nEnter the localhost SNMP Read/Write community string\n(one word, required, no default): " $TTY NOBLANK NOSPACE NOECHO CLSCR`
            if [ ! -z "$TEMPSTR1" ]; then
               SNMPDLOCALWRITECOMMUSED="rwcommunity $TEMPSTR1 127.0.0.1\\n"
               CMALOCALHOSTRWCOMMSTR=$TEMPSTR1
            fi
         fi
      fi
      if [ ! -z "$SNMPDLOCALWRITECOMMUSED" ]; then
         printf "$SNMPDLOCALWRITECOMMUSED" >>$TMPFILE
         LINES=`expr $LINES + 1`
      else
         # Performs minimum configuration with random community string
         # but only if no env variable was passed in.
         RWCOMMSTRING=`rancomm`
         echo "rwcommunity  $RWCOMMSTRING  127.0.0.1" >>$TMPFILE
         LINES=`expr $LINES + 1`
      fi
   fi

   TEMPSTR1=""
   if [ ! -z "$CMALOCALHOSTROCOMMSTR" ]; then
      validate_data "$CMALOCALHOSTROCOMMSTR" NOBLANK NOSPACE
      TEMPSTR1=$?
   fi
   if [ "$TEMPSTR1" = "0" ]; then
      env_manager ENVUSED CMALOCALHOSTROCOMMSTR
      echo "rocommunity  $CMALOCALHOSTROCOMMSTR  127.0.0.1" >>$TMPFILE
      LINES=`expr $LINES + 1`
   else
      [ ! -z "$TEMPSTR1" ] && env_manager ENVREJECTED CMALOCALHOSTROCOMMSTR
      if [ "$INSTMODE" = "INTERACTIVE" ]; then
         if [ ! -z "$SNMPDLOCALREADCOMMUSED" ]; then
            TEMPSTR1=`get_userinput "Localhost SNMP Read Only community strings are already known.\nDo you wish to change it (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
            [ "$TEMPSTR1" = "y" ] &&  SNMPDLOCALREADCOMMUSED=
         fi
         if [ -z "$SNMPDLOCALREADCOMMUSED" ]; then
            TEMPSTR1=`get_userinput "Enter localhost SNMP Read Only community string\n(one word, Blank to skip): " $TTY BLANKOK NOSPACE NOECHO NOCLSCR`
            if [ ! -z "$TEMPSTR1" ]; then
               SNMPDLOCALREADCOMMUSED="rocommunity $TEMPSTR1 127.0.0.1\\n"
               CMALOCALHOSTROCOMMSTR=$TEMPSTR1
            fi
         fi
      fi
      if [ ! -z "$SNMPDLOCALREADCOMMUSED" ]; then
         printf "$SNMPDLOCALREADCOMMUSED"  >>$TMPFILE
         LINES=`expr $LINES + 1`
      fi
   fi
}

get_mgmt_station_comm_string() 
{
   # READ WRITE COMMUNITIES
   #Backward compatibility
   if [ ! -z "$CMAMGMTSTATIONRWIPORDNS" ]; then
      CMAMGMTSTATIONIPORDNS="$CMAMGMTSTATIONRWIPORDNS"
   fi

   I=0
   for TEMPSTR1 in $CMAMGMTSTATIONIPORDNS; do
      I=`expr $I + 1`
      TEMPARRAY1[$I]="$TEMPSTR1"
   done
   J=0
   for TEMPSTR2 in $CMAMGMTSTATIONRWCOMMSTR; do
      J=`expr $J + 1`
      TEMPARRAY2[$J]="$TEMPSTR2"
   done

   if [ "$I" != "0" ]; then
      for J in `seq 1 $I`; do
         if [ ! -z "${TEMPARRAY2[$J]}" ]; then
            echo "rwcommunity  ${TEMPARRAY2[$J]} ${TEMPARRAY1[$J]}" >>$TMPFILE
            LINES=`expr $LINES + 1`
         fi
      done
      env_manager ENVUSED CMAMGMTSTATIONIPORDNS
      env_manager ENVUSED CMAMGMTSTATIONRWCOMMSTR
   else
      [ ! -z "$CMAMGMTSTATIONIPORDNS" ] && env_manager ENVREJECTED CMAMGMTSTATIONIPORDNS
      [ ! -z "$CMAMGMTSTATIONRWCOMMSTR" ] && env_manager ENVREJECTED CMAMGMTSTATIONRWCOMMSTR
      if [ "$INSTMODE" = "INTERACTIVE" ]; then
         # Read Write stuff
         if [ ! -z "$SNMPDNONLOCALWRITECOMMUSED" ]; then
            TEMPSTR1=`get_userinput "SNMP Read/Write community strings are already set to\n${SNMPDNONLOCALWRITECOMMUSED}Do you wish to change them (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
            [ "$TEMPSTR1" = "y" ] &&  SNMPDNONLOCALWRITECOMMUSED=
         fi
         if [ -z "$SNMPDNONLOCALWRITECOMMUSED" ]; then
            while true; do
               TEMPSTR1=`get_userinput "Enter Read/Write Authorized Management Station IP or DNS name\n(Blank to skip): " $TTY BLANKOK NOSPACE ECHO NOCLSCR`
               [ -z "$TEMPSTR1" ] && break
               TEMPSTR2=`get_userinput "Enter SNMP Read/Write community string for Management Station \"$TEMPSTR1\"\n(one word, required, no default): " $TTY NOBLANK NOSPACE NOECHO NOCLSCR`
               if [ ! -z "$TEMPSTR2" ]; then
                  SNMPDNONLOCALWRITECOMMUSED="${SNMPDNONLOCALWRITECOMMUSED}rwcommunity  $TEMPSTR2 $TEMPSTR1\\n"
                  if [ -z "$CMAMGMTSTATIONRWIPORDNS" ]; then
                     CMAMGMTSTATIONRWIPORDNS="$TEMPSTR1"
                  else
                     CMAMGMTSTATIONRWIPORDNS="$CMAMGMTSTATIONRWIPORDNS $TEMPSTR1"
                  fi
                  if [ -z "$CMAMGMTSTATIONRWCOMMSTR" ]; then
                     CMAMGMTSTATIONRWCOMMSTR="$TEMPSTR2"
                  else
                     CMAMGMTSTATIONRWCOMMSTR="$CMAMGMTSTATIONRWCOMMSTR $TEMPSTR2"
                  fi
               fi
               break
            done
         fi
      fi
      if [ ! -z "$SNMPDNONLOCALWRITECOMMUSED" ]; then
         printf "$SNMPDNONLOCALWRITECOMMUSED" >>$TMPFILE
         LINES=`expr $LINES + 1`
      fi
   fi

   # READ ONLY COMMUNITIES
   I=0
   for TEMPSTR1 in $CMAMGMTSTATIONROIPORDNS; do
       I=`expr $I + 1`
       TEMPARRAY1[$I]="$TEMPSTR1"
   done
   J=0
   for TEMPSTR2 in $CMAMGMTSTATIONROCOMMSTR; do
      J=`expr $J + 1`
      TEMPARRAY2[$J]="$TEMPSTR2"
   done

   if [ "$I" != "0" ]; then
      for J in `seq 1 $I`; do
         if [ ! -z "${TEMPARRAY2[$J]}" ]; then
            echo "rocommunity  ${TEMPARRAY2[$J]} ${TEMPARRAY1[$J]}" >>$TMPFILE
            LINES=`expr $LINES + 1`
         fi
      done
      env_manager ENVUSED CMAMGMTSTATIONROIPORDNS
      env_manager ENVUSED CMAMGMTSTATIONROCOMMSTR
   else
      [ ! -z "$CMAMGMTSTATIONROIPORDNS" ] && env_manager ENVREJECTED CMAMGMTSTATIONROIPORDNS
      [ ! -z "$CMAMGMTSTATIONROCOMMSTR" ] && env_manager ENVREJECTED CMAMGMTSTATIONROCOMMSTR
      if [ "$INSTMODE" = "INTERACTIVE" ]; then
         # Read Only stuff
         if [ ! -z "$SNMPDNONLOCALREADCOMMUSED" ]; then
            TEMPSTR1=`get_userinput "SNMP Read Only community strings are already set to\n${SNMPDNONLOCALREADCOMMUSED}Do you wish to change them (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
            [ "$TEMPSTR1" = "y" ] &&  SNMPDNONLOCALREADCOMMUSED=
         fi
         if [ -z "$SNMPDNONLOCALREADCOMMUSED" ]; then
            while true; do
               TEMPSTR1=`get_userinput "Enter Read Only Authorized Management Station IP or DNS name\n(Blank to skip): " $TTY BLANKOK NOSPACE ECHO NOCLSCR`
               [ -z "$TEMPSTR1" ] && break
               TEMPSTR2=`get_userinput "Enter SNMP Read Only community string for Management Station \"$TEMPSTR1\"\n(one word, required, no default): " $TTY NOBLANK NOSPACE NOECHO NOCLSCR`
               if [ ! -z "$TEMPSTR2" ]; then
                  SNMPDNONLOCALREADCOMMUSED="${SNMPDNONLOCALREADCOMMUSED}rocommunity  $TEMPSTR2 $TEMPSTR1\\n"
                  if [ -z "$CMAMGMTSTATIONROIPORDNS" ]; then
                     CMAMGMTSTATIONROIPORDNS="$TEMPSTR1"
                  else
                     CMAMGMTSTATIONROIPORDNS="$CMAMGMTSTATIONROIPORDNS $TEMPSTR1"
                  fi
                     if [ -z "$CMAMGMTSTATIONROCOMMSTR" ]; then
                        CMAMGMTSTATIONROCOMMSTR="$TEMPSTR2"
                     else
                        CMAMGMTSTATIONROCOMMSTR="$CMAMGMTSTATIONROCOMMSTR $TEMPSTR2"
                     fi
               fi
               break
            done
         fi
      fi
      if [ ! -z "$SNMPDNONLOCALREADCOMMUSED" ]; then
         printf "$SNMPDNONLOCALREADCOMMUSED" >>$TMPFILE
         LINES=`expr $LINES + 1`
      fi
   fi
}
get_trap_comm_string() 
{
   # TRAP COMMUNITY
   TEMPSTR1=""
   if [ ! -z "$CMADEFTRAPCOMMSTR" ]; then
      validate_data "$CMADEFTRAPCOMMSTR" NOBLANK NOSPACE
      TEMPSTR1=$?
   fi
   if [ "$TEMPSTR1" = "0" ]; then
      echo "trapcommunity $CMADEFTRAPCOMMSTR" >>$TMPFILE
      LINES=`expr $LINES + 1`
      env_manager ENVUSED CMADEFTRAPCOMMSTR
   else
      [ ! -z "$CMADEFTRAPCOMMSTR" ] && env_manager ENVREJECTED CMADEFTRAPCOMMSTR
      if [ "$INSTMODE" = "INTERACTIVE" ]; then
         if [ ! -z "$SNMPDTRAPDEFCOMM" ]; then
            TEMPSTR1=`get_userinput "The SNMP trap community strings are set up like this:\n${SNMPDTRAPDEFCOMM}Do you wish to change this (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
            [ "$TEMPSTR1" = "y" ] &&  SNMPDTRAPDEFCOMM=
         fi
         if [ -z "$SNMPDTRAPDEFCOMM" ]; then
            TEMPSTR1=`get_userinput "Enter default SNMP trap community string\n(One word; Blank to skip): " $TTY BLANKOK NOSPACE ECHO NOCLSCR`
            if [ ! -z "$TEMPSTR1" ]; then
               SNMPDTRAPDEFCOMM="trapcommunity $TEMPSTR1\\n"
               CMADEFTRAPCOMMSTR=$TEMPSTR1
            fi
         fi
      fi
      if [ ! -z "$SNMPDTRAPDEFCOMM" ]; then
         printf "$SNMPDTRAPDEFCOMM" >>$TMPFILE
         LINES=`expr $LINES + 1`
      fi
   fi
}

get_trap_sink_string() 
{

        # TRAP SINKS

        I=0
        for TEMPSTR1 in $CMATRAPDESTINATIONIPORDNS; do
                I=`expr $I + 1`
                TEMPARRAY1[$I]="$TEMPSTR1"
        done
        J=0
        for TEMPSTR2 in $CMATRAPDESTINATIONCOMMSTR; do
                J=`expr $J + 1`
                TEMPARRAY2[$J]="$TEMPSTR2"
        done

        if [ "$I" != "0" ]; then
                for J in `seq 1 $I`; do
                        if [ ! -z "${TEMPARRAY2[$J]}" ]; then
                                echo "trapsink ${TEMPARRAY1[$J]} ${TEMPARRAY2[$J]}" >>$TMPFILE
                                LINES=`expr $LINES + 1`
                        fi
                done
                env_manager ENVUSED CMATRAPDESTINATIONIPORDNS
                env_manager ENVUSED CMATRAPDESTINATIONCOMMSTR
        else
                [ ! -z "$CMATRAPDESTINATIONIPORDNS" ] && env_manager ENVREJECTED CMATRAPDESTINATIONIPORDNS
                [ ! -z "$CMATRAPDESTINATIONCOMMSTR" ] && env_manager ENVREJECTED CMATRAPDESTINATIONCOMMSTR
                if [ "$INSTMODE" = "INTERACTIVE" ]; then
                        if [ ! -z "$SNMPDTRAPDESTANDCOMM" ]; then
                                TEMPSTR1=`get_userinput "Trap sinks are set up like this:\n${SNMPDTRAPDESTANDCOMM}Do you wish to change this (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
                                [ "$TEMPSTR1" = "y" ] &&  SNMPDTRAPDESTANDCOMM=
                        fi
                        if [ -z "$SNMPDTRAPDESTANDCOMM" ]; then
                                while true; do
                                        TEMPSTR1=`get_userinput "Enter SNMP trap destination IP or DNS name\n(One word; Blank to skip): " $TTY BLANKOK NOSPACE ECHO NOCLSCR`
                                        [ -z "$TEMPSTR1" ] && break
                                        TEMPSTR2=`get_userinput "Enter trap community string for trap destination \"$TEMPSTR1\"\n(One word; Blank to skip): " $TTY BLANKOK NOSPACE ECHO NOCLSCR`
                                        if [ ! -z "$TEMPSTR1" ]; then
                                                SNMPDTRAPDESTANDCOMM="${SNMPDTRAPDESTANDCOMM}trapsink $TEMPSTR1 $TEMPSTR2\\n"
                                                if [ -z "$CMATRAPDESTINATIONIPORDNS" ]; then
                                                        CMATRAPDESTINATIONIPORDNS="$TEMPSTR1"
                                                else
                                                        CMATRAPDESTINATIONIPORDNS="$CMATRAPDESTINATIONIPORDNS $TEMPSTR1"
                                                fi
                                                if [ -z "$CMATRAPDESTINATIONCOMMSTR" ]; then
                                                        CMATRAPDESTINATIONCOMMSTR="$TEMPSTR2"
                                                else
                                                        CMATRAPDESTINATIONCOMMSTR="$CMATRAPDESTINATIONCOMMSTR $TEMPSTR2"
                                                fi
                                        fi
                                        break
                                done
                        fi
                fi
                if [ ! -z "$SNMPDTRAPDESTANDCOMM" ]; then
                        printf "$SNMPDTRAPDESTANDCOMM" >>$TMPFILE
                        LINES=`expr $LINES + 1`
                fi
        fi
}

get_sys_contact() 
{
        # Configure sysContact
        if [ ! -z "$CMASYSCONTACT" ]; then
                echo "syscontact  $CMASYSCONTACT" >>$TMPFILE
                LINES=`expr $LINES + 1`
                env_manager ENVUSED CMASYSCONTACT
        else
                if [ "$INSTMODE" = "INTERACTIVE" ]; then
                        if [ ! -z "$SNMPDSYSCONTACT" ]; then
                                TEMPSTR1=`get_userinput "The system contact is set to\n${SNMPDSYSCONTACT}Do you wish to change it (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
                                [ "$TEMPSTR1" = "y" ] &&  SNMPDSYSCONTACT=
                        fi
                        if [ -z "$SNMPDSYSCONTACT" ]; then
                                TEMPSTR1=`get_userinput "Enter system contact infomation\n(Name, phone, room, etc; Blank to skip): " $TTY BLANKOK SPACEOK ECHO NOCLSCR`
                                if [ ! -z "$TEMPSTR1" ]; then
                                        SNMPDSYSCONTACT="syscontact $TEMPSTR1\\n"
                                        CMASYSCONTACT=$TEMPSTR1
                                fi
                        fi
                fi
                if [ ! -z "$SNMPDSYSCONTACT" ]; then
                        printf "$SNMPDSYSCONTACT" >>$TMPFILE
                        LINES=`expr $LINES + 1`
                fi
        fi
}

get_sys_location() 
{
        # Configure sysLocation
        if [ ! -z "$CMASYSLOCATION" ]; then
                echo "syslocation  $CMASYSLOCATION" >>$TMPFILE
                LINES=`expr $LINES + 1`
                env_manager ENVUSED CMASYSLOCATION
        else
                if [ "$INSTMODE" = "INTERACTIVE" ]; then
                        if [ ! -z "$SNMPDLOCATION" ]; then
                                TEMPSTR1=`get_userinput "The system location is set to\n${SNMPDLOCATION}Do you wish to change it (y/n) (Blank is n): " $TTY BLANKOK YESNO ECHO NOCLSCR`
                                [ "$TEMPSTR1" = "y" ] &&  SNMPDLOCATION=
                        fi
                        if [ -z "$SNMPDLOCATION" ]; then
                                TEMPSTR1=`get_userinput "Enter system location infomation\n(Building, room, etc; Blank to skip): " $TTY BLANKOK SPACEOK ECHO NOCLSCR`
                                if [ ! -z "$TEMPSTR1" ]; then
                                        SNMPDLOCATION="syslocation $TEMPSTR1"
                                        CMASYSLOCATION=$TEMPSTR1
                                fi

                        fi
                fi
                if [ ! -z "$SNMPDLOCATION" ]; then
                        printf "$SNMPDLOCATION\\n" >>$TMPFILE
                        LINES=`expr $LINES + 1`
                fi
        fi
}

snmp_conf_remove_hp() 
{
   if [ -f $SNMPDCONFFILE ]; then
      #remove any old HP entries
      sed '/\# Following entries were added by HP Insight Management Agents at/,/\# ---------------------- END --------------------/d' $SNMPDCONFFILE > $TMPSNMPDCONF
   fi
   cat  $TMPSNMPDCONF > $SNMPDCONFFILE
   rm -f $TMPSNMPDCONF
}

snmp_conf_add() 
{
   if [ $LINES -eq 0 ]; then
      return
   fi

   echo "# Following entries were added by HP Insight Management Agents at" >$TMPSNMPDCONF
   echo "#      `date`" >>$TMPSNMPDCONF
   cat $TMPFILE >> $TMPSNMPDCONF
   echo "# ---------------------- END --------------------" >>$TMPSNMPDCONF
   if [ -f $SNMPDCONFFILE ]; then

      # Filter out the stuff that we are about to add
      grep -v -e 'libcmaX' -e 'rwcommunity' -e 'rocommunity' -e 'trapcommunity' -e 'trapsink' -e 'syslocation' -e 'syscontact' $SNMPDCONFFILE >> $TMPSNMPDCONF

   else
       > $SNMPDCONFFILE
   fi

   cat  $TMPSNMPDCONF > $SNMPDCONFFILE

   echo
   echo "=============================================================================="
   echo "NOTE: New snmpd.conf entries were added to the top of $SNMPDCONFFILE"
   echo "=============================================================================="
   rm -f $TMPFILE
   rm -f $TMPSNMPDCONF
}

make_config() 
{
   CMAKERNELVERSION="`uname -r`"
   cat >/etc/hp-snmp-agents.conf <<EOF
# install mode
export CMASILENT="YES"
# kernel version
export CMAKERNELVERSION="$CMAKERNELVERSION"
#Decision to touch existing SNMP file
export CMASKIPSNMPCONFIG="$CMASKIPSNMPCONFIG"
#local rw community string
export CMALOCALHOSTRWCOMMSTR="$CMALOCALHOSTRWCOMMSTR"
#local ro community string
export CMALOCALHOSTROCOMMSTR="$CMALOCALHOSTROCOMMSTR"
#rw authorized management stations (multiples allowed)
export CMAMGMTSTATIONRWIPORDNS="$CMAMGMTSTATIONRWIPORDNS"
#rw authorized mangamane station community string (multiplies allowed)
export CMAMGMTSTATIONRWCOMMSTR="$CMAMGMTSTATIONRWCOMMSTR"
#ro authorized management stations (multiples allowed)
export CMAMGMTSTATIONROIPORDNS="$CMAMGMTSTATIONROIPORDNS"
#ro authorized management station community string (multiplies allowed)
export CMAMGMTSTATIONROCOMMSTR="$CMAMGMTSTATIONROCOMMSTR"
#default trap community string
export CMADEFTRAPCOMMSTR="$CMADEFTRAPCOMMSTR"
#trap recipients (multiples allowed)
export CMATRAPDESTINATIONIPORDNS="$CMATRAPDESTINATIONIPORDNS"
#trap recipient community strings (multiples allowed)
export CMATRAPDESTINATIONCOMMSTR="$CMATRAPDESTINATIONCOMMSTR"
#system contact
export CMASYSCONTACT="$CMASYSCONTACT"
#system location
export CMASYSLOCATION="$CMASYSLOCATION"
#agent exclusion on startup
export CMAAGENTEXCLUDESTR="$CMAAGENTEXCLUDESTR"
EOF

}

snmp_restart() 
{
   # Restart snmpd
   if [ -x /etc/init.d/snmpd ]; then
      SNMPDSSCRIPT="/etc/init.d/snmpd"
   elif [ -x /etc/rc.d/init.d/snmpd ]; then
      SNMPDSSCRIPT="/etc/rc.d/init.d/snmpd"
   fi

   SNMP_ACTION="start"

   if [ -n "`$PIDOF snmpd 2> /dev/null`" ]; then
      SNMP_ACTION="restart"
   fi

   if [ -n "$SNMPDSSCRIPT" ]; then
      (cd /; $SNMPDSSCRIPT $SNMP_ACTION) < /dev/null >> $INSTALLLOG 2>&1
      sleep 2
      [ -z "`$PIDOF snmpd 2> /dev/null`" ] && sleep 2
      if [ -n "`$PIDOF snmpd 2> /dev/null`" ]; then
         echo "snmpd is started"
      else
         echo "failed to start snmpd"
      fi
   fi
}


################################################
# MAIN
################################################

INSTALLLOG=/var/spool/compaq/cma.log
TMPFILE=/tmp/hpsnmpagent$$
TMPSNMPDCONF=/tmp/snmpdconf$$
LINES=0

if [ "$1" = "undo" ]; then
   which_snmpd_conf
   snmp_conf_remove_hp
   #restart snmpd if its already running
   [ -n "`$PIDOF snmpd 2> /dev/null`" ] && snmp_restart 
   exit 0
fi

get_installmode INSTMODE TTY
env_manager INIT

configure_snmp
if [ "$CMASKIPSNMPCONFIG" = "y" ]; then
   exit 0
fi

which_snmpd_conf

get_configs
CMAECHO="no"
if [ "$CMAECHO" = "yes" -o "$CMAFDTNECHO" = "yes" ]; then
   echo  "    INSTMODE=$INSTMODE"
   echo  "    SNMPDCONFUSED=$SNMPDCONFUSED"
   echo  "    SNMPDLOCALWRITECOMMUSED=$SNMPDLOCALWRITECOMMUSED"
   echo  "    SNMPDLOCALREADCOMMUSED=$SNMPDLOCALREADCOMMUSED"
   echo  "    SNMPDNONLOCALWRITECOMMUSED=$SNMPDNONLOCALWRITECOMMUSED"
   echo  "    SNMPDNONLOCALREADCOMMUSED=$SNMPDNONLOCALREADCOMMUSED"
   echo  "    SNMPDTRAPDEFCOMM=$SNMPDTRAPDEFCOMM"
   echo  "    SNMPDTRAPDESTANDCOMM=$SNMPDTRAPDESTANDCOMM"
   echo  "    SNMPDSYSCONTACT=$SNMPDSYSCONTACT"
   echo  "    SNMPDLOCATION=$SNMPDLOCATION"
   echo  "    SNMPDCOM2SECCOMM=$SNMPDCOM2SECCOMM"
   echo  "    CMASKIPSNMPCONFIG=$CMASKIPSNMPCONFIG"
   echo  "    CMALOCALHOSTRWCOMMSTR=$CMALOCALHOSTRWCOMMSTR"
   echo  "    CMAMGMTSTATIONIPORDNS=$CMAMGMTSTATIONIPORDNS"
   echo  "    CMAMGMTSTATIONRWIPORDNS=$CMAMGMTSTATIONRWIPORDNS"
   echo  "    CMAMGMTSTATIONROIPORDNS=$CMAMGMTSTATIONROIPORDNS"
   echo  "    CMAMGMTSTATIONRWCOMMSTR=$CMAMGMTSTATIONRWCOMMSTR"
   echo  "    CMAMGMTSTATIONROCOMMSTR=$CMAMGMTSTATIONROCOMMSTR"
   echo  "    CMADEFTRAPCOMMSTR=$CMADEFTRAPCOMMSTR"
   echo  "    CMATRAPDESTINATIONIPORDNS=$CMATRAPDESTINATIONIPORDNS"
   echo  "    CMATRAPDESTINATIONCOMMSTR=$CMATRAPDESTINATIONCOMMSTR"
   echo  "    CMASYSLOCATION=$CMASYSLOCATION"
   echo  "    CMASYSCONTACT=$CMASYSCONTACT"
   echo  "    CMAXLOCATION=$CMAXLOCATION"
fi

#Add the cmaX extension
if [ -e /usr/lib/libcmaX.so ]; then 
   echo "dlmod cmaX /usr/lib/libcmaX.so" >>$TMPFILE
else
   echo "dlmod cmaX /usr/lib64/libcmaX64.so" >>$TMPFILE
fi
LINES=`expr $LINES + 1`

#Get snmp stuff
get_comm_string
get_mgmt_station_comm_string
get_trap_comm_string
get_trap_sink_string
get_sys_contact
get_sys_location

#remove old hp entry if any
snmp_conf_remove_hp

#add snmp data
snmp_conf_add

#make a answer file
make_config

env_manager PRINT

#restart snmpd
snmp_restart
