#!/bin/bash
# $Header: /cvs/WebShield/wsrc/files/mgmt/add_extra_dat,v 1.3 2004/05/14 11:07:54 bwhittak Exp $
#
# Copyright (C) 2004 Networks Associates Technology Inc. All rights reserved.
#
# Called by the UI to add an extra.dat file obtained from user.
#
if [ -f $NETAWSS/.profile.vars ]; then
    . $NETAWSS/.profile.vars
else
    . /var/NAIENV/.profile.vars
fi
[[ "$PATH" == "$wsPATH":* || -z "$wsPATH" ]] || PATH=$wsPATH:$PATH

shopt -s extglob

# what do I call myself?
declare -r me=${0##*/}
declare -r cmdline="$me $*"

# constants
declare -r inst="$me.$(date -u '+%Y%m%d%H%M%S').$$"
declare -r tmp=/tmp/$inst	# temporary directory

# event codes
declare -r PROGevent=UPDATE_PROGRESS
declare -r CHNGevent=AV_UPDATE_CHANGE
declare -r NOCHevent=AV_UPDATE_NOCHANGE
declare -r FAILevent=AV_UPDATE_FAIL
declare -r INTRevent=AV_UPDATE_INTR

# functions

SendLog()	# send stuff to syslog and echo to stdout
{
    local saverr=$?	# save previous error
    [[ $# -gt 0 ]] || return $saverr	# nothing to send
    printf '%s\n' "$@" >&2
    printf '%s\n' "$@" | logger -t "$me[$$]"
    return $saverr	# return saved error
}

Event()		# report an event
{
    evrep -n $me -i AUDIT_ID -v $inst "$@" \
	${WS_SESSION:+-i UI_SESSION_ID -v "$WS_SESSION"} \
	${WS_USER_ID:+-i USER_NAME -v "$WS_USER_ID"} \
	${WS_SOURCE_IP:+-i SOURCE_IP -v "$WS_SOURCE_IP"} \
	${extra_id:+-i EXTRA_DAT_ID -v "$extra_id"}
}

declare -a bad_reason	# reason array for last bad event
GoodEvent()	# a good update progress event
{
    local saverr=$?	# save previous error
    bad_reason=()
    Event -e $PROGevent::"$@"
    return $saverr	# return saved error
}
BadEvent()	# a bad update progress event
{
    local saverr=$?	# save previous error
    bad_reason=( "$@" )	# save the reason for possible exit
    Event -e $PROGevent::"$@"
    return $saverr	# return saved error
}

declare -a exit_event	#event array set by Exit caller for exit event
Exit()		# the standard way out
{
    error=${1:-$?}		# set exit code
    shift
    cd /tmp	# make sure we're not sitting on the branch we saw off
    SendLog "$me: Exit $error: $*"
    # send events
    [[ -n $exit_event ]] || exit_event=$FAILevent
    Event -e "${exit_event[@]}"
    # clean up and go home
    [[ $tmp == /tmp/* ]] && rm -rf $tmp
    exit $error
}

BadExit()	# failed for some reason
{
    if [[ $1 == "-e" ]]; then
	exit_event=( $2 )
	shift 2
    else
	exit_event=( $FAILevent${bad_reason:+"::${bad_reason[@]}"} )
    fi
    Exit 1 "$@"
}

trap 'BadExit -e $INTRevent on signal' hup int term

GoodExit()	# all happy
{
    if [[ $1 == "-e" ]]; then
	exit_event=( $2 )
	shift 2
    fi
    Exit 0 "$@"
}

# now we start
GoodEvent UpdateLocal -i COMMANDLINE -v "$cmdline"

file=$1
if [[ ! -s "$file" ]]; then
    BadEvent UpdateFileBad -i FILE_NAME -v "$file"
    BadExit "No file to add!"
fi

# make temp directory for all our files
rm -rf $tmp
trap 'rm -rf $tmp' EXIT

# copy DAT files
out=$(exec 2>&1; mkdir -p $tmp &&
cp "$DATDIR"/!(extra).dat "$tmp" &&
cp "$file" "$tmp/extra.dat" &&
chmod a=r "$tmp/extra.dat")
if [[ $? -ne 0 ]]; then
    BadEvent SystemCommandError -i SYSTEM_ERROR_TEXT -v "$out"
    BadExit "unexpected error copying extra.dat"
fi

# Check what we got
if out=$(olympusver -D "$tmp" 2>&1) && [[ -z "$out" ]] &&
    extra_id=$(olympusver -D "$tmp" -x) && [[ -n $extra_id ]]; then :
else
    BadEvent UpdateTestFail
    BadExit "extra.dat file loaded does not work - not installed"
fi

# Install DAT
ts=$(date +%Y-%m-%d_%T%Z)
out=$(wsmount 2>&1 <<-END
	[[ -d "$DATDIR/backup" ]] || mkdir -p "$DATDIR/backup"
	ln -f "$DATDIR/extra.dat" "$DATDIR/backup/extra.dat.$ts"
	mv -f "$tmp/extra.dat" "$DATDIR"
END
)
if [[ $? -ne 0 ]]; then
    BadEvent SystemCommandError -i SYSTEM_ERROR_TEXT -v "$out"
    BadExit "unexpected error installing extra.dat"
fi

# Go home
proxy-restart </dev/null >/dev/null 2>&1 &
GoodExit -e $CHNGevent::UpdateExtraDat

