#!/bin/sh
# ipchains/iptables rules generator
#
# chkconfig:	345 15 85
# description:	ipchains/iptables rules generator

# Source function library
. /etc/rc.d/init.d/functions

# Get service config
CONFIG=/etc/filter/simple.conf
GEN_CONFIG=/etc/filter/generated_rules
SUBSYS=/var/lock/subsys/filter
[ -f /etc/sysconfig/filter ] && . /etc/sysconfig/filter

confstatus() {
	if [ ! -e "$GEN_CONFIG" ]; then
		confstatus=3
	elif [ "$GEN_CONFIG" -ot "$CONFIG" ]; then
		confstatus=2
	elif [ "$SUBSYS" -ot "$GEN_CONFIG" ]; then
		confstatus=1
	else
		confstatus=0
	fi
}

find_filter() {
	iptables=`which iptables 2> /dev/null`
	ipchains=`which ipchains 2> /dev/null`
	if [ -n "$iptables" ]; then
		filter=$iptables
	elif [ -n "$ipchains" ]; then
		filter=$ipchains
	else
		nls "ipchains/iptables not found. Cannot continue"
		filter=
		exit 1
	fi
}

RETVAL=0
# See how we were called.
case "$1" in
  start)
	confstatus
	if [ $confstatus -ge 0 ]; then
		if [ $confstatus -gt 0 ]; then
			$0 init
		fi
		show "Setting filter rules"
		busy
		sh "$GEN_CONFIG"
		[ $? -ne 0 ] && RETVAL=1
		if [ $RETVAL -eq 0 ]; then
			touch "$SUBSYS"
			ok
		else
			fail
		fi
	fi
	;;
  stop)
	show "Flushing filter rules"
	find_filter
	$filter -F
	RETVAL=$?
	if [ $RETVAL = 0 ]; then
		rm -f "$SUBSYS"
		ok
	else
		fail
	fi
	;;
  init)
	show "Generating %s" "$GEN_CONFIG"
	find_filter
	umask 077
	filtergen "$CONFIG" `basename $filter` > "$GEN_CONFIG"
	;;
  restart|force-reload)
	$0 stop
	$0 start
	exit $?
	;;
  status)
	confstatus
	case "$confstatus" in
	  3)
		nls "%s not generated" "$GEN_CONFIG"
		;;
	  2)
		nls "%s outdated" "$GEN_CONFIG"
		;;
	  1)
		nls "%s not applied" "$GEN_CONFIG"
		;;
	  0)
		nls "filter rules applied"
		;;
	esac
	[ "$confstatus" -ne 0 ] && RETVAL=3
	;;
  *)
	msg_usage "$0 {start|stop|init|restart|force-reload|status}"
	exit 3
	;;
esac

exit $RETVAL
