Ah, peer review is a wonderful thing! Within *minutes* of me posting a 
proposed approach, I got an e-mail off-list,
from a person who should remain anonymous, that included:

> it is not exact and sloppy and based on assumptions rather than the 
official API 
> Looks to me your code would also confirm that the users TIME and USERID 
are logged as well

Sure enough TIME and USERID are incorrectly reported as being user IDs:
# ./checkuser.sh userid
Error: userid is logged on
# ./checkuser.sh time
Error: time is logged on

That made me think of other arguments will also produce the wrong results.
# ./checkuser.sh 123
Error: unexpected rc from CP QUERY 123 - 40

So I modified the code to use the LINK <USERID> approach suggested.

# ./checkuser.sh time
Error: time does not exist
# ./checkuser.sh userid
Error: userid does not exist
# ./checkuser.sh 123
Error: 123 does not exist
# ./checkuser.sh foo
Error: foo does not exist
# ./checkuser.sh maint
# ./checkuser.sh linux191
Error: linux191 is logged on

Here's the modified code:
# cat checkuser.sh
#!/bin/sh
#+--------------------------------------------------------------------------+
function CPcmd()
# Run a CP command and invoke it via the vmcp module/command
#   Arg1-n: the command to issue
#   Return: the command's return code
#+--------------------------------------------------------------------------+
 {
  if [ "$verbose" = 2 ]; then  // echo extra output
    echo "Invoking CP command: $@"
  fi
# parse output to get return code: awk -F# splits line at '#' with rc at 
end
  output=$(vmcp $@ 2>&1)
  if [ ${#output} != 0 -a "$verbose" != 0 ]; then # echo the output
    echo "$output"
  fi
  retVal=0
  retVal=$(echo $output | grep "Error: non-zero CP" | awk -F# '{print 
$2}')
  return $retVal
 }

#+--------------------------------------------------------------------------+
function checkID()
# Verify user ID exists and is logged off
# Arg 1: user ID to check
#+--------------------------------------------------------------------------+
 {
  userID=$1
  verbose=0
  CPcmd LINK $userID  # first check if the user ID exists
  rc=$?
  case $rc in
   22)  # user ID exists - fall through
      ;;
   53)  # user ID does not exist
      echo "Error: $userID does not exist"
      return 2
      ;;
   *) # unexpected
      echo "Error: unexpected rc from CP LINK $userID - $rc"
      return 3
  esac
  CPcmd QUERY $userID # verify that the user ID is logged off
  rc=$?
  case $rc in
    0)  # user ID is logged on or disconnected
      echo "Error: $userID is logged on"
      return 1
      ;;
   45) # user ID is logged off - this is correct
      ;;
   *) # unexpected
      echo "Error: unexpected rc from CP QUERY $userID - $rc"
      return 3
  esac
  verbose=1
  return 0
 } # checkID()

So Rob, does this look better?  :))

"Mike MacIsaac" <[email protected]>   (845) 433-7061

Reply via email to