This is writersfix.sh in view mode; [Download] [Up]
#! /bin/sh -u
# @(#)writersfix $Revision: 1.5 $ $Date: 93/01/20 13:11:24 $ $State: Released $
#
# Script to remove _writers from the specified directory and its
# children.
PATH=/usr/bin:/bin:/usr/ucb:/usr/etc:/etc:. export PATH
TEMP=/tmp/wf.$$
PGMNAME=`basename $0`
DEFAULT_Verbose=true
DEFAULT_vFlag=
DEFAULT_Remove=false
DEFAULT_rFlag=
DEFAULT_Recursive=false
DEFAULT_RFlag=
DEFAULT_Sp=""
DEFAULT_Domain=/
DEFAULT_Directory=/printers
# We use -remove (rather than just -r) to help avoid confusion
# between -r (remove) and -R (recurse).
USAGE="${PGMNAME} [-s] [-R] [-remove] [-d directory] [domain]"
DESCRIPTION="\
-s Silent
-R Recurse through NetInfo domain hierarchy
-remove Remove _writers (default is just show)
-d directory Directory to check (default: $DEFAULT_Directory)
domain Domain to check (default: $DEFAULT_Domain)
The specified directory and its immediate subdirectories are checked.
If -R is used, the domain must be specified as a full path, not a
relative domain name."
E_OK=0
E_Syntax=2
E_BadDomain=3
E_NIError=4
E_FoundWriters=5
# Proceess arguments
while [ $# -gt 0 ]; do
case ${1} in
-help | -Help | -HELP) # Help the user
echo "$USAGE"
echo "$DESCRIPTION"
exit $E_OK
;;
-s) # Silent
Verbose=false
vFlag=-s
;;
-R) # Recursive: apply to all child domains
Recursive=true
RFlag=-R
Sp=" "
;;
-remove) # Remove the _writers property
Remove=true
rFlag=-remove
;;
-d) # Specify the directory to examine
if [ 2 -ge $# ]; then
echo 1>&2 "${PGMNAME}: missing argument to -d"
exit $E_Syntax
fi
Directory="${2}"
shift
;;
-*) # Error
echo 1>&2 "${PGMNAME}: unknown flag $1"
echo 1>&2 "Usage: $USAGE"
exit $E_Syntax
;;
*) # Domain name
Domain="${1}"
;;
esac
shift
done
Verbose="${Verbose-$DEFAULT_Verbose}"
vFlag="${vFlag-$DEFAULT_vFlag}"
Remove="${Remove-$DEFAULT_Remove}"
rFlag="${rFlag-$DEFAULT_rFlag}"
Recursive="${Recursive-$DEFAULT_Recursive}"
RFlag="${RFlag-$DEFAULT_RFlag}"
Sp="${Sp-$DEFAULT_Sp}"
Domain="${Domain-$DEFAULT_Domain}"
Directory="${Directory-$DEFAULT_Directory}"
# If recursive, can't handle relative domain names!
if $Recursive; then
case "${Domain}" in
/*) # Full path: ok
;;
.*) # Relative path: no go
echo 1>&2 "Cannot specify relative domain names with recursive option."
exit $E_BadDomain
;;
*) # Something's weird, here
echo 1>&2 "Illegal domain name (starts with neither / nor .)"
exit $E_BadDomain
;;
esac
fi
if $Remove; then
Operation="removed"
else
Operation="found"
fi
FoundWriters=false
# First, handle the domain specified. Examine the directory first
if $Verbose; then
if $Recursive; then
echo "Domain ${Domain}"
fi
echo -n "${Sp}${Domain}:${Directory} "
fi
niutil -read ${Domain} ${Directory} 2> /dev/null | bm -s _writers
if [ 0 -eq $? ]; then
# Directory has an _writers
RetCode=$E_FoundWriters
if $Remove; then
niutil -destroyprop ${Domain} ${Directory} _writers 2> /dev/null
fi
if [ 0 -ne $? ]; then
RetCode=$E_NIError
echo 1>&2 "couldn't remove _writers from ${Domain}:${Directory}"
elif $Verbose; then
echo "$Operation _writers"
fi
elif $Verbose; then
echo ""
fi
# Now, examine the directory's subdirectories. We iterate over
# the directory numbers, and then translate things below, to
# protect against directories with slashes in their names (like the
# subdirectories of /mounts).
for dirnum in `niutil -list ${Domain} ${Directory} 2> /dev/null | \
awk '{print $1}'`; do
SubDir=`niutil -read ${Domain} ${dirnum} | \
awk '/^name:/ {printf "%s", $2}'`
if $Verbose; then
echo -n "${Sp}${Domain}:${Directory}/${SubDir} [${dirnum}] "
fi
niutil -read ${Domain} ${dirnum} 2> /dev/null | bm -s "_writers:"
if [ 0 -eq $? ]; then
# Directory has an _writers
RetCode=$E_FoundWriters
if $Remove; then
niutil -destroyprop ${Domain} ${dirnum} _writers 2> /dev/null
fi
if [ 0 -ne $? ]; then
RetCode=$E_NIError
echo 1>&2 \
"couldn't remove _writers from ${Domain}:${Directory}/${SubDir} [${dirnum}]"
continue
elif $Verbose; then
echo -n "$Operation _writers"
fi
fi
if $Verbose; then
echo ""
fi
done
if $Recursive; then
# Examine ${Domain}'s child domains, recursively. Get all the serves
# properties, then turn those into domain names.
niutil -list ${Domain} /machines serves > $TEMP 2> /dev/null
if [ 0 -ne $? ]; then
echo 1>&2 "Could not contact ${Domain}"
else
# The serves properties are in $TEMP; turn them into domain names.
awk -f - > $TEMP.1 $TEMP << \Writers!Fix
{for (i = 2; i <= NF; i++) \
{len = index($i, "/") - 1
if (0 == len) \
{printf "%s ", $i}
else
{printf "%s ", substr($i, 1, len)}}}
Writers!Fix
# Iterate over the child domains
for child in `cat $TEMP.1`; do
if [ "." != "$child" -a ".." != "$child" ]; then
$0 $vFlag $RFlag $rFlag -d "${Directory}" "${Domain}/${child}"
case $? in
$E_OK) # No errors, not found
;;
$E_Syntax | $E_BadDomain) # We blew our call
RetCode=$?
echo 1>&2 "Problem invoking $0 [$RetCode]"
exit $RetCode
;;
$E_NIError) # NetInfo error
RetCode=$?
;;
$E_FoundWriters) # Found an _writers
RetCode=$E_FoundWriters
;;
*) # Shell problem, or something's weird
RetCode=$?
echo 1>&2 "Unexpected return from $0 [$RetCode]"
exit $RetCode
;;
esac
fi
done
fi
fi
rm -f $TEMP $TEMP.1
exit ${RetCode-$E_OK}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.