#!/bin/ksh - # # $Id: sxxu,v 1.21 2010/04/20 17:25:54 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 siteXXtools/generate # Copyright (c) 2006 Alex Holst OSREV=$(uname -r| sed 's/\.//g') SRCDIR=`pwd` COMMONDIR=common RELEASEDIR=/tmp do_pre() { if [ -z "$WRKDIR" ]; then WRKDIR=`mktemp -d -t sxxu.XXXXXXXXX` || exit 1 fi cd ${SRCDIR} if [ ${#MACHINES[@]} -eq 0 ]; then local _d for _d in *; do [ ! -d "$_d" ] && continue [ -z "${NORECURSE}" -a "${_d#role-}" != "$_d" ] && continue MACHINES[${#MACHINES[@]}]="${_d}" done fi if [ -z "${INSTALL_SITE}" ]; then for INSTALL_SITE in \ "${SRCDIR}/install.siteXX" \ "${SRCDIR}/install.site" \ "${SAMPLE_DIR}/install.siteXX" \ "${SAMPLE_DIR}/install.site" do [ -e "$INSTALL_SITE" ] && break done fi [ -e "${CONFIG_FILE}" ] && echo "Read config from ${CONFIG_FILE}" echo "===> Running ${0##*/} with the following settings:" echo " SRCDIR: ${SRCDIR}" echo " WRKDIR: ${WRKDIR}" echo " OSREV: ${OSREV}" echo '' echo " COMMONDIR: ${COMMONDIR}" echo " RELEASEDIR: ${RELEASEDIR}" [ -e "${INSTALL_SITE}" ] && echo " install.site source: ${INSTALL_SITE}" [ -n "${REGEN_MTREE}" ] && echo " Regenerating mtree files" } do_loop() { local _machine for _machine in "${MACHINES[@]}"; do _machine=`basename -- "${_machine}"` if [ ! -d "${SRCDIR}/${_machine}" ]; then echo ${_machine} does not exist continue fi local _site=site${OSREV} if [ X"${_machine}" != X"${COMMONDIR}" ]; then _site="${_site}-${_machine}" fi echo -n "===> processing: $_site" WRKINST="${WRKDIR}/${_site}" if [ -z "${NORECURSE}" -o ! -e "${WRKINST}" ]; then mkdir -p "${WRKINST}/var/siteXX" echo -n "\n ==> including:" if [ -z "$NORECURSE" ]; then if [ -e "${CONFIG_FILE}" ]; then echo -n ' siteXXrc' cp ${CONFIG_FILE} "$WRKINST/var/siteXX/siteXXrc" fi if [ -e "${INSTALL_SITE}" ]; then echo -n ' install.site' cp ${INSTALL_SITE} "$WRKINST/install.site" fi if [ X"${_machine}" != X"${COMMONDIR}" \ -a -d "${SRCDIR}/${COMMONDIR}" ]; then include $COMMONDIR fi fi include "${_machine}" fi if [ -n "${REGEN_MTREE}" ]; then mkdir -p "${SRCDIR}/${_machine}/siteXX" \ "${WRKINST}/var/siteXX/${_machine}" local _mtree="${SRCDIR}/${_machine}/siteXX/mtree" echo -n "\n ==> regenerate: ${_mtree#${SRCDIR}/}" [ -e "${_mtree}" ] && mv -f "${_mtree}" "${_mtree}.old" mtree -cp "${WRKINST}" -k uid,gid,mode > "$_mtree" fi if [ -z "$NOGZIP" ]; then local _tgz="${RELEASEDIR}/${_site}.tgz" echo -n "\n ==> creating: $_tgz" tar -cz -C "${WRKINST}" -f "$_tgz" . fi echo ' . . . done' done } do_post() { if [ -z "$NOREMOVE" ]; then rm -rf $WRKDIR fi } copy_special() { local _src="$1" local _dst="$2" if [ ! -d "$_src" ]; then echo "$_src does not exist!" return fi cd "$_src" find . \( \ -path './siteXX' \ -o -name 'CVS' \ -o -name '.git' \ -o -name '.svn' \ \) -prune -o -print \ | { local _file while read _file ; do if [ -d "$_file" ]; then mkdir -p "${_dst}/${_file}" else cp "$_file" "${_dst}/${_file}" fi done } cd "${OLDPWD}" } include() { local _src="$1" if [ X"${_src}" == X"" ]; then echo "include " return fi if [ ! -d "${SRCDIR}/${_src}" ]; then return fi local _siteXX_src="${SRCDIR}/${_src}/siteXX" local _siteXX_dst="${WRKINST}/var/siteXX/${_src}" if [ -d "$_siteXX_dst" ]; then echo -n " !!!${_src}!!!" return fi mkdir -p "$_siteXX_dst" if [ -d "$_siteXX_src" ]; then if [ -z "${NORECURSE}" -a -e "${_siteXX_src}/roles" ]; then local _role while read _role; do include "$_role" done < "${_siteXX_src}/roles" fi copy_special "$_siteXX_src" "$_siteXX_dst" fi echo -n " $_src" echo "$_src" > "${WRKINST}/var/siteXX/roles" copy_special "${SRCDIR}/${_src}" "${WRKINST}" if [ -e "${_siteXX_src}/mtree" ]; then echo -n ' (mtree)' mtree -Uep "${WRKINST}" < "${_siteXX_src}/mtree" > /dev/null local _mtree_out=`mktemp` mtree -ep "${WRKINST}" < "${_siteXX_src}/mtree" > $_mtree_out if [ $? -ne 0 ]; then echo "\nMTREE PROBLEMS" cat $_mtree_out fi rm -f $_mtree_out fi } usage() { echo "usage: ${0##*/} [-kmR] [-w WRKDIR] [machine1 [machine2 [...]]]" >&2 } for CONFIG_FILE in "${SRCDIR}/.siteXXrc" ~/.siteXXrc /etc/siteXX.conf; do [ -e "$CONFIG_FILE" ] && . "$CONFIG_FILE" && break done while getopts :kmw:R arg; do case ${arg} in k) NOREMOVE=1 ;; m) REGEN_MTREE=1 NORECURSE=1 NOGZIP=1 ;; R) NORECURSE=1 NOGZIP=1 ;; w) WRKDIR=${OPTARG} ;; *) echo ${0##*/}: unknown option -- ${arg} usage exit 1 ;; esac done shift $(($OPTIND - 1)) set -A MACHINES -- "$@" do_pre do_loop do_post