4 # Copyright (C) 2004,2005 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; version 2 of the License.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
20 test -e "$UTIL_VSERVER_VARS" || {
21 echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
24 . "$UTIL_VSERVER_VARS"
26 . "$_LIB_VSERVER_BUILD_FUNCTIONS"
27 . "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT"
28 . "$__PKGLIBDIR/vserver.functions"
33 $"Usage: $0 --externalize|--internalize [-y] [--] <vserver-name>
35 Report bugs to <$PACKAGE_BUGREPORT>."
39 function showVersion()
42 vpkg $PACKAGE_VERSION -- shows information about packages in vservers
43 This program is part of $PACKAGE_STRING
45 Copyright (C) 2004,2005 Enrico Scholz
46 This program is free software; you may redistribute it under the terms of
47 the GNU General Public License. This program has absolutely no warranty."
53 if test -z "$WORKAROUND_106057"; then
56 rpmdb_mntpoint=/.rpmdb
60 function _createDirs()
63 test -n "$i" || continue
68 function _copySecure()
75 ( cd "$srcdir" && tar chf - '.' ) | \
76 ( cd "$chroot" && $_EXEC_CD "$dstdir" $_TAR xf - )
79 function _copySecureRev()
85 ( cd "$chroot" && $_EXEC_CD "$srcdir" $_TAR cf - '.' ) | \
86 ( cd "$dstdir" && tar xf - )
89 ## Usage: _substFile <filename> <sed-expression>
95 $_CHROOT_SH testfile "$file" || return 0
97 local tmp=$($_MKTEMP pkgmgmt_subst.XXXXXX)
98 trap "$_RM -f $tmp" EXIT
100 $_CHROOT_SH cat "$file" | \
101 $_SED -e "$expr" >$tmp
103 $_CHROOT_SH cat "$file" | $_CMP -s $tmp - || \
104 $_CHROOT_SH truncate "$file" <$tmp
114 $_CHROOT_SH testfile "$file" || return 0
116 local tmp=$($_MKTEMP apt.conf.XXXXXX)
117 trap "$_RM -f $tmp" EXIT
119 $_CHROOT_SH cat "$file" | \
120 $_SED -e "s|^\([^$hash].*@autogenerated@\)|$hash$hash\1|" >$tmp
122 $_CHROOT_SH cat "$file" | $_CMP -s $tmp - || \
123 $_CHROOT_SH truncate "$file" <$tmp
128 function _unhashAuto()
130 test -e "$1" || return 0
133 local tmp=$($_MKTEMP apt.conf.XXXXXX)
134 trap "$_RM -f $tmp" EXIT
136 $_SED -e "s|^$hash$hash\(.*@autogenerated@\)|\1|" "$1" >$tmp
137 $_CMP -s "$tmp" "$1" || \
143 function _mountFilesystemsInternal()
146 test -e "$fstab" || return 0
149 pushd "$vdir" >/dev/null
150 "$@" $_SECURE_MOUNT -n -a --chroot --fstab "$fstab"
154 function _mountFilesystems()
157 cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || {
158 echo "Can not determine configuration directory for '$1'; ..." >&2
161 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
163 _mountFilesystemsInternal "$cfgdir"/fstab || return 1
164 _mountFilesystemsInternal "$cfgdir"/fstab.local || return 1
165 _mountFilesystemsInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || return 1
168 function _umountFilesystems()
171 cfgdir=$($_VSERVER_INFO "$1" CFGDIR) || {
172 echo "Can not determine configuration directory for '$1'; ..." >&2
175 local vdir=$cfgdir/vdir
177 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
179 pushd "$vdir/" >/dev/null || return 1
180 _umountVserverInternal "$cfgdir"/fstab.remote "${CHBIND_CMD[@]}" || is_ok=
181 _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
182 _umountVserverInternal "$cfgdir"/fstab || is_ok=
183 popd >/dev/null || return 1
188 # Usage: verifyInternalPackages <vserver> <style>
189 function verifyInternalPackages()
193 The following errors occured while trying to internalize the
198 (RH) pkgs=$(vrpm "$1" -- -q --qf '---%{NAME}---\n' rpm apt yum urpmi "${YUM_RELEASEPKGS[@]}")
199 hasSubstring "$pkgs" ---rpm--- || {
201 * The vserver does not seem to have the 'rpm' package which is required
202 for internal package management. It is suggested to install it before
208 hasSubstring "$pkgs" ---apt--- ---yum--- ---urpmi--- || {
210 * The vserver does not seem to have a depsolver like 'apt' or 'yum'
211 installed. It is suggested to install such a program before setting
212 up internal package management."
217 test -n "$have_apt" || test -n "$have_urpmi" ||
218 test -z "$have_yum" || \
219 hasSubstring "$pkgs" "${YUM_RELEASEPKGS[@]}" || {
221 * yum requires a special package which describes the version of the
222 distribution. Such a package could not be found within the vserver
223 so please install it before continuing. Usually, this package is
224 named 'redhat-release' of 'fedora-release'."
234 function processVserver_RH()
237 local is_internalize=$2
244 cfgdir=$($_VSERVER_INFO "$vserver" APPDIR pkgmgmt) || \
245 cfgdir=$($_VSERVER_INFO "$vserver" APPDIR)/pkgmgmt
247 ## Figure out the environment....
251 pkgmgmt.isAptAvailable "$cfgdir" "$vdir" "$is_internalize" || have_apt=
252 pkgmgmt.isYumAvailable "$cfgdir" "$vdir" "$is_internalize" || have_yum=
253 pkgmgmt.isUrpmiAvailable "$cfgdir" "$vdir" "$is_internalize" || have_urpmi=
262 ## Create directories and assign variables where configuration
263 ## can/will be found on the host
264 if test -n "$is_internalize"; then
265 verifyInternalPackages "$vserver" RH || test -n "$IS_FORCE" ||
267 Can not continue; use '--force' to override this check"
269 pushd "$vdir" >/dev/null
271 test ! -L var/lib/rpm || {
272 $_EXEC_CD /var/lib $_RM rpm &&
273 $_EXEC_CD /var/lib $_MKDIR -m755 rpm &&
274 $_EXEC_CD /var/lib $_CHOWN rpm:rpm rpm ||
276 } </dev/null 2>/dev/null
278 for i in var/cache/apt/{,archives/{,partial},genpkglist,gensrclist} \
279 var/state/{,apt/{,lists/{,partial}}} \
282 $_EXEC_CD /$(dirname "$i") $_MKDIR -m755 $(basename "$i") || :
287 if test -n "$have_apt"; then
288 findDir APTETCDIR "$cfgdir"/aptetc "$cfgdir"/base/apt/etc /etc/apt /
289 elif test -n "$have_urpmi"; then
290 findDir URPMISTATEDIR "$cfgdir"/base/var/lib/urpmi
291 findDir URPMIETCDIR "$cfgdir"/base/etc/urpmi
294 findDir RPMETCDIR "$cfgdir"/rpmetc "$cfgdir"/base/rpm/etc \
295 "$cfgdir"/base/etc/rpm /etc/rpm /
296 findDir RPMSTATEDIR "$cfgdir"/rpmstate "$cfgdir"/base/rpm/state \
297 "$cfgdir"/base/var/lib/rpm
299 mkdir -m755 -p "$cfgdir"
302 if test -n "$have_apt"; then
303 findDir APTETCDIR "$cfgdir"/aptetc "$cfgdir"/base/apt/etc /
304 findDir APTSTATEDIR "$cfgdir"/aptstate "$cfgdir"/base/apt/state /
305 findDir APTCACHEDIR "$cfgdir"/aptcache "$cfgdir"/base/apt/cache /
306 findDir APTARCHIVDIR "$cfgdir"/aptarchives "$cfgdir"/base/apt/archives /
308 test "$APTETCDIR" != / || APTETCDIR=$cfgdir/base/apt/etc
309 test "$APTSTATEDIR" != / || APTSTATEDIR=$cfgdir/base/apt/state
310 test "$APTCACHEDIR" != / || APTCACHEDIR=$cfgdir/base/apt/cache
311 test "$APTARCHIVDIR" != / || APTARCHIVDIR=$cfgdir/base/apt/archive
313 test -d "$cfgdir"/aptetc -a -d "$cfgdir"/aptstate -a \
314 -d "$cfgdir"/aptcache -a -d "$cfgdir"/aptarchives || need_base=1
317 findDir RPMETCDIR "$cfgdir"/rpmetc "$cfgdir"/base/rpm/etc /
318 findDir RPMSTATEDIR "$cfgdir"/rpmstate "$cfgdir"/base/rpm/state /
320 test "$RPMETCDIR" != / || RPMETCDIR=$cfgdir/base/rpm/etc
321 test "$RPMSTATEDIR" != / || RPMSTATEDIR=$cfgdir/base/rpm/state
323 test -d "$cfgdir"/rpmetc -a -d "$cfgdir"/rpmstate || need_base=1
324 test ! -e "$cfgdir"/base || need_base=
326 test -z "$need_base" || ln -s "$PKGCFGDIR" "$cfgdir"/base
328 mkdir -m755 -p "$PKGCFGDIR"
329 _createDirs "$APTETCDIR" "$APTSTATEDIR" "$APTCACHEDIR" "$APTARCHIVDIR" \
330 "$RPMETCDIR" "$RPMSTATEDIR"
334 if test -n "$is_internalize"; then
335 if test -n "$have_apt"; then
336 _copySecure "$vdir" "$APTETCDIR" /etc/apt
337 pushd "$vdir" >/dev/null
338 _hashAuto /etc/apt/apt.conf '/'
340 elif test -n "$have_urpmi"; then
341 _copySecure "$vdir" "$URPMISTATEDIR" /var/lib/urpmi
342 _copySecure "$vdir" "$URPMIETCDIR" /etc/urpmi
345 _copySecure "$vdir" "$RPMETCDIR" /etc/rpm
346 _copySecure "$vdir" "$RPMSTATEDIR" /var/lib/rpm
348 pushd "$vdir" >/dev/null
349 ## remove %_dbpath settings
350 _substFile /etc/rpm/macros '/^%_dbpath[ \t].*/D'
353 if test -n "$have_apt"; then
354 _copySecureRev "$vdir" /etc/apt "$APTETCDIR"
355 _unhashAuto "$APTETCDIR"/apt.conf '/'
358 _copySecureRev "$vdir" /etc/rpm "$RPMETCDIR"
359 _copySecureRev "$vdir" /var/lib/rpm "$RPMSTATEDIR"
361 echo -e "%_dbpath\t\t$rpmdb_mntpoint" >>$RPMETCDIR/macros
365 if test -n "$is_internalize"; then
368 tmpdir=$($_MKTEMPDIR -p /var/tmp pkgmgmt.XXXXXX)
369 trap "$_RM -rf $tmpdir" EXIT
370 pushd "$vdir" >/dev/null
371 $_EXEC_CD /var/lib $_MV rpm $tmpdir/
372 $_EXEC_CD /var/lib $_LN_S "$rpmdb_mntpoint" rpm
377 if test -n "$is_internalize"; then
378 $_TOUCH "$cfgdir"/internal
380 $_RM -f "$cfgdir"/internal
384 function processVserver_Debian()
387 local is_internalize=$2
389 if test -n "$is_internalize"; then
390 echo $"Debian vservers should be internalized everytime; do not know how to handle '$vserver'" >&2
392 echo $"External packagemanagement is not supported for Debian vserver" >&2
398 function processVserver()
405 ! $_VSERVER_INFO -q "$vserver" RUNNING || {
406 echo $"Can not operate on running vservers; please stop '$vserver' and retry again..."
410 vdir=$($_VSERVER_INFO "$vserver" VDIR) && test -d "$vdir" || {
411 echo $"Vserver '$vserver' does not seem to exist; skipping it..."
415 _setVserverDir "$vserver"
418 pkgmgmt.initVariables
420 pkgmgmt.isInternal "$vserver" || is_external=1
422 case "$is_external"X"$IS_INTERNALIZE"X"$IS_EXTERNALIZE" in
423 (*X1X1) echo $"Can not externalize and internalize at the same time";;
424 (*XX) echo $"No operation specified; try '--help' for more information";;
425 (1XX1) echo $"Vserver '$vserver' has already external packagemanagment; skipping it...";;
426 (X1X) echo $"Vserver '$vserver' has already internal packagemanagment; skipping it...";;
430 test -z "$skip" || return 1
433 _mountFilesystems "$vserver" || return 1
434 pkgmgmt.guessStyle "$vserver" style || return 1
437 (redhat|mandrake) processVserver_RH "$vserver" "$IS_INTERNALIZE";;
438 (debian) processVserver_Debian "$vserver" "$IS_INTERNALIZE";;
440 echo $"Vserver style '$style' is not supported for packagemanagment" >&2
444 _umountFilesystems "$vserver" || return 1
447 tmp=$(getopt -o y --long debug,externalize,internalize,help,version,force -n "$0" -- "$@") || exit 1
457 (--help) showHelp $0;;
458 (--version) showVersion;;
460 (--externalize) IS_EXTERNALIZE=1;;
461 (--internalize) IS_INTERNALIZE=1;;
462 (--force) IS_FORCE=1;;
465 (*) echo $"vserver: internal error; arg=='$1'" >&2; exit 1;;
471 echo $"No vserver specified; try '--help' for more information"
482 processVserver "$i" && passed=1 || ok=
485 test -z "$ok" || exit 0
486 test -z "$passed" || exit 1