#!/bin/sh
# tmww plugin: accsniffer
# whatis: wrapper around accsniffer util
# conflicts: pysniffer
# depends: alts
# recommends: -

# this file is part of tmww - the mana world watcher
# willee, 2012-2014
# GPL v3

# check if not run as plugin
if [ "$TMWW_PLUGINS" != "yes" ] ; then
   echo >&2 "This script is tmww plugin and rely heavily on it's facilities."
   exit 1
fi

help_accsniffer() {
   cat << EOF
accsniffer -- wrapper around accsniffer util
   Listen on all traffic from server, cut account ids, call alts plugin
   to store char info. One sniffer per server.

   Required setup for tcpick same as e.g. wireshark - changing tcpick
   group/adding user in group and setting tcpick capabilities:
   # setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpick
   # usermod -a -G wireshark yourmom
   # chgrp wireshark /usr/sbin/tcpick

   Sniffer will crash if interface goes down. Don't forget to stop/start.

Command line options:
   -1 -- start | stop | status
EOF
}

[ "$TMWW_PLUGINHELP" = "yes" ] && help_accsniffer && return 0
# if someone by mistake export accsniffer
[ "$TMWW_PLUGINEXPORT" = "yes" ] && return 0

check_conflicts() {
   if [ -f ${LOCK}/sniffer.$servername ]; then
       error "Other sniffer listening on $servername. Aborting!"
       return 1
   fi
}

[ -z "${servername}" ] && { error "No servername defined. Aborting."; exit 1; }

# options parser
set -- $plugin_options
case "$1" in
   start)
       if check_conflicts; then
           ${TMWW_UTILPATH}/accsniffer "${servername}" "${config}" >/dev/null 2>&1 &
           # if you see different kinds of errors like shell synthax error
           # reports , kill accsniffer process group by hand, stop and start
           # again
           # not sure why it happen, so added sleep as measure
           sleep 2
           sniffer_pgid=$(ps -o pgid= -C accsniffer)
           if [ -z "${sniffer_pgid}" ]; then
               echo Run failed! Check tcpick capabilities and permissions. Aborting!
               return 1
           else
               echo ${sniffer_pgid} > ${TMWW_LOCK}/sniffer.$servername
           fi
       fi
       ;;
   stop)
       [ -f ${TMWW_LOCK}/sniffer.$servername ] && {
           read sniffer_pgid < ${TMWW_LOCK}/sniffer.$servername
           [ -z "${sniffer_pgid}" ] || /bin/kill -9 -- -${sniffer_pgid}
           rm -f ${TMWW_LOCK}/sniffer.$servername
       }
       ;;
   status)
       if [ -f ${TMWW_LOCK}/sniffer.$servername ]; then
           read sniffer_pgid < ${TMWW_LOCK}/sniffer.$servername
           result=$( ps -Ao 'pgid=' | grep -- "${sniffer_pgid}" )
           if [ ! -z "${result}" ]; then
               echo Sniffer listening on $servername
           else
               error "Sniffer crashed. Restart manually!"
               return 1
           fi
       else
           echo No sniffer running on $servername
       fi
       ;;
   '') error_missing
       ;;
   *) error_incorrect
       ;;
esac

return 0