added 'novlandev' interface flag
[util-vserver.git] / util-vserver / scripts / vserver-build.functions
index b73d1d1..4d78cdd 100644 (file)
@@ -30,6 +30,9 @@ _EXEC_DIR=
 BUILD_INITPRE=
 BUILD_INITPOST=
 
+__BASE_GENERATED_FILES=()
+__BASE_SUCCESS=
+
 function makeDevEntry
 {
     local dst=$1/$2
@@ -55,12 +58,7 @@ function populateDirectory
        local file=
        
        for file in "$i"/*; do
-           test -e "$file" || continue
-           case "$file" in
-               (*/CVS) test ! -d "$file" || continue;;
-               (*.rpmsave|*.rpmnew|*.rpmorig)
-                       continue;;
-           esac
+           isRegularFile "$file" || continue
            
            cp -a "$file" "$dst/"
        done
@@ -71,7 +69,7 @@ function _setRootDir
 {
     test -z "$ROOTDIR" || return 0
     
-    for item in "\"$CONFDIR/.defaults/vdirbase\" 1" "$DEFAULT_VSERVERDIR"; do
+    for item in "\"$__CONFDIR/.defaults/vdirbase\" 1" "$__DEFAULT_VSERVERDIR"; do
        eval set -- "$item"
        ROOTDIR=$1
        ROOTDIR_REL=$2
@@ -107,58 +105,75 @@ function _renameVserverCfg
     local i
     
     for i in "$VDIR" "$SETUP_CONFDIR"; do
-       test ! -e "$i" || {
+       test ! -e "$i" || isDirectoryEmpty "$i" || {
            mv "$i" "$i$suffix"
            say "Renamed '$i' to '$i$suffix'"
        }
     done
 }
 
+
+## Usage: getDistribution [<default>] [<ignore-config>]
 function getDistribution
 {
-    test -z "$DISTRIBUTION" || return 0
-
-    if test -e /etc/fedora-release; then
-       set -- $(cat /etc/fedora-release)
-       DISTRIBUTION=fdr$4
-    elif test -e /etc/redhat-release; then
-       set -- $(cat /etc/redhat-release)
-       DISTRIBUTION=rh$5
-    elif test -e /etc/debian_version; then
-       set -- $(cat /etc/debian_version)
-       DISTRIBUTION=deb$1
-    elif test -e /etc/SuSE-release; then
-       set -- $(cat /etc/SuSE-release)
-       DISTRIBUTION=suse$3
-    elif test -e /etc/gentoo-release; then
-       set -- $(cat /etc/gentoo-release)
-       DISTRIBUTION=gentoo$5
-    elif test -e /etc/slackware-release; then
-       set -- $(cat /etc/slackware-release)
-       DISTRIBUTION=slackware$2
-    else
-       echo \
-"Can not determine distribution; please specify it manually
-with the '-d' option"  >&2
-       exit 1
-    fi >&2
+    local ignore_config=$2
+    
+    if test -z "$DISTRIBUTION"; then
+       if test -e /etc/fedora-release; then
+           set -- $(cat /etc/fedora-release)
+           DISTRIBUTION=fdr$4
+       elif test -e /etc/redhat-release; then
+           set -- $(cat /etc/redhat-release)
+           DISTRIBUTION=rh$5
+       elif test -e /etc/debian_version; then
+           set -- $(cat /etc/debian_version)
+           DISTRIBUTION=deb$1
+       elif test -e /etc/SuSE-release; then
+           set -- $(cat /etc/SuSE-release)
+           DISTRIBUTION=suse$3
+       elif test -e /etc/gentoo-release; then
+           set -- $(cat /etc/gentoo-release)
+           DISTRIBUTION=gentoo$5
+       elif test -e /etc/slackware-release; then
+           set -- $(cat /etc/slackware-release)
+           DISTRIBUTION=slackware$2
+       elif test -n "$1"; then
+           DISTRIBUTION=$1
+       else
+           colpanic $"\
+ERROR: Can not determine distribution; please specify it manually with
+  the '-d' option."
+       fi
+    fi
+
+    test -n "$ignore_config" -o \
+         -d "$__CONFDIR/.distributions/$DISTRIBUTION" -o \
+         -d "$__DISTRIBDIR/$DISTRIBUTION" ||
+           colpanic $"\
+ERROR: Can not find configuration for the distribution '$DISTRIBUTION';
+  please read http://linux-vserver.org/HowToRegisterNewDistributions
+  for information how to add support for your own distribution."
+}
+
+function base._addGeneratedFile
+{
+    __BASE_GENERATED_FILES=( "${__BASE_GENERATED_FILES[@]}" "$@" )
 }
 
 ## Usage: initFilesystem [force]
 function base.initFilesystem
 {
     test -z "$1" || _renameVserverCfg
-    test ! -d "$VDIR" -a ! -d "$SETUP_CONFDIR" || {
-       echo \
-"vserver-topdirectory '$VDIR' and/or configuration at '$SETUP_CONFDIR'
-exist already; please try to use '--force', or remove them manually"
->&2
-       exit 1
-    } >&2
+    { isDirectoryEmpty "$VDIR" && test  ! -e "$SETUP_CONFDIR"; } || colpanic $"\
+vserver-topdirectory '$VDIR' and/or configuration at '$SETUP_CONFDIR'
+exist already; please try to use '--force', or remove them manually."
 
     mkdir -p -m755 "$VDIR"
     chattr -t "$VDIR"
+    base._addGeneratedFile "$VDIR"
+    
     mkdir -p -m755 "$SETUP_CONFDIR"/apps "$VDIR"/{dev/pts,etc}
+    base._addGeneratedFile "$SETUP_CONFDIR"
     
     ln -s "$VDIR"       "$SETUP_CONFDIR/vdir"
 
@@ -168,22 +183,45 @@ exist already; please try to use '--force', or remove them manually"
     done <$_DEV_FILE
 
     mkdir -p "$VDIR"/proc
-    findAndCopy "$VDIR"/etc/hosts         "$CONFDIR"/.defaults/files/hosts "$CONFDIR/.distributions/$DISTRIBUTION"/files/hosts \
-                                         "$DISTRIBDIR/$DISTRIBUTION"/files/hosts "$DISTRIBDIR"/defaults/files/hosts ""
+    findAndCopy "$VDIR"/etc/hosts         "$__CONFDIR"/.defaults/files/hosts "$__CONFDIR/.distributions/$DISTRIBUTION"/files/hosts \
+                                         "$__DISTRIBDIR/$DISTRIBUTION"/files/hosts "$__DISTRIBDIR"/defaults/files/hosts ""
 
     for i in nsswitch.conf krb5.conf krb.conf krb.realms ldap.conf localtime resolv.conf; do
-       findAndCopy "$VDIR"/etc/$i  "$CONFDIR/.defaults/files/$i" "$CONFDIR/.distributions/$DISTRIBUTION/files/$i" ""
+       findAndCopy "$VDIR"/etc/$i  "$__CONFDIR/.defaults/files/$i" "$__CONFDIR/.distributions/$DISTRIBUTION/files/$i" ""
     done
 }
 
-function base.initVariables
+function base._initVariables
 {
     _setRootDir
     _setVserverDir
     _setVdir
 
-    findFile _DEV_FILE      "$CONFDIR/.distributions/$DISTRIBUTION/devs"      "$DISTRIBDIR/$DISTRIBUTION/devs"     "$DISTRIBDIR/defaults/devs"
-    findDir  _EXECDIR       "$CONFDIR/.distributions/$DISTRIBUTION/execdir"   "$DISTRIBDIR/$DISTRIBUTION/execdir"  /
-    findFile BUILD_INITPRE  "$CONFDIR/.distributions/$DISTRIBUTION/initpre"   "$DISTRIBDIR/$DISTRIBUTION/initpre"  ""
-    findFile BUILD_INITPOST "$CONFDIR/.distributions/$DISTRIBUTION/initpost"  "$DISTRIBDIR/$DISTRIBUTION/initpost" ""
+    findFile _DEV_FILE      "$__CONFDIR/.distributions/$DISTRIBUTION/devs"      "$__DISTRIBDIR/$DISTRIBUTION/devs"     "$__DISTRIBDIR/defaults/devs"
+    findDir  _EXECDIR       "$__CONFDIR/.distributions/$DISTRIBUTION/execdir"   "$__DISTRIBDIR/$DISTRIBUTION/execdir"  /
+    findFile BUILD_INITPRE  "$__CONFDIR/.distributions/$DISTRIBUTION/initpre"   "$__DISTRIBDIR/$DISTRIBUTION/initpre"  ""
+    findFile BUILD_INITPOST "$__CONFDIR/.distributions/$DISTRIBUTION/initpost"  "$__DISTRIBDIR/$DISTRIBUTION/initpost" ""
+}
+
+function base.__cleanup
+{
+    test -z "$OPTION_KEEP"    || return 0
+    test -z "$__BASE_SUCCESS" || return 0
+    
+    rm -rf "${__BASE_GENERATED_FILES[@]}"
+}
+
+function base.init
+{
+    test -z "$SETUP_CONTEXT" || ! $_VSERVER_INFO -q "$SETUP_CONTEXT" RUNNING || \
+       panic $"\
+Context '$SETUP_CONTEXT' is already in use. Please select another one."
+
+    trap "base.__cleanup" EXIT
+    base._initVariables
+}
+
+function base.setSuccess
+{
+    __BASE_SUCCESS=1
 }