use different files for 'bcap' and 'ccap' for now
[util-vserver.git] / util-vserver / scripts / vserver.functions
index e02c0dd..9e92c98 100644 (file)
@@ -36,6 +36,11 @@ declare -a INITCMD_PREPARE=()
 declare -a INITKILL_SEQ=()
 declare -a ENTER_SHELL=()
 
+declare -a OPTS_VCONTEXT_CREATE=()
+declare -a OPTS_VCONTEXT_MIGRATE=()
+declare -a OPTS_VATTRIBUTE=()
+USE_VNAMESPACE=
+
 INTERFACE_CMDS_IDX=0
 _HAVE_INTERFACE_OPTIONS=
 _HAVE_CHBIND_OPTIONS=
@@ -85,6 +90,36 @@ function _generateNiceCommand
     NICE_CMD=( $_NICE -$nice )
 }
 
+function _generateCCapabilityOptions
+{
+    local vdir=$1
+    local cap
+    local f="$vdir"/ccapabilities
+    
+    test -e "$f" || return 0
+    while read cap; do
+       case x"$cap" in
+           x|x#)       ;;
+           *)          OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --ccap "$cap" );;
+       esac
+    done <"$f"
+}
+
+function _generateBCapabilityOptions
+{
+    local vdir=$1
+    local cap
+    local f="$vdir"/bcapabilities
+    
+    test -e "$f" || return 0
+    while read cap; do
+       case x"$cap" in
+           x|x#)       ;;
+           *)          OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --bcap "$cap" );;
+       esac
+    done <"$f"
+}
+
 function _generateCapabilityOptions
 {
     local vdir=$1
@@ -99,10 +134,12 @@ function _generateCapabilityOptions
        case x"$cap" in
            x|x#)       ;;
            !CAP_SYSCHROOT)
+               OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]" --cap "$cap" )
                CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
                CAPCHROOT_OPTS=( "${CAPCHROOT_OPTS[@]}" --nochroot )
                ;;
            *)
+               OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]" --cap "$cap" )
                CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" );;
        esac
     done <"$vdir"/capabilities
@@ -185,6 +222,7 @@ function _generateInitOptions
            INITCMD_START=( /sbin/init )
            INITCMD_STOP=(  /sbin/init )
            CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
+           OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
            test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
            test -z "$runlevel_stop"  || INITCMD_STOP=(  "${INITCMD_STOP[@]}"  "$runlevel_stop"  )
            ;;
@@ -195,6 +233,7 @@ function _generateInitOptions
            CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
            INITCMD_START_SYNC=( "$_INITSYNC_MINIT_START" "$vdir" )
            INITCMD_STOP_SYNC=(  "$_INITSYNC_MINIT_STOP"  "$vdir" )
+           OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
            test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
            test -z "$runlevel_stop"  || INITCMD_STOP=(  "${INITCMD_STOP[@]}"  "$runlevel_stop"  )
            ;;
@@ -228,15 +267,23 @@ function _generateFlagOptions
     while read flag; do
        case x"$flag" in
            x|x#)               ;;
+           xnamespace)         ;;
            xfakeinit)
                CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
+               OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
                ;;
            *)
+               OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --flag "$flag" )
                CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
                                      --flag "$flag" )
                ;;
        esac
     done <"$vdir"/flags
+
+    isAvoidNamespace "$cfgdir" || {
+       USE_VNAMESPACE=1
+       CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" --flag namespace )
+    }
 }
 
 function _generateChcontextOptions
@@ -264,6 +311,11 @@ function _generateChcontextOptions
                     ${ctx:+--ctx "$ctx"} \
                      ${hostname:+--hostname "$hostname"} \
                     ${domainname:+--domainname "$domainname"} )
+
+    OPTS_VCONTEXT_CREATE=( $SILENT_OPT \
+                          ${ctx:+--xid "$ctx"} )
+    ## put '--secure' at front so that it can be overridden
+    OPTS_VATTRIBUTE=( --secure "${OPTS_VATTRIBUTE[@]}" )
 }
 
 function _getInterfaceValue
@@ -323,9 +375,13 @@ function _processSingleInterface
     _getInterfaceValue name   '' "$iface"
     _getInterfaceValue scope  '' "$iface" "$iface/.."
 
-    test "$ip" || { echo $"Can not read ip for '$iface'"; return 1; }
+    test "$ip" || { echo $"Can not read ip for '$iface'"  >&2; return 1; }
     
-    test ! -e "$iface"/only_ip   || unset dev
+    test ! -e "$iface"/only_ip || {
+       echo $"The 'only_ip' flag for interface '$iface' is deprecated; use 'nodev' instead of" >&2
+       unset dev
+    }
+    test ! -e "$iface"/nodev   || unset dev
     
     if test "$dev"; then
        _transformMask2Prefix prefix "$prefix" "$mask"
@@ -333,7 +389,7 @@ function _processSingleInterface
        case "$dev" in
            *.*)
                test -d /proc/net/vlan || {
-                   echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers"
+                   echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers"  >&2
                    return 1
                }
                test -f /proc/net/vlan || {
@@ -452,6 +508,10 @@ function mountVserver
     popd >/dev/null
 
     test "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
+
+    test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \
+       $_VNAMESPACE --cleanup
+       
     $_CHBIND "${CHBIND_OPTS[@]}" \
        $_SECURE_MOUNT -a --chroot "$vdir" --fstab "$cfgdir"/fstab