OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

252 lines
5.5 KiB

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