jw-pkg/scripts/jcs

2020 lines
48 KiB
Text
Raw Normal View History

2002-07-22 14:11:42 +00:00
#!/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"
}
NO_QUOTES=0
set -- `getopt hn $*`
while [ $1 != -- ] ; do
case $1 in
-n)
NO_QUOTES=1;;
-h)
usage; exit 0;;
*)
usage; exit 1;;
esac
shift
done
shift
if [ $# -lt 3 ] ; then
2002-07-22 14:11:42 +00:00
usage
exit 0
fi
if [ ! -e "$1" ] ; then
2002-07-22 14:11:42 +00:00
echo $1 not found. Exiting.
exit 1
fi
if [ ! -w "$1" ] ; then
2002-07-22 14:11:42 +00:00
echo $1 is not a writable file. Exiting.
exit 1
fi
MYNAME=`basename $0`
WD=`/bin/pwd`
DATE=`date`
FILE=$1
KEY=$2
shift 2
VALUES="$*"
test -e "$FILE".$MYNAME && rm "$FILE".$MYNAME
grep "$KEY" "$FILE" >/dev/null 2>&1 || cat << EOF >> "$FILE"
2002-07-22 14:11:42 +00:00
#
# added by $MYNAME on $DATE
# called from within $WD
#
$KEY="dummy"
2002-07-22 14:11:42 +00:00
EOF
if [ -n "` echo "$VALUES" | grep -e ' \|\t'`" -a "$NO_QUOTES" != 1 ] ; then
2002-07-22 14:11:42 +00:00
# put multi-word value in quotes
# but delete all quotes before so we don't end up
# with a ""quotation"".
VAL=\"`echo $VALUES | tr -d "\""`\"
2002-07-22 14:11:42 +00:00
else
VAL="$VALUES"
2002-07-22 14:11:42 +00:00
fi
echo -n " + $FILE: set $KEY to $VAL ... "
awk '
BEGIN {
FS = "="
}
{
left=$1
sub(/^ */,"",left)
sub(/ *$/,"",left)
if (left == key) {
if ($2$3$4$5$6$7$8$9$10$11$12$13$14$15$16 != val) {
2002-07-22 14:11:42 +00:00
print key"="val >> outfile
changed = changed $2 "-->" val" "
++occ
next
}
}
{
print >> outfile
}
}
END {
print "changed " (occ ? occ " occurence: " changed : "nothing.");
exit occ
} ' \
key="$KEY" val="$VAL" outfile="$FILE.$MYNAME" "$FILE"
2002-07-22 14:11:42 +00:00
if [ ! $? = 0 ] ; then
mv "$FILE".$MYNAME "$FILE"
2002-07-22 14:11:42 +00:00
mkdir -p $cfg_jcs_log_dir
echo "$FILE" >> $cfg_jcs_log_dir/changed_files.log
2002-07-22 14:11:42 +00:00
else
rm "$FILE".$MYNAME
2002-07-22 14:11:42 +00:00
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 $ARG3/local
chgrp $ARG4 $ARG3 $ARG3/dat $ARG3/local
2002-07-22 14:11:42 +00:00
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 [-n] config-file key value
options: -n: don't put quotation marks around a multiword value
2002-07-22 14:11:42 +00:00
--<<<-- 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 --