#!/bin/sh
######################################################################
#
# $Id: webjob-lock-profile,v 1.2 2012/01/07 08:01:20 mavrik Exp $
#
######################################################################
#
# Copyright 2011-2012 The WebJob Project, All Rights Reserved.
#
######################################################################
#
# Purpose: Lock or unlock one or more WebJob profiles.
#
######################################################################

IFS=' 	
'

PROGRAM=`basename ${0}`

######################################################################
#
# Usage
#
######################################################################

Usage()
{
  echo 1>&2
  echo "${PROGRAM} [-u] [-H webjob-home] [-S webjob-server-home] client [client ...]" 1>&2
  echo 1>&2
  exit 1
}

######################################################################
#
# Main
#
######################################################################

LOCK_PROFILE="1"

WEBJOB_SERVER_HOME="/var/webjob"

while getopts "H:S:u" OPTION ; do
  case "${OPTION}" in
  H)
    WEBJOB_HOME="${OPTARG}"
    ;;
  S)
    WEBJOB_SERVER_HOME="${OPTARG}"
    ;;
  u)
    LOCK_PROFILE="0"
    ;;
  *)
    Usage
    ;;
  esac
done

shift `expr ${OPTIND} - 1`

if [ $# -lt 1 ] ; then
  Usage
fi

PATH=${WEBJOB_HOME=/usr/local/webjob}/bin:${PATH} ; export PATH

if [ ! -d "${WEBJOB_SERVER_HOME}" ] ; then
  echo "${PROGRAM}: Error='Server home directory (${WEBJOB_SERVER_HOME}) does not exist.'" 1>&2
  exit 2
fi

######################################################################
#
# Ensure that all prerequisites exist. Any error is considered fatal
# since it implies that the server's configuration is not complete.
#
######################################################################

HTUSERS_FILE="${WEBJOB_SERVER_HOME}/config/apache/ht-client"
if [ ! -f "${HTUSERS_FILE}" ] ; then
  echo "${PROGRAM}: Error='Password file (${HTUSERS_FILE}) does not exist.'" 1>&2
  exit 2
fi

WEBJOB_CLIENT_DB="${WEBJOB_SERVER_HOME}/db/mldbm/client.db"
if [ ! -f "${WEBJOB_CLIENT_DB}" ] ; then
  echo "${PROGRAM}: Error='Client DB (${WEBJOB_CLIENT_DB}) does not exist.'" 1>&2
  exit 2
fi

WEBJOB_JQD_DIR="${WEBJOB_SERVER_HOME}/spool/jqd"
if [ ! -d "${WEBJOB_JQD_DIR}" ] ; then
  echo "${PROGRAM}: Error='JQD directory (${WEBJOB_JQD_DIR}) does not exist.'" 1>&2
  exit 2
fi

######################################################################
#
# Do some work.
#
######################################################################

for CLIENT_ID in ${@} ; do

  ####################################################################
  #
  # Do a sanity check on the client ID.
  #
  ####################################################################

  MY_CLIENT_ID_OK=`echo ${CLIENT_ID} | perl -n -e 'if ($_ =~ /^(?:[A-Za-z](?:(?:[0-9A-Za-z]|[_-](?=[^.]))){0,62})(?:[.][A-Za-z](?:(?:[0-9A-Za-z]|[_-](?=[^.]))){0,62}){0,127}$/) { print "pass\n"; } else { print "fail\n"; }'`

  if [ x"${MY_CLIENT_ID_OK}" != x"pass" ] ; then
    echo "${PROGRAM}: Error='Client ID (${CLIENT_ID}) does not pass muster. No further action will be taken.'" 1>&2
    continue
  fi

  ####################################################################
  #
  # Update the client's password entry.
  #
  ####################################################################

  MY_HTUSERS_ENTRY=`egrep "^${CLIENT_ID}:" ${HTUSERS_FILE} 2> /dev/null`
  if [ -z "${MY_HTUSERS_ENTRY}" ] ; then
    echo "${PROGRAM}: Error='Unable to locate htusers entry for ${CLIENT_ID}. No further action will be taken.'" 1>&2
    continue
  fi
  MY_NEW_HTUSERS_ENTRY="${MY_HTUSERS_ENTRY}"

  if [ ${LOCK_PROFILE} -eq 1 ] ; then
    echo "${MY_HTUSERS_ENTRY}" | egrep 'LOCKED' > /dev/null 2>&1 || \
    MY_NEW_HTUSERS_ENTRY=`echo "${MY_HTUSERS_ENTRY}" | sed "s/^${CLIENT_ID}:/${CLIENT_ID}:LOCKED/;"`
  else
    MY_NEW_HTUSERS_ENTRY=`echo "${MY_HTUSERS_ENTRY}" | sed "s/^${CLIENT_ID}:LOCKED/${CLIENT_ID}:/;"`
  fi
  if [ -n "${MY_NEW_HTUSERS_ENTRY}" ] ; then
    webjob-cfg-set-kvps -d : -f ${HTUSERS_FILE} "${MY_NEW_HTUSERS_ENTRY}"
    if [ $? -ne 0 ] ; then
      echo "${PROGRAM}: Warning='Unable to update htusers entry for ${CLIENT_ID}. Profile may be in an indeterminate state.'" 1>&2
    fi
  fi

  ####################################################################
  #
  # Update the client's queue state.
  #
  ####################################################################

  if [ ${LOCK_PROFILE} -eq 1 ] ; then
    MY_OLD_NEW_STATE="any:locked"
  else
    MY_OLD_NEW_STATE="locked:active"
  fi
  webjob-jqd-change-state -d ${WEBJOB_JQD_DIR} -i ${CLIENT_ID} -s ${MY_OLD_NEW_STATE} -t queue > /dev/null
  if [ $? -ne 0 ] ; then
    echo "${PROGRAM}: Warning='Unable to update queue state ${CLIENT_ID}. Profile may be in an indeterminate state.'" 1>&2
  fi

  ####################################################################
  #
  # Update the client's profile state in client.db.
  #
  ####################################################################

  if [ ${LOCK_PROFILE} -eq 1 ] ; then
    MY_NEW_STATE="locked"
  else
    MY_NEW_STATE="active"
  fi
  webjob-mldbm-set-config-kvps -c ${CLIENT_ID} ProfileState=${MY_NEW_STATE}
  if [ $? -ne 0 ] ; then
    echo "${PROGRAM}: Warning='Unable to update profile state ${CLIENT_ID}. Profile may be in an indeterminate state.'" 1>&2
  fi

done
