|
|
1.1 ! root 1: : ! 2: # @(#)shipout (ulysses!{dgk,gsf}) 01/31/91 ! 3: # ! 4: # shipout [ options ... ] [ name ... ] [ tool ... ] ! 5: # ! 6: # ship software to recipient using system|user info in $SHIPINFO ! 7: # ! 8: # options -- + turns the corresponding option off ! 9: # ! 10: # -b ship bases with deltas ! 11: # -c don't generate tool closure ! 12: # -d don't ship deltas ! 13: # -i list info on specified recipient(s) only ! 14: # -k mark recipient(s) as having received tool(s) ! 15: # -l file list of people to ship to ! 16: # -m don't send shipment manifest mail message ! 17: # -n show but don't execute ! 18: # -o set shipment ownership to shipper ! 19: # -p name next argument is a recipient to ship to ! 20: # -s don't send shipment support files ! 21: # -t don't execute but show total shipment ! 22: # -u [[yy]mm]dd ignore db info for date pattern ! 23: # -v yymmdd override current date stamp ! 24: # -C files add to default crate file list ! 25: # -D secs delay in seconds between sends ! 26: # -F force db override ! 27: # -S files add to default support file list ! 28: # ! 29: # name -- recipient address ! 30: # ! 31: # machine!user uucp address ! 32: # host:directory rcp address ! 33: # *%compress generates compressed cpio archive on stdout ! 34: # *%list generates shipment file list ! 35: # *%pull generates sh script with datakit pull's ! 36: # *%push generates sh script with datakit push's ! 37: # ! 38: # the message file is evaluated by the shell and the following variables ! 39: # are predefined by ship: ! 40: # ! 41: # f list of expanded file names ! 42: # name name of shipee ! 43: # ! 44: ! 45: umask 02 ! 46: PATH=:$PATH ! 47: ! 48: SHIPSLOG=${SHIPSLOG:-shipslog} ! 49: SHIPINFO=${SHIPINFO:-$SHIPSLOG/info} ! 50: SHIPFILES="README shipin shipout" ! 51: SHIPMENT=*[0-9][0-9][0-9][0-9][0-9][0-9] ! 52: SHIPPER=${SHIPPER:-${USER:-${LOGNAME:-${HOME##*/}}}} ! 53: SHIPSPOOL=${SHIPSPOOL:-/usr/spool/uucppublic} ! 54: CRATEFILES="items message promo release report" ! 55: TMP=${TMPDIR:=/tmp}/ship$$ ! 56: FROMSYS=$((uname -n || hostname || cat /etc/whoami) 2>/dev/null) ! 57: ! 58: test -f shipinit && . ./shipinit ! 59: ! 60: function errexit ! 61: { ! 62: # print out an error message on unit 2 and exit ! 63: print -u2 - "$command: $@" ! 64: exit 1 ! 65: } ! 66: ! 67: function warning ! 68: { ! 69: print -u2 - "$command: warning: $@" ! 70: } ! 71: ! 72: function cleanup # exitcode ! 73: { ! 74: db_done ! 75: rm -f $TMP.? ! 76: exit $1 ! 77: } ! 78: ! 79: db_data= ! 80: db_db= ! 81: db_key_base= ! 82: db_key_delta= ! 83: db_status= ! 84: db_style= ! 85: ! 86: # ! 87: # send request to dbm server ! 88: # status returned in db_status ! 89: # data returned in db_data ! 90: # ! 91: ! 92: function db_request # request ! 93: { ! 94: print -p "$@" ! 95: read -p db_status db_data ! 96: case $db_debug in ! 97: ?*) print -u2 DB: "$@": $db_status $db_data ;; ! 98: esac ! 99: case $db_status in ! 100: I) return 0 ;; ! 101: E) print -u2 $logfile: $db_data; return 1 ;; ! 102: *) return 1 ;; ! 103: esac ! 104: } ! 105: ! 106: # ! 107: # initialize db ! 108: # ! 109: ! 110: function db_init # machine user ! 111: { ! 112: case $db_debug in ! 113: grep) db_style=grep ;; ! 114: esac ! 115: case $db_style in ! 116: "") if (shipdbm) </dev/null >/dev/null 2>&1 ! 117: then db_style=dbm ! 118: logfile=$SHIPSLOG/log ! 119: shipdbm |& ! 120: db_request om$logfile || db_request oc$logfile || errexit $logfile: cannot access log ! 121: db_db=$db_data ! 122: else db_style=grep ! 123: fi ! 124: ;; ! 125: esac ! 126: case $db_style in ! 127: dbm) first_time=0 ! 128: db_request s$db_db ! 129: db_check - $1 $2 shipin "*" base || first_time=1 ! 130: ;; ! 131: grep) typeset -L2 dir=$1 ! 132: case $logfile in ! 133: ?*) mv $logfile $SHIPSLOG/.tmp. ! 134: sort -r < $SHIPSLOG/.tmp. | sort -m -u +0 -1 > $logfile ! 135: rm -f $SHIPSLOG/.tmp. ! 136: ;; ! 137: esac ! 138: logfile=$SHIPSLOG/$dir/$1/$2 ! 139: if test "" = "$force" -a -r "$logfile" ! 140: then first_time=0 ! 141: else first_time=1 ! 142: case $noexec in ! 143: "") if test ! -d "$SHIPSLOG/$dir" ! 144: then mkdir "$SHIPSLOG/$dir" || logfile=$SHIPSLOG/log ! 145: fi ! 146: if test ! -d "$SHIPSLOG/$dir/$1" ! 147: then mkdir "$SHIPSLOG/$dir/$1" || logfile=$SHIPSLOG/log ! 148: fi ! 149: ;; ! 150: esac ! 151: fi ! 152: ;; ! 153: esac ! 154: } ! 155: ! 156: # ! 157: # end db interaction ! 158: # ! 159: ! 160: function db_done # ! 161: { ! 162: case $noexec in ! 163: "") case $db_style in ! 164: dbm) case $db_db in ! 165: ?*) db_request c$db_db && db_request q ;; ! 166: esac ! 167: ;; ! 168: grep) case $logfile in ! 169: ?*) mv $logfile $SHIPSLOG/.tmp. ! 170: sort -r < $SHIPSLOG/.tmp. | sort -m -u +0 -1 > $logfile ! 171: rm -f $SHIPSLOG/.tmp. ! 172: ;; ! 173: esac ! 174: ;; ! 175: esac ! 176: ;; ! 177: esac ! 178: } ! 179: ! 180: # ! 181: # check if < machine user tool version type > was sent ! 182: # ! 183: ! 184: function db_check # [ - ] machine user tool version type ! 185: { ! 186: typeset k key ks sav x nocheck= ! 187: case $first_time:$force in ! 188: 1:*|*:1) return 1 ;; ! 189: esac ! 190: case $1 in ! 191: -) shift; nocheck=1 ;; ! 192: esac ! 193: typeset a=$1!$2 n=$3 v=$4 t=$5 m ! 194: case $5 in ! 195: "*") ks="base delta" ;; ! 196: base) ks=base ;; ! 197: *) ks=delta ;; ! 198: esac ! 199: for k in $ks ! 200: do key=$a,$n,$k ! 201: eval sav=\$db_key_$k ! 202: case $key in ! 203: $sav) eval set -- \$db_val_$k ! 204: ;; ! 205: *) case $db_style in ! 206: dbm) if db_request g$db_db$key ! 207: then set -- $db_data ! 208: else continue ! 209: fi ! 210: ;; ! 211: grep) set -- `grep "^$key" $logfile` ! 212: case $# in ! 213: 0) continue ;; ! 214: esac ! 215: shift ! 216: ;; ! 217: esac ! 218: eval db_key_$k='$key' db_val_$k='$*' ! 219: ;; ! 220: esac ! 221: case $1/$2 in ! 222: $v/$t) case $undo:$nocheck in ! 223: :*|*:1) ;; ! 224: *) continue ;; ! 225: esac ! 226: case $3 in ! 227: $undo) continue ;; ! 228: *) ;; ! 229: esac ! 230: case $v in ! 231: "*") return 0 ;; ! 232: esac ! 233: ;; ! 234: *) case "$v" in ! 235: "*") return 0 ;; ! 236: esac ! 237: continue ! 238: ;; ! 239: esac ! 240: if test -d $n ! 241: then m=$(shipop time $n/$1/$2) ! 242: else m=$(shipop time $n) ! 243: fi ! 244: case $6 in ! 245: ""|$m) return 0 ;; ! 246: *) return 1 ;; ! 247: esac ! 248: done ! 249: return 1 ! 250: } ! 251: ! 252: # ! 253: # note that < machine user tool version type > was sent ! 254: # ! 255: ! 256: function db_note # machine user tool version type name ! 257: { ! 258: typeset k v m ! 259: case $5 in ! 260: base) k=base ;; ! 261: *) k=delta ;; ! 262: esac ! 263: if test -d $3 ! 264: then m=$(shipop time $3/$4/$5) ! 265: else m=$(shipop time $3) ! 266: fi ! 267: v="$1!$2,$3,$k $4 $5 $date $SHIPPER $6 $m" ! 268: case $db_style in ! 269: dbm) db_request p$db_db$v ;; ! 270: grep) print $v >> $logfile ;; ! 271: esac ! 272: } ! 273: ! 274: # ! 275: # output SHIPMENT stamp for file [current date] ! 276: # ! 277: ! 278: function shipstamp # file ! 279: { ! 280: typeset -Z2 day month ! 281: typeset -R2 year ! 282: integer mon Jan=1 Feb=2 Mar=3 Apr=4 May=5 Jun=6 \ ! 283: Jul=7 Aug=8 Sep=9 Oct=10 Nov=11 Dec=12 ! 284: case $# in ! 285: 0) set -- $(date) ! 286: shift 1 ! 287: ;; ! 288: *) set -- $(ls -ld $1) ! 289: while : ! 290: do case $# in ! 291: [01]) break ;; ! 292: esac ! 293: case $1 in ! 294: Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ! 295: case $2 in ! 296: [1-9]|[0-3][0-9]) ! 297: case $3 in ! 298: [0-9]*) break ;; ! 299: esac ! 300: ;; ! 301: esac ! 302: ;; ! 303: ! 304: esac ! 305: shift ! 306: done ! 307: ;; ! 308: esac ! 309: mon=$1 ! 310: day=$2 ! 311: month=$mon ! 312: case $3 in ! 313: *:*:*) year=$5 ! 314: ;; ! 315: *:*) set -- $(date) ! 316: year=$6 ! 317: if (($mon > $2)) ! 318: then let year=year-1 ! 319: fi ! 320: ;; ! 321: *) year=$3 ! 322: ;; ! 323: esac ! 324: print $year$month$day ! 325: } ! 326: ! 327: # ! 328: # prepare $tool for shipping -- $tool.000 always created ! 329: # ! 330: ! 331: function package ! 332: { ! 333: typeset tool=$1 ! 334: integer nblocks=${2-20} ! 335: ! 336: integer size i=0 skip=0 ! 337: integer chunksize=nblocks*8*1024 ! 338: typeset -RZ3 suffix ! 339: typeset fsize ! 340: print packaging $tool ! 341: rm -f "$tool".??? ! 342: fsize=$(wc -c $tool) ! 343: size=${fsize%$tool} ! 344: if ((size <= chunksize)) ! 345: then ln "$tool" "$tool".000 ! 346: else while (( size > 0)) ! 347: do suffix=$i ! 348: dd if="$tool" of="$tool.$suffix" bs=8k skip=$skip count=$nblocks 2> /dev/null ! 349: let i=i+1 skip=skip+nblocks size=size-chunksize ! 350: done ! 351: fi ! 352: set -- "$tool".??? ! 353: case $1 in ! 354: *.\?\?\?) errexit "$tool: cannot package" ;; ! 355: esac ! 356: } ! 357: ! 358: function gencontrol # tool ! 359: { ! 360: typeset tool=${1%/*} ! 361: typeset format=${1#$tool/} ! 362: typeset init ! 363: if test -f $1 ! 364: then if test $1 -nt $1.000 ! 365: then package $1 ! 366: fi ! 367: set -- $1.??? ! 368: else # $SHIPFILES ! 369: print - "cp $date.$SHIPPER/${tool%/*} \$INSTALLROOT/ship" >> $TMP.u ! 370: return ! 371: fi ! 372: tooldir=${tool%%/*} ! 373: { ! 374: cat <<-! ! 375: if test ! -f "\$INSTALLROOT/ship/$tooldir/items" ! 376: then ! 377: ! ! 378: case $format in ! 379: base) init= ;; ! 380: *) init=$basetoo ;; ! 381: esac ! 382: case $init in ! 383: "") cat <<-! ! 384: if test ! -d "\$INSTALLROOT/ship/$tooldir" ! 385: then mkdir "\$INSTALLROOT/ship/$tooldir" ! 386: fi ! 387: rm -rf "\$INSTALLROOT/ship/$tool" ! 388: mkdir "\$INSTALLROOT/ship/$tool" ! 389: ! ! 390: ;; ! 391: esac ! 392: cat <<-! ! 393: if cat $tool/$format.??? > \$INSTALLROOT/ship/$tool/$format ! 394: then rm -f $tool/$format.??? ! 395: fi ! 396: ! ! 397: case $init in ! 398: "") for i in $CRATEFILES ! 399: do if test -s $tool/$i ! 400: then print - "echo \"$(cat $tool/$i 2>/dev/null)\" > \$INSTALLROOT/ship/$tool/$i" ! 401: elif test -f $tool/$i ! 402: then print - "> \$INSTALLROOT/ship/$tool/$i" ! 403: fi ! 404: done ! 405: if test "" = "$shipper" -a -s $tool/owner ! 406: then owner=$(<$tool/owner) ! 407: else owner=$SHIPPER ! 408: fi ! 409: case ${TOSYS##*!} in ! 410: ${owner%%!*}) owner=${TOSYS%!*}!$owner ;; ! 411: *) owner=$TOSYS!$owner ;; ! 412: esac ! 413: print - "echo \"$owner\" > \$INSTALLROOT/ship/$tool/owner" ! 414: ;; ! 415: esac ! 416: cat <<-! ! 417: fi ! 418: ! ! 419: } >> $TMP.u ! 420: } ! 421: ! 422: function buildscript # machine user ! 423: { ! 424: # create mscript to execute as a . script ! 425: typeset tool format ! 426: integer delta=0 first=1 no_shipin ! 427: mscript=$TMP.s tfile=$TMP.f ! 428: case $message in ! 429: ?*) { ! 430: print "cat > $tfile <<!EOF!" ! 431: print "Subject: software shipment" ! 432: if test -f ship.body ! 433: then print ! 434: cat ship.body ! 435: else f=${name#*,} ! 436: l=${name%,*} ! 437: case $f in ! 438: $l) ;; ! 439: *) print "\ ! 440: ! 441: Dear ${name#*,} ${name%,*}:" ;; ! 442: esac ! 443: if test -f ship.head ! 444: then cat ship.head ! 445: print ! 446: fi ! 447: if db_check $1 $2 shipin "*" base ! 448: then no_shipin=0 ! 449: else no_shipin=1 ! 450: fi ! 451: if ((first_time||no_shipin)) ! 452: then print "\ ! 453: ! 454: As a first time recipient: ! 455: ! 456: (1) Wait for a \\\`copy succeeded' message from uucp for the file: ! 457: ! 458: \$user/$FROMSYS/$date.$SHIPPER/manifest ! 459: ! 460: (2) For safety do not run as root. If you are not running as \$user then: ! 461: ! 462: RECIPIENT=\$user ! 463: export RECIPIENT ! 464: ! 465: (3) Create a shipment root directory under which all source and binaries ! 466: will be generated. This should not be a final installation directory. ! 467: ! 468: INSTALLROOT=<shipment-root-directory> ! 469: test -d \\\$INSTALLROOT || mkdir \\\$INSTALLROOT ! 470: cd \\\$INSTALLROOT ! 471: test -d ship || mkdir ship ! 472: ! 473: (4) Name the uucp shipment spool directory: ! 474: ! 475: SHIPSPOOL=$uuspool/\$user/$FROMSYS ! 476: ! 477: however if $uuspool/\$user/$FROMSYS was copied to \\\$SPOOLROOT then: ! 478: ! 479: SHIPSPOOL=\\\$SPOOLROOT ! 480: ! 481: (5) If your system has att and bsd/ucb universes then in general the tools ! 482: will have more functionality when built in the bsd/ucb universe. You ! 483: can set the C compiler name and/or flags by: ! 484: ! 485: CC='hackcc -systype bsd43' CCFLAGS='-g' # just an example # ! 486: export CC CCFLAGS ! 487: ! 488: (6) Execute the following commands to unpack and install the shipment: ! 489: ! 490: export SHIPSPOOL ! 491: cp \\\$SHIPSPOOL/$date.$SHIPPER/shipin ship/shipin ! 492: chmod 0755 ship/shipin ! 493: nohup ship/shipin & ! 494: ! 495: (7) Use shipout within \\\$INSTALLROOT/ship to ship to other machines. ! 496: \\\$INSTALLROOT/ship/README contains more detailed information. ! 497: " ! 498: else print "\ ! 499: ! 500: As a repeat recipient: ! 501: ! 502: (1) Wait for a \\\`copy succeeded' message from uucp for the file: ! 503: ! 504: \$user/$FROMSYS/$date.$SHIPPER/manifest ! 505: ! 506: (2) For safety do not run as root. If you are not running as \$user then: ! 507: ! 508: RECIPIENT=\$user ! 509: export RECIPIENT ! 510: ! 511: (3) Name the directory under which previous shipments were installed: ! 512: ! 513: INSTALLROOT=<shipment-root-directory> ! 514: ! 515: (4) If $uuspool/\$user/$FROMSYS was copied to \\\$SPOOLROOT then: ! 516: ! 517: SHIPSPOOL=\\\$SPOOLROOT ! 518: export SHIPSPOOL ! 519: ! 520: (5) If your system has att and bsd/ucb universes then in general the tools ! 521: will have more functionality when built in the bsd/ucb universe. You ! 522: can set the C compiler name and/or flags by: ! 523: ! 524: CC='hackcc -systype bsd43' CCFLAGS='-g' # just an example # ! 525: export CC CCFLAGS ! 526: ! 527: (6) Execute the following commands to unpack and install the shipment: ! 528: ! 529: cd \\\$INSTALLROOT ! 530: nohup ship/shipin & ! 531: ! 532: (7) Use shipout within \\\$INSTALLROOT/ship to ship to other machines. ! 533: \\\$INSTALLROOT/ship/README contains more detailed information. ! 534: " ! 535: fi ! 536: fi ! 537: typeset -L n='tool ' d='release ' ! 538: t='type' ! 539: print "\ ! 540: This distribution contains: ! 541: ! 542: $n$d$t" ! 543: n=---- ! 544: d=------- ! 545: t=---- ! 546: print "\ ! 547: $n$d$t" ! 548: for tool in "${ship_list[@]}" ! 549: do format=${tool##*/} ! 550: tool=${tool%/$format} ! 551: test -r $tool && eval _notes_${tool%%/*}=0 ! 552: n=${tool%%/*} ! 553: d=${tool##*/} ! 554: case $format in ! 555: base) t="base" ;; ! 556: $SHIPMENT) t="$format delta" delta=1 ;; ! 557: *) errexit "$format: invalid format" ;; ! 558: esac ! 559: print " $n$d$t" ! 560: done ! 561: print ! 562: if ((delta)) ! 563: then print "\ ! 564: Unpacking delta shipments requires the new pax command. ! 565: " ! 566: fi ! 567: for tool in "${ship_list[@]}" ! 568: do if test ! -r $tool ! 569: then continue ! 570: fi ! 571: format=${tool##*/} ! 572: tool=${tool%/$format} ! 573: if test -s "$tool/message" ! 574: then item=${tool%%/*} ! 575: eval x='$'_notes_$item ! 576: case $x in ! 577: 0) print "\ ! 578: $item notes: ! 579: " ! 580: eval _notes_$item=1 ! 581: ;; ! 582: 1) if cmp -s "$tool/message" "$item/$format/message" ! 583: then continue ! 584: fi ! 585: ;; ! 586: esac ! 587: cat "$tool/message" ! 588: print ! 589: fi ! 590: done ! 591: if test -f ship.tail ! 592: then cat ship.tail ! 593: elif test -f $HOME/.signature ! 594: then cat $HOME/.signature ! 595: fi ! 596: print '!EOF!' ! 597: case $noexec in ! 598: "") print 'mail $mail < $tfile' ! 599: ;; ! 600: *) print 'print "mail $mail <<!EOF!"' ! 601: print "cat $tfile" ! 602: print 'echo !EOF!' ! 603: ;; ! 604: esac ! 605: } > $mscript ! 606: ;; ! 607: esac ! 608: } ! 609: ! 610: function tosys # machine ! 611: { ! 612: # construct return mail address ! 613: typeset IFS=! ! 614: TOSYS= ! 615: for i in $@ ! 616: do TOSYS=$i!$TOSYS ! 617: done ! 618: case $TOSYS in ! 619: $FROMSYS!) TOSYS= ;; ! 620: esac ! 621: TOSYS=$TOSYS$FROMSYS ! 622: } ! 623: ! 624: function genshiplist # machine user mail ! 625: { ! 626: typeset tool file x n v t need_pax= missing= ! 627: integer i=0 j=0 ! 628: lclfiles= rmtfiles= ! 629: db_init $1 $2 ! 630: db_check - $1 $2 pax "*" base || need_pax=1 ! 631: machine=$1 ! 632: user=$2 ! 633: mail=$3 ! 634: unset ship_list ! 635: for file in $SHIPFILES ! 636: do if test ! -r "$file" ! 637: then continue ! 638: fi ! 639: v=$(shipstamp $file) ! 640: if db_check $machine $user $file $v base ! 641: then continue ! 642: fi ! 643: ship_list[i]=$file/$v/base ! 644: i=i+1 ! 645: done ! 646: j=i ! 647: for tool in "${tool_list[@]}" ! 648: do n=${tool%%/*} ! 649: case $need_pax in ! 650: "") eval t=\$type_$n ! 651: case $t in ! 652: pax) continue ;; ! 653: esac ! 654: ;; ! 655: esac ! 656: v=${tool#*/} ! 657: v=${v%/*} ! 658: t=${tool##*/} ! 659: case $tool in ! 660: */*/$SHIPMENT) ! 661: if db_check $machine $user $n $t "*" ! 662: then case $basetoo in ! 663: ?*) if db_check $machine $user $n $v base ! 664: then : ! 665: elif test -f $n/$v/base ! 666: then ship_list[i]=$n/$v/base ! 667: i=i+1 ! 668: else print -u2 "$n/$v/base: missing base archive" ! 669: missing=1 ! 670: fi ! 671: ;; ! 672: *) case $noexec in ! 673: "") db_note $machine $user $n $t base $name ;; ! 674: esac ! 675: ;; ! 676: esac ! 677: elif test -f "$n/$v/base" ! 678: then if db_check $machine $user $n $v base ! 679: then case $basetoo in ! 680: "") continue ;; ! 681: esac ! 682: else ship_list[i]=$n/$v/base ! 683: i=i+1 ! 684: case $basetoo in ! 685: "") continue ;; ! 686: esac ! 687: fi ! 688: elif test -f $n/$t/base ! 689: then ship_list[i]=$n/$t/base ! 690: i=i+1 ! 691: else print -u2 "$n/$t/base: missing base archive" ! 692: missing=1 ! 693: fi ! 694: ;; ! 695: esac ! 696: if db_check $machine $user $n $v $t ! 697: then continue ! 698: fi ! 699: ship_list[i]=$tool ! 700: eval clean_$n= ! 701: i=i+1 ! 702: done ! 703: case $missing in ! 704: ?*) exit 1 ;; ! 705: esac ! 706: if ((j>=i)) ! 707: then case $total in ! 708: "") print -u2 "$mail is up to date" ;; ! 709: *) print -u2 "\n$mail: up to date" ;; ! 710: esac ! 711: return 0 ! 712: else case $mark in ! 713: ?*) case $user:$noexec in ! 714: ?*:) for tool in "${ship_list[@]}" ! 715: do x=${tool#*/} ! 716: x=${x%/*} ! 717: db_note $machine $user ${tool%%/*} $x ${tool##*/} $name ! 718: done ! 719: ;; ! 720: esac ! 721: return 0 ! 722: ;; ! 723: esac ! 724: case $total in ! 725: ?*) print -u2 "\n$mail:" ! 726: PS3='' ! 727: select i in ${ship_list[*]} ! 728: do : ! 729: done </dev/null ! 730: return 0 ! 731: ;; ! 732: esac ! 733: fi ! 734: return 1 ! 735: } ! 736: ! 737: function sendcontrol # machine user ! 738: { ! 739: # $transport the control file to <user> on given <machine> ! 740: case $transport in ! 741: uucp) typeset dest=$1!$uupublic/$2/$FROMSYS/$date.$SHIPPER ! 742: print "$rmtfiles ! 743: $date.$SHIPPER/unspool ! 744: $date.$SHIPPER/manifest" > $TMP.m ! 745: print uucp -r -C $TMP.u $dest/unspool ! 746: case $noexec in ! 747: "") uucp -r -C $TMP.u $dest/unspool ;; ! 748: esac ! 749: case $SHIPID in ! 750: ?*) print $date.$SHIPPER/id >> $TMP.m ! 751: id="$SHIPPER SEAL $(date) $1!$2" ! 752: print "$1!$SHIPID $id" > $TMP.i ! 753: print uucp -r -C $TMP.i $dest/id ! 754: case $noexec in ! 755: "") uucp -r -C $TMP.i $dest/id ;; ! 756: esac ! 757: case $noexec in ! 758: "") print "$id\t$(shipop seal $lclfiles $TMP.u $TMP.m $TMP.i)" >> $SHIPSLOG/seals ! 759: ;; ! 760: esac ! 761: ;; ! 762: esac ! 763: print uucp -r -C -m -n"$2" $TMP.m $dest/manifest ! 764: case $noexec in ! 765: "") uucp -r -C -m -n"$2" $TMP.m $dest/manifest ;; ! 766: esac ! 767: ;; ! 768: uuto) print uuto -m $TMP.u $1!$2 ! 769: case $noexec in ! 770: "") uuto -m $TMP.u $1!$2 ;; ! 771: esac ! 772: ;; ! 773: esac ! 774: case $noexec in ! 775: ?*) case $SHIPID in ! 776: ?*) print "ID:" ! 777: cat $TMP.i ! 778: ;; ! 779: esac ! 780: print "MANIFEST:" ! 781: cat $TMP.m ! 782: print "UNSPOOL:" ! 783: cat $TMP.u ! 784: ;; ! 785: esac ! 786: } ! 787: ! 788: function doship # ! 789: { ! 790: # ship the files ! 791: typeset i j tool file ! 792: integer d ! 793: case "$info" in ! 794: ?*) fixedname=${name%% *} ! 795: print "$fixedname $address $phone $mail $company $project $transport" ! 796: return ! 797: esac ! 798: user=${mail##*!} machine=${mail%!*} ! 799: user=${user%%@*} machine=${machine#*@} ! 800: target=$machine!~/$user/$FROMSYS ! 801: uuspool=$SHIPSPOOL ! 802: case $transport in ! 803: uucp) uupublic='~' ! 804: ;; ! 805: uuto) uuspool=$uuspoool/receive ! 806: uupublic=$uuspool ! 807: print -u2 $transport: transport not supported for $user ! 808: return ! 809: ;; ! 810: *) print -u2 $transport: unknown transport for $user ! 811: return ! 812: ;; ! 813: esac ! 814: if genshiplist $machine $user $mail ! 815: then return ! 816: fi ! 817: tosys $machine ! 818: > $TMP.u ! 819: for i in "${ship_list[@]}" ! 820: do gencontrol "$i" ! 821: done ! 822: buildscript $machine $user ! 823: dtime=0 ! 824: for tool in "${ship_list[@]}" ! 825: do for i in $tool.??? ! 826: do case $i in ! 827: *.\?\?\?) ! 828: d=50 ! 829: if test -f $tool ! 830: then i=$tool j=$tool.000 ! 831: else # here for $SHIPFILES ! 832: i=${tool%%/*}; j=$date.$SHIPPER/$i ! 833: fi;; ! 834: *.000) j=$i d=50;; ! 835: *) j=$i d=100;; ! 836: esac ! 837: dfile=$target/$j ! 838: if test -f "$i" ! 839: then lclfiles="$lclfiles $i" ! 840: case $rmtfiles in ! 841: "") rmtfiles=$j ! 842: ;; ! 843: *) rmtfiles="$rmtfiles ! 844: $j" ! 845: ;; ! 846: esac ! 847: print uucp -r $nocopy $PWD/"$i" "$dfile" ! 848: case $noexec in ! 849: "") uucp -r $nocopy $PWD/"$i" "$dfile" ! 850: dtime=dtime+d ! 851: ;; ! 852: esac ! 853: fi ! 854: done ! 855: i=${tool#*/} ! 856: i=${i%/*} ! 857: case $noexec in ! 858: "") db_note $machine $user ${tool%%/*} $i ${tool##*/} $name ;; ! 859: esac ! 860: done ! 861: if test -r $mscript ! 862: then . $mscript ! 863: fi ! 864: sendcontrol $machine $user ! 865: } ! 866: ! 867: function dosend # recipient open ! 868: { ! 869: # lookup <recipient> in database and transport software to them ! 870: # if <open> is given, the database is re-opened ! 871: addr=$1 ! 872: case $addr in ! 873: *:*) transport=rcp ! 874: mail=$1 ! 875: host=${addr%:*} ! 876: machine=$host ! 877: dir=${addr#*:} ! 878: user=${dir%%/*} ! 879: case $user in ! 880: '~'*) user=${user#~} ;; ! 881: *) user=$SHIPPER ;; ! 882: esac ! 883: ;; ! 884: *!*) name=${1##*!} transport=uucp ! 885: ;; ! 886: *@*) name=${1%%@*} transport=uucp ! 887: ;; ! 888: *%compress|*%list|*%pull|*%push) ! 889: mail=$addr ! 890: transport=${addr##*'%'} ! 891: machine=%$transport ! 892: user=${addr%$machine} ! 893: dir=. ! 894: ;; ! 895: *) transport=db ! 896: ;; ! 897: esac ! 898: case $transport in ! 899: uucp) address= phone= mail=$1 project= ! 900: doship ! 901: return 1 ! 902: ;; ! 903: db) typeset -l given match ! 904: case $shipinfo_test in ! 905: "") if test ! -f "$SHIPINFO" ! 906: then errexit "$SHIPINFO: cannot find information file" ! 907: fi ! 908: shipinfo_test=1 ! 909: ;; ! 910: esac ! 911: case $2 in ! 912: ?*) exec 3< $SHIPINFO ;; ! 913: esac ! 914: given=$1 ! 915: while IFS=: read -ru3 name address phone mail company project unused transport comments ! 916: do match=$name ! 917: case $match in ! 918: \#*) ;; ! 919: $given*) doship ! 920: return 1 ! 921: ;; ! 922: esac ! 923: done ! 924: ;; ! 925: *) typeset d i p s ! 926: if genshiplist $machine $user $mail ! 927: then return 1 ! 928: fi ! 929: tosys $machine ! 930: { ! 931: case $transport in ! 932: compress|list|push) ! 933: ;; ! 934: *) print - "umask 02" ! 935: ;; ! 936: esac ! 937: for i in "${ship_list[@]}" ! 938: do if test -f $i ! 939: then d=$i/file ! 940: p=${d%%/*} ! 941: s=${d#${p}/} ! 942: t=$p ! 943: while test "$s" != file ! 944: do if test "" != "$p" ! 945: then case $transport in ! 946: compress|list) ! 947: print - "$dir/$p" ! 948: ;; ! 949: push) ;; ! 950: *) print - "if test ! -d $dir/$p" ! 951: print - "then mkdir $dir/$p" ! 952: print - "fi" ! 953: ;; ! 954: esac ! 955: fi ! 956: p=${p}/${s%%/*} ! 957: s=${d#${p}/} ! 958: done ! 959: i=${i%/*} ! 960: for f in $CRATEFILES ! 961: do if test -s $i/$f ! 962: then case $transport in ! 963: compress|list|push) ! 964: print - "$dir/$i/$f" ! 965: ;; ! 966: *) print - "echo \"$(cat $i/$f 2>/dev/null)\" > $dir/$i/$f" ! 967: ;; ! 968: esac ! 969: elif test -f $i/$f ! 970: then case $transport in ! 971: compress|list|push) ! 972: print - "$dir/$i/$f" ! 973: ;; ! 974: ! 975: *) print - "> $dir/$i/$f" ! 976: ;; ! 977: esac ! 978: fi ! 979: done ! 980: case $transport in ! 981: compress|list|push) ! 982: if test -s $i/owner ! 983: then print - "$dir/$i/owner" ! 984: fi ! 985: ;; ! 986: *) if test "" = "$shipper" -a -s $i/owner ! 987: then owner=$(<$i/owner) ! 988: else owner=$SHIPPER ! 989: fi ! 990: case ${TOSYS##*!} in ! 991: ${owner%%!*}) owner=${TOSYS%!*}!$owner ;; ! 992: *) owner=$TOSYS!$owner ;; ! 993: esac ! 994: print - "echo \"$owner\" > $dir/$i/owner" ! 995: ;; ! 996: esac ! 997: fi ! 998: done ! 999: case $transport in ! 1000: list|push) ! 1001: ;; ! 1002: *) print - "rm -f $dir/ship.$date" ! 1003: ;; ! 1004: esac ! 1005: } | case $transport:$noexec in ! 1006: compress:) ! 1007: cat ! 1008: ;; ! 1009: compress:*) ! 1010: print - "(pax -wv | compress${mail:+" > $mail"}) <<!" ! 1011: cat ! 1012: ;; ! 1013: list:*) cat ! 1014: ;; ! 1015: pull:*) print - ': pull shipment from remote dk host' ! 1016: print - 'case $# in' ! 1017: print - '1|2) ;;' ! 1018: print - '*) echo "Usage: $0 dk-address [remote-INSTALLROOT]" >&2; exit 1 ;;' ! 1019: print - 'esac' ! 1020: print - 'DK_ADDRESS=$1' ! 1021: print - 'DK_INSTALLROOT=${2-.}' ! 1022: cat ! 1023: ;; ! 1024: push:*) print - ': push shipment to remote dk host' ! 1025: print - 'case $# in' ! 1026: print - '1|2) ;;' ! 1027: print - '*) echo "Usage: $0 dk-address [remote-INSTALLROOT]" >&2; exit 1 ;;' ! 1028: print - 'esac' ! 1029: print - 'push $1 - ${2-ship} <<"!"' ! 1030: cat ! 1031: ;; ! 1032: *:) cat > $TMP.r ! 1033: rcp $TMP.r $host:$dir/ship.$date || exit ! 1034: rm -f $TMP.r ! 1035: case $rsh in ! 1036: "") for i in rcmd remsh ! 1037: do if ($i $host date) >/dev/null 2>&1 ! 1038: then rsh=$i ! 1039: break ! 1040: fi ! 1041: done ! 1042: case $rsh in ! 1043: "") rsh=rsh ;; ! 1044: esac ! 1045: ;; ! 1046: esac ! 1047: $rsh $host sh $dir/ship.$date || exit ! 1048: ;; ! 1049: *) print - "cat '" ! 1050: cat ! 1051: print - "' > ship.$date" ! 1052: print - "rcp ship.$date $host:$dir" ! 1053: print - "rm ship.$date" ! 1054: print - "rsh $host sh $dir/ship.$date" ! 1055: ;; ! 1056: esac ! 1057: for tool in "${ship_list[@]}" ! 1058: do if test ! -f $tool ! 1059: then i=${tool%%/*} ! 1060: else i=$tool ! 1061: fi ! 1062: dfile=$mail/$i ! 1063: if test -f "$i" ! 1064: then case $transport in ! 1065: compress) ! 1066: print -u2 "oops: $i" ! 1067: ;; ! 1068: list|push) ! 1069: print - "$i" ! 1070: ;; ! 1071: pull) case $i in ! 1072: */*) t=${i%/*} ;; ! 1073: *) t=. ;; ! 1074: esac ! 1075: print - echo pull '$DK_ADDRESS' '$DK_INSTALLROOT'/ship/$i $t ! 1076: print - pull '$DK_ADDRESS' '$DK_INSTALLROOT'/ship/$i $t ! 1077: ;; ! 1078: rcp) print rcp "$i" "$dfile" ! 1079: case $noexec in ! 1080: "") rcp "$i" "$dfile" || exit ;; ! 1081: esac ! 1082: ;; ! 1083: esac ! 1084: fi ! 1085: i=${tool#*/} ! 1086: i=${i%/*} ! 1087: case $user:$noexec in ! 1088: ?*:) db_note $machine $user ${tool%%/*} $i ${tool##*/} $name ;; ! 1089: esac ! 1090: done ! 1091: case $transport in ! 1092: push) print - '!' ;; ! 1093: esac ! 1094: return 1 ! 1095: ;; ! 1096: esac ! 1097: print -u2 "$command: address for $1 not found" ! 1098: return 1 ! 1099: } ! 1100: ! 1101: function closure # tools ! 1102: { ! 1103: tools= ! 1104: for tool ! 1105: do if test ! -d $tool ! 1106: then case $original in ! 1107: *" ${tool%/*} "*|*" $tool "*) warning "${tool%/*}: invalid tool" ;; ! 1108: esac ! 1109: else case $tool in ! 1110: */?*) release=${tool#*/} ! 1111: tool=${tool#*/} ! 1112: ;; ! 1113: *) eval items=\"\$items_$item\" ! 1114: case $items in ! 1115: "") release= ;; ! 1116: *) eval release=\$release_$tool ;; ! 1117: esac ! 1118: ;; ! 1119: esac ! 1120: eval release_${tool%/*}=$release ! 1121: tools="$tools $tool" ! 1122: fi ! 1123: done ! 1124: set -- $tools ! 1125: # ! 1126: # now generate the closure of the top level tools and releases ! 1127: # ! 1128: tools= ! 1129: for tool ! 1130: do old= ! 1131: new=$tool ! 1132: while : ! 1133: do case $new in ! 1134: $old) break ! 1135: esac ! 1136: dup= ! 1137: for item in $new ! 1138: do # we assume items_* not in environment ! 1139: eval items=\"\$items_$item\" ! 1140: case $items in ! 1141: "") eval release=\$release_$item ! 1142: case $release in ! 1143: "") set -- $item/$SHIPMENT ! 1144: shift $#-1 ! 1145: case $1 in ! 1146: "$item/$SHIPMENT") continue ;; ! 1147: esac ! 1148: release=${1#*/} ! 1149: eval release_$item=$release ! 1150: esac ! 1151: if test ! -f $item/$release/items ! 1152: then continue ! 1153: fi ! 1154: case $closure in ! 1155: "") items=$item ;; ! 1156: *) items=$(<$item/$release/items)" $item" ;; ! 1157: esac ! 1158: eval items_$item=\"$items\" ! 1159: ;; ! 1160: esac ! 1161: dup="$dup $items" ! 1162: done ! 1163: old=$new ! 1164: new= ! 1165: for item in $dup ! 1166: do eval seen_$item= ! 1167: done ! 1168: for item in $dup ! 1169: do eval seen=\$seen_$item ! 1170: case $seen in ! 1171: "") eval seen_$item=1 ! 1172: new="$new $item" ! 1173: esac ! 1174: done ! 1175: done ! 1176: tools="$tools $new" ! 1177: done ! 1178: } ! 1179: ! 1180: function undup # tools ! 1181: { ! 1182: tools= ! 1183: for item ! 1184: do eval seen_$item= ! 1185: done ! 1186: for item ! 1187: do eval seen=\$seen_$item ! 1188: case $seen in ! 1189: "") eval seen_$item=1 ! 1190: tools="$tools $item" ! 1191: esac ! 1192: done ! 1193: } ! 1194: ! 1195: command=$0 ! 1196: integer dtime=0 i=0 nrecipient=0 first_time=1 delay=0 ! 1197: info= mark= list= logfile= message=1 nocopy= noexec= format=$SHIPMENT ! 1198: shipinfo_test= force= shipper= closure=1 undo= date= basetoo= ! 1199: while : ! 1200: do case $1 in ! 1201: -b) basetoo=1 ;; ! 1202: +b) basetoo= ;; ! 1203: -c) closure= ;; ! 1204: +c) closure=1 ;; ! 1205: -d) format=base ;; ! 1206: +d) format=$SHIPMENT ;; ! 1207: -i) info=1 delay=0 ;; ! 1208: -k) mark=1 delay=0 ;; ! 1209: -l) shift; list=$1 ;; ! 1210: +l) list= ;; ! 1211: -m) message= ;; ! 1212: +m) message=1 ;; ! 1213: -n) noexec=1 delay=0 ;; ! 1214: +n) noexec= ;; ! 1215: -o) shipper=1 ;; ! 1216: +o) shipper= ;; ! 1217: -p) shift; recipient_list[nrecipient]=$1; nrecipient=nrecipient+1 ;; ! 1218: +p) recipient= ;; ! 1219: -s) SHIPFILES= ;; ! 1220: -t) total=1 noexec=1 delay=0 ;; ! 1221: -u) shift; undo=$1 ;; ! 1222: +u) undo= ;; ! 1223: -v) shift; date=$1 ;; ! 1224: -C) shift; CRATEFILES="$CRATEFILES $1" ;; ! 1225: -D) shift; delay=$1 ;; ! 1226: +D) delay=0 ;; ! 1227: -F) force=1 ;; ! 1228: +F) force= ;; ! 1229: -S) shift; SHIPFILES="$SHIPFILES $1" ;; ! 1230: *[,:!%@]*)recipient_list[nrecipient]=$1;nrecipient=nrecipient+1 ;; ! 1231: --) shift; break ;; ! 1232: -*|+*) print -u2 "Usage: $command [-bcdikmnostfF] [-l recipient-list] [-p recipient] [-u [[yy]mm]dd] [-v yymmdd] [-C crate-file] [-D delay] [-S support-file] [recipient ...] [tool ...]"; exit 2 ;; ! 1233: *) break ;; ! 1234: esac ! 1235: shift ! 1236: done ! 1237: case $date in ! 1238: $SHIPMENT) ;; ! 1239: *) date=$(shipstamp) ;; ! 1240: esac ! 1241: case $info in ! 1242: "") if test 0 = "$nrecipient" -a ! -f "$list" ! 1243: then errexit "no recipient(s)" ! 1244: fi ! 1245: trap 'cleanup $?' EXIT INT TERM ! 1246: # ! 1247: # generate the tools list ! 1248: # ! 1249: original=" $* " ! 1250: case $# in ! 1251: 0) tools= ! 1252: for tool in * ! 1253: do set -- $tool/$SHIPMENT ! 1254: case $1 in ! 1255: "$tool/$SHIPMENT") ;; ! 1256: *) tools="$tools $tool" ;; ! 1257: esac ! 1258: done ! 1259: case $tools in ! 1260: "") errexit "no tools" ;; ! 1261: esac ! 1262: set -- $tools ! 1263: ;; ! 1264: esac ! 1265: closure $* ! 1266: case $tools in ! 1267: "") errexit "no 'items' file(s)" ;; ! 1268: esac ! 1269: tools_usr=$tools ! 1270: tools_pax= ! 1271: case $closure:$format:$SHIPFILES in ! 1272: :*|*:|*:base:*) ! 1273: ;; ! 1274: *) set -- pax/$SHIPMENT ! 1275: case $1 in ! 1276: "$tool/$SHIPMENT") ! 1277: ;; ! 1278: *) closure pax ! 1279: tools_pax=$tools ! 1280: ;; ! 1281: esac ! 1282: ;; ! 1283: esac ! 1284: undup $tools_pax $tools_usr ! 1285: set -- $tools ! 1286: for tool in $tools_pax ! 1287: do eval type_$tool=pax ! 1288: done ! 1289: for tool in $tools_usr ! 1290: do eval type_$tool=usr ! 1291: done ! 1292: set -- $tools ! 1293: for tool ! 1294: do eval tool=$tool/\$release_$tool ! 1295: item= ! 1296: for f in "$format" base ! 1297: do set -- $tool/$f ! 1298: if test -f "$1" ! 1299: then item=${1##*/} ! 1300: break ! 1301: fi ! 1302: done ! 1303: case $item in ! 1304: "") if test ! -d ${tool%/*} ! 1305: then case $original in ! 1306: *" ${tool%/*} "*|*" $tool "*) warning "${tool%/*}: invalid tool" ;; ! 1307: esac ! 1308: continue ! 1309: fi ! 1310: case $format in ! 1311: base) set -- $tool/$SHIPMENT ! 1312: if test -f "$1" ! 1313: then eval release_${tool%/*}=${1##*/} ! 1314: tool=${tool%/*}/${1##*/} ! 1315: item=base ! 1316: warning "${tool}: latest base not crated" ! 1317: else warning "${tool}: base not crated" ! 1318: continue ! 1319: fi ! 1320: ;; ! 1321: *) continue ! 1322: ;; ! 1323: esac ! 1324: ;; ! 1325: esac ! 1326: case $format in ! 1327: "$SHIPMENT"|$item) ! 1328: tool=$tool/$item ! 1329: ;; ! 1330: *) tool=${tool%/*}/$item/base ! 1331: if test ! -f $tool ! 1332: then errexit "${tool%/*}: $item base not crated" ! 1333: fi ! 1334: ;; ! 1335: esac ! 1336: tool_list[i]=$tool;i=i+1 ! 1337: done ! 1338: ;; ! 1339: *) typeset -lL16 fixedname ! 1340: typeset -L9 address project ! 1341: typeset -R12 phone ! 1342: typeset -L21 mail ! 1343: typeset -L11 company ! 1344: ;; ! 1345: esac ! 1346: if test ! -d $SHIPSLOG ! 1347: then mkdir $SHIPSLOG || errexit "$SHIPSLOG: cannot create log directory" ! 1348: fi ! 1349: if test -f shipop.c -a -x shipop ! 1350: then SHIPID=$FROMSYS!$SHIPPER ! 1351: case $SHIPFILES in ! 1352: ?*) SHIPFILES="$SHIPFILES shipop.c" ;; ! 1353: esac ! 1354: else SHIPID= ! 1355: fi ! 1356: while : ! 1357: do case $undo in ! 1358: ""|??????*) break ;; ! 1359: *) undo="?$undo" ;; ! 1360: esac ! 1361: done ! 1362: nocopy=${nocopy+-c} ! 1363: flag=1 ! 1364: case $list in ! 1365: "") set -s -- "${recipient_list[@]}" ! 1366: ;; ! 1367: ?*) if test ! -r "$list" ! 1368: then errexit "$list: cannot read" ! 1369: else set -s -- "${recipient_list[@]}" $(sed -e '/^#/d' -e 's/[: ].*//' $list) ! 1370: fi ! 1371: ;; ! 1372: esac ! 1373: for recipient ! 1374: do if ((dtime)) ! 1375: then sleep $dtime ! 1376: fi ! 1377: if dosend "$recipient" $flag ! 1378: then flag= ! 1379: case $noexec$info in ! 1380: "") print "$name" >> ${tool%/*}/list ;; ! 1381: esac ! 1382: else flag=1 ! 1383: fi ! 1384: if ((delay > dtime)) ! 1385: then dtime=delay ! 1386: fi ! 1387: done ! 1388: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.