cdesktopenv/cde/admin/IntegTools/dbTools/mkProd

651 lines
15 KiB
Bash
Executable File

#! /bin/ksh
export SYSTYPE=bsd4.3
# This script is aimed at producing Apollo product tree but
# it should work as well on hp-ux systems. There is at least
# one special rule "-n" which should not be generated on hp-ux systems
# where it is not necessary to run nroff on the man page sources.
# Put "/etc", "/sbin" and "/usr/sbin" in the path
# because this is where "chown" appears on bsd4.3 systems (i.e. apollo).
# Put "/usr/apollo/bin" on the path to access "chacl" on apollo systems.
export PATH=":/etc:/sbin:/usr/sbin:$PATH:/usr/apollo/bin:"
typeset STRIP=""
# this alias makes for more "beautiful" output.
alias echo=print
#
# Shell script to read a file full of destination/perm/source triples and
# create data base entries in a format suitable for 8.0 release. All other
# information defaults to the default values for now -- this should be correct
# in most cases but may require editing of the result for those cases
# needing special handling.
#
# Lst file syntax:
# [<install-flags>] <destination_path> <perm> <src> [ <type> <owner> <group> <status> <processor> <resp_proj> ]
#
# <install-rule> ==> [optional] 2 character field encoding special actions to be invoked when
# creating the product tree. In the absence of this field the file is subject
# to defaults based on its name,destination directory and permissions.
# valid values:
# -- Do nothing special
# c- compress the file
# -n run it through an nroff pipeline
# -s strip the file (should be a binary executable)
#
# <destination_path> ===> full path name on target system
# <perm> ===> numeric permission (with leading 0)
# <src> ===> build tree path name (relative to build tree root)
# | full path name of link source
# | "-" to ignore this field (source for directory not required)
# <type> ===> "file" | "empty_dir" | "directory" | "hard_link" | NULL
# <owner> ===> file owner name -- defaults to bin
# <group> ===> file group ownership --- defaults to bin
# <status> ===> "di----" default
# <processor> ===> valid processor "3-" | "-8" | "38" -- defaults to "38"
# <resp_proj> ===> responsible project --- defaults to "xwindows"
#
Usage="Usage: $0 [-f filesetName] -D <desttree> -S <srctree> <file> ...\n
\tfilesetName \t==> (optional) used to create subdirectory in desttree\n
\tdesttree \t==> destination directory\n
\tsrctree \t==> usually a build tree containing the source\n
\tfile \t\t==> data base file in \".lst\" format"
FILE='file'
STATUS='di----'
PROCESSOR='378'
DESTTREE='.'
if [ -f /com/ctnode ]; then
# Apollo systems
OWNER='root'
GROUP='staff'
# set flag used to test for soft links
LNKTST="L"
else
# hp-ux systems (and all other systems)
OWNER='bin'
GROUP='bin'
# set flag used to test for soft links
LNKTST="h"
fi
BUILD_TARGET='/'
INSTALL_RULE='--'
INSTALL_FLAGS=''
ORDER='0'
RESP_PROJ='xwindows'
# Set which system we are on
BUILDSYSTEM=$(uname)
# Set system
if [ $BUILDSYSTEM = "AIX" ];
then
PLATFORM=aix
elif [ $BUILDSYSTEM = "SunOS" ];
then
PLATFORM=sun
elif [ $BUILDSYSTEM = "UNIX_SV" ];
then
PLATFORM=usl
elif [ $BUILDSYSTEM = "UNIX_System_V" ];
then
PLATFORM=uxp
elif [ $BUILDSYSTEM = "OSF1" ];
then
PLATFORM=dec
else # Build system = HP
PLATFORM=hp-ux
fi
if [ $PLATFORM = "aix" ];
then
USER=`/bin/whoami`
elif [ $PLATFORM = "usl" -o $PLATFORM = "uxp" ];
then
USER=`/usr/ucb/whoami`
else
USER=`/usr/bin/whoami`
fi
awkit() {
awk '
BEGIN {
print "#"
print "# TYPE RULE SRC DEST MODE OWNER GROUP LINKSRC"
print ""
}
/^[ ]*#/ { next }
{
# initialize install_rule to NULL
install_rule=""
# skip blank lines
if ( NF == 0 )
next
# do a little syntax checking
if ( $1 !~ /\// ) {
# check for special install_rule values
if ( $1 ~ /[-c][-ns]/ ) {
# set the special install rule
install_rule=$1
# shift the rest of the fields left
for ( i = 1; i < NF; i++) {
$i = $(i+1)
}
NF=NF-1
}
else {
print "Syntax Error (line " NR ") destination path: " $1
print "text: " $0
next
}
}
if ( NF > 9 ) {
print "Syntax Error (line " NR ") number of fields"
print "text: " $0
exit
}
if ( $2 !~ /0[0-7][0-7]*/ ) {
print "Syntax Error (line " NR ") perm : " $2
print "text: " $0
next
}
# if ( $4 ~ /link/ && $3 !~ /^\// && $3 !~ /`node_data/) {
# changed to allow local link (using ./file syntax) -- Should this be
# domain only?
#
if ( $4 ~ /link/ && $3 !~ /^\// && $3 !~ /`node_data/ && \
$3 !~ /^\.\// && $3 !~ /^\.\.\// ) {
print "Syntax Error (line " NR ") source: " $3
print "text: " $0
next
}
# Check for special install rules
# man pages are compressed use rule "c-"
# font files are compressed use rule "c-"
# directories have no source i.e. src = "-"
src = $3;
link_src = "";
type = "'$FILE'";
owner = "'$OWNER'";
group = "'$GROUP'";
status = "'$STATUS'";
processor = "'$PROCESSOR'";
resp_proj = "'$RESP_PROJ'";
if ( $4 != "" )
{
type = $4;
if ( $4 ~ /link/ ) {
src = "";
if ( $3 ~ /^\// || $3 ~ /`node_data/ || \
$3 ~ /^\.\// || $3 ~ /^\.\.\// )
link_src = $3;
else {
print "Syntax Error (line " NR ") link_src: " $3
print "text: " $0
next;
};
}
else if ( $4 == "directory" )
if ( $3 != "-" )
{
print "Syntax Error (line " NR ") directory: " $3;
print "text: " $0;
next;
}
else
src="";
else if ( $4 == "empty_dir" )
{
resp_proj = "common";
status = "------";
if ( $3 != "-" )
{
print "Syntax Error (line " NR ") empty_dir: " $3;
print "text: " $0;
next;
}
else
src="";
}
else if ( $4 == "file" && $3 == "-" )
if ( $7 == "---cu-")
src = "";
}
#
# If owner an/or group are specified all previous fields (including
# type) must be specified.
#
if ( $5 != "" )
owner = $5;
if ( $6 != "" )
group = $6;
if ( $7 != "" )
status = $7
if ( $8 != "" )
processor = $8;
if ($9 != "" )
resp_proj= $9;
if ( install_rule != "" ) {
; # install rule has been explicitly set -- do nothing
}
else if ( $1 ~ /\/usr\/man\/man.*\.Z\// )
{
install_rule = "c-";
}
else if ( $1 ~ /\/usr\/X11\/man\/cat[1-9]\/.*[1-9]/ )
{
install_rule = "-n";
}
else if ( $1 ~ /\/bsd4.3\/usr\/man\/cat[1-9]\/.*[1-9]/ )
{
install_rule = "-n";
}
else if ( $1 ~ /\/sys5.3\/usr\/catman\/.*man[1-9]\/.*[1-9]/ )
{
install_rule = "-n";
}
else if ( $1 ~ /.*\/fonts\/.*.scf$/ && $3 ~ /.*.snf$/ )
{
install_rule = "c-";
}
else if ( $1 ~ /.*\/fonts\/.*.snf\.Z$/ && $3 ~ /.*.snf$/ )
{
install_rule = "c-";
}
else if ( $1 ~ /^\/integration\// && $3 ~ /^doc\/upinfo\// )
{
install_rule = "";
}
else if ( $2 ~ /[1357]/ && $4 == "file" )
{ # executable files may be stripped
install_rule = "-s";
}
else
install_rule = "'$INSTALL_RULE'";
# print "install_target : " $1
# print "fileset : " "'$FILESET'"
# print "type : " type
# print "status : " status
# print "processor : " processor
# print "mode : " $2
# print "owner : " owner
# print "group : " group
# print "link_source : " link_src
# print "build_target : " "'$BUILD_TARGET'"
# print "install_rule_name : " install_rule
# print "install_flags : " "'$INSTALL_FLAGS'"
# print "a_out_location : " src
# print "order : " "'$ORDER'"
# print "responsible_project : " resp_proj
# print "#"
if ( type ~ /.*link/ )
src= link_src
else if ( type ~ /.*directory/ )
src="-"
print type, install_rule, src, $1, $2, owner ,group
}
' $1
}
#
# createPath
# function to create a directory path. (mkdir -p replacement on bsd4.3)
#
createPath()
{
if [ $# -ne 1 ]; then
echo "ERROR: \"$0\" invalid argument count" >&2
echo " ARGS=$@"
return 1
fi
# Since we are SYSTYPE bsd4.3 "-x" won't work.
if [ -r /sys5.3/bin/mkdir ]; then
/sys5.3/bin/mkdir -p $1
return
fi
if hp9000s300 > /dev/null 2>&1 || hp9000s800 > /dev/null 2>&1; then
mkdir -p $1
return
fi
#
# We can't use mkdir -p so do the hard way.
# starting at the root check/create all the directories
# in the given path
#
typeset xdirs=""
typeset nextdir=""
typeset fulldirs
# provide extra slash for apollo systems (//hp* syntax)?
if [ "$1" = "${1##/}" ]; then
# not a full path name so attach path to current directory
fulldirs=`/bin/pwd`/$1
xdirs="/" # added to support apollo "//host" syntax
elif [ "$1" != "${1##//}" ]; then
# using "//host" syntax
fulldirs=$1
xdirs="/"
else
fulldirs=$1
xdirs=""
fi
echo creating path: $1
while nextdir=`expr /$fulldirs/ : '/*\([^/]*\)/.*'`; do
xdirs=$xdirs/$nextdir
if [ ! -d $xdirs ]; then
mkdir $xdirs
fi
fulldirs=`expr $fulldirs : '/*[^/]*/\(.*\)'`
done
return 0
}
# doit
# function to put the source file into the product tree. This function
# reads its stdin for file movement rules.
#
doit()
{
if [ $# -ne 0 ]; then
echo "ERROR: \"$0\" incorrect arg count" >&2
echo "ARGS: $@" >&2
fi
typeset TYPE
typeset RULE
typeset SRC
typeset DEST
typeset MODE
typeset OWNER
typeset GROUP
while read TYPE RULE SRC DEST MODE OWNER GROUP; do
# ignore blank lines
if [ -z "$TYPE" ]; then
continue;
fi
# ignore comment lines (match longest string starting with '#')
if [ "${TYPE###}" != "$TYPE" ]; then
continue
fi
DEST=$DESTTREE/$FILESET${DEST}
CMD=""
case $TYPE in
directory)
if [ ! -d "$DEST" ]; then
CMD="createPath $DEST"
fi
;;
file)
SRC=$SRCTREE/$SRC
if [ "$CHECK_BEFORE" = "yes" ]
then
if [ ! -f $SRC ]
then
echo "Missing: $SRC"
echo "Missing: $SRC" >>/tmp/mkprod.missing
continue
fi
fi
if [ ! -f $SRC ]; then
echo "ERROR: Cannot read \"$SRC\"." >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP " >&2
continue
fi
case $RULE in
c-) # compress rule
CMD="compress -c $SRC > $DEST"
;;
-n) # nroff rule (for apollo man pages)
if egrep -c '^\.TH[ ]|^\.ds[ ]' $SRC > /dev/null ; then
CMD="tbl $SRC|eqn|nroff -man|col -b> $DEST"
else
CMD="cp $SRC $DEST"
fi
;;
-s) # strip rule
# Domain Only
# if [ "$(find $SRC -typeuid coff -print)" = "$SRC" ]; then
# hp-ux
if [ -z "$STRIP" ]; then
CMD="cp $SRC $DEST"
else if file $SRC | grep -q "not stripped"; then
CMD="cp $SRC $DEST; strip $DEST"
else
CMD="cp $SRC $DEST"
fi
fi
;;
--) # default (no special processing)
CMD="cp $SRC $DEST"
;;
*) # huh?
echo "ERROR: Unrecognized rule: \"$RULE\"" >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP " >&2
continue;
;;
esac
;;
sym_link)
if [ -z "$SRC" ]; then
echo "ERROR: No link source for \"$DEST\"" >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP " >&2
continue;
fi
if [ "${SRC#\`node_data}" != "$SRC" ]; then
# apollo-style special link
echo "WARNING: encountered special link: $SRC" >&2
# try to make link to this SRC by adding a
# backslash to protect the tic mark.
SRC=\\$SRC
elif [ "${SRC#/}" = "$SRC" ]; then
# echo "ERROR: Relative link \"$SRC\"" >&2
# echo "WARNING: Relative link \"$SRC\"" >&2
# echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP " >&2
# Protect the potential variant link variable
# (eg lnk_$(LNK))
SRC=\'$SRC\'
# continue;
fi
CMD="ln -s $SRC $DEST"
# Remove existing link if one already exists
[ -${LNKTST} "$DEST" ] && rm $DEST
;;
hard_link)
# Hard links are assumed to be made only to other
# files in the submittal -- not to existing system
# files.
SRC="$DESTTREE/$FILESET${SRC}"
if [ -z "$SRC" ]; then
echo "ERROR: No link source for \"$DEST\"" >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP" >&2
continue;
fi
CMD="ln $SRC $DEST"
;;
*) echo "ERROR: Unrecognized type: \"$TYPE\"" >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP" >&2
continue;
;;
esac
# createPath issues its own error messages
if [ ! -d ${DEST%/*} ]; then
createPath ${DEST%/*} || continue
fi
[ -z "$CMD" ] && continue
eval "$CMD" || {
echo "ERROR: \"$CMD\" failed" >&2
echo " LINE=$TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP" >&2;
continue;
}
# set permissions for non-links
if [ "${TYPE%link}" = "$TYPE" ]; then
if [ "$USER" = "root" ]; then
chgrp $GROUP $DEST ||
echo "ERROR: \"chgrp $GROUP $DEST\" failed" >&2
chown $OWNER $DEST ||
echo "ERROR: \"chown $OWNER $DEST\" failed" >&2
chmod $MODE $DEST ||
echo "ERROR: \"chmod $MODE $DEST\" failed" >&2
fi
fi
echo $TYPE $RULE $SRC $DEST $MODE $OWNER $GROUP
done
}
###################################################
# MAIN BODY
###################################################
#
# Check Path for chmod, chown, and chgrp
#
whence chmod > /dev/null || {
echo "ERROR: \"chmod\" not in PATH." >&2
exit 1
}
whence chown > /dev/null || {
echo "ERROR: \"chown\" not in PATH." >&2
exit 1
}
whence chgrp > /dev/null || {
echo "ERROR: \"chgrp\" not in PATH." >&2
exit 1
}
CHECK_BEFORE="no"
while [ $# -ne 0 ] ; do
case $1 in
-f*)
FILESET=${1#-f}
if [ -z "$FILESET" ]; then
if [ $# -ge 1 ]; then
shift;
FILESET=$1
else
echo $Usage
exit 1;
fi
fi;;
-S*) SRCTREE=${1#-S}
if [ -z "$SRCTREE" ]; then
if [ $# -ge 1 ]; then
shift;
SRCTREE=$1
else
echo $Usage
exit 1;
fi
fi
;;
-D*) DESTTREE=${1#-D}
if [ -z "$DESTTREE" ]; then
if [ $# -ge 1 ]; then
shift;
DESTTREE=$1
else
echo $Usage
exit 1;
fi
fi
;;
-P*) CHECK_BEFORE="yes"
;;
*) files="$files $1";;
esac
if [ $# -ge 1 ]; then
shift;
fi
done
if [ -z "$files" -o -z "$SRCTREE" ]; then
echo $Usage >&2
exit 1;
fi
if [ ! -d "$SRCTREE" ]; then
echo "ERROR: Cannot access \"$SRCTREE\"." >&2
exit 1
fi
if [ ! -d "$DESTTREE" ]; then
echo "ERROR: Cannot access \"$DESTTREE\"." >&2
exit 1
fi
umask 022
if [ -f /com/ctnode ]; then
#
# Make sure berkely style permissions are applied to the product tree
# This should cause directories to be created with permissions based
# on the umask (which is otherwise ignored on "open security model"
# file systems).
#
chacl -RB $DESTTREE
fi
# Debug Stmts
echo FILESET=$FILESET
echo files=$files
echo SRCTREE=$SRCTREE
echo DESTTREE=$DESTTREE
echo "#-------------- $(date) --------------"
echo ""
TOOL_DIR=$SRCTREE/admin/IntegTools/dbTools
#
# Avoid making duplicate entries
# make sure links are referred to AFTER the files to which they point.
#
if [ $PLATFORM = "uxp" ]; then
$TOOL_DIR/uncomment $files | sort | uniq | $TOOL_DIR/linksLast - > /tmp/awk.in
cat /tmp/awk.in | awkit > /tmp/awk.out
cat /tmp/awk.out | doit
else
$TOOL_DIR/uncomment $files | sort | uniq | $TOOL_DIR/linksLast - | awkit | doit
fi
echo ""
echo "#-------------- $(date) --------------"