|
|
#!/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
|