=================================================================== RCS file: /cvs/openbsd/sxxu/Attic/install.sxxu,v retrieving revision 1.4 retrieving revision 1.16 diff -u -r1.4 -r1.16 --- openbsd/sxxu/Attic/install.sxxu 2010/04/20 18:25:57 1.4 +++ openbsd/sxxu/Attic/install.sxxu 2010/04/23 00:01:30 1.16 @@ -1,5 +1,5 @@ -#!/bin/sh -# $Id: install.sxxu,v 1.4 2010/04/20 17:25:57 andrew Exp $ +#!/bin/ksh - +# $Id: install.sxxu,v 1.16 2010/04/22 23:01:30 andrew Exp $ # Copyright (c) 2010 Andrew Fresh # @@ -18,22 +18,162 @@ # based on (and some parts taken from) siteXXtools/install.site # Copyright (c) 2006 Alex Holst -echo XXX THIS IS NOT IN ANY WAY SHAPE OR FORM COMPLETE XXX -exit +BASEDIR=/var/siteXX +useradd_args="-m -gid =uid" +[ -e /var/siteXX/siteXXrc ] && . /var/siteXX/siteXXrc -user_add_args="-gid =uid" # Could be in .siteXYrc +export PKG_PATH -for _f in /var/siteXX/*/siteXXrc; do - . "$_f" -done +do_pre() { + echo 'Running post install from sxxu' +} -for _f in /var/siteXX/*/*_list; do - local _cmd=`basename "${_f%_list}"` - local _args=`eval echo \\${${_cmd}_args}` - echo Running $_cmd $_args +do_post() { + echo 'See /var/log/install.log for install messages.' +} + +# Strip comments (and leading/trailing whitespace if IFS is set) +# from a file and spew to stdout +stripcom() { + local _file="$1" local _line - while read _line; do - ${_cmd} ${_args} ${_line} - done < $f -done + { + while read _line ; do + _line=${_line%%#*} # strip comments + test -z "$_line" && continue + echo $_line + done + } < $_file +} + + +process_roles() { + local _oldpwd="${PWD}" + + cd "${BASEDIR}" + if [ ! -e roles ]; then + echo 'No roles defined.' + exit + fi + + local _roles + unset _roles + set -A _roles + local _role + stripcom roles | while read _role; do + if [ -n "${_role}" ]; then + _roles[${#_roles[@]}]="$_role" + fi + done + + for _role in "${_roles[@]}"; do + apply_role "$_role" + done + + cd "${_oldpwd}" +} + + +append_pkg_path() { + [ ! -e pkg_path ] && return + + echo ' ==> Setting PKG_PATH' + local _line + stripcom pkg_path | while read _line; do + if [ -z "${PKG_PATH}" ]; then + PKG_PATH="$_line" + else + PKG_PATH="${PKG_PATH}:${_line}" + fi + done + + PKG_PATH=`eval echo $PKG_PATH` +} + +run_command_lists() { + local _f + for _f in *_list; do + [ ! -f "${_f}" ] && continue + + local _cmd=`basename "${_f%_list}"` + local _args=`eval echo \\${${_cmd}_args}` + + echo " ==> Running $_cmd $_args" + local _line + stripcom "${_f}" | while read _line; do + echo " => ${_cmd} ${_args} ${_line}" + eval ${_cmd} ${_args} ${_line} + done + done +} + +apply_patches() { + [ ! -d patches ] && return + + echo ' ==> Applying patches' + local _p + for _p in patches/*; do + [ X"patches/*" == X"${_p}" ] && continue + echo " => $_p" + # -N Always assume a forward patch. + # -t Never prompt; assume the user is expert + # -p0 full path, always + patch -N -t -p0 -d / < "$_p" + done +} + +install_packages() { + [ ! -d packages ] && return + + echo ' ==> Installing packages' + find packages -name '*.tgz' -print0 | xargs -0 pkg_add ${pkg_add_args} +} + +apply_role() { + local _role="$1" + + local _oldpwd="${PWD}" + local _rolepwd="${BASEDIR}/${_role}" + + if [ ! -d "${_rolepwd}" ]; then + echo "===> Missing ${_role}" + return + fi + + echo "===> Applying role ${_role}" + + cd "${_rolepwd}" + if [ -e ./siteXXrc ]; then + echo ' ==> Including siteXXrc' + . ./siteXXrc + fi + + cd "${_rolepwd}" && append_pkg_path + cd "${_rolepwd}" && run_command_lists + cd "${_rolepwd}" && apply_patches + cd "${_rolepwd}" && install_packages + + cd "${_rolepwd}" + if [ -e ./install.site ]; then + if [ -x ./install.site ]; then + echo ' ==> Running install.site' + ./install.site + else + echo ' ==> Including install.site' + . ./install.site + fi + fi + + cd "${_oldpwd}" +} + + +if [ ! -d "${BASEDIR}" ]; then + echo Nothing to do. + exit +fi + +do_pre 2>&1 | /usr/bin/tee /var/log/install.log +process_roles 2>&1 | /usr/bin/tee -a /var/log/install.log | grep '^...>' +do_post 2>&1 | /usr/bin/tee -a /var/log/install.log