981c037d7c25efd9a7a3f98b19fac10db175c03e
[util-vserver.git] / scripts / vserver-build.functions
1 # $Id: vserver-build.functions,v 1.18 2005/07/04 22:38:42 ensc Exp $    --*- sh -*--
2
3 # Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
4 #  
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License.
8 #  
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #  
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18 # Expected environment:
19 #     $VSERVER_NAME ... name of vserver
20
21 ROOTDIR=
22 ROOTDIR_REL=
23 VSERVERDIRNAME=
24
25 VDIR=
26
27 _DEV_FILE=
28 _EXEC_DIR=
29
30 BUILD_INITPRE=
31 BUILD_INITPOST=
32
33 __BASE_GENERATED_FILES=()
34 __BASE_SUCCESS=
35
36 function makeDevEntry
37 {
38     local dst=$1/$2
39     case "$3" in
40         (c|b)   mknod -m$6 "$dst"  $3 $4 $5;;
41         (d)     mkdir -p -m$4 "$dst";;
42         (f)     touch "$dst"
43                 chmod $4 "$dst"
44                 ;;
45         (*)     echo "Unknown dev-entry mode '$3'" >&2
46                 false
47                 ;;
48     esac
49 }
50
51 function populateDirectory
52 {
53     local dst=$1
54     local i
55     
56     shift
57     for i; do
58         local file=
59         
60         for file in "$i"/*; do
61             isRegularFile "$file" || continue
62             
63             cp -a "$file" "$dst/"
64         done
65     done
66 }
67
68 function _setRootDir
69 {
70     test -z "$ROOTDIR" || return 0
71     
72     for item in "\"$__CONFDIR/.defaults/vdirbase\" 1" "$__DEFAULT_VSERVERDIR"; do
73         eval set -- "$item"
74         ROOTDIR=$1
75         ROOTDIR_REL=$2
76         test ! -d "$ROOTDIR" || break
77     done
78
79     test -d "$ROOTDIR" || {
80         echo "Root-directory '$ROOTDIR' does not exist or is invalid" >&2
81         exit 1
82     }
83 }
84
85 function _setVserverDir
86 {
87     test -z "$VSERVERDIRNAME" || return 0
88     VSERVERDIRNAME="$VSERVER_NAME"
89 }
90
91 function _setVdir
92 {
93     VDIR="$ROOTDIR/$VSERVERDIRNAME"
94 }
95
96 function say
97 {
98     test -z "$OPTION_SILENT" || return 0
99     echo "$@"
100 }
101
102 function _renameVserverCfg
103 {
104     local suffix=.~$(date +'%s')~
105     local i
106     
107     for i in "$VDIR" "$SETUP_CONFDIR"; do
108         test ! -e "$i" || {
109             mv "$i" "$i$suffix"
110             say "Renamed '$i' to '$i$suffix'"
111         }
112     done
113 }
114
115
116 ## Usage: getDistribution [<default>]
117 function getDistribution
118 {
119     test -z "$DISTRIBUTION" || return 0
120
121     if test -e /etc/fedora-release; then
122         set -- $(cat /etc/fedora-release)
123         DISTRIBUTION=fdr$4
124     elif test -e /etc/redhat-release; then
125         set -- $(cat /etc/redhat-release)
126         DISTRIBUTION=rh$5
127     elif test -e /etc/debian_version; then
128         set -- $(cat /etc/debian_version)
129         DISTRIBUTION=deb$1
130     elif test -e /etc/SuSE-release; then
131         set -- $(cat /etc/SuSE-release)
132         DISTRIBUTION=suse$3
133     elif test -e /etc/gentoo-release; then
134         set -- $(cat /etc/gentoo-release)
135         DISTRIBUTION=gentoo$5
136     elif test -e /etc/slackware-release; then
137         set -- $(cat /etc/slackware-release)
138         DISTRIBUTION=slackware$2
139     elif test -n "$1"; then
140         DISTRIBUTION=$1
141     else
142         echo \
143 "Can not determine distribution; please specify it manually
144 with the '-d' option"  >&2
145         exit 1
146     fi >&2
147 }
148
149 function base._addGeneratedFile
150 {
151     __BASE_GENERATED_FILES=( "${__BASE_GENERATED_FILES[@]}" "$@" )
152 }
153
154 ## Usage: initFilesystem [force]
155 function base.initFilesystem
156 {
157     test -z "$1" || _renameVserverCfg
158     test ! -d "$VDIR" -a ! -d "$SETUP_CONFDIR" || {
159         echo \
160 "vserver-topdirectory '$VDIR' and/or configuration at '$SETUP_CONFDIR'
161 exist already; please try to use '--force', or remove them manually"
162 >&2
163         exit 1
164     } >&2
165
166     mkdir -p -m755 "$VDIR"
167     chattr -t "$VDIR"
168     base._addGeneratedFile "$VDIR"
169     
170     mkdir -p -m755 "$SETUP_CONFDIR"/apps "$VDIR"/{dev/pts,etc}
171     base._addGeneratedFile "$SETUP_CONFDIR"
172     
173     ln -s "$VDIR"       "$SETUP_CONFDIR/vdir"
174
175     local spec
176     while read spec; do
177         makeDevEntry "$VDIR"/dev $spec
178     done <$_DEV_FILE
179
180     mkdir -p "$VDIR"/proc
181     findAndCopy "$VDIR"/etc/hosts         "$__CONFDIR"/.defaults/files/hosts "$__CONFDIR/.distributions/$DISTRIBUTION"/files/hosts \
182                                           "$__DISTRIBDIR/$DISTRIBUTION"/files/hosts "$__DISTRIBDIR"/defaults/files/hosts ""
183
184     for i in nsswitch.conf krb5.conf krb.conf krb.realms ldap.conf localtime resolv.conf; do
185         findAndCopy "$VDIR"/etc/$i  "$__CONFDIR/.defaults/files/$i" "$__CONFDIR/.distributions/$DISTRIBUTION/files/$i" ""
186     done
187 }
188
189 function base._initVariables
190 {
191     _setRootDir
192     _setVserverDir
193     _setVdir
194
195     findFile _DEV_FILE      "$__CONFDIR/.distributions/$DISTRIBUTION/devs"      "$__DISTRIBDIR/$DISTRIBUTION/devs"     "$__DISTRIBDIR/defaults/devs"
196     findDir  _EXECDIR       "$__CONFDIR/.distributions/$DISTRIBUTION/execdir"   "$__DISTRIBDIR/$DISTRIBUTION/execdir"  /
197     findFile BUILD_INITPRE  "$__CONFDIR/.distributions/$DISTRIBUTION/initpre"   "$__DISTRIBDIR/$DISTRIBUTION/initpre"  ""
198     findFile BUILD_INITPOST "$__CONFDIR/.distributions/$DISTRIBUTION/initpost"  "$__DISTRIBDIR/$DISTRIBUTION/initpost" ""
199 }
200
201 function base.__cleanup
202 {
203     test -z "$OPTION_KEEP"    || return 0
204     test -z "$__BASE_SUCCESS" || return 0
205     
206     echo rm -rf "${__BASE_GENERATED_FILES[@]}"
207 }
208
209 function base.init
210 {
211     test -z "$SETUP_CONTEXT" || ! $_VSERVER_INFO -q "$SETUP_CONTEXT" RUNNING || \
212         panic $"\
213 Context '$SETUP_CONTEXT' is already in use. Please select another one."
214
215     trap "base.__cleanup" EXIT
216     base._initVariables
217 }
218
219 function base.setSuccess
220 {
221     __BASE_SUCCESS=1
222 }