#!/bin/ksh - # $Id: install.sxxu,v 1.17 2010/04/23 21:14:22 andrew Exp $ # Copyright (c) 2010 Andrew Fresh # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # based on (and some parts taken from) siteXXtools/install.site # Copyright (c) 2006 Alex Holst BASEDIR=/var/siteXX useradd_args="-m -gid =uid" [ -e /var/siteXX/siteXXrc ] && . /var/siteXX/siteXXrc export PKG_PATH do_pre() { echo 'Running post install from sxxu' } do_post() { echo 'See /var/log/install.log for install messages.' } 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 while read _role; do if [ -n "${_role}" ]; then _line=${_line%%#*} # strip comments test -z "$_line" && continue _roles[${#_roles[@]}]="$_role" fi done < roles for _role in "${_roles[@]}"; do apply_role "$_role" done cd "${_oldpwd}" } append_pkg_path() { [ ! -e pkg_path ] && return echo ' ==> Setting PKG_PATH' local _line while read _line; do _line=${_line%%#*} # strip comments test -z "$_line" && continue if [ -z "${PKG_PATH}" ]; then PKG_PATH="$_line" else PKG_PATH="${PKG_PATH}:${_line}" fi done < pkg_path 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 while read _line; do _line=${_line%%#*} # strip comments test -z "$_line" && continue echo " => ${_cmd} ${_args} ${_line}" eval ${_cmd} ${_args} ${_line} done < "${_f}" 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