<collection name="interfaces">
<scalar name="bcast">
- <description>The default broadcast address.</description>
+ <description>The guest's broadcast address.</description>
+ </scalar>
+ <scalar name="lback">
+ <description>The guest's loopback address.</description>
</scalar>
<scalar name="dev">
<description>The default network device. See <optionref ref="per-if-dev">iface/dev</optionref> for more information.</description>
<scalar name="ip">
<description>The IP address which will be assigned to this interface.</description>
</scalar>
- <scalar name="bcast">
- <description>The broadcast address.</description>
- </scalar>
<scalar name="dev" id="per-if-dev">
<description>The network device. When this is specified, the IP address will be assigned and removed when starting and stopping the guest.</description>
</scalar>
{
echo \
$"Usage: $1 [--silent] [--nid <nid>] [--ip <ip_num>[/<mask>]]
- [--bcast <broadcast>] [--] <commands> <args>*
+ [--lback <loopback>] [--bcast <broadcast>]
+ [--] <commands> <args>*
--silent
Do not print the addresses assigned.
Network context id to use.
--ip <ip_num>[/<mask>]
IP address to bind to.
+--lback <loopback>
+ Loopback address for the network context.
--bcast <broadcast>
Broadcast address for the network context.
exit $1
}
-tmp=$(getopt -o + --long ncap:,nid:,ip:,bcast:,disconnect,flag:,secure,silent,help,version -n "$0" -- "$@") || exit 1
+tmp=$(getopt -o + --long ncap:,nid:,ip:,bcast:,lback:,disconnect,flag:,secure,silent,help,version -n "$0" -- "$@") || exit 1
eval set -- "$tmp"
OPT_CAPS=()
OPT_SECURE=
OPT_SILENT=
OPT_BCAST=
+OPT_LBACK=
OPT_IPS=()
while true; do
--silent) OPT_SILENT=1;;
--ip) OPT_IPS=( "${OPT_IPS[@]}" --ip "$2" ); shift;;
--bcast) OPT_BCAST=$2; shift;;
+ --lback) OPT_LBACK=$2; shift;;
--) shift; break;;
*) echo $"chbind: internal error; arg=='$1'" >&2; exit 1;;
esac
$_NADDRESS --add
${OPT_SILENT:+--silent}
${OPT_BCAST:+--bcast "$OPT_BCAST"}
+ ${OPT_LBACK:+--lback "$OPT_LBACK"}
"${OPT_IPS[@]}" )
migrate_cmd=( $_NCONTEXT
shift
done
-create_cmd=( ${OPT_CTX:+$_VTAG --create --tag "$OPT_CTX" --silentexist --}
+create_cmd=( ${OPT_CTX:+$_VTAG --create --tag "$OPT_CTX" --silentexist --silent --}
$_VCONTEXT --create --silentexist
${OPT_SILENT:+--silent}
${OPT_CTX:+--xid "$OPT_CTX"} )
rc=254
fi
-test "$rc" -ne 254 || exec "$_VTAG" --migrate --tag "$OPT_CTX" -- \
+test "$rc" -ne 254 || exec "$_VTAG" --migrate --tag "$OPT_CTX" --silent -- \
"${migrate_cmd[@]}" --xid "$OPT_CTX" --migrate -- "$@"
exit $rc
}
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
- _mountFilesystemsInternal "$cfgdir"/fstab || return 1
- _mountFilesystemsInternal "$cfgdir"/fstab.local || return 1
- _mountFilesystemsInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || return 1
+ _mountFilesystemsInternal "$cfgdir"/fstab || return 1
+ _mountFilesystemsInternal "$cfgdir"/fstab.local || return 1
+ _mountFilesystemsInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || return 1
}
function _umountFilesystems()
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
pushd "$vdir/" >/dev/null || return 1
- _umountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
- _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
- _umountVserverInternal "$cfgdir"/fstab || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab || is_ok=
popd >/dev/null || return 1
test -n "$is_ok"
$_SECURE_MOUNT -n -t proc proc /mnt/proc
cd /mnt
-$_CHBIND "${CHBIND_OPTS[@]}" \
+"${CHBIND_CMD[@]}" \
$_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
$_VUNAME --xid self --set -t nodename="${SETUP_HOSTNAME:-fai-build}" \
-t context="$SETUP_CONFDIR" -- \
# $VSERVER_NAME ... name of vserver
declare -a NICE_CMD=()
-declare -a CHBIND_OPTS=()
+declare -a CHBIND_CMD=()
declare -a CAP_OPTS=()
declare -a CHCONTEXT_INIT_OPTS=()
declare -a CHCONTEXT_FLAG_OPTS=()
local vdir="$1"
local i
local bcast=
+ local lback=
local nid=
test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
- local f=$vdir/interfaces/bcast
+ local f="$vdir"/interfaces/bcast
getFileValue bcast "$f"
+ f="$vdir"/interfaces/lback
+ getFileValue lback "$f"
getFileValue nid "$vdir/ncontext" "$vdir/context"
- CHBIND_OPTS=( $SILENT_OPT --secure ${nid:+--nid "$nid"} ${bcast:+--bcast "$bcast"} )
+ CHBIND_CMD=( $_CHBIND $SILENT_OPT --secure ${nid:+--nid "$nid"}
+ ${bcast:+--bcast "$bcast"} ${lback:+--lback "$lback"}
+ )
for i in "${INTERFACES[@]}"; do
- CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
+ CHBIND_CMD=( "${CHBIND_CMD[@]}" --ip "$i" )
done
- _readFileToArray "$vdir"/nflags CHBIND_OPTS --flag
- _readFileToArray "$vdir"/ncapabilities CHBIND_OPTS --ncap
+ _readFileToArray "$vdir"/nflags CHBIND_CMD --flag
+ _readFileToArray "$vdir"/ncapabilities CHBIND_CMD --ncap
_HAVE_CHBIND_OPTIONS=1
}
_mountVserverInternal "$cfgdir"/fstab
_mountVserverInternal "$cfgdir"/fstab.local
- _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
+ _mountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}"
isNamespaceCleanup "$cfgdir" && \
_namespaceCleanup "$cfgdir"
test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
pushd "$vdir/" >/dev/null || return 1
- _umountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
- _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
- _umountVserverInternal "$cfgdir"/fstab || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
+ _umountVserverInternal "$cfgdir"/fstab || is_ok=
popd >/dev/null || return 1
test -n "$is_ok"
is_configured=1
if $_VSERVER_INFO - FEATURE migrate; then
${NICE_CMD[@]} \
- $_CHBIND "${CHBIND_OPTS[@]}" -- \
+ "${CHBIND_CMD[@]}" \
$_EXEC_ULIMIT "$VSERVER_DIR"/ulimits \
- $_VTAG --create "${OPTS_VTAG_CREATE[@]}" -- \
+ $_VTAG --create "${OPTS_VTAG_CREATE[@]}" --silent -- \
$_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
${OPTION_STRACE:+$_STRACE -fF -o /tmp/vserver-start.$$} \
${USE_VNAMESPACE:+$_VNAMESPACE --set -- } \
fi
${NICE_CMD[@]} \
- $_CHBIND "${CHBIND_OPTS[@]}" \
+ "${CHBIND_CMD[@]}" \
$_EXEC_ULIMIT "$VSERVER_DIR/ulimits" \
$_CHCONTEXT_COMPAT "${CHCONTEXT_OPTS[@]}" "${CHCONTEXT_INIT_OPTS[@]}" \
$_SAVE_CTXINFO "$VSERVER_DIR" \
fi
elif $_VSERVER_INFO - FEATURE migrate; then
"${NICE_CMD[@]}" \
- "$_CHBIND" "${CHBIND_OPTS[@]}" \
- "$_VTAG" --migrate "${OPTS_VTAG_MIGRATE[@]}" -- \
+ "${CHBIND_CMD[@]}" \
+ "$_VTAG" --migrate "${OPTS_VTAG_MIGRATE[@]}" --silent -- \
$_VCONTEXT $SILENT_OPT --migrate --chroot --xid "$S_CONTEXT" -- \
"${INITCMD_STOP[@]}" || fail=1
else
if $_VSERVER_INFO - FEATURE migrate; then
if test -z "$is_stopped"; then
exec \
- $_CHBIND "${CHBIND_OPTS[@]}" \
+ "${NICE_CMD[@]}" \
+ "${CHBIND_CMD[@]}" \
$_EXEC_ULIMIT "$VSERVER_DIR/ulimits" \
${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT" -- } \
- $_VTAG --migrate "${OPTS_VTAG_ENTER[@]}" -- \
+ $_VTAG --migrate "${OPTS_VTAG_ENTER[@]}" --silent -- \
$_VCONTEXT $SILENT_OPT --migrate --chroot \
--xid "$S_CONTEXT" --uid "$user" "${OPTS_VCONTEXT_ENTER[@]}" -- \
"$@"
else
exec \
- $_CHBIND "${CHBIND_OPTS[@]}" \
+ "${NICE_CMD[@]}" \
+ "${CHBIND_CMD[@]}" \
$_EXEC_ULIMIT "$VSERVER_DIR/ulimits" \
- $_VTAG --migrate "${OPTS_VTAG_ENTER[@]}" -- \
+ $_VTAG --create "${OPTS_VTAG_CREATE[@]}" --silent -- \
$_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
$_VUNAME --xid self --dir "$VSERVER_DIR"/uts --missingok -- \
$_VUNAME --xid self --set -t context="$VSERVER_DIR" -- \
else
exec \
"${NICE_CMD[@]}" \
- "$_CHBIND" "${CHBIND_OPTS[@]}" \
+ "${CHBIND_CMD[@]}" \
"$_EXEC_ULIMIT" "$VSERVER_DIR/ulimits" \
${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT" --} \
$_CHCONTEXT_COMPAT "${CHCONTEXT_OPTS[@]}" -- \
$_VSERVER "$i" exec "$cmd" "$@"
else
_setVserverDir "$i"
+ # subshell so we don't have to clean up
( _generateChbindOptions "$VSERVER_DIR"
- $_VSERVER "$i" status &> /dev/null && \
- CHBIND_CMD=( "$_CHBIND" "${CHBIND_OPTS[@]}" -- )
+ $_VSERVER "$i" status &> /dev/null || \
+ CHBIND_CMD=()
callInNamespace "$i" \
"$_VNAMESPACE" --new -- \
"${CHBIND_CMD[@]}" \
#define CMD_CREATE 0x4001
#define CMD_MIGRATE 0x4002
#define CMD_SILENTEXIST 0x4003
+#define CMD_SILENT 0x4004
struct option const
{ "tag", required_argument, 0, CMD_TAG },
{ "create", no_argument, 0, CMD_CREATE },
{ "migrate", no_argument, 0, CMD_MIGRATE },
+ { "silent", no_argument, 0, CMD_SILENT },
{ "silentexist", no_argument, 0, CMD_SILENTEXIST },
{ 0,0,0,0 },
};
"<opts> can be:\n"
" --silentexist ... be silent when context exists already; useful\n"
" for '--create' only\n"
+ " --silent ... if the feature is not supported, just execute\n"
+ " <program>\n"
"\n"
"'vtag --create' exits with code 254 iff the context exists already.\n"
"\n"
{
tag_t tag;
- if (!vc_isSupported(vcFEATURE_PPTAG))
- goto exec;
+ if (!vc_isSupported(vcFEATURE_PPTAG)) {
+ if (args->verbosity >= 1) {
+ errno = ENOSYS;
+ perror(ENSC_WRAPPERS_PREFIX);
+ return wrapper_exit_code;
+ }
+ else
+ goto exec;
+ }
if (args->do_create) {
tag = vc_tag_create(args->tag);
while (1) {
int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0);
if (c==-1) break;
-
+
switch (c) {
case CMD_HELP : showHelp(1, argv[0], 0);
case CMD_VERSION : showVersion();
case CMD_MIGRATE : args.do_migrate = true; break;
case CMD_SILENTEXIST : args.is_silentexist = true; break;
case CMD_TAG : args.tag = Evc_tagopt2tag(optarg,true); break;
+ case CMD_SILENT : args.verbosity--; break;
default :
WRITE_MSG(2, "Try '");