#!/bin/bash # --- T2-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # T2 SDE: misc/vserver/install # Copyright (C) 2006 Juergen "George" Sawinski # Copyright (C) 2006 The T2 SDE Project # # More information can be found in the files COPYING and README. # # 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. A copy of the # GNU General Public License can be found in the file COPYING. # --- T2-COPYRIGHT-NOTE-END --- # TODO: # - implement "update" mode # - add "check" mode # - implement $admdir outside $root # - post-installation methods # - add rootfs alike copy_and_parse functionality # root directory defaults root=./test #FIXME vdirbase=/etc/vservers/.defaults/vdirbase guest= # files (selections) to install files= selection= # installer defaults method=install installer=mine # misc defaults verbose=0 pkgdir= pkgs= admdir= templates= templatedir=./${0%/*}/templates #FIXME /etc/vserver/.distributions/t2/templates patterndir=./${0%/*}/patterns #FIXME /etc/vserver/.distributions/t2/patterns ############################################################################# usage() { cat << EOF vserver-guest-install [options] [packages] Options: Methods -i,-install Install packages (default) -u,-update Update packages -r,-remove Remove packages -c,-check Check packages VServer setup -g,-guest <name of guest> Name of the vserver guest -R,-root <root> Root installation directory (./test) Package selection -t,-template <template> Template name or file Miscellaneous: -v Increase verbosity level -pkgdir Package directory -admdir Set alternate /var/adm directory (a link into the install root is created) EOF } # parse options while [ "$1" ]; do case "$1" in -i|-install) method=install ;; -u|-update) method=update ;; -r|-remove) method=remove ;; -g|-guest) guest=$2 ; root=$vdirbase/$2 ; shift ;; -R|-root) root=$2 ; shift ;; -t|-template) templates="$templates $2" ; shift ;; -v) verbose=$(( $verbose + 1 )) ;; -vv) verbose=$(( $verbose + 2 )) ;; -vvv) verbose=$(( $verbose + 3 )) ;; -pkgdir) pkgdir=$2 ; shift ;; -admdir) admdir=$2 ; shift ;; -*) usage ; exit ;; *) pkgs="$pkgs $1" ;; esac shift done ############################################################################# # screen logging dbg() { [ $1 -le $verbose ] || return msg info "$@" } msg() { local lvl; local t=$1 ; shift case "$t" in head) echo "=== $*" 1>&2 ;; status) echo "-> $*" 1>&2 ;; warn) echo "!!! $*" 1>&2 ;; error) echo "*** $*" 1>&2 ;; info) lvl=$1; shift ; echo "[$lvl] $*" 1>&2 ;; esac } ############################################################################# # parse templates parse_template() { local line dbg 2 " Parsing template \`$1'" while read line; do if [[ $line = .include* ]]; then parse_template ${line/.include/} else echo $line fi done < <(egrep -v '(#.*|^)$' $templatedir/$1) } dbg 1 "Assembling templates...." pfile=`mktemp` tmpfile=`mktemp` for tmpl in $templates; do parse_template $tmpl >> $tmpfile done echo $pkgs >> $tmpfile sort -u < $tmpfile > $pfile pkgs=" `cat $pfile` " rm -f $tmpfile $pfile dbg 1 "Done." ############################################################################# # parse package.db pkgdb=$pkgdir/packages.db block_end=$'\004' entry_end=$'\027' # _pkgdb_node pkg _pkgdb_node() { zcat $pkgdb | egrep "^$1$" -A 10000 | grep "$block_end" -m 1 -B 10000 } # extract_package_node <package> <dir> extract_pkg_node() { local state=0 local line _pkgdb_node $1 | while read line; do if [ "$line" = "$entry_end" -o "$line" = "$block_end" ]; then state=$(( $state + 1 )) else case "$state" in 1) echo $line >> $2/$1.desc ;; 2) echo $line >> $2/$1.deps ;; 3) echo $line >> $2/$1.md5 ;; esac fi done } ############################################################################# # exclude pattern # pattern <pkg> pattern() { local f pat ( for f in default $*; do [ -f $patterndir/$f ] && egrep -v "(^|#.*)$" $patterndir/$f done ) | while read pat; do case "$installer" in mine) echo -n "-x '$pat' " ;; esac done } ############################################################################# # find the tar file # archive <package> archive() { local ext local ver for ext in tar.bz2; do # FIXME list of extensions!!! if [ -f $pkgdir/$1.$ext ]; then echo $pkgdir/$1.$ext return else ver="`_pkgdb_node $1 | fgrep '[V]'`" ; ver=${ver##* } if [ -f $pkgdir/$1-$ver.$ext ]; then echo $pkgdir/$1-$ver.$ext return fi fi done msg error "Package archive of \`$1' not found." } ############################################################################# # install, update, remove packages msg head "Installing..." case "$method" in install) case "$installer" in mine) [ $verbose -gt 2 ] && v="-v" for p in $pkgs; do pkg=${p/\%*/} msg status " $pkg" dbg 2 mine -i -R $root $( pattern $p ) $( archive $pkg ) eval mine -i $v -R $root $( pattern $p ) $( archive $pkg ) done ;; esac ;; remove) case "$installer" in mine) for p in $pkgs; do pkg=${p/\%*/} echo mine -r -R $vdirbase/$guest $pkg done ;; esac ;; *) echo "Not implemented: $method" esac