087bff
#!/bin/bash
087bff
087bff
# compat for removed initscripts dependency
087bff
087bff
success() {
087bff
       echo "[  OK  ]"
087bff
       return 0
087bff
}
087bff
087bff
failure() {
087bff
       echo "[FAILED]"
087bff
       return 1
087bff
}
087bff
087bff
# internal variables
087bff
EBTABLES_CONFIG=/etc/sysconfig/ebtables-config
087bff
EBTABLES_DATA=/etc/sysconfig/ebtables
087bff
EBTABLES_TABLES="filter nat"
087bff
if ebtables --version | grep -q '(legacy)'; then
087bff
	EBTABLES_TABLES+=" broute"
087bff
fi
087bff
VAR_SUBSYS_EBTABLES=/var/lock/subsys/ebtables
087bff
087bff
# ebtables-config defaults
087bff
EBTABLES_SAVE_ON_STOP="no"
087bff
EBTABLES_SAVE_COUNTER="no"
087bff
087bff
# load config if existing
087bff
[ -f "$EBTABLES_CONFIG" ] && . "$EBTABLES_CONFIG"
087bff
087bff
initialize() {
087bff
	local ret=0
087bff
	for table in $EBTABLES_TABLES; do
087bff
		ebtables -t $table --init-table || ret=1
087bff
	done
087bff
	return $ret
087bff
}
087bff
087bff
sanitize_dump() {
087bff
	local drop=false
087bff
087bff
	export EBTABLES_TABLES
087bff
087bff
	cat $1 | while read line; do
087bff
		case $line in
087bff
		\**)
087bff
			drop=false
087bff
			local table="${line#\*}"
087bff
			local found=false
087bff
			for t in $EBTABLES_TABLES; do
087bff
				if [[ $t == "$table" ]]; then
087bff
					found=true
087bff
					break
087bff
				fi
087bff
			done
087bff
			$found || drop=true
087bff
			;;
087bff
		esac
087bff
		$drop || echo "$line"
087bff
	done
087bff
}
087bff
087bff
start() {
087bff
	if [ -f $EBTABLES_DATA ]; then
087bff
		echo -n $"ebtables: loading ruleset from $EBTABLES_DATA: "
087bff
		sanitize_dump $EBTABLES_DATA | ebtables-restore
087bff
	else
087bff
		echo -n $"ebtables: no stored ruleset, initializing empty tables: "
087bff
		initialize
087bff
	fi
087bff
	local ret=$?
087bff
	touch $VAR_SUBSYS_EBTABLES
087bff
	return $ret
087bff
}
087bff
087bff
save() {
087bff
	echo -n $"ebtables: saving active ruleset to $EBTABLES_DATA: "
087bff
	export EBTABLES_SAVE_COUNTER
087bff
	ebtables-save >$EBTABLES_DATA && success || failure
087bff
}
087bff
087bff
case $1 in
087bff
	start)
087bff
		[ -f "$VAR_SUBSYS_EBTABLES" ] && exit 0
087bff
		start && success || failure
087bff
		RETVAL=$?
087bff
		;;
087bff
	stop)
087bff
		[ "x$EBTABLES_SAVE_ON_STOP" = "xyes" ] && save
087bff
		echo -n $"ebtables: stopping firewall: "
087bff
		initialize && success || failure
087bff
		RETVAL=$?
087bff
		rm -f $VAR_SUBSYS_EBTABLES
087bff
		;;
087bff
	save)
087bff
		save
087bff
		;;
087bff
	*)
087bff
		echo "usage: ${0##*/} {start|stop|save}" >&2
087bff
		RETVAL=2
087bff
		;;
087bff
esac
087bff
087bff
exit $RETVAL