# $Id: vserver-build.functions,v 1.18 2005/07/04 22:38:42 ensc Exp $ --*- sh -*-- # Copyright (C) 2003 Enrico Scholz # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Expected environment: # $VSERVER_NAME ... name of vserver ROOTDIR= ROOTDIR_REL= VSERVERDIRNAME= VDIR= _DEV_FILE= _EXEC_DIR= BUILD_INITPRE= BUILD_INITPOST= __BASE_GENERATED_FILES=() __BASE_SUCCESS= function makeDevEntry { local dst=$1/$2 case "$3" in (c|b) mknod -m$6 "$dst" $3 $4 $5;; (d) mkdir -p -m$4 "$dst";; (f) touch "$dst" chmod $4 "$dst" ;; (*) echo "Unknown dev-entry mode '$3'" >&2 false ;; esac } function populateDirectory { local dst=$1 local i shift for i; do local file= for file in "$i"/*; do isRegularFile "$file" || continue cp -a "$file" "$dst/" done done } function _setRootDir { test -z "$ROOTDIR" || return 0 for item in "\"$__CONFDIR/.defaults/vdirbase\" 1" "$__DEFAULT_VSERVERDIR"; do eval set -- "$item" ROOTDIR=$1 ROOTDIR_REL=$2 test ! -d "$ROOTDIR" || break done test -d "$ROOTDIR" || { echo "Root-directory '$ROOTDIR' does not exist or is invalid" >&2 exit 1 } } function _setVserverDir { test -z "$VSERVERDIRNAME" || return 0 VSERVERDIRNAME="$VSERVER_NAME" } function _setVdir { VDIR="$ROOTDIR/$VSERVERDIRNAME" } function say { test -z "$OPTION_SILENT" || return 0 echo "$@" } function _renameVserverCfg { local suffix=.~$(date +'%s')~ local i for i in "$VDIR" "$SETUP_CONFDIR"; do test ! -e "$i" || { mv "$i" "$i$suffix" say "Renamed '$i' to '$i$suffix'" } done } ## Usage: getDistribution [] 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 elif test -n "$1"; then DISTRIBUTION=$1 else echo \ "Can not determine distribution; please specify it manually with the '-d' option" >&2 exit 1 fi >&2 } 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 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" local spec while read spec; do makeDevEntry "$VDIR"/dev $spec 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 "" 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" "" done } 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" "" } function base.__cleanup { test -z "$OPTION_KEEP" || return 0 test -z "$__BASE_SUCCESS" || return 0 echo 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 }