From b68074d3aceabf60b0022252c03ed0ed0380f05b Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Mon, 22 Jul 2002 14:11:42 +0000 Subject: [PATCH] jcs: Move it here from the proj tree --- scripts/jcs | 1986 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1986 insertions(+) create mode 100644 scripts/jcs diff --git a/scripts/jcs b/scripts/jcs new file mode 100644 index 00000000..32767480 --- /dev/null +++ b/scripts/jcs @@ -0,0 +1,1986 @@ +#!/bin/sh +######################################################################## +# # +# jannet configuration shadow # +# (c) 2000 jannet # +# Authors: Jan Lindemann # +# contact@jannet.de # +# patches, bugfixes and comments are welcome at patch@jannet.de # +# # +# $Id$ +# # +# This program is free software; permission to use, copy, modify, # +# distribute, and sell this software and its documentation under the # +# terms of the GNU Public license as published by the Free Software # +# Foundation, either version 2 or any later version of the license, is # +# hereby granted without fee, provided that (i) the above copyright # +# notices and this permission notice appear in all copies of the # +# software and related documentation, and (ii) the name of jannet may # +# not be used in any advertising or publicity relating to the software # +# without the specific, prior written permission of jannet. # +# # +# This program is distributed in the hope that it will be useful, but # +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- # +# TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # +# Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the Free Software Founda- # +# tion, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # +# # +######################################################################## + + +JCS_CONF_FILES=" + /etc/jcs/jcs.conf + /etc/jcs/jcs.mk + /etc/jcs/templates/dir/module/Makefile + /etc/jcs/templates/dir/src/Makefile +" + +JCS_EXE_INSTALL_DIR=/usr/local/bin + +txtout() { + MARKER=$1 + MARKER="`echo $MARKER | sed -e 's/\//\\\\\//g'`" + DELIM_START="-->>>-- $MARKER --" + DELIM_END="--<<<-- $MARKER --" + cat $SCRIPTNAME | + sed -n "/$DELIM_START/,/$DELIM_END/ p" | + sed -n "1! p" | + sed -n "\$! p" +} + +usage() { + txtout "global usage" + txtout "commands" + txtout "global usage 2" +} + +eusage() { + usage >&2 + test -n "$1" && exit $1 + exit 0 +} + +version() { + txtout "jcs version" | sed -e s/Revision://g | + sed -e s/Date://g | + tr -d '$\047' | + tr -s ' ' +} + +checkroot() { + if [ `whoami` != root ] ; then + echo This function is only available to root. Exiting. >&2 + exit 1 + fi +} + +get_file_attrib() { + + if [ ! -e "$1" ] ; then + echo \"$1\" does not exist. Exiting. >&2 + exit 1 + fi + + case $2 in + mode) + PLACE=1;; + owner) + PLACE=3;; + group) + PLACE=4;; + *) + PLACE=-1;; + esac + + ls -ld $1 | tr -s ' ' ' ' | cut -d' ' -f$PLACE +} + +log() { + echo $* | tee -a $cfg_jcs_log_dir/jcs.log +} + +jcs_wipe() { + checkroot + echo "This will wipe the jcs executables and " + echo "configuration files from this machine." + + echo -n "Are you shure you want to continue (y|n)? " + + while read ANSWER ; do + test $ANSWER != y -a $ANSWER != n && continue; + test $ANSWER = n && return + for FILE in $JCS_CONF_FILES ; do # $SCRIPTNAME + test ! -f $FILE && continue + echo -n " + removing $FILE ... " + rm -rf $FILE + echo done + done + break + done +} + +jcs_init() { + +usage() { + txtout "usage init" +} + + TODO=0 + LOCAL_JCS_DIR="" + + checkroot + set -- `getopt hc: $*` + while [ $1 != -- ] ; do + case $1 in + -c) + LOCAL_JCS_DIR=$2; + test -d "$LOCAL_JCS_DIR" || { + echo "\"$LOCAL_JCS_DIR\" is not a directory. Exiting." >$2 + exit 1 + } + shift;; + -h) + usage; exit 0;; + *) + usage; exit 1;; + esac + shift + done + shift + # --- be downward compatible > + cat /etc/jcs/jcs.conf | cut -d\# -f1 | grep JNT_CONFDIR >/dev/null 2>&1 + if [ $? = 0 ] ; then + txtout "old config warning" + + while echo -n "Are you shure you want to continue (y|n)? "; read ANSWER ; do + test $ANSWER != y -a $ANSWER != n && continue; + test $ANSWER = y && break + echo "Coward!" + exit 1 + done + + get_config + + CFG=/etc/jcs/jcs.conf + echo "Saving old configuration to $CFG.oldstyle and creating new $CFG." + + mv $CFG $CFG.oldstyle + + txtout `basename $CFG` > $CFG + + echo "Changing configuration in $CFG:" + $SCRIPTNAME setval $CFG jcs_dir "$JNT_CONFDIR" + $SCRIPTNAME setval $CFG jcs_owner `get_file_attrib "$JNT_CONFDIR" owner` + $SCRIPTNAME setval $CFG jcs_group `get_file_attrib "$JNT_CONFDIR" group` + $SCRIPTNAME setval $CFG jcs_log_dir "/tmp/jcs/log" + $SCRIPTNAME setval $CFG use_checksum `echo "$JNT_USE_CHECKSUM" | tr -s '[A-Z]' '[a-z]'` + + echo "Moving old /etc/jcs/jcs.mk to /etc/jcs/jcs.mk.oldstyle." + mv /etc/jcs/jcs.mk /etc/jcs/jcs.mk.oldstyle + fi + # --- be downward compatible < + # --- be downward compatible > + if [ -f /etc/jcs/jcs.mk ] ; then + MINOR=`$SCRIPTNAME -V | grep Version | cut -d. -f2 | cut -d" " -f1` + test $MINOR -lt 50 && { + test -f /etc/jcs/jcs.mk.autoinit || cp /etc/jcs/jcs.mk /etc/jcs/jcs.mk.autoinit + rm -f /etc/jcs/jcs.mk + } + fi + # --- be downward compatible < + if [ $SCRIPTNAME -nt $JCS_EXE_INSTALL_DIR/jcs -o \ + ! -e $JCS_EXE_INSTALL_DIR/jcs ] ; then + echo -n " + copying $SCRIPTNAME to $JCS_EXE_INSTALL_DIR ... " + mkdir -p $JCS_EXE_INSTALL_DIR + cp $SCRIPTNAME $JCS_EXE_INSTALL_DIR + chmod 755 $JCS_EXE_INSTALL_DIR/jcs + echo done + else + echo Did not touch $JCS_EXE_INSTALL_DIR/jcs since it does not seem older than $SCRIPTNAME. + fi + for FILE in $JCS_CONF_FILES ; do + if [ ! -f $FILE ] ; then + echo -n "creating $FILE " + mkdir -p `dirname $FILE` + if [ -n "$LOCAL_JCS_DIR" ] ; then + LOCAL_FILE=$LOCAL_JCS_DIR"`echo $FILE | sed -e s/\\\/etc\\\/jcs//`" + if [ -f $LOCAL_FILE ] ; then + echo -n "from local ... " + cp $LOCAL_FILE `dirname $FILE` + fi + fi + if [ ! -f $FILE ] ; then + echo -n "from default ... " + txtout "`basename $FILE`" > $FILE + test -s $FILE || txtout $FILE > $FILE + fi + echo done. + TODO=1 + elif [ $FILE -ot "$SCRIPTNAME" ] ; then + echo $FILE is older than $SCRIPTNAME\! + TODO=1 + else + echo Did not touch $FILE since it seems newer than $SCRIPTNAME. + fi + done + if [ "$TODO" = 1 ] ; then + echo You might want to revise the newly created or out-of-date files. + fi +} + +get_config() { + + if [ ! -f /etc/jcs/jcs.conf ] ; then + echo /etc/jcs/jcs.conf not found. >&2 + echo Have you installed it or run "jcs init" yet? >&2 + echo Exiting now. >&2 + exit 1 + fi + + . /etc/jcs/jcs.conf + + VARS="`cat /etc/jcs/jcs.conf | + cut -d# -f1 | + grep = | + cut -d= -f1`" + for VAR in $VARS ; do + eval cfg_$VAR=\$$VAR + export cfg_$VAR + done +} + +# ==================== get.sh +jcs_get() { +usage() { + txtout "usage get" +} + +set -- `getopt ht: $*` +while [ ! "$1" = "--" ] ; do + case $1 in + -t) TEST=1 ; shift;; + -h|*) usage; exit 0;; + esac +done +shift + +for FILE in $* ; do + if [ ! -r $FILE ] ; then + echo $FILE does not exist or not ready for reading. Exiting. + test -z "$TEST" && exit 1 + fi + if [ -z "$TEST" ] ; then + cp $FILE . + MODE="`ls -l $FILE | tr -s ' ' ' ' | cut -d' ' -f1`" + OWNER="`ls -l $FILE | tr -s ' ' ' ' | cut -d' ' -f3`" + GROUP="`ls -l $FILE | tr -s ' ' ' ' | cut -d' ' -f4`" + echo $MODE $OWNER $GROUP > `basename $FILE`.prp + fi +done +} + +# ==================== install.sh +jcs_install() { + +LAST_LINE_MARKER="# THIS IS THE LAST LINE - readinf.sh stops here!" +TMP_INF_FILE=/tmp/readinf.tmp +TMP_SEC_FILE=/tmp/section.tmp +TMP_LIBS_FILE=/tmp/libs.tmp +DEFAULT_SEC_FILE=`dirname $0`/default_sec.inf + +errorout() { + echo $@ >&2 + exit 1 +} + +exec_scripts() { + test -e $DEFAULT_SEC_FILE && . $DEFAULT_SEC_FILE + . $TMP_SEC_FILE.$1 + test -n "$BCKPDIR" && BACKUP_DIR=$BCKPDIR +} + +usage() { + txtout "usage install" +} + +# ================================================ +# ============================ here we go! +# ================================================ + +set -- `getopt b:htf $*` +while [ ! "$1" = "--" ] ; do + case $1 in + -b) + BCKPDIR=$2 + shift 2;; + -f) + FORCE=1 + shift;; + -t) + TEST=1 + shift;; + -h) + usage; exit 0;; + *) + usage; exit 1;; + esac +done +shift + +INFFILE=$1 + +if [ ! "$INFFILE" ] ; then + usage +fi + +if [ ! `whoami` = root ] ; then + errorout "$0 can only be executed by root!" +fi + +WORKDIR="`pwd`" +if [ ! $# = 1 ] ; then + for FILE in $@ ; do + if [ ! `basename $FILE` = `basename $DEFAULT_SEC_FILE` ] ; then + cd `dirname $FILE` + jcs install `basename $FILE` || exit $? + cd $WORKDIR + fi + done +fi +echo '====' processing file $1. + +# ------------ determine relative and absolute paths +REL_INF_DIR=`dirname $INFFILE` +cd $REL_INF_DIR +INF_DIR="`pwd`" +# cd $WORKDIR +INFFILE="`basename $INFFILE`" + +# ------------ delete comments +cat $INFFILE | cut -d\# -f1 > $TMP_INF_FILE #delete comments +# ------------ set end mark +echo "$LAST_LINE_MARKER" >> $TMP_INF_FILE +# ------------ get section names +SECTIONS="`cat $TMP_INF_FILE | grep '\[' | cut -d\[ -f2 | cut -d\] -f1`" +FIRST_SECTION="`echo $SECTIONS | cut -d' ' -f1`" +# ------------ cut the 1st off +if [ "`echo $SECTIONS | wc -w`" -le 1 ] ; then + SECTIONS="" +else + SECTIONS="`echo $SECTIONS | cut -d' ' -f2-`" +fi + +# ------------ first loop over all the sections (check the installation) +SECTION=$FIRST_SECTION +for NEXT_SECTION in $SECTIONS "$LAST_LINE_MARKER"; do + + TODO=0 + + # ------------ produce and execute shell script +# COMMAND=x\\x"$SECTION"x,\\x"$NEXT_SECTION"x" "p + COMMAND=/\\\[$SECTION\\\]/,/\\\[$NEXT_SECTION\\\]/" "p +# echo \"$COMMAND\" + cat $TMP_INF_FILE | sed -n "$COMMAND" | grep -v "\[" | grep -v "$LAST_LINE_MARKER" > $TMP_SEC_FILE.$SECTION + exec_scripts $SECTION + + # ------------ check installation variables + if [ ! -d "$SOURCE_DIR" ] ; then + errorout "The source directory \"$SOURCE_DIR\" doesn't exist!"; exit 1 + fi + if [ "$BACKUP_DIR" ] ; then + # if [ ! -d $BACKUP_DIR ] ; then + # errorout "The backup directory \"$BACKUP_DIR\" doesn't exist!"; exit 1 + # fi + if [ ! "$BACKUP_OWNER" ] ; then + BACKUP_OWNER=$cfg_jcs_owner + fi + if [ ! "$BACKUP_GROUP" ] ; then + BACKUP_GROUP=$cfg_jcs_group + fi + fi + if [ ! -d "$TARGET_DIR" ] ; then + if [ -z "$TARGET_DIR_MODE" ] ; then + echo "Don't know how to create target directory \"$TARGET_DIR\". TARGET_DIR_MODE not specified." + exit 1 + fi + if [ -z "$TARGET_DIR_OWNER" ] ; then + echo "Don't know how to create target directory \"$TARGET_DIR\". TARGET_DIR_OWNER not specified." + exit 1 + fi + fi + # if [ "$LIB_DIR" ] ; then + #if [ ! -d "$LIB_DIR" ] ; then + # errorout "The library directory \"$LIB_DIR\" doesn't exist!" ; exit 1 + #fi + # fi + + rm $TMP_LIBS_FILE.$SECTION 2>/dev/null + + for FILE in $FILES ; do + TARGETFILE="`echo $FILE | awk 'BEGIN {FS="->"}{print $2}'`" + if [ -n "$TARGETFILE" ] ; then + SOURCEFILE="`echo $FILE | awk 'BEGIN {FS="->"}{print $1}'`" + else + TARGETFILE=$FILE + SOURCEFILE=$FILE + fi + # echo TARGETFILE=$TARGETFILE,SOURCEFILE=$SOURCEFILE + if [ ! -e $SOURCE_DIR/$SOURCEFILE ] ; then + echo "The file $SOURCE_DIR/$SOURCEFILE doesn't exist!"; exit 1 + exit 1 + fi + if [ $SOURCE_DIR/$SOURCEFILE -nt $TARGET_DIR/$TARGETFILE -o ! -e $TARGET_DIR/$TARGETFILE -o -n "$FORCE" ] ; then + TODO=1 + fi + + if [ -n "$LIB_DIR" ] ; then + LIBS="`ldd $SOURCE_DIR/$SOURCEFILE 2>/dev/null | grep -v 'not a dynamic executable' | awk '{print $3}' | grep -v $SOURCEFILE `" + # the "dynamic exe" - stuff is a feature-workaround for linux ldd: doesn't output all error mess. to stderr + for LIB_LONG in $LIBS ; do + if [ ! -e $LIB_LONG ] ; then + echo $SOURCEFILE - $LIBS + echo "The library file $LIB_LONG doesn't exist!"; exit 1 + fi + + LIB_SHORT=`echo $LIB_LONG | rev | cut -d/ -f1 | rev` + if [ $LIB_LONG -nt $LIB_DIR/$LIB_SHORT -o -n "$FORCE" ] ; then + TODO=1 + echo $LIB_LONG >> $TMP_LIBS_FILE.$SECTION + fi + done + fi + done + + # ------------ end check installation + + if [ $TODO = 0 ] ; then + rm $TMP_SEC_FILE.$SECTION 2>/dev/null + rm $TMP_LIBS_FILE.$SECTION 2>/dev/null + fi + + SECTION="$NEXT_SECTION" +done + +# ------------ second loop over all the sections (installation) +SECTION=$FIRST_SECTION +for NEXT_SECTION in $SECTIONS "$LAST_LINE_MARKER"; do + + if [ ! -e $TMP_SEC_FILE.$SECTION ] ; then + + echo "---- Section [$SECTION] -- nothing to do! ----" + + else + + # ------------ execute shell scripts + exec_scripts $SECTION + + echo "---- Section [$SECTION] -- installing $INSTALLATION_SUBJECT ----" + echo " ($SOURCE_DIR -> $TARGET_DIR)" + + # ------------ create target directory if not yet existing + if [ ! -d "$TARGET_DIR" ] ; then + cd / + DIR="`echo $TARGET_DIR | rev`" + while [ ! $DIR = "." -a ! $DIR = "/" ] ; do + CUR_DIR="`basename $DIR | rev`" + if [ ! -d "$CUR_DIR" ] ; then + if [ -z "$TEST" ] ; then + mkdir -m $TARGET_DIR_MODE $CUR_DIR + chown $TARGET_DIR_OWNER.$TARGET_DIR_GROUP $CUR_DIR 2>/dev/null + echo created the subdirectory \"$CUR_DIR\" + else + echo would create the subdirectory \"$CUR_DIR\" + fi + fi + cd $CUR_DIR + DIR=`dirname $DIR` + done + cd $INF_DIR + if [ -n "$TEST" ] ; then + echo created the target directory \"$TARGET_DIR\" + else + echo would have created the target directory \"$TARGET_DIR\" + fi + fi + + # ------------ copy the files + for FILE in $FILES ; do + TARGETFILE="`echo $FILE | awk 'BEGIN {FS="->"}{print $2}'`" + if [ -n "$TARGETFILE" ] ; then + SOURCEFILE="`echo $FILE | awk 'BEGIN {FS="->"}{print $1}'`" + else + TARGETFILE=$FILE + SOURCEFILE=$FILE + fi + if [ $SOURCE_DIR/$SOURCEFILE -nt $TARGET_DIR/$TARGETFILE -o ! -e $TARGET_DIR/$TARGETFILE -o -n "$FORCE" ] ; then + if [ $BACKUP_DIR ] ; then + if [ ! -d $BACKUP_DIR ] ; then + test -z "$TEST" && mkdir -p $BACKUP_DIR + chown $BACKUP_OWNER.$BACKUP_GROUP $BACKUP_DIR 2>/dev/null + fi + if [ -e $TARGET_DIR/$TARGETFILE ] ; then + if [ -z $TEST ] ; then + echo " + saving old file $TARGETFILE to $BACKUP_DIR/$SOURCEFILE" + mv -f $TARGET_DIR/$TARGETFILE $BACKUP_DIR/$SOURCEFILE + chown $BACKUP_OWNER.$BACKUP_GROUP $BACKUP_DIR/$SOURCEFILE 2>/dev/null + chmod $BACKUP_MODE $BACKUP_DIR/$SOURCEFILE 2>/dev/null + gzip -f $BACKUP_DIR/$SOURCEFILE + else + echo " + would save old file $TARGETFILE to $BACKUP_DIR/$SOURCEFILE" + fi + fi + fi + if [ -z "$TEST" ] ; then + echo " + copying file $SOURCEFILE to $TARGET_DIR/$TARGETFILE" + test -L $TARGET_DIR/$TARGETFILE && rm -f $TARGET_DIR/$TARGETFILE # better kill links + cp -f $SOURCE_DIR/$SOURCEFILE $TARGET_DIR/$TARGETFILE + mkdir -p $cfg_jcs_log_dir + echo $TARGET_DIR/$TARGETFILE >> $cfg_jcs_log_dir/changed_files.log + chown $TARGET_OWNER.$TARGET_GROUP $TARGET_DIR/$TARGETFILE + chmod $TARGET_MODE $TARGET_DIR/$TARGETFILE + else + echo " + would copy file $SOURCEFILE to $TARGET_DIR/$TARGETFILE" + fi + fi + + if [ -s "$TMP_LIBS_FILE.$SECTION" ] ; then + if [ "$LIB_DIR" ] ; then + if [ ! -d "$LIB_DIR" ] ; then + if [ -z "$TEST" ] ; then + mkdir -p -m $LIB_DIR_MODE $LIB_DIR + echo "created the lib directory \"$LIB_DIR\"" + else + echo "would create the lib directory \"$LIB_DIR\"" + fi + fi + fi + sort -u "$TMP_LIBS_FILE.$SECTION" | + while read -r LIB_LONG ; do + LIB_SHORT=`echo $LIB_LONG | rev | cut -d/ -f1 | rev` + if [ -z "$TEST" ] ; then + echo " - copying library $LIB_LONG to $LIB_DIR" + cp -f $LIB_LONG $LIB_DIR + chown $LIB_OWNER.$LIB_GROUP $LIB_DIR/$LIB_SHORT + chmod $LIB_MODE $LIB_DIR/$LIB_SHORT + else + echo " - would copy library $LIB_LONG to $LIB_DIR" + fi + done + rm $TMP_LIBS_FILE.$SECTION + fi + done + rm $TMP_SEC_FILE.$SECTION + fi + SECTION="$NEXT_SECTION" + +done +echo "---- Installation completed. ----" + +#TODO +rm -f $TMP_SEC_FILE. $TMP_INF_FILE 2>/dev/null +} # end function jcs_install + +# ==================== install_source.sh +jcs_sinstall() { +INSTALLDIR=$cfg_jcs_dir/src +OWNER=$cfg_jcs_owner +GROUP=$cfg_jcs_group + +usage() { + txtout "usage sinstall" # TODO: never used +} + +MYNAME=`basename $0` +ARCHIVE=$1 + +if [ ! -f "$ARCHIVE" ] ; then + echo \"$ARCHIVE\" is not a regular file. Exiting. + exit 1 +fi + +WD=`pwd` +PKGDIRNAME=`basename $WD` +echo creating $INSTALLDIR/$PKGDIRNAME +mkdir -p $INSTALLDIR/$PKGDIRNAME +tar -zxf $ARCHIVE -C$INSTALLDIR/$PKGDIRNAME \ + --owner=$OWNER --group=$GROUP +cd $INSTALLDIR/$PKGDIRNAME +rm -f cur +ln -s `find . -maxdepth 1 -cmin -2 | grep -v Makefile | sed -e 's/\.\/\|\.$//g'` cur +# test -e Makefile || cp ../Makefile.template Makefile +#$JNT_JCSDIR/bin/prepare_directory.sh -t src . +jcs_newdir -t src . +make setup +chown -R $OWNER $INSTALLDIR +chgrp -R $GROUP $INSTALLDIR +} # end function jcs_sinstall + +# ==================== make_srcpkg.sh +jcs_smake() { +#set -e + +WD="`pwd`" +TARGET=$1 +shift +SUBDIRS="$*" +test -z "$CONFIGURE" && CONFIGURE=configure + +usage() { + txtout "usage smake" +} + +case $TARGET in + setup) + for DIR in $SUBDIRS ; do + set -e + cd $DIR + echo changing to directory $DIR + ./$CONFIGURE || { + echo "$CONFIGURE does not exist. Exiting." >&2 + exit 1 + } + if [ -f Makefile ] ; then make clean; fi + make + make install + echo changing to directory $WD + cd $WD + set +e + done + ;; + install) + for DIR in $SUBDIRS ; do + make -C $DIR + make -C $DIR install + done + ;; + clean) + for DIR in $SUBDIRS ; do + make -C$DIR clean + done + ;; + *) + usage + ;; +esac +} # end function jcs_make_srcpkg + +# ==================== prepare_directory.sh +jcs_newdir() { +# ------------- constants +TEMPLATE_BASEDIR=/etc/jcs/templates/dir +MYNAME=`basename $0` + +# ------------- default values +TEMPLATE=module + +# ------------- functions +usage() { + txtout "usage newdir" +} + +# ------------- here we go +set -- `getopt t:h $*` +while [ ! "$1" = "--" ] ; do +case "$1" in + -h) + usage; exit 0;; + -t) + TEMPLATE="$2"; shift 2;; + *) + echo Unknown option $1. Exiting. >&2 + exit 1 +esac +done +shift # get past -- + +if [ -z "$1" ] ; then + usage + exit 1 +fi + +TEMPLATE_DIR=$TEMPLATE_BASEDIR/$TEMPLATE +if [ ! -d "$TEMPLATE_DIR" ] ; then + echo \"$TEMPLATE_DIR\" is not a directory. Exiting. >&2 + exit 1 +fi + +TARGETDIR="$1" + +if [ ! -d "$TARGETDIR" ] ; then + echo + creating directory \"$TARGETDIR\" + mkdir -p "$TARGETDIR" + if [ ! -d "$TARGETDIR" ] ; then + echo could not create directory \"$TARGETDIR\". Exiting >&2 + exit 1 + else + OWNR="`ls -ld "$TEMPLATE_BASEDIR" | tr -s ' ' | cut -d' ' -f3`" + GRUP="`ls -ld "$TEMPLATE_BASEDIR" | tr -s ' ' | cut -d' ' -f4`" + chown $OWNR $TARGETDIR + chgrp $GRUP $TARGETDIR + fi +fi + +for FILE in `ls -d $TEMPLATE_DIR/* | grep -v CVS` ; do + + if [ ! -e $TARGETDIR/`basename $FILE` ] + then echo + copying $FILE to $TARGETDIR + cp $FILE $TARGETDIR + fi + +done +} # end function jcs_newdir + +# ==================== config_add.sh +jcs_add() { + +# ------------- constants +MYNAME=`basename $0` +WD="`/bin/pwd`" + +# ------------- default values +MODE=GET_CONFIG + +# ------------- functions +usage() { + txtout "usage add" +} +#' reset vi fontification ... :-> + +eusage() { + usage + exit 1 +} + +ssh_wrapper() { + + ssh -n $TARGET_HOST "$@" + if [ $? != 0 ] ; then + echo "The secure shell connection could not be established. Exiting." >&2 + exit 1 + fi +} + +cp_wrapper() { + if [ "$1" = localhost ] ; then + if [ "" ] ; then + su - "$4" -c "cp -p $2 $3" + else + cp -p $2 $3 + fi + else + scp $1:$2 $3 + fi + +} +# ------------- get options +set -- `getopt b:hvl $*` +if [ "$?" != 0 ] ; then + eusage 1 +fi +while [ ! "$1" = "--" ] ; do +case "$1" in + -b) + CONFIG_BASEDIR="$2" + shift 2;; + -h) + usage; exit 0;; + -v) + VERBOSE=1 + shift;; + -l) + MOVE_AND_LINK=1 + shift 1;; + *) + echo Unknown option $1. Exiting. >&2 + exit 1 +esac +done +shift # get past -- + +# ---------- check for being root +if [ "`whoami`" != root ] ; then + echo This program has to be executed by root. Exiting. >&2 + exit 1 +fi + +# ---------- rename input +test $# -ne 2 && eusage + +FILE_LOCATION="$1" +MODULE="$2" +echo $FILE_LOCATION | grep ":" >/dev/null 2>&1 +if [ $? = 0 ] ; then + FILENAME="`echo $1 | cut -d: -f2`" + TARGET_HOST="`echo $1 | cut -d: -f1`" +else + FILENAME="$1" + TARGET_HOST=localhost + test `echo $FILENAME | cut -c1` != / && FILENAME=$WD/$FILENAME +fi + +# ---------- check input + +if [ -z "$CONFIG_BASEDIR" ] ; then + if [ "$TARGET_HOST" != localhost ] ; then + echo jcs_confdir has to be specified with remote files. Exiting. >&2 + exit 1 + fi + if [ -z "$cfg_jcs_dir" ] ; then + echo cfg_jcs_dir is not set and jcs_confdir has not been specified. Exiting. >&2 + exit 1 + fi + CONFIG_BASEDIR="$cfg_jcs_dir" +fi +if [ "$TARGET_HOST" != localhost ] ; then + ssh_wrapper "echo The ssh connection can be established. >/dev/null" +fi +if [ "`echo $CONFIG_BASEDIR | cut -c 1`" != / ] ; then + usage + echo CONFIG_BASEDIR has to be an absolute path name. Exiting. >&2 + exit 1 +fi +if [ "`echo $FILENAME | cut -c 1`" != / ] ; then + usage + echo \"filename\" has to be an absolute path name. Exiting. >&2 + exit 1 +fi + +# ---------- here we go +CONFDIR=$CONFIG_BASEDIR/$MODULE +FILEBASE=`basename $FILENAME` +#cd `dirname $FILEBASE` +#SOURCEDIR=`pwd` +SOURCEDIR="`dirname $FILENAME`" + +mkdir -p $CONFIG_BASEDIR + +if [ -e "$CONFDIR" -a ! -d "$CONFDIR" ] ; then + echo \"$CONFDIR\" exists, but is not a directory. Exiting. + exit 1 +fi + +TARGETDIR=`dirname $FILENAME` +#if [ ! -d $TARGETDIR ] ; then +# echo $TARGETDIR is not a directory. Exiting. +# exit 1 +#fi + + +LINKFILEENTRY="link $FILEBASE $SOURCEDIR" +if test -r "$CONFDIR/new_link.sh" -a -n "`grep \"$LINKFILEENTRY\" $CONFDIR/new_link.sh 2>/dev/null`"; then + echo Entry \"$LINKFILEENTRY\" already exists in $CONFDIR/new_link.sh. Exiting. + exit 1 +fi + +#$JNT_LOCAL_SBINDIR/prepare_directory.sh $CONFDIR -t module || exit 1 +jcs_newdir $CONFDIR -t module || exit 1 +if [ -e $CONFDIR/$FILEBASE ] ; then + echo $CONFDIR/$FILEBASE exists! Exiting. + exit 1 +fi + +# ------------------------ makeinf part > +if [ "$TARGET_HOST" = localhost ] ; then + LSML="`ls -l $FILENAME`" +else + LSML="`ssh_wrapper ls -l $FILENAME`" +fi +cd $CONFDIR +rm *.sec *.fil 2>/dev/null + +UMOD="`echo $LSML | cut -d' ' -f1 | cut -c2-4 | sed -e s/-//g;`" +GMOD="`echo $LSML | cut -d' ' -f1 | cut -c5-7 | sed -e s/-//g;`" +OMOD="`echo $LSML | cut -d' ' -f1 | cut -c8-10| sed -e s/-//g;`" +MOD="u=$UMOD,g=$GMOD,o=$OMOD" +test -n "$DEF_NO_TARGET_WRITE_PERM" && \ + MOD="`echo $MOD | sed -e s/w//g;`" + +OWNR="`echo $LSML | tr -s ' ' | cut -d' ' -f3`" +GRUP="`echo $LSML | tr -s ' ' | cut -d' ' -f4`" + +# echo d=$TDIR f=$FILEBASE o=$OWNR g=$GRUP um=$UMOD gm=$GMOD om=$OMOD +# ------------------------ makeinf part < +if [ "$MOVE_AND_LINK" = 1 ] ; then + mv $FILEBASE $CONFDIR + echo + linking $CONFDIR/$FILEBASE -\> $SOURCEDIR/$FILEBASE + cd $WD + cd `dirname $FILENAME` + ln -sf $CONFDIR/$FILEBASE + if [ $? -gt 0 ] ; then + echo mv failed! Exiting + exit 1 + fi +else + cp_wrapper $TARGET_HOST $FILENAME $CONFDIR $cfg_jcs_owner +fi + +echo "$LINKFILEENTRY # properties: $OWNR $GRUP $MOD" >> $CONFDIR/new_link.sh + +OWNR=$cfg_jcs_owner +GRUP=$cfg_jcs_group +chown -R $OWNR $CONFDIR +chgrp -R $GRUP $CONFDIR +chmod -R ug+rw $CONFDIR + +} # end function jcs_add + +# ==================== config_snapshot.sh +jcs_snapshot() { +# #/bin/bash + +# ------------- constants +MYNAME=`basename $0` +WD="`/bin/pwd`" + +# ------------- default values +MODE=GET_CONFIG + +# ------------- functions +usage() { + txtout "usage snapshot" +} +#' reset vi fontification ... :-> + +eusage() { + usage + exit 1 +} + +dump_conf_template() { +cat << EOF +# +# this is a sample configuration file for $MYNAME +# + +[options] +HOSTNAME=$HOSTNAME +CONFIG_BASEDIR=$JNT_HOMEDIR/conf/$HOSTNAME.$DOMAINNAME/$OSVERSION + +#[named] +#/etc/named.conf +#/var/named +#exclude slave +#exclude root.hint +EOF +} + +get_conf_sec() { + SECTION="$1" + cat "$2" | + cut -d\# -f1 | + tr -s '\n' '\n' | + sed -n "/\[$SECTION\]/,/\[/ p" | + grep -v '\[' +} + +ssh_wrapper() { + + ssh -n $HOSTNAME "$@" + if [ $? != 0 ] ; then + echo "The secure shell connection could not be established. Exiting." >&2 + exit 1 + fi +} +# ------------- get options +set -- `getopt dhvt: $*` +if [ "$?" != 0 ] ; then + eusage +fi +while [ ! "$1" = "--" ] ; do +case "$1" in + -h) + usage; exit 0;; + -d) + VERBOSE=1 + DEBUG=1 + shift;; + -v) + VERBOSE=1 + shift;; + -t) + HOSTNAME="$2" + MODE=DUMP_TEMPLATE + shift 2;; + *) + echo Unknown option $1. Exiting. >&2 + exit 1 +esac +done +shift # get past -- + +# ---------- check for being root +if [ "`whoami`" != root ] ; then + echo This program has to be executed by root. Exiting. >&2 + exit 1 +fi + +# ---------- handle dump template mode +if [ "$MODE" = DUMP_TEMPLATE ] ; then + + ssh_wrapper "echo The ssh connection can be established. >/dev/null" + HOSTNAME="`ssh_wrapper 'hostname' | cut -d. -f1`" + DOMAINNAME="`ssh_wrapper 'dnsdomainname'`" + OSVERSION="`ssh_wrapper 'uname -s'`-`ssh_wrapper 'uname -r'`" + OSVERSION="`echo $OSVERSION | tr -t '[A-Z]' '[a-z]'`" + dump_conf_template + exit 0 +fi + +# ---------- read config file +if [ ! -r "$1" ] ; then + echo \"$1\" is not a readable configuration file. Exiting >&2 + exit 1 +fi + +CONFFILE="$1" +eval "`get_conf_sec options $CONFFILE`" + +# ---------- check configuration +ssh_wrapper "echo The ssh connection can be established. >/dev/null" +if [ `echo $CONFIG_BASEDIR | cut -c1` != / ] ; then + echo CONFIG_BASEDIR has to be an absolute path name. Exiting. >&2 + exit 1 +fi + +# ---------- here we go +cd "`dirname $CONFFILE`" +CONFFILE="`/bin/pwd`/$CONFFILE" +mkdir -p $CONFIG_BASEDIR +cd $CONFIG_BASEDIR + +MODULES="`cat $CONFFILE | + cut -d\# -f1 | + grep '\[' | + cut -d\[ -f2 | + cut -d\] -f1 | + grep -v options`" + +[ "$DEBUG" ] && echo The modules are \>$MODULES\< + +# ----- main loop +for MOD in $MODULES ; do + + [ "$DEBUG" ] && echo processing module \"$MOD\": + # [ "$DEBUG" ] && get_conf_sec $MOD $CONFFILE + + TDIR=$CONFIG_BASEDIR/$MOD + mkdir -p $TDIR + + EXCLUDE="`get_conf_sec $MOD $CONFFILE | + grep exclude | + cut -d' ' -f2 | + tr -s ' '`" + EXCLUDE="`echo $EXCLUDE | sed -e 's/ /\\\|/g'`" + test -z "$EXCLUDE" && EXCLUDE='*' + + get_conf_sec $MOD $CONFFILE | + while read LINE ; do + if [ -z "`echo $LINE | grep exclude`" ] ; then + PATHNAME=`echo $LINE | cut -d' ' -f1` + for FILE in `ssh_wrapper "find $PATHNAME -type f" | grep -ve "$EXCLUDE"` ; do + [ "$VERBOSE" ] && echo processing $FILE ... + # scp $HOSTNAME:$FILE $TDIR +# $JNT_JCSDIR/bin/config_add.sh $HOSTNAME:$FILE $MOD -b $CONFIG_BASEDIR + config_add $HOSTNAME:$FILE $MOD -b $CONFIG_BASEDIR + done + else + [ "$DEBUG" ] && echo found exclude statement $LINE + fi + done +done + +# ---------- save the snapshot definition file +SNAPLINKNAME=last-snapshot +mkdir -p $CONFIG_BASEDIR/snapshot +rm -f $CONFIG_BASEDIR/snapshot/$SNAPLINKNAME +NEW_SNAPSHOT=`basename $CONFFILE`-`date +'%Y%m%d-%H%M%S'` +cp -p $CONFFILE $CONFIG_BASEDIR/snapshot/$NEW_SNAPSHOT +cd $CONFIG_BASEDIR/snapshot +ln -s $NEW_SNAPSHOT $SNAPLINKNAME +} # end function snapshot + +# ==================== makeinf.sh +jcs_makeinf() { + +DEF_NO_TARGET_WRITE_PERM=1 +DEF_BACKUP_GROUP=$cfg_jcs_group +DEF_BACKUP_MODE=660 +DEF_LOCAL_GROUP=$cfg_jcs_group +DEF_LOCAL_OWNER=$cfg_jcs_owner + +if [ "$1" ] ; then + if [ ! -d "$1" ] ; then + echo \"$1\" is not a directory. Exiting. >&2 + exit 1 + fi + CONFIG_BASEDIR="$1" +elif [ ! -d "$cfg_jcs_dir" ] ; then + echo \"cfg_jcs_dir\" not set to a valid directory. Exiting. + exit 1 +else + CONFIG_BASEDIR=$cfg_jcs_dir +fi + +cd $CONFIG_BASEDIR + + +LINKFILES="`find . -name new_link.sh`" +test -z "$LINKFILES" && exit 0 +echo creating .inf-files... +for LINKFILE in $LINKFILES ; do + DIR="`dirname $LINKFILE`" + cd $DIR + rm *.sec *.fil 2>/dev/null + echo +++ in $DIR... + cat new_link.sh | + while read -r LINE ; do + + TDIR="`echo $LINE | cut -d' ' -f3`" + FILE="`echo $LINE | cut -d' ' -f2`" + + if [ -n "`echo $LINE | grep properties:`" ] ; then + + PROPS="`echo $LINE | awk 'BEGIN {FS="properties:"} {print $2}'`" + OWNR="`echo $PROPS | tr -s ' ' | cut -d' ' -f1`" + GRUP="`echo $PROPS | tr -s ' ' | cut -d' ' -f2`" + MOD="`echo $PROPS | tr -s ' ' | cut -d' ' -f3`" + + else + + OWNR="`ls -l $FILE | tr -s ' ' | cut -d' ' -f3`" + GRUP="`ls -l $FILE | tr -s ' ' | cut -d' ' -f3`" + UMOD="`ls -l $FILE | cut -d' ' -f1 | cut -c2-4 | sed -e s/-//g;`" + GMOD="`ls -l $FILE | cut -d' ' -f1 | cut -c5-7 | sed -e s/-//g;`" + OMOD="`ls -l $FILE | cut -d' ' -f1 | cut -c8-10| sed -e s/-//g;`" + MOD="u=$UMOD,g=$GMOD,o=$OMOD" + + fi + + + test -n "$DEF_NO_TARGET_WRITE_PERM" && \ + MOD="`echo $MOD | sed -e s/w//g;`" + + + SUBJ="`echo $TDIR | sed -e 's/\//_/g;'`" + echo $SUBJ + echo -n "$FILE " >> $SUBJ.fil + + echo \[$SUBJ\] > $SUBJ.sec + echo INSTALLATION_SUBJECT=\"$SUBJ\" >> $SUBJ.sec + echo SOURCE_DIR=\$INF_DIR >> $SUBJ.sec + echo TARGET_DIR=$TDIR >> $SUBJ.sec + echo TARGET_OWNER=$OWNR >> $SUBJ.sec + echo TARGET_GROUP=$GRUP >> $SUBJ.sec + echo TARGET_MODE=$MOD >> $SUBJ.sec + echo BACKUP_GROUP=$DEF_BACKUP_GROUP >> $SUBJ.sec + echo BACKUP_MODE=$DEF_BACKUP_MODE >> $SUBJ.sec + echo BACKUP_DIR=\$INF_DIR/trash >> $SUBJ.sec + + echo $TDIR/$FILE >> old_links.txt + + chown $DEF_LOCAL_OWNER $FILE + chgrp $DEF_LOCAL_GROUP $FILE + + # echo d=$TDIR f=$FILE o=$OWNR g=$GRUP um=$UMOD gm=$GMOD om=$OMOD + + done + + for SUBJ_SEC in `ls *.sec` ; do + + INF=new_`basename $DIR`.inf + SUBJ="`echo $SUBJ_SEC | rev | cut -d. -f2- | rev`" + FILES="`cat $SUBJ.fil`" + cat $SUBJ_SEC >> $INF + echo FILES=\"$FILES\" >> $INF + echo >> $INF + done + + rm *.sec *.fil 2>/dev/null + rm new_link.sh + + echo The following links are obsolete now: + cat old_links.txt | awk '{print " + " $0}' + echo -n 'Do you want them removed (yes|no)? ' + while read -r ANSW && test ! "$ANSW" = yes -a ! "$ANSW" = no ; do + echo -n "" + done + if [ "$ANSW" = yes ] ; then + + for FILE in `cat old_links.txt` ; do + if [ -L $FILE ] ; then + echo + removing $FILE + rm $FILE + else + echo + $FILE is not a link. Did not remove it. >&2 + fi + done + echo It is recommended that you check $INF. + + echo -n "Do you want \"make install\" to be issued " + echo -n "now to reinstall the files? " + + while read -r ANSW && test ! "$ANSW" = yes -a ! "$ANSW" = no ; do + echo -n "" + done + test "$ANSW" = yes && make install + + else + echo It is recommended that you do this yourself. + fi + + cd $CONFIG_BASEDIR + +done +} # end function makeinf + +# ==================== setval.sh +jcs_setval() { + +usage() { + txtout "usage setval" +} + +if [ $# != 3 ] ; then + usage + exit 0 +fi +if [ ! -e $1 ] ; then + echo $1 not found. Exiting. + exit 1 +fi +if [ ! -w $1 ] ; then + echo $1 is not a writable file. Exiting. + exit 1 +fi + +echo -n " + $1: set $2 to $3 ... " + + +MYNAME=`basename $0` +WD=`/bin/pwd` +DATE=`date` +test -e $1.$MYNAME && rm $1.$MYNAME +grep $2 $1 >/dev/null 2>&1 || cat << EOF >> $1 +# +# added by $MYNAME on $DATE +# called from within $WD +# +$2="dummy" + +EOF + +if echo "$3" grep -e " \|\t" >/dev/null 2>&1 ; then + # put multi-word value in quotes + # but delete all quotes before so we don't end up + # with a ""quotation"". + VAL=\"`echo $3 | tr -d "\""`\" +else + VAL="$3" +fi +awk 'BEGIN {FS = "="} + $1 == key { if ($2$3$4$5$6$7$8$9$10$11$12$13$14$15$16 != val) { + print key"="val >> outfile + changed = changed $2 "-->" val" " + ++occ + next + } + } + { print >> outfile } + END { print "changed " (occ ? occ " occurence: " changed : "nothing."); + exit occ } + ' \ + key=$2 val="$VAL" outfile="$1.$MYNAME" "$1" + +if [ ! $? = 0 ] ; then + mv $1.$MYNAME $1 + mkdir -p $cfg_jcs_log_dir + echo $1 >> $cfg_jcs_log_dir/changed_files.log +else + rm $1.$MYNAME +fi +} # end function jcs_setval + +# ==================== setvals +jcs_setvals() { + +MYNAME=`basename $0` +TMPFILE=/tmp/missing_keys.$MYNAME +DATE=`date` +WD=`/bin/pwd` + +# ------------- functions +usage() { + txtout "usage setvals" +} + +eusage() { + usage + exit 1 +} + +if [ $# != 2 ] ; then + eusage +fi +if [ ! -e "$1" ] ; then + echo $1 not found. Exiting. + exit 1 +fi +if [ ! -f "$2" ] ; then + echo $2 is not a regular file. Exiting. + exit 1 +fi +if [ ! -w "$1" ] ; then + echo $1 is not a writable file. Exiting. + exit 1 +fi + +rm -f $TMPFILE +cat $2 | cut -d\# -f1 | sed -e 's/=/ /' | +while read KEY VAL; do + test -n "$KEY" && (grep "$KEY" $1 >/dev/null 2>&1 ||\ + echo $KEY=\"dummy\" >> $TMPFILE) +done + +if [ -f $TMPFILE ] ; then +cat << EOF >> $1 + +# +# missing keys inserted by $MYNAME +# on $DATE +# from $WD +# +EOF + +cat $TMPFILE >> $1 +fi + +cat $2 | cut -d\# -f1 | sed -e 's/=/ /' | +while read KEY VAL; do + if test -n "$KEY" ; then + jcs_setval $1 $KEY "$VAL" + fi +done +} + +# ==================== mkdirs +jcs_mkdirs() { + +PREFIX="" +WD=`pwd` + +usage() { + txtout "usage mkdirs" +} + +eusage() { + usage + exit 1 +} + +# ------------- get options +set -- `getopt p:h $*` +if [ "$?" != 0 ] ; then + eusage +fi +while [ ! "$1" = "--" ] ; do +case "$1" in + -h) + usage; exit 0;; + -p) + PREFIX="$2"; shift 2;; + *) + echo Unknown option $1. Exiting. >&2 + exit 1 +esac +done +shift # get past -- + +if [ $# != 1 ] ; then + eusage +fi +if [ ! -f "$1" ] ; then + echo $1 is not a regular file. Exiting. + exit 1 +fi +if [ -n "$PREFIX" -a ! -d "$PREFIX" ] ; then + echo \"$PREFIX\" is not a directory. Exiting. >&2 + exit 1 +else + echo changing to directory \"$PREFIX\" + cd $PREFIX +fi + +cat $WD/$1 | cut -d\# -f1 | +while read DIR USER GROUP MODE ; do + if [ -n "$MODE" ] ; then + echo -n Creating directory $DIR ..." " + mkdir -p $DIR + chown $USER $DIR + chgrp $GROUP $DIR + chmod $MODE $DIR + echo done. + fi +done + +} + +# ==================== useradd +jcs_useradd() { + +usage() { + txtout "usage useradd" +} + +eusage() { + usage + exit 1 +} + +test "`whoami`" = root || { + echo "This program has to be executed by root. Exiting." >&2 + exit 1 +} + +set -- `getopt hu:g: $*` +while [ $1 != -- ] ; do + case $1 in + -u) + USERFILE=$2 + test -r "$USERFILE" || { + echo "\"$USERFILE\" is not a readable file. Exiting." >$2 + exit 1 + } + shift;; + -g) + GROUPFILE=$2 + test -r "$GROUPFILE" || { + echo "\"$GROUPFILE\" is not a readable file. Exiting." >$2 + exit 1 + } + shift;; + -h) + usage; exit 0;; + *) + usage; exit 1;; + esac + shift +done +shift + +for CMD in which useradd groupadd ; do + test -z "`which $CMD 2>/dev/null`" && { + echo $CMD not found. Exiting. >&2 + exit 1 + } +done + +if [ $# != 1 ] ; then + eusage +fi +if [ ! -f "$1" ] ; then + echo $1 is not a regular file. Exiting. + exit 1 +fi + +cat $1 | + +while read CMD ARG1 ARG2 ARG3 ARG4 ARG5 ARGN ; do + NEWGRPS="" + case "$CMD" in + USER) + test -n "$USERFILE" && grep -e "^ *$ARG1 *$" $USERFILE >/dev/null || continue + mkdir -p $ARG3/dat $ARG3/local + if ! grep -e "^$ARG1:" /etc/passwd >/dev/null 2>&1 ; then + echo -n adding user $ARG1, uid $ARG2, dir $ARG3, \ + groups $ARG4 $ARG5 $REST ..." " + #GRPS=`echo "$ARG4 $ARG5 $ARGN $REST" | tr "\t" " " | tr -s ' ' | + # sed -e 's/ $//' | sed -e 's/ /,/g' | tr -d " \n\r\t"` + for NEWGRP in $ARG4 $ARG5 $ARGN $REST; do + NEWGRP=$NEWGRP + if [ -n "$GROUPFILE" ]; then + grep -e "^ *$NEWGRP *$" $GROUPFILE >/dev/null || continue + fi + NEWGRPS="$NEWGRPS,$NEWGRP" + done + NEWGRPS=`echo $NEWGRPS | sed -e 's/^ *,//'` + useradd -u $ARG2 -d $ARG3 -g $ARG4 -G $NEWGRPS $ARG1 + chown $ARG1 $ARG3 $ARG3/dat + chgrp $ARG4 $ARG3 $ARG3/dat + echo done + else + echo -n user $ARG1 already exists on this system + NEWGRPS="" + OLDGRPS=`groups $ARG1 | cut -d: -f2` + for NEWGRP in $ARG4 $ARG5 $ARGN $REST ; do + test -n "$GROUPFILE" && grep -e "^ *$NEWGRP *$" $GROUPFILE >/dev/null || continue + if ! echo $OLDGRPS | tr " " "\n" | + grep -e "^$NEWGRP$" >/dev/null 2>&1 ; then + NEWGRPS="$NEWGRPS $NEWGRP" + fi + done + if [ -n "$NEWGRPS" ] ; then + echo + echo " but adding him to group(s) $NEWGRPS" + usermod -G "`echo $OLDGRPS $NEWGRPS | tr -s ' ' | + sed -e 's/^ \| $//' | + tr ' ' ','`" $ARG1 + else + echo " - skipping" + fi + fi + ;; + GROUP) + test -n "$GROUPFILE" && grep -e "^ *$ARG1 *$" $GROUPFILE >/dev/null || continue + if ! grep -e "^$ARG1:" /etc/group >/dev/null 2>&1 ; then + echo adding group $ARG1, gid $ARG2 + groupadd $ARG1 -g $ARG2 + + else + echo group $ARG1 already exists on this system - skipping + fi + ;; + *) + ;; + esac +done + +} + +jcs_touch() { + touch $1 + chown $cfg_jcs_owner $1 + chgrp $cfg_jcs_group $1 +} +# ===================== This is jcs + +SCRIPTNAME=$0 + +test -z "$1" && eusage + +while test -n "$1" ; do + if test "`echo $1 | cut -c1`" != - ; then + break + fi + case $1 in + -h) + usage + exit 0;; + -V) + version + exit 0;; + -q) + GLOB_OPT_QUIET=1 + exit 0;; + -v) + GLOB_OPT_VERBOSE=1 + exit 0;; + *) + echo unknown option $1. Exiting. >&2 + eusage 1;; + esac + shift +done + +txtout commands | grep $1 >/dev/null +if test $? != 0 ; then + echo \"$1\" is not a known command. >&2 + eusage +fi + +if [ "`echo $@ | cut -d' ' -f1`" != init ] ; then + get_config +fi + +CMD=$1 +shift + +jcs_$CMD "$@" + +exit 0 + +-->>>-- commands -- + init + wipe + add + get + install + sinstall + smake + makeinf + newdir + setval + setvals + mkdirs + useradd + touch +--<<<-- commands -- + +-->>>-- global usage -- + +usage: jcs [global_opts] command [command_opts] + +where global_opts is out of + + -h : display this help screen + -v : be verbose about what is done + -q : work in silence + -V : display version number and exit + +command is one of + +--<<<-- global usage -- + +-->>>-- global usage 2 -- + +Most of the commands understand the option -h and +display a usage message explaining its meaning. + +--<<<-- global usage 2 -- + +-->>>-- jcs version -- +Jannet Configuration Shadow +Version '$Revision$' - '$Date$' +(c) 2000, 2001 jannet it services +--<<<-- jcs version -- + +-->>>-- usage init -- +usage: jcs init [-h] [-c jcs_config_source_dir] + +jcs init is used to create the directory tree under /etc/jcs +which is necessary for jcs to work correctly. In this +directory structure the files jcs.conf, where some variables +are set and jcs.mk, the standard makefile that is included +in most makefiles in the jcs, can be found. Also, in the +subdirectory "templates", there are template directories that +are used by "jcs newdir" and "jcs add" upon creation of a new +module directory. "jcs add" searches for a template directory +"module" by default. + +if -c jcs_config_source_dir is specified, the relevant files under +jcs_config_source_dir are copied to /etc/jcs. For relevant files +that are not present under jcs_config_source_dir, a default version +is created. +--<<<-- usage init -- + +-->>>-- usage add -- + + jcs add is used to add a file from either the local or a remote + machine to the jannet configuration shadow (jcs). + + usage: + jcs add [-lv] [-b jcs_basedir] [hostname:]filename module + jcs add -h + + -b jcs_basedir: + use jcs_basedir/module rather than cfg_jcs_dir/module + (as specified in /etc/jcs/jcs.conf) for storing the file. + This option is mandatory if hostname is specified. + -h: show this usage message + -v: run in verbose mode + -l: move the file to the jcs rather than just copy it. + Substitute the original file with a symbolic link to + its new location (only available if hostname is not + specified). + + see also: + + jcs makeinf for automatically creating .inf information files + +--<<<-- usage add -- + +-->>>-- usage snapshot -- + + jcs snapshot is used to store the configuration + of a given machine into a jannet configuration + shadow (jcs) directory tree. The connection + to the given machine is set up via ssh. Thus, + if you don't want to enter passwords many times + it is recomendable that you set up a passwordless + login from this host to the target machine. + + usage: + jcs snapshot [-v] configfile + jcs snapshot -h + jcs snapshot [-v] -t hostname + + -h: shows this usage message + -v: verbose + -t: writes a template for a configuration + file to standard output. It is attempted + to establish a connection to hostname as + root via ssh. + +--<<<-- usage snapshot -- + +-->>>-- usage install -- +usage: jcs install .inf-file [-h] [-f] [-b backup-dir] +--<<<-- usage install -- + +-->>>-- usage smake -- +usage: jcs smake: {install|setup|clean} subdirs... +--<<<-- usage smake -- + +-->>>-- usage sinstall -- +usage: jcs sinstall tar.gz-archive +--<<<-- usage sinstall -- + +-->>>-- usage makeinf -- + jcs makeinf looks for files named new_link.sh under + the directory specified by JCS_CONFDIR in /etc/jcs/jcs.conf. + it then transforms the contents of these files into + .inf - files. +--<<<-- usage makeinf -- + +-->>>-- usage newdir -- +usage: jcs newdir [-h] [-t template_directory] target_directory +--<<<-- usage newdir -- + +-->>>-- usage setval -- +usage : jcs setval config-file key value +--<<<-- usage setval -- + +-->>>-- usage setvals -- +usage : jcs setvals config-file template-file +--<<<-- usage setvals -- + +-->>>-- usage mkdirs -- + +usage : jcs mkdirs [-p prefix] config-file + +jcs mkdirs is used to create some directories, as specified in +config-file. Each line in config-file describes one directory +to be created. It consists of 4 words, in the order: + + NAME USER GROUP MODE + +which have the obvious meanings. +Everything on the right hand side of a # sign is ignored. + +If a prefix is specified with -p, all directories that don't +start with a "/" character, will be created relative to the +directory specified by prefix. The directory specified by +prefix will not be created, it has to exist beforehand, other- +wise jcs will display an error message and quit. +--<<<-- usage mkdirs -- + +-->>>-- usage useradd -- + +usage : jcs useradd [-u user-file] [-g group-file] config-file + +jcs useradd is used to add users and groups to the system. +Each line in config-file describes either a user to be added +or a group to be added. If a user or a group already exists on +the system neither is their id changed nor are users removed +from groups. They are added, however if this is specified by +an entry in config-file. + +Lines in config file start either with the word "USER" or with +the word "GROUP" and have the following formats: + + USER username uid homedir group [group ...] + GROUP groupname gid + +Everything on the right hand side of a # sign is ignored. + +If user-file is specified, only users listed in user-file will be +added. If group-file is specified, only groups listed in +group-file will be added. The lines in these files must contain +one entry each. + +--<<<-- usage useradd -- + +-->>>-- usage get -- +usage: jcs get [-t] files ... + jcs get [-h] +--<<<-- usage get -- + +-->>>-- jcs.mk -- +SHELL = /bin/sh + +WD := $(shell pwd) +MOD := $(shell pwd | xargs basename) +LOG_DIR := $(shell . /etc/jcs/jcs.conf; echo $$jcs_log_dir) +INSTALL_LOG := $(LOG_DIR)/install.log +SETUP_LOG := $(LOG_DIR)/setup.log +TEE := /usr/bin/tee +BINDIR := /usr/local/bin +SBINDIR := /usr/local/bin +INF := $(wildcard *.inf) +INF_DONE := $(addsuffix .done,$(basename $(INF))) +INF_SU_DONE := $(addsuffix .su_done,$(basename $(INF))) +JCS_HTTP_PATH := $(shell . /etc/jcs/jcs.conf; echo $$jcs_http_path) + +export SETUP_LOG INSTALL_LOG TEE BINDIR SBINDIR + + +define recurse_subdirs + @set -e ;\ + TARGET=$@ ;\ + N="`echo $(SUBDIRS) | wc -w`" ;\ + I=1 ;\ + while [ $$I -le $$N ] ; do \ + SUBDIR="`echo $(SUBDIRS) | cut -d' ' -f$$I`" ;\ + $(MAKE) -C $$SUBDIR $$TARGET;\ + I=`expr $$I + 1`;\ + done +endef + +%.done: %.inf + jcs install $< + touch $@ + +%.su_done: %.inf + jcs install -b setup -f $< + touch $@ + +install_inf: $(INF_DONE) + +install_inf.old: checkroot checkdirs + @echo "####" checking installation information files ... ;\ + if [ -n "`find . -name '*.inf' -maxdepth 1`" ] ; then \ + jcs install *.inf ;\ + fi | $(TEE) -a $(INSTALL_LOG) + +install_link: + +install_link.old: checkroot checkdirs + @echo "####" checking link information files ... ;\ + if [ -e link.sh ] ; then \ + jcs linkout link.sh -b install ;\ + fi | $(TEE) -a $(INSTALL_LOG) + +setup_inf: $(INF_SU_DONE) + +setup_inf.old: checkroot checkdirs + @echo "####" checking installation information files ... ;\ + if [ -n "`find . -name '*.inf' -maxdepth 1`" ] ; then \ + jcs install -b setup -f *.inf ;\ + fi | $(TEE) -a $(SETUP_LOG) + +setup_link: checkroot checkdirs + @echo "####" checking link information files ... ;\ + if [ -e link.sh ] ; then \ + jcs linkout -f -b setup link.sh ;\ + fi | $(TEE) -a $(SETUP_LOG) + +test_inf: checkdirs + @echo "####" testing installation information files ... ;\ + if [ -n "`find . -name '*.inf' -maxdepth 1`" ] ; then \ + jcs install *.inf -t ;\ + fi | $(TEE) -a $(INSTALL_LOG) + +test_link: checkdirs + @echo "####" testing link information files ... ;\ + if [ -e link.sh ] ; then \ + jcs linkout -t link.sh ;\ + fi | $(TEE) -a $(INSTALL_LOG) + +get: checkdirs + @echo "####" getting files. ;\ + if [ -n "$(GETFILES)" ] ; then jcs get $(GETFILES) ; fi + +getall: $(LOCAL_GET) get $(LOCAL_POST_GET) + $(recurse_subdirs) + +checksum: checkroot # TODO integrate tripwire + @if [ "$$cfg_use_checksum" = TRUE ] ; then \ + echo "####" updating checksum database ... ;\ + $$update_checksum_command ;\ + fi + +install: checkroot $(LOCAL_INSTALL) install_inf install_link $(LOCAL_POST_INSTALL) checksum + $(recurse_subdirs) + +setup: checkroot $(LOCAL_SETUP) setup_inf setup_link $(LOCAL_POST_SETUP) checksum + $(recurse_subdirs) + +test: $(LOCAL_TEST) test_inf test_link $(LOCAL_POST_TEST) + $(recurse_subdirs) + +dist: clean + cd ..;\ + find $(MOD) -type f -o -type l | \ + grep -ve "CVS\|trash\|$(MOD)/setup" | \ + xargs tar -cvzf $(MOD).tar.gz ;\ + mv $(MOD).tar.gz $(MOD) + +checkroot: + @if [ `whoami` != root ] ; then echo "Only root can do this." >&2; exit 1; fi + +checkdirs: + @test -f /etc/jcs/jcs.conf || exit 1 ;\ + test -d `dirname $(SETUP_LOG)` || mkdir -p `dirname $(SETUP_LOG)` ;\ + test -d `dirname $(INSTALL_LOG)` || mkdir -p `dirname $(INSTALL_LOG)` + +clean: $(LOCAL_CLEAN) + $(recurse_subdirs) ;\ + rm -f *~ *.swp *.rep .\#* *.done *.su_done $(MOD).tar.gz default.cache 2>/dev/null +--<<<-- jcs.mk -- + +-->>>-- jcs.conf.oldstyle -- +JNT_CONFDIR=/tmp +JNT_USE_CHECKSUM=FALSE +JNT_JCSDIR=/tmp +--<<<-- jcs.conf.oldstyle -- + +-->>>-- jcs.conf -- +jcs_dir=/tmp/jcs +jcs_owner=root +jcs_group=root +jcs_log_dir=/tmp/jcs/log +jcs_file_extension=inf +use_checksum=false +update_checksum_command="/home/tripwire/bin/fs_checksum.sh update" +jcs_http_path=http://www.jannet.de +--<<<-- jcs.conf -- + +-->>>-- /etc/jcs/templates/dir/module/Makefile -- +# jannet configuration shadow +# (c) 2000 - 2001 jannet +# contact@jannet.de + +include /etc/jcs/jcs.mk +--<<<-- /etc/jcs/templates/dir/module/Makefile -- + +-->>>-- /etc/jcs/templates/dir/src/Makefile -- +# jannet configuration shadow +# (c) 2000 jannet +# contact@jannet.de +MAKE_SH := jcs smake + +SUBDIRS = cur + +setup: + $(MAKE_SH) setup $(SUBDIRS) + +install: + $(MAKE_SH) install $(SUBDIRS) + +clean: + $(MAKE_SH) clean $(SUBDIRS) +--<<<-- /etc/jcs/templates/dir/src/Makefile -- + +-->>>-- old config warning -- ++--------------------------------------------+ +| | +| C A U T I O N | +| | +| It looks like you are using an old style | +| jcs configuration file /etc/jcs/jcs.conf. | +| Use of this format is deprecated. JCS will | +| now translate it into the new style format.| +| Also the file /etc/jcs/jcs.mk will be re- | +| placed, since it's default version also | +| makes use of /etc/jcs/jcs.conf. If you have| +| edited it yourself, you will have to adapt | +| it to meet your needs, otherwise JCS will | +| cease to function properly. | +| | +| Both files will be backed up with an | +| ".oldstyle" appended to their names. | +| | ++--------------------------------------------+ +--<<<-- old config warning --