|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: C T
Length: 17542 (0x4486)
Types: TextFile
Names: »ConfigureMap«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦6429e39db⟧ »EurOpenD3/news/tmnn.7.8.tar.Z«
└─⟦b5a65d78b⟧
└─⟦this⟧ »src/ConfigureMap«
: ConfigureMap -- query user and environment to make a UUCP map entry for site
# written by Eric S. Raymond (snark!eric) for 3.0 netnews
#
# This tool uses configuration symbol information and queries the user to
# update a file of UUCP-project-style map data, which it can then massage
# into a uucp map entry form and ship off to the map maintainers.
#
# Depends on the following ConfigureSys variables:
# date0 machine species sitename
#
# Depends on the following Configure variables:
# date1 libdir myorg notify admdir domainist smarthost mailserv
#
# This tool writes the following files:
# mapdata.sh -- map information in shellscript form
# uucpmap.form -- a pathalias-format map entry file
: these are the default map maintainer addresses for interactive mode
mappers_at=uucpmap@rutgers.edu
mappers_bang=rutgers!uucpmap
: make sure we have preconditions
if test -f ./configsys.sh ; then
echo "Fetching default answers from your configsys.sh file..."
else
echo "There's no configsys.sh here, I'll run ConfigureSys"
ConfigureSys
echo "Fetching default answers from your new configsys.sh file..."
fi
. ./configsys.sh
echo $date0
if test -f ./confignews.sh ; then
echo "Fetching default answers from your old confignews.sh file..."
. ./confignews.sh
echo $date1
else
echo "There's no confignews.sh here; I'll run Configure"
Configure
fi
: where the map entry gets written to
mapform="$libdir/uucpmap.form"
mapdata="$libdir/mapdata.sh"
: we may be trying to run batch, mailing the results to a passed-in addresses
if test $# != 0
then
toaddresses="$*"
if test ! -r "$mapdata" ; then
exit 1 : cannot run batch mode without a map data file
fi
fi
model='' os='' orgname='' contact='' conaddr='' phone='' orgaddr=''
longitude='' latitude='' oncity='undef' downstream=''
domains='' aliases='' connections='' sendto=''
: first, make sure we can see link data
if test -r /usr/lib/uucp/L.sys; then
neighbors=/usr/lib/uucp/L.sys
elif test -r /usr/lib/uucp/Systems; then
neighbors=/usr/lib/uucp/Systems
elif test -r /etc/uucp/Systems; then
neighbors=/etc/uucp/Systems
else
echo "I need read access to your Systems or L.sys file"
exit 1
fi
trap 'rm -f remarks$$; exit 1' 0 1 2 15
if test -f $mapdata ; then
echo "Fetching default answers from your old map data file..."
. $mapdata
echo $mapdate
level=1
else
echo "There's no $mapdata, I won't assume any defaults"
level=0
fi
: get the utilities contains, qq, loc
. ./ConfigureUtils
trap 'rm -f $confighelpers config$$.sh remarks$$ mapentry$$; exit 1' 0 1 2 15
: interactive section starts here
case "$toaddresses" in '')
cat <<EOT
This script will assist you in creating or updating a map entry and
mailing it to the map maintainers.
EOT
echo " "
if $test $level != 0 ; then
set "1. Change configuration, organization, or contact data?" turnon go n;
. qq
fi
case $go in undef|n*) ;; *)
cat <<EOT
The first field of a map entry is a quick description of your equipment.
It consists of a semicolon-separated pair of machine-type and OS-type
information. The first two questions will prompt you for this data.
EOT
: try to be smart about defaults for the next couple of questions
case $machine in
UNIXPC) model='AT&T 3B1' os=3.51;;
SUN) model=`arch` os=SunOS ;;
*) model=unknown os=unknown ;;
esac
: take a stab at the machine type
set "What is the manufacturer and model name of your machine?" name model; . qq
: next the os type
set "What is the maker's name and version number of your OS?" name os; . qq
: get the organization name
echo " "
if $test "X$orgname" = "X" ; then
orgname=`expr "$myorg" : "\(.*\),"`
if $test "X$orgname" = "X" ; then
orgname="$myorg"
fi
fi
echo "Please give the name of your site's sponsoring organization."
set "Name?" name orgname; . qq
: get the organization address
echo " "
if $test "X$orgaddr" = "X" ; then
orgaddr=`expr "$myorg" : ".*, \(.*\)"`
if $test "X$orgaddr" = "X" ; then
orgaddr="$myorg"
fi
fi
echo "Please give the address of your site organization."
set "Address?" name orgaddr; . qq
: now get or change the missile coordinates for the site
cat <<EOT
The latitude, longitude and city questions that come next generate an entry
field in the following format:
#L DD MM [SS] "N"|"S" / DDD MM [SS] "E"|"W" ["city"]
Two fields, with optional third.
First number is Latitude in degrees (NN), minutes (MM), and seconds
(SS), and a N or S to indicate North or South of the Equator.
Second number is Longitude in degrees (DDD), minutes (MM), and
seconds (SS), and a E or W to indicate East or West of the Prime
Meridian in Greenwich, England.
Seconds are optional, but it is worth noting that the more accurate
you are, the more accurate maps we can make of the network (including
blow-ups of various high density areas, like New Jersey, or the
San Francisco Bay Area). Decimal minutes or degrees are NOT allowed.
If you give the coordinates for your city (i.e. without fudging
for where you are relative to that), add the word "city" at the
end of the end of the specification, to indicate that.
EOT
set 'Your latitude (DD MM [SS] "N"|"S")?' name latitude; . qq
set 'Your longitude (DD MM [SS] "E"|"W")?' name longitude; . qq
set "Are these actually for the nearest city?" turnon oncity n; . qq
case oncity in define) city='city' ;; *) city='' ;; esac
: the admin name and email address
cat <<EOT
Next, we need a full name and one or more email addresses for your site
mail and USENET contact person.
Each address should be just a machine name, and a user name, like
"ucbvax!postmaster". It should not be a full path, since we should
be able to generate a path to the given address from the data you're
giving us. There is no problem with the machine name not being the
same as the #N field (e.g. the contact receives mail on another
machine at your site), so long as that site is also in UUCP maps.
Also, it's a good idea to give a generic address or alias (if your
mail system is capable of providing aliases) like "postmaster" or
"usenet", so that if the contact person leaves the institution or
is re-assigned to other duties, he doesn't keep getting mail about
the system. In the Internet, for example, all sites are *required* to
accept mail for "postmaster" and have that pointed at the person at
that site who is responsible for the electronic mail system.
Multiple electronic addresses should be separated by commas, and
all of them should be specified in the manner described above.
EOT
contact=`./grpw -u $notify %r`
set "What is your site contact's full name?" name contact; . qq
if $test "X$conaddr" = "X" ; then
conaddr="postmaster@${fromname}"
fi
set "What is your site contact's email address?" name conaddr; . qq
: and the site admin phone number
cat <<EOT
Please enter your site contact's voice phone in the following format:
+<country code><space><area code><space><prefix><space><number>
Example:
#T +1 415 642 1024
This is the international format for the representation of phone
numbers. The country code for the United States of America (and Canada)
is 1. Other country codes should be listed in your telephone directory.
If you must list an extension (i.e. what to ask the receptionist for,
if not the name of the contact person), list it after the main phone
number with an "x" in front of it to distinguish it from the rest of
the phone number. For example:
#T +1 415 549 3854 x37
Multiple phone numbers should be separated by commas, and all of them
should be completely specified as described above to prevent confusion.
EOT
set "What is your site contact's phone?" name phone; . qq
echo " "
if $test "$smarthost" = "%s"
then
if $test "X$sendto" = "X" ; then
sendto="$mappers_at"
fi
echo "Your mailer does domainist addressing, $mappers_at should work."
else
if $test "X$sendto" = "X" ; then
sendto="$mappers_bang"
fi
echo "Your mailer needs bang-path addresses."
sendto=`expr "$smarthost" : "\(.*\)%s"`$mappers_bang
fi
set "Where should I send map updates?" name sendto ; . qq
;; esac
echo " "
if $test $level != 0 ; then
set "2. Change remarks field?" turnon go n;
. qq
fi
case $go in undef|n*) ;; *)
echo " "
if $test -s "remarks$$"
then
echo "Your Remarks field currently looks like:"
cat <remarks$$
else
echo "Your map entry contains no Remarks field."
fi
set "Do you wish to add special remarks about your site?" turnon rems n; . qq
if $test "$rems" = "define" ; then
while :;
do
echo $n "#R\011$c"
read line
if $test "X$line" = "X" ; then
break;
else
echo "#R\011$line" >>remarks$$
fi
done
echo "Thank you."
fi
;; esac
echo " "
if $test $level != 0 ; then
set "3. Change USENET feed information?" turnon go n;
. qq
fi
case $go in undef|n*) ;; *)
: extract news feed names from the feeds file
echo " "
allfeeds=`sed -n <$admdir/feeds \
-e "/$sitename/d" \
-e '/[Mm][Ee]/d' \
-e '/^\([a-zA-Z][^:]*\):.*/s//\1/p' \
| tr "\012" " "`
if $test X = X$allfeeds; then
echo "You have no downstream sites list."
downstream=""
else
echo "Sites currently listed in your feeds file are: $allfeeds"
echo " "
set - $allfeeds
for x in $*
do
if $expr "$downstream" : ".*$x.*" >/dev/null
then
echo $n "Hide $x from downstream site list? [n] $c"; read ans
case $ans in y*|Y*) ;; *) newdowns="$newdowns $x";; esac
else
echo $n "Add $x to downstream site list? [y] $c"; read ans
case $ans in n*|N*) ;; *) newdowns="$newdowns $x";; esac
fi
done
downstream=`expr "$newdowns" : ' \(.*\)'`
fi
;; esac
: now try for the full name of the entry editor
editor=`./grpw -u ${LOGNAME}${USER} "%r"`
set "Your name, for the #W field: $c" name editor; . qq
echo " "
if $test $level != 0 ; then
set "4. Change gateway or alias data?" turnon go n;
. qq
fi
case $go in undef|n*) ;; *)
echo " "
case $domains in '') dflt=none;; *) dflt=$domains;; esac
echo $n "Domains site is a gateway for? [$dflt] $c"; read ans
case $ans in '') ;; *) domains=$ans;; esac
case $aliases in '') dflt=none;; *) dflt=$aliases;; esac
echo $n "Site aliases? [$dflt] $c"; read ans
case $ans in '') ;; *) aliases=$ans;; esac
;; esac
echo " "
if $test $level != 0 ; then
set "5. Edit pathalias data?" turnon go y;
. qq
fi
case $go in undef|n*) ;; *)
systems=" "`awk <$neighbors '/^[^#]/ {print $1;}' | tr "\012" " "`" "
echo "Sites currently listed in your $neighbors file are: $systems"
echo " "
: make as many passes over the list as user wants
while :;
do
: set our edit mode for this pass over the list
set "Do you want to reveal private links?" turnon reveal n; . qq
set "Do you want to hide links that are now public?" turnon hide n; . qq
set "Do you want to change grades on public links?" turnon change n; . qq
: if we gave any editing actions, edit types and grades on UUCP links
echo " "
if $test "$reveal" = 'define' -o "$change" = 'define' -o "$hide" = 'define'
then
newconnects=""
for x in $systems
do
: for later on we need a copy of the site with any dashes quoted
quoted=`echo "$x" | sed "s/-/DASH/g"`
: if we already have a grade value for this system, retrieve it
eval "grade=\$${quoted}_grade"
: is system in announced list?
if $expr "$connects" : ".* $x .*" >/dev/null
then
if $test "$hide" = define
then
echo $n "Hide link to $x? [n] $c"; read ans
fi
case $ans in y*|Y*) continue ;; esac
elif $test "$reveal" = define -o "X$grade" = "X"; then
echo $n "Announce link to $x? [y] $c"; read ans
case $ans in n*|N*) continue ;; esac
fi
: try to deduce a grade for new connections
if $test "$grade" = ""
then
set - `$grep "$x" "$neighbors"`
case "$3" in
DIR|Dir|DIRECT|Direct|$1) grade="DEDICATED" ;;
*)
case $2 in
Any)
: toll calls default to DEMAND, locals to DIRECT
if expr "X$5" : "X1-.*" >/dev/null ; then
grade="DEMAND"
else
grade="DIRECT"
fi
;;
Any*) grade="EVENING" ;;
Nvr)
: someday we will analyze logfiles to find the
: frequencies for POLLED connections
grade="POLLED" ;;
esac
;;
esac
eval "${quoted}_grade=$grade"
fi
: finally, must we change grades?
if $test "$change" = define -o "$reveal" = define -o "$grade" = ""
then
: find out if user wants default link grade or new value
while :;
do
echo $n "New grade of $x link (? for help)? [$grade] $c";
read ans
case $ans in
'') break ;;
\?*) cat <<EOT
The DEMAND, DAILY, etc., entries represent imaginary connect costs
(see below) used by pathalias to calculate lowest cost paths. The
values of the symbols are:
LOCAL 25 local area network
DEDICATED 95 high speed dedicated
DIRECT 200 local call
DEMAND 300 normal call (long distance, anytime)
HOURLY 500 hourly poll
EVENING 1800 time restricted call
DAILY 5000 daily poll
POLLED 5000 synonym for DAILY
WEEKLY 30000 irregular poll
DEAD a very high number - not usable path
HIGH and LOW (used like DAILY+HIGH) are -5 and +5 respectively, for baud-rate
or other quality bonuses/penalties. Expressions can be used but beware, the
results are often counterintuitive (e.g. (DAILY*4) means every 4 days, not 4
times a day). They represent *costs*, rather than *frequencies*. There is an
assumed high overhead for each hop; thus, HOURLY is far more than DAILY/24.
EOT
;;
LOCAL*) grade="$ans" break ;;
DEDICATED*) grade="$ans" break ;;
DIRECT*) grade="$ans" break ;;
DEMAND*) grade="$ans" break ;;
HOURLY*) grade="$ans" break ;;
EVENING*) grade="$ans" break ;;
DAILY*) grade="$ans" break ;;
WEEKLY*) grade="$ans" break ;;
DEAD*) grade="$ans" break ;;
POLLED*) grade="$ans" break ;;
*) echo "$ans not a valid link grade, type ? for help.";;
esac
done
eval "${quoted}_grade=$grade"
fi
: if we made it this far, keep this system
newconnects="$newconnects $x"
done
connects="$newconnects"
fi
: This may do it for us
set "Done editing?" turnon done n; . qq
if $test "$done" = define
then
break
fi
done
;; esac
date=`date`
echo " "
echo $n "Writing map configuration file...$c"
$spitshell >config$$.sh <<EOT
# Map data file for site $sitename
mapdate="Last map entry update was `date`"
model="$model" # machine make and model
os="$os" # manufacturer's OS designation
orgname="$orgname" # organization name
contact="$contact" # full name of site contact
conaddr="$conaddr" # email address of site contact
phone="$phone" # site contact's phone
orgaddr="$orgaddr" # organization address
latitude="$latitude" # latitude of site
longitude="$longitude" # longitude of site
oncity="$oncity" # 'define' if above are city coordinates
downstream="$downstream" # downstream-site list
sendto='' # where to send map info
# include remarks material here
cat >remarks\$\$ <<__SMASH_THE_STATE__
EOT
cat remarks$$ >>config$$.sh
$spitshell >>config$$.sh <<EOT
__SMASH_THE_STATE__
# domain and alias data
domains="$domains"
aliases="$aliases"
# UUCP connection and grade data
connects="$connects"
EOT
for x in $systems
do
quoted=`echo "$x" | sed "s/-/DASH/g"`
eval "foo=\"\$${quoted}_grade\""
if $test "$foo"
then
echo "${quoted}_grade=$foo" >>config$$.sh
fi
done
echo " " >>config$$.sh
echo "# map data file ends here" >>config$$.sh
mv config$$.sh $mapdata
echo "Done"
: interactive section ends here
;; esac
: derive the OS variety from the species variable in configsys.sh
ostype=''
case $species in
BSD4_3) ostype='4.3BSD';;
BSD4_2) ostype='4.2BSD';;
BSD4_1C) ostype='4.1C ';;
SYSV3) ostype='SVr3';;
SYSV2) ostype='SVr2';;
SYSV1) ostype='SVr1';;
SYS3) ostype='SIII';;
SCO_XENIX) ostype='SCO XENIX V';;
V7) ostype='V7';;
VMS) ostype='VMS';;
esac
if $test "$ostype" ; then
ostype="($ostype)"
fi
: here goes the map entry I/O
echo $n "Writing map entry...$c"
(
cat <<EOS
#N $sitename
#S $processor ($model) ; $ostype ($os)
#O $orgname
#C $contact
#E $conaddr
#T $phone
#P $orgaddr
#L $latitude / $longitude $city
EOS
cat remarks$$
if test "$downstream"
then
echo $n "#U\011$c"
column=8
for token in $downstream
do
width=`expr "$token" : '.*'`
column=`expr $column + $width + 1`
if $test `expr $column \>= 60` = 1
then
column=8
echo $n "\012#U\011$c"
fi
echo $n "${token} $c"
done
echo " "
fi
cat <<EOS
#W ${editor}; ${date}
#
EOS
case $domains in '') ;; *) echo "$sitename\011$domains" ;; esac
case $aliases in '') ;; *) echo "${sitename}=\011$aliases" ;; esac
echo $n "${sitename}\011$c"
column=8
for x in $connects
do
: extreme hairiness here to cope with the fact that
: the dash character is not legal in shell variable names
quoted=`echo "$x" | sed "s/-/DASH/g"`
eval "token=\"${quoted}(\$${quoted}_grade),\""
token=`echo "$token" | sed "s/DASH/-/g"`
width=`expr "$token" : '.*'`
column=`expr $column + $width + 1`
if $test `expr $column \>= 60` = 1
then
column=8
echo $n "\012\011$c"
fi
echo $n "$token $c"
done
echo " "
) \
| sed '$s/, *$//' >mapentry$$
mv mapentry$$ $mapform
echo "Done"
case "$toaddresses" in
'')
set "Mail a copy to the map maintainers?" turnon go n; . qq
case $go in undef|n*) ;; *)
$mailserv $sendto <$mapform
;; esac
;;
*) $mailserv $toaddresses <$mapform ;;
esac
# ConfigureMap ends here