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