Jails, FIBs etc.
Поднимем-ка неиссякающую тему.
Есть джейлы часть из которых должна сидеть ровно в своём фибе, то есть нужно помимо добавления defaultrouter'а добавлять и удалять маршруты при старте.
Под это было перепилено несколько скриптов.
Код: Выделить всё
[root]cat setfib
#!/bin/sh
# PROVIDE: SETFIB
# REQUIRE: NETWORKING
# BEFORE: DAEMON
#
. /etc/rc.subr
name="setfib"
rcvar=`set_rcvar`
load_rc_config ${name}
max_fibs=`sysctl net.fibs | awk '{ print $2; }'`
start_cmd="${name}_start"
stop_cmd="${name}_stop"
setfib_start()
{
cmd="add"
setfib_default
setfib_route
}
setfib_stop()
{
cmd="del"
setfib_default
setfib_route
}
setfib_default()
{
i=1
while [ $i -le $max_fibs ] ; do
eval ": \${${name}${i}_enable:=\"NO\"}"
eval ": \${${name}${i}_defaultrouter:=\"NO\"}"
_enable="$(eval echo \${${name}${i}_enable})"
defaultrouter="$(eval echo \${${name}${i}_defaultrouter})"
if [ ${_enable} != "NO" ]; then
setfib -$i route $cmd default ${defaultrouter}
fi
i=$((i+1))
done;
}
setfib_route()
{
case "$cmd" in
add) del_cmd="del"
add_cmd="add";;
del) del_cmd="add"
add_cmd="del";;
esac
i=0
while [ $i -le $max_fibs ]; do
[ ${i} != 0 ] && [ "$(eval echo \${${name}${i}_enable})" = "NO" ] && break
route="$(eval echo \${${name}${i}_add})"
if [ -n "${route}" ]; then
if [ ${i} = 0 ]; then
route ${add_cmd} ${route}
else
setfib -$i route ${add_cmd} ${route}
fi
fi
route="$(eval echo \${${name}${i}_del})"
if [ -n "${route}" ]; then
if [ ${i} = 0 ]; then
route ${del_cmd} ${route}
else
setfib -$i route ${del_cmd} ${route}
fi
fi
j=0
while : ; do
route="$(eval echo \${${name}${i}_add${j}})"
[ -z "${route}" ] && break
if [ ${i} = 0 ]; then
route ${add_cmd} ${route}
else
setfib -$i route ${add_cmd} ${route}
fi
j=$((j+1))
done
while : ; do
route="$(eval echo \${${name}${i}_del${j}})"
[ -z "${route}" ] && break
if [ ${i} = 0 ]; then
route ${del_cmd} ${route}
else
setfib -$i route ${del_cmd} ${route}
fi
j=$((j+1))
done
i=$((i+1))
done;
}
run_rc_command "$1"
Правила описываются в /etc/rc.conf
1. Включается стандартно: setfib_enable="YES"
2. Для каждой таблицы фибов нужно указать что мы её задействуем и далее перечень команд:
setfib3_enable="YES"
setfib3_add0="-host 192.168.0.1 -interface lo0"
setfib3_add1="....."
3. Если команда должна быть одна, то допускается указать setfib3_add="..." or setfib3_del="..."
4. Если мы переносим интерфейсы из основной таблицы в дополнительные, то необходимо удалить их. Делается это обращением к setfib0, команды описанные для номера "0" вызываются вне зависимости от его активации.
5. Если есть необходимость стартовать и останавливать скрипт, то в командах на удаление желательно указывать все опции (например интерфейс на котором сидел адрес), необходимые для корректного возвращения маршрута к жизни.
--- rc.conf ---
setfib_enable="YES"
setfib0_del0="-host 192.168.0.1 -interface lo0"
setfib0_del1="-host 192.168.10.1 -interface lo0"
setfib2_enable="YES"
setfib2_default="192.168.0.100"
setfib2_add="-host 192.168.0.1 -interface lo0"
--- rc.conf ---