MFC 256716,256835:

- Fix jail_parallel_start="YES".
- Fix ip[46].addr when interface parameter is not defined.
- Fix a bug which prevented jails from starting when $jail_conf was used and
  no jail name was specified.
- Display error messages when start/stop fails.

Approved by:	re (glebius)
This commit is contained in:
hrs 2013-10-22 06:02:40 +00:00
parent b31f0060b5
commit bb4ca793bf

View File

@ -132,7 +132,9 @@ parse_options()
# #
_confwarn=1 _confwarn=1
if [ -r "$jail_conf" -o -r "$_jconf" ]; then if [ -r "$jail_conf" -o -r "$_jconf" ]; then
warn "$_conf is created and used for jail $_j." if ! checkyesno jail_parallel_start; then
warn "$_conf is created and used for jail $_j."
fi
fi fi
/usr/bin/install -m 0644 -o root -g wheel /dev/null $_conf || return 1 /usr/bin/install -m 0644 -o root -g wheel /dev/null $_conf || return 1
@ -367,10 +369,10 @@ jail_handle_ips_option()
# Append address to list of addresses for the jail command. # Append address to list of addresses for the jail command.
case $_type in case $_type in
inet) inet)
echo " ip4.addr += \"${_iface}|${_addr}${_mask}\";" echo " ip4.addr += \"${_iface:+${_iface}|}${_addr}${_mask}\";"
;; ;;
inet6) inet6)
echo " ip6.addr += \"${_iface}|${_addr}${_mask}\";" echo " ip6.addr += \"${_iface:+${_iface}|}${_addr}${_mask}\";"
need_dad_wait=1 need_dad_wait=1
;; ;;
esac esac
@ -418,7 +420,7 @@ jail_status()
jail_start() jail_start()
{ {
local _j _jid _jn local _j _jid _jn _jl
if [ $# = 0 ]; then if [ $# = 0 ]; then
return return
@ -426,47 +428,82 @@ jail_start()
echo -n 'Starting jails:' echo -n 'Starting jails:'
case $1 in case $1 in
_ALL) _ALL)
echo -n ' '
command=$jail_program command=$jail_program
rc_flags=$jail_flags rc_flags=$jail_flags
command_args="-f $jail_conf -c" command_args="-f $jail_conf -c"
$jail_jls -nq | while read IN; do _tmp=`mktemp -t jail` || exit 3
_jn=$(echo $IN | tr " " "\n" | grep name=) if $command $rc_flags $command_args >> $_tmp 2>&1; then
_jid=$(echo $IN | tr " " "\n" | grep jid=) $jail_jls -nq | while read IN; do
if $command $rc_flags $command_args ${_jn#name=}; then _jn=$(echo $IN | tr " " "\n" | grep ^name=)
_jid=$(echo $IN | tr " " "\n" | grep ^jid=)
echo -n " ${_jn#name=}" echo -n " ${_jn#name=}"
echo "${_jid#jid=}" \ echo "${_jid#jid=}" \
> /var/run/jail_${_jn#name=}.id > /var/run/jail_${_jn#name=}.id
fi done
done else
tail -1 $_tmp
fi
rm -f $_tmp
echo '.' echo '.'
return return
;; ;;
esac esac
_tmp=`mktemp -t jail` || exit 3 if checkyesno jail_parallel_start; then
for _j in $@; do #
_j=$(echo $_j | tr /. _) # Start jails in parallel and then check jail id when
parse_options $_j || continue # jail_parallel_start is YES.
#
_jl=
for _j in $@; do
_j=$(echo $_j | tr /. _)
parse_options $_j || continue
eval rc_flags=\${jail_${_j}_flags:-$jail_flags} _jl="$_jl $_j"
eval command=\${jail_${_j}_program:-$jail_program} eval rc_flags=\${jail_${_j}_flags:-$jail_flags}
if checkyesno jail_parallel_start; then eval command=\${jail_${_j}_program:-$jail_program}
command_args="-i -f $_conf -c $_j &"
else
command_args="-i -f $_conf -c $_j" command_args="-i -f $_conf -c $_j"
fi $command $rc_flags $command_args \
if $command $rc_flags $command_args \ >/dev/null 2>&1 </dev/null &
>> $_tmp 2>&1 </dev/null; then done
sleep 1
for _j in $_jl; do
echo -n " ${_hostname:-${_j}}" echo -n " ${_hostname:-${_j}}"
_jid=$($jail_jls -n -j $_j | tr " " "\n" | grep jid=) if _jid=$($jail_jls -n -j $_j | tr " " "\n" | \
echo "${_jid#jid=}" > /var/run/jail_${_j}.id grep ^jid=); then
else echo "${_jid#jid=}" > /var/run/jail_${_j}.id
rm -f /var/run/jail_${_j}.id else
echo " cannot start jail \"${_hostname:-${_j}}\": " rm -f /var/run/jail_${_j}.id
cat $_tmp echo " cannot start jail " \
fi "\"${_hostname:-${_j}}\": "
rm -f $_tmp fi
done done
else
#
# Start jails one-by-one when jail_parallel_start is NO.
#
for _j in $@; do
_j=$(echo $_j | tr /. _)
parse_options $_j || continue
eval rc_flags=\${jail_${_j}_flags:-$jail_flags}
eval command=\${jail_${_j}_program:-$jail_program}
command_args="-i -f $_conf -c $_j"
_tmp=`mktemp -t jail` || exit 3
if $command $rc_flags $command_args \
>> $_tmp 2>&1 </dev/null; then
echo -n " ${_hostname:-${_j}}"
_jid=$($jail_jls -n -j $_j | \
tr " " "\n" | grep ^jid=)
echo "${_jid#jid=}" > /var/run/jail_${_j}.id
else
rm -f /var/run/jail_${_j}.id
echo " cannot start jail " \
"\"${_hostname:-${_j}}\": "
cat $_tmp
fi
rm -f $_tmp
done
fi
echo '.' echo '.'
} }
@ -480,17 +517,21 @@ jail_stop()
echo -n 'Stopping jails:' echo -n 'Stopping jails:'
case $1 in case $1 in
_ALL) _ALL)
echo -n ' '
command=$jail_program command=$jail_program
rc_flags=$jail_flags rc_flags=$jail_flags
command_args="-f $jail_conf -r" command_args="-f $jail_conf -r"
$jail_jls -nq | while read IN; do $jail_jls -nq | while read IN; do
_jn=$(echo $IN | tr " " "\n" | grep name=) _jn=$(echo $IN | tr " " "\n" | grep ^name=)
echo -n " ${_jn#name=}" echo -n " ${_jn#name=}"
$command $rc_flags $command_args ${_jn#name=} _tmp=`mktemp -t jail` || exit 3
if ! $jail_jls -j ${_jn#name=} > /dev/null 2>&1; then $command $rc_flags $command_args ${_jn#name=} \
>> $_tmp 2>&1
if $jail_jls -j ${_jn#name=} > /dev/null 2>&1; then
tail -1 $_tmp
else
rm -f /var/run/jail_${_jn#name=}.id rm -f /var/run/jail_${_jn#name=}.id
fi fi
rm -f $_tmp
done done
echo '.' echo '.'
return return
@ -504,10 +545,14 @@ jail_stop()
fi fi
eval command=\${jail_${_j}_program:-$jail_program} eval command=\${jail_${_j}_program:-$jail_program}
echo -n " ${_hostname:-${_j}}" echo -n " ${_hostname:-${_j}}"
$command -q -f $_conf -r $_j _tmp=`mktemp -t jail` || exit 3
if ! $jail_jls -j $_j > /dev/null 2>&1; then $command -q -f $_conf -r $_j >> $_tmp 2>&1
if $jail_jls -j $_j > /dev/null 2>&1; then
tail -1 $_tmp
else
rm -f /var/run/jail_${_j}.id rm -f /var/run/jail_${_j}.id
fi fi
rm -f $_tmp
done done
echo '.' echo '.'
} }