[Mnj] Issue with MNJ

Eric Greisen egreisen at nrao.edu
Fri Oct 14 16:46:37 EDT 2016


I added a new adverb to POPSDAT.HLP and then noticed that several of the 
MNJs for which I receive reports did not automatically run POPSGN to 
acquire the new adverb.  I have found a couple of issues behind this 
which affect primarily binary installations but which may affect others 
as well.  Unfortunately, the bugs are in the code that cause the MNJ to 
update itself and so the fixes will not propagate automatically as they 
are supposed to do.  Therefore I attach two files which should be copied 
to $TST/$ARCH/UPDATE to replace the current copies.  It would be best if 
you do this before running a new MNJ.

Sorry about this.

Eric Greisen


-------------- next part --------------
#!/bin/sh
#-----------------------------------------------------------------------
#! Update AIPS areas
## UPDATE UNIX
#-----------------------------------------------------------------------
#;  Copyright (C) 1995-1997, 2000-2002, 2004-2005, 2009, 2016
#;  Associated Universities, Inc. Washington DC, USA.
#;
#;  This program is free software; you can redistribute it and/or
#;  modify it under the terms of the GNU General Public License as
#;  published by the Free Software Foundation; either version 2 of
#;  the License, or (at your option) any later version.
#;
#;  This program is distributed in the hope that it will be useful,
#;  but WITHOUT ANY WARRANTY; without even the implied warranty of
#;  MERCHANTABILITY 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 Foundation, Inc., 675 Massachusetts Ave, Cambridge,
#;  MA 02139, USA.
#;
#;  Correspondence concerning AIPS should be addressed as follows:
#;         Internet email: aipsmail at nrao.edu.
#;         Postal address: AIPS Project Office
#;                         National Radio Astronomy Observatory
#;                         520 Edgemont Road
#;                         Charlottesville, VA 22903-2475 USA
#-----------------------------------------------------------------------
#   Update specified versions of AIPS according to transaction files
#   on a remote server.  The AIPS versions to be updated should be
#   given as command line arguments, for example
#
#   AIPSUPD CVX TST NEW
#
#   Version names other than OLD, NEW or TST will be ignored.
#
#   This script may be run manually or under the control of the Unix
#   cron utility (see cron(1)).  If interactive, it's quite verbose.
#
#   WARNING!  This script will (re)define the AIPS environment.  It has
#   to, as it might be invoked from the c shell and inherit the
#   incorrect $CDTST definition.  Use bash; it's better :-)
#-----------------------------------------------------------------------
#                                       Define pgmr env. variables.
#                                       If it's not here, CHANGE ME!!!
if [ "$AIPS_ROOT" = "" ] ; then
   echo 'AIPSUPD - the AIPS_ROOT variable is not defined.  Help!'
   exit 1
fi
if [ -f $AIPS_ROOT/LOGIN.SH ] ; then
   . $AIPS_ROOT/LOGIN.SH
elif [ "$HOME" != "" ] ; then
   if [ -f $HOME/LOGIN.SH ] ; then
      . $HOME/LOGIN.SH
   else
      echo "AIPSUPD - Please edit $0; no LOGIN.SH found in $HOME/"
      exit 1
   fi
else
   echo "AIPSUPD - Please edit $0; cannot find LOGIN.SH in $AIPS_ROOT"
   exit 1
fi
#                                       Local configuration
#                                       Now referenced by the master
#                                       version of UPDCONFIG
if [ -f UPDCONFIG ] ; then
   . UPDCONFIG
elif [ -f $UPDUNIX/UPDCONFIG ] ; then
   . $UPDUNIX/UPDCONFIG
else
   echo "AIPSUPD - cannot find $UPDUNIX/UPDCONFIG"
   echo "AIPSUPD - something is badly wrong!  Cannot proceed."
   exit 1
fi
if [ "$1" = "" ] ; then
  echo "AIPSUPD - no version specified on command line"
  exit 2
fi

# Sanity check on UpdCVS.
if [ "$UpdCVS" = YES ] ; then
  if [ "$UpdDoCopy" != YES ] ; then
    echo "AIPSUPD - UpdCVS is YES but UpdDoCopy isn't!"
    exit 3
  fi
  if [ "$UpdSSH" = YES ] ; then
    echo "AIPSUPD - both UpdSSH and UpdCVS are YES, one must fall!"
    echo "AIPSUPD - UpdSSH is still sort of supported, for clients"
    echo "AIPSUPD - chained to a local master without NFS, but UpdCVS"
    echo "AIPSUPD - is a different ball of wax."
    exit 4
  fi
  if [ "$UpdClient" = YES ] ; then
    echo "AIPSUPD - UpdCVS and UpdClient are both YES; UpdCVS is"
    echo "AIPSUPD - for clients slaved to the main NRAO master"
    echo "AIPSUPD - only, not for clients slaved to a local master,"
    echo "AIPSUPD - which is what UpdClient implies."
    exit 5
  fi
fi

#                                       Set RunTime to current date in
#                                       YYYYMMDD.HHMMSS format, and set
#                                       names for update and error logs.
#                                       This is an ATOMIC OPERATION!
#                                       (excuse the zippy-like tone :-)
#                                       It defines the time used for
#                                       reference on transactions.
#                                       MNJ Systems should use NTP.
RunTime=`date -u +%Y%m%d.%H%M%S`
export RunTime
#                                       Process each version given on
#                                       the command line; ignore non-
#                                       standard version names:

for Vers
   do
   if [ \( X$Vers = XCVX \) -o \
        \( X$Vers = XTST \) -o \
        \( X$Vers = XNEW \) -o \
        \( X$Vers = XOLD \) ] ; then
#                                       Set env. vars for this version.
      eval \$CD$Vers >/dev/null 2>/dev/null
      if [ -d $AIPS_VERSION/$ARCH/UPDATE ] ; then
         [ -t 1 ] && echo "AIPSUPD - cd $AIPS_VERSION/$ARCH/UPDATE"
         cd $AIPS_VERSION/$ARCH/UPDATE
      else
         [ -t 1 ] && echo "AIPSUPD - cd $UPDUNIX, no $ARCH-specific dir"
         cd $UPDUNIX
      fi
      LogFile=$AIPS_VERSION/$ARCH/UPDATE/UPD$RunTime.LOG; export LogFile
      ErrorFile=$AIPS_VERSION/$ARCH/UPDATE/UPD$RunTime.ERR; export ErrorFile
      if [ -t 1 ] ; then
         echo "AIPSUPD - RunTime is $RunTime"
         echo "AIPSUPD - LogFile is $LogFile"
         echo "AIPSUPD - ErrorFile is $ErrorFile"
      fi
#                                       Make sure dot is in path.
      PATH=.:$PATH; export PATH
#                                       Clean out junk from last time:
      rm -f $LogFile *.ERR *.UNQ
      touch $LogFile
#                                       (temporary?) heads up...

      if [ "$UpdCVS" = YES ] ; then
        echo "AIPSUPD - Using CVS for copying files." >>$LogFile
        [ -t 1 ] && echo "AIPSUPD - Using CVS for copying files."
      elif [ "$UpdRsync" = YES ] ; then
        echo "AIPSUPD - Using rsync (not CVS) for copying files." >>$LogFile
        [ -t 1 ] && echo "AIPSUPD - Using rsync (not CVS) for copying files."
      elif [ "$UpdSSH" = YES ] ; then
         if [ "$UpdDoNFS" = YES ] ; then
            echo "AIPSUPD - if NFS copying fails,"\
                 "the SECURE SHELL will be used instead." \
             >>$LogFile
            [ -t 1 ] && echo "AIPSUPD - if NFS copying fails,"\
                             "the SECURE SHELL will be used instead."
         else
            echo "AIPSUPD - Using the SECURE SHELL for copying files." \
             >>$LogFile
            [ -t 1 ] && echo \
             "AIPSUPD - Using the SECURE SHELL for copying files."
         fi
      else
         if [ "$UpdDoNFS" = YES ] ; then
            echo "AIPSUPD - NOTE: if NFS copying fails," \
                 "will NOT use SECURE SHELL." >>$LogFile
            [ -t 1 ] && echo "AIPSUPD - NOTE: if NFS copying fails,"\
                             "will NOT use SECURE SHELL."
         else
            echo "AIPSUPD - WARNING: using scp for copying files" \
                 " - accounts must match." >>$LogFile
             [ -t 1 ] && \
             echo "AIPSUPD - WARNING: using scp for copying files" \
                " - accounts must match."
         fi
      fi
#                                       Get version name (15MMMYY):
      VerName=`echo $AIPS_VERSION | awk -F/ '{print $NF}'`
      export VerName
#                                       Get dates of last completed
#                                       operations:
      LASTREMOVE=`cat LASTREMOVE.DAT`; export LASTREMOVE
      LASTCOPY=`cat LASTCOPY.DAT`;     export LASTCOPY
      LASTCOMRPL=`cat LASTCOMRPL.DAT`; export LASTCOMRPL
      LASTCOMLNK=`cat LASTCOMLNK.DAT`; export LASTCOMLNK
#                                       Copy transaction files from
#                                       server and process them to
#                                       isolate changes relevant to
#                                       this machine since the last
#                                       update:
      export Vers

      # SWW - 2002-01-07, start of great cvs tweak.
      # If they are using CVS, call UPDCVS to grab the files,
      # then at each next major chunk of the process, skip it
      # if obsolete, or make sure it doesn't try to grab the
      # files again.

      if [ "$UpdCVS" = YES ] ; then
         [ -t 1 ] && echo "AIPSUPD - calling UPDCVS"
          UPDCVS
          StatVar=$?

         # If things went wrong here, then either the
         # cvs update failed to work, or it merged some
         # files it should have updated. Either way,
         # no sense in plugging on.

         if [ ! "$StatVar" = "0" ] ; then
            echo "AIPSUPD - UPDCVS failed, Status=$StatVar" | \
               tee -a $ErrorFile >> $LogFile
            [ -t 1 ] && echo "AIPSUPD - UPDCVS failed, Status=$StatVar"
            UPDERROR
            exit 1
         else
            echo "AIPSUPD - UPDCVS apparently worked" >> $LogFile
         fi
      elif [ $UpdRsync = "YES" ] ; then
        basen=`basename $AIPS_VERSION`
        [ -t 1 ] && echo "UPDRSYNC: rsync UPDATE"
        echo "UPDRSYNC: rsync UPDATE"           >> $LogFile
        rsync -vcaz --timeout=480 $RsyncMaster::$basen/UPDATE/* $AIPS_VERSION/UPDATE >>$LogFile
        rsync -vcaz --timeout=480 $RsyncMaster::$basen/UPDATE/* $AIPS_VERSION/$ARCH/UPDATE >>$LogFile
      fi

      # UPDCONTROL does some stuff besides just grabbing the UPD
      # files, so even if UpdCVS is true, it should be run.
      [ -t 1 ] && echo "AIPSUPD - calling UPDCONTROL"
      UPDCONTROL
      StatVar=$?
      [ -t 1 ] && echo "AIPSUPD - UPDCONTROL done"
      if [ "$StatVar" = "0" ] ; then
         Status=OK
      else
#                                       Abort if things are bad at this
#                                       stage:
         Status=FAILED
         echo "AIPSUPD - UPDCONTROL failed, Status=$StatVar." | \
            tee -a $ErrorFile >> $LogFile
         [ -t 1 ] && echo "AIPSUPD - UPDCONTROL failed, Status=$StatVar."
         UPDERROR
         exit 1
      fi


#                                       Intercept changes to AREAS.DAT
#                                       in SYSAIPS and quit if screwup

      # If UpdCVS, then CVS should have handled this and and
      # we can skip this section. 2002-01-07, SWW.
      if [ "$UpdCVS" != YES -a  "$UpdRsync" != YES ] ; then
         if [ "$UpdDoCopy" = YES ] ; then
            [ -t 1 ] && echo "AIPSUPD - calling UPDAREAS"
            UPDAREAS
            if [ -s UPDAREAS.ERR ] ; then
               Status=FAILED
               [ -t 1 ] && echo "AIPSUPD - UPDAREAS failed."
               echo "AIPSUPD - UPDAREAS failed." | \
                  tee -a $ErrorFile >> $LogFile
               UPDERROR
               exit 1
            fi
         fi
      fi
#                                       Remove obsolete files:
#
      LASTGOOD=`cat LASTGOOD.DAT.$ServerName`; export LASTGOOD
#                                       ...and only if things are kosher
#                                       Won't happen anymore...

      if expr $LASTREMOVE \< $LASTGOOD > /dev/null ; then
         [ -t 1 ] && \
            echo "AIPSUPD - calling UPDREMOVE (watch those libraries)"
         UPDREMOVE
         if [ $? -eq 0 ] ; then
            [ -t 1 ] && echo "AIPSUPD - UPDREMOVE apparently worked"
            cp LASTGOOD.DAT.$ServerName LASTREMOVE.DAT
            LASTREMOVE=`cat LASTREMOVE.DAT`
            Status=OK
         else
            [ -t 1 ] && echo "AIPSUPD - UPDREMOVE apparently FAILED"
            echo "AIPSUPD - UPDREMOVE apparently FAILED" | \
               tee -a $ErrorFile >> $LogFile
            Status=FAILED
         fi
      else
#                                       lastgood more recent
         if [ -t 1 ] ; then
            echo "AIPSUPD - dates wrong: LASTREMOVE is $LASTREMOVE"
            echo "AIPSUPD -          and   LASTGOOD is $LASTGOOD"
         fi
         echo "AIPSUPD - dates wrong: LASTREMOVE = $LASTREMOVE" | \
            tee -a $ErrorFile >> $LogFile
         echo "AIPSUPD -          and LASTGOOD   = $LASTGOOD" | \
            tee -a $ErrorFile >> $LogFile
         Status=FAILED
      fi

#                                       Copy altered files from server:
      if [ "$UpdCVS" != YES -a "$UpdRsync" != YES ] ; then
         if [ "$UpdDoCopy" = YES ] ; then
            if expr $LASTCOPY \< $LASTREMOVE > /dev/null ; then
               [ -t 1 ] && echo "AIPSUPD - calling UPDCOPY"
               UPDCOPY
               if [ $? -eq 0 ] ; then
                  [ -t 1 ] && echo "AIPSUPD - UPDCOPY apparently worked"
                  cp LASTREMOVE.DAT LASTCOPY.DAT
                  cp LASTCOPY.DAT LASTGOOD.DAT
                  LASTCOPY=$LASTREMOVE
                  Status=OK
               else
                  [ -t 1 ] && echo "AIPSUPD - UPDCOPY apparently FAILED"
                  echo "AIPSUPD - UPDCOPY apparently FAILED" | \
                     tee -a $ErrorFile >> $LogFile
                  Status=FAILED
               fi
            else
               if [ -t 1 ] ; then
                  echo "AIPSUPD - dates wrong: LASTREMOVE is $LASTREMOVE"
                  echo "AIPSUPD -          and LASTCOPY   is $LASTCOPY"
               fi
               echo "AIPSUPD - dates wrong: LASTREMOVE = $LASTREMOVE" | \
                  tee -a $ErrorFile >> $LogFile
               echo "AIPSUPD -          and LASTCOPY   = $LASTCOPY" | \
                  tee -a $ErrorFile >> $LogFile
               Status=FAILED
            fi
         else
            [ -t 1 ] && echo "AIPSUPD - No COPY, don't worry, be happy"
            cp LASTREMOVE.DAT LASTCOPY.DAT
            cp LASTCOPY.DAT LASTGOOD.DAT
            LASTCOPY=$LASTREMOVE
            Status=OK
         fi
      else
         cp LASTREMOVE.DAT LASTCOPY.DAT
         cp LASTCOPY.DAT LASTGOOD.DAT
         LASTCOPY=$LASTREMOVE
         Status=OK
      fi
#                                       POPSDAT, XAS etc remakes
      UPDUPDATE
#                                       Binary rsynch requested
      if [ $UpdRsync = "YES" ] ; then
         UPDRSYNC
         Status=OK
         cp LASTCOPY.DAT LASTCOMRPL.DAT
         LASTCOMRPL=$LASTCOPY
         cp LASTCOMRPL.DAT LASTCOMLNK.DAT
         LASTCOMLNK=$LASTCOMRPL
#                                       Else Compile changed subroutines:
      else
         if expr $LASTCOMRPL \< $LASTCOPY > /dev/null ; then
            [ -t 1 ] && echo "AIPSUPD - calling UPDCOMRPL"
            UPDCOMRPL
            [ -t 1 ] && echo "AIPSUPD - UPDCOMRPL done, check for errors"
#                                       Check for COMRPL errors:
            File=`grep '^[^-]' COMRPL.AT | head -1`
            if [ "$File" = "" ] ; then
               [ -t 1 ] && echo "AIPSUPD - All in COMRPL.AT marked as done"
               cp LASTCOPY.DAT LASTCOMRPL.DAT
               LASTCOMRPL=$LASTCOPY
               Status=OK
            else
               num=`grep '^[^-]' COMRPL.AT | wc -l`
               [ -t 1 ] && echo "AIPSUPD - $num in COMRPL.AT NOT done"
               echo "AIPSUPD - COMRPL $File" | \
                  tee -a $ErrorFile >> $LogFile
               echo "AIPSUPD - failed!" | \
                  tee -a $ErrorFile >> $LogFile
               Log=`basename $File | sed -e 's/\..*/.LOG/'`
               if [ -f $PREP/$Log ] ; then
                  num=`cat $PREP/$Log | wc -l`
                  if [ $num -lt 125 ] ; then
                     cat $PREP/$Log | tee -a $ErrorFile >>$LogFile
                  else
                     echo "AIPSUPD - first 125 lines of $PREP/$Log follow" \
                     | tee -a $ErrorFile >> $LogFile
                     head -125 $PREP/$Log | tee -a $ErrorFile >>$LogFile
                  fi
               else
                 echo "AIPSUPD - Cannot find $PREP/$Log logfile!"
               fi
               Status=FAILED
            fi
         else
            if [ -t 1 ] ; then
               echo "AIPSUPD - dates wrong: LASTCOPY   is $LASTCOPY"
               echo "AIPSUPD -          and LASTCOMRPL is $LASTCOMRPL"
            fi
            echo "AIPSUPD - dates wrong: LASTCOPY   = $LASTCOPY" | \
               tee -a $ErrorFile >> $LogFile
            echo "AIPSUPD -          and LASTCOMRPL = $LASTCOMRPL" | \
               tee -a $ErrorFile >> $LogFile
            Status=FAILED
         fi
#                                       Only do COMLNK if COMRPL was OK
         if [ "$Status" = OK ] ; then
#                                       Compile changed programs:
            if   expr $LASTCOMLNK \< $LASTCOMRPL > /dev/null ; then
               [ -t 1 ] && echo "AIPSUPD - calling UPDCOMLNK"
               UPDCOMLNK
               [ -t 1 ] && echo "AIPSUPD - UPDCOMLNK done, check errors"
#                                       Check for COMLNK errors:
               File=`grep '^[^-]' COMLNK.AT | head -1`
               if [ "$File" = "" ] ; then
                  [ -t 1 ] && echo "AIPSUPD - all files in COMLNK.AT done"
                  cp LASTCOMRPL.DAT LASTCOMLNK.DAT
                  LASTCOMLNK=$LASTCOMRPL
                  Status=OK
#                                       TPMON hard links
                  File=`grep '^-.*/TPMON' COMLNK.AT | head -1`
                  if [ "$File" != "" ] ; then
                     echo "AIPSUPD - TPMON links need redone..." >> $LogFile
                     for i in $LOAD/TPMON[0-9A-Z] ; do
                        if rm $i ; then
                           if ln $LOAD/TPMON.EXE $i ; then
                              : fine
                           else
                              echo \
                              "AIPSUPD - symlink $i -> TPMON.EXE FAILED" \
                               >> $LogFIle
                           fi
                        else
                           echo \
                           "AIPSUPD - FAILED to remove $i and relink to",\
                           "new TPMON.EXE" >> $LogFile
                        fi
                     done
                  fi
               else
                  num=`grep '^[^-]' COMLNK.AT | wc -l`
                  [ -t 1 ] && echo "AIPSUPD - $num in COMLNK.AT NOT done"
                  echo "AIPSUPD - COMLNK $File" | \
                    tee -a $ErrorFile >> $LogFile
                  echo "AIPSUPD - failed!" | \
                    tee -a $ErrorFile >> $LogFile
                  Log=`basename $File | sed -e 's/\..*/.LOG/'`
                  if [ -f $PREP/$Log ] ; then
                     num=`cat $PREP/$Log | wc -l`
                    if [ $num -lt 125 ] ; then
                       cat $PREP/$Log | tee -a $ErrorFile >>$LogFile
                    else
                       echo "AIPSUPD -  125 lines of $PREP/$Log follow" \
                         | tee -a $ErrorFile >> $LogFile
                       head -125 $PREP/$Log | tee -a $ErrorFile >>$LogFile
                    fi
                 else
                    echo "AIPSUPD - Cannot find $PREP/$Log logfile!"
                 fi
                 Status=FAILED
              fi
           else
              if [ -t 1 ] ; then
                 echo "AIPSUPD - dates wrong: LASTCOMLNK is $LASTCOMLNK"
                 echo "AIPSUPD -          and LASTCOMRPL is $LASTCOMRPL"
              fi
              echo "AIPSUPD - dates wrong: LASTCOMLNK = $LASTCOMLNK" | \
                 tee -a $ErrorFile >> $LogFile
              echo "AIPSUPD -          and LASTCOMRPL = $LASTCOMRPL" | \
            tee -a $ErrorFile >> $LogFile
              Status=FAILED
           fi
         else
            echo "AIPSUPD - UPDCOMRPL failed, NOT doing any COMLNK's!" | \
              tee -a $ErrorFile >> $LogFile
         fi
      fi
#                                       Report any errors:
      if [ "$Status" != OK ] ; then
         [ -t 1 ] && echo "AIPSUPD - Status is not OK, calling UPDERROR"
         UPDERROR
         [ -t 1 ] && echo "AIPSUPD - UPDERROR done, reset Status to OK"
         Status=OK
      fi
#
      [ -t 1 ] && echo "AIPSUPD - calling UPDREPORT"
      UPDREPORT
      [ -t 1 ] && echo "AIPSUPD - UPDREPORT done, MNJ finished."
   fi
done
exit 0
-------------- next part --------------
#!/bin/sh
# UPDCONTROL
#-------------------------------------------------------------------
#! Copy UPDATE control files from the server
## Update UNIX
#-----------------------------------------------------------------------
#;  Copyright (C) 1995-2016
#;  Associated Universities, Inc. Washington DC, USA.
#;
#;  This program is free software; you can redistribute it and/or
#;  modify it under the terms of the GNU General Public License as
#;  published by the Free Software Foundation; either version 2 of
#;  the License, or (at your option) any later version.
#;
#;  This program is distributed in the hope that it will be useful,
#;  but WITHOUT ANY WARRANTY; without even the implied warranty of
#;  MERCHANTABILITY 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 Foundation, Inc., 675 Massachusetts Ave, Cambridge,
#;  MA 02139, USA.
#;
#;  Correspondence concerning AIPS should be addressed as follows:
#;         Internet email: aipsmail at nrao.edu.
#;         Postal address: AIPS Project Office
#;                         National Radio Astronomy Observatory
#;                         520 Edgemont Road
#;                         Charlottesville, VA 22903-2475 USA
#-----------------------------------------------------------------------
#   Copy the UPDATE control files from the server, sort them and
#   remove duplicate entries and entries already processed. The
#   checksums of the transaction files are checked against values
#   obtained from the server to attempt to ensure that they have not
#   been corrupted during transfer.
#
#   In addition, a mail message is sent to people on MailList if
#   changes are detected to the preprocesor (PP.FOR), file, the
#   NEWEST.C program or other critical routines.
#
#   A check for $master/$VERS/UPDATE/$VERS.UPD is also done, to ensure
#   that the TST or NEW you ask for is what we consider TST or NEW,
#   respectively.  This prevents inadvertent cross-version copying.
#
#   Inputs:
#      ClientName            Name of client (for e-mail msg when needed)
#      ServerName            Name of server
#      MasterRoot            AIPS master root directory on server
#      MasterArch            AIPS master architecture needed for Clients
#      ServerUpd             Relative pathname of server UPDATE
#                             directory
#      VerName               AIPS version name
#      Vers                  OLD, NEW or TST
#      LogFile               Name of log file
#      ErrorFile             Name of error log
#      MailList              People to notify of changes
#      RunTime               Todays date.
#      UpdClient             YES or NO.  YES if we wait for master's
#                            midnight job to complete.
#      UpdMini               YES or NO.  YES for XAS/TV stuff only.
#                            See UPDCONFIG for description.
#
# Generic version.  Verbose if done interactively.
# Should work on BSD or SVR4 variants of Unix (also Posix).
#-------------------------------------------------------------------
Status=OK
Tries=0
Done=True
sumcmd="sum"
case $ARCH in
#                                       System V checksum is different
   HP | HP2 | SOL* | SUL | SGI) sumcmd="sum -r";;
esac
#                                       Should I wait for master to
#                                       finish?
if [ "$UpdClient" = YES ] ; then
#                                       Try to copy LASTGOOD.DAT from
#                                       the server. If the copy fails
#                                       or the contents of
#                                       LASTGOOD.DAT are the same as
#                                       LASTCOMLNK.DAT then wait 30
#                                       minutes and try again up to a
#                                       maximum of MaxTries times
   Done=False
   while [ \( "$Done" = "False" \) -a \
           \( "$Tries" != "$MaxTries" \) ] ; do
      rm -f *.UPD LASTGOOD.DAT.$ServerName
      [ -t 1 ] && echo "UPDCONTROL - trying to get LASTGOOD.DAT"
      if UPDCOPYSUB \
       $MasterRoot/$VerName/$MasterArch/UPDATE/LASTGOOD.DAT \
       `pwd`/LASTGOOD.DAT.$ServerName ; then
         if diff -s LASTGOOD.DAT.$ServerName LASTCOMLNK.DAT \
          > /dev/null ; then
            echo "UPDCONTROL - But `pwd`/LASTGOOD.DAT.$ServerName" \
                 >> $LogFile
            echo "UPDCONTROL - is the same as `pwd`/COMLNK.DAT." \
                 >> $LogFile
            echo "UPDCONTROL - Will wait 30 minutes and try again." \
                 >> $LogFile
            [ -t 1 ] && echo "UPDCONTROL - sleeping 30 minutes..."
            sleep 1800
         else
            Done=True
         fi
      fi
      Tries=`expr $Tries + 1`
   done
   if [ "$Done" != "True" ] ; then
      Status=FAILED
      echo "UPDCONTROL - Tried $Tries times to get LASTGOOD.DAT from" \
           "$ServerName" | \
            tee -a $ErrorFile >> $LogFile
      echo "UPDCONTROL - It's either identical to COMLNK.DAT here or" \
           "the copy attempts failed" | \
            tee -a $ErrorFile >> $LogFile
   fi
else

   # CVS should handle this, so if UpdCVS, skip it.
   if [ "$UpdCVS" != YES -a "$UpdRsync" != YES ] ; then
#                                       We're not a client, so we need
#                                       to check the cross-version file
#                                       on the master, to make sure what
#                                       it thinks is TST is what we
#                                       think it is too.
      [ -t 1 ] && echo "UPDCONTROL - Checking cross-version file"
#                                       Example of what we want is
#                                       master/TST/UPDATE/31DEC16.UPD
      fff=$MasterRoot/$Vers/UPDATE/${VerName}.UPD
      [ -f ${VerName}.UPD ] && /bin/rm -f ${VerName}.UPD
      Done=False; Tries=1
      while [ \( "$Done" = "False" \) -a \
              \( "$Tries" != "$MaxTries" \) ] ; do
         if UPDCOPYSUB $fff ${VerName}.UPD ; then
            echo "UPDCONTROL - verified that $Vers is indeed $VerName" \
             >> $LogFile
            [ -t 1 ] && echo "UPDCONTROL - $Vers is indeed $VerName"
            Done="True"
         fi
         Tries=`expr $Tries + 1`
      done
      if [ "$Done" = "True" ] ; then
#         [ -t 1 ] && echo "UPDCONTROL - Creating LASTGOOD.DAT.$ServerName"
         [ -t 1 ] && echo "UPDCONTROL - Syncing LASTGOOD.DAT.$ServerName"
#         echo $RunTime > LASTGOOD.DAT.$ServerName
         cp $AIPS_ROOT/$VerName/UPDATE/LASTCVS.DAT LASTGOOD.DAT.$ServerName
      else
         echo "UPDCONTROL - cannot verify $Vers=$VerName on master"
          >> $LogFile
         [ -t 1 ] && echo "UPDCONTROL - $Vers not $VerName on master?"
         Status=FAILED
      fi
   else
#      [ -t 1 ] && echo "UPDCONTROL - Creating LASTGOOD.DAT.$ServerName"
      [ -t 1 ] && echo "UPDCONTROL - Syncing LASTGOOD.DAT.$ServerName"
#         echo $RunTime > LASTGOOD.DAT.$ServerName
         cp $AIPS_ROOT/$VerName/UPDATE/LASTCVS.DAT LASTGOOD.DAT.$ServerName
   fi

fi
#                                       If LASTGOOD.DAT was copied
#                                       get the control files
if [ "$Status" = "OK" ] ; then

   # Again, if we are using cvs, then UPDCVS has taken care of this.
   if [ "$UpdCVS" != YES -a "$UpdRsync" != YES ] ; then

      [ -t 1 ] && echo "UPDCONTROL - Getting the 5 update files"
      for file in COMRPL.UPD COMLNK.UPD PUTBCK.UPD REASONS.UPD REMOVE.UPD
      do
         if [ "$Status" = "OK" ] ; then
#                                       Different place on master
            fff=$MasterRoot/$Vers/UPDATE/$file
            [ "$UpdClient" = YES ] && \
               fff=$MasterRoot/$VerName/$MasterArch/UPDATE/$file
#
            [ -t 1 ] && echo "UPDCONTROL - getting $fff -> $file"
            if UPDCOPYSUB $fff $file ; then
#                                       that worked, get checksum
               sumhere=`$sumcmd $file | awk '{print $1}'`
               if UPDCOPYSUB ${fff}.SUM ${file}.SUM ; then
                  sumthere=`cat ${file}.SUM | awk '{print $1}'`
                  if [ $sumhere -ne $sumthere ] ; then
#                                       Checksums do not match, bail out
                     Status=FAILED
                     [ -t 1 ] && echo "UPDCONTROL - $file checksum mismatch"
                     [ -t 1 ] && echo "UPDCONTROL - $sumhere, $sumthere"
                     echo "UPDCONTROL - $file checksum mismatch" \
                          | tee -a $ErrorFile >> $LogFile
                  else
#                                       Yep, copy most to old copy
#                                       Is this still necessary????
                     grep -v '(ADDITION)' $file > $file.OLD
                     [ -t 1 ] && echo \
                        "UPDCONTROL - copied to $file.OLD minus additions"
                  fi
               else
                  [ -t 1 ] && echo "UPDCONTROL - cannot copy checksum file"
                  Status=FAILED
               fi
            else
               [ -t 1 ] && echo "UPDCONTROL - failed"
               Status=FAILED
            fi
         fi
      done
   fi
fi
#                                       If all transaction files were
#                                       copied successfully then
#                                       remove PUTBCK entries made
#                                       obsolete by REMOVE.UPD
#
#                                       done by master long ago
if [ "$Status" = "OK" ] ; then
#  sort +3 REMOVE.UPD > REMOVE.TMP
#   sort -k 4 REMOVE.UPD > REMOVE.TMP
#  sort +3 PUTBCK.UPD > PUTBCK.TMP
   sort -k 4 PUTBCK.UPD > PUTBCK.TMP
   [ -t 1 ] && echo \
      "UPDCONTROL - sort PUTBCK"
#  UPDOBSLT PUTBCK.TMP REMOVE.TMP | sort +2 -3 +1 -2 > PUTBCK.UPD
#  UPDOBSLT PUTBCK.TMP REMOVE.TMP | sort -k 3 -k 2 > PUTBCK.UPD
   sort -k 3,3 -k 2,2 PUTBCK.TMP > PUTBCK.UPD
   [ -t 1 ] && echo \
      "UPDCONTROL - UPDOBSLT done, new PUTBCK.UPD"
fi
#                                       If all copied, remove AIPSWHO,
#                                       AIPSGRIP; they are local to CV.
#                                       Don't bother with removed files.
if [ "$Status" = "OK" ] ; then
   cat PUTBCK.UPD | \
    awk '$5 != "AIPSWHO" && $5 != "AIPSGRIP" {print $0}' >PUTBCK.TMP.2
   rm -f PUTBCK.UPD; mv PUTBCK.TMP.2 PUTBCK.UPD
#                                       Regenerate checksum in case we
#                                       are a master for another MNJ.
   rm -f PUTBCK.UPD.SUM
   $sumcmd PUTBCK.UPD | awk '{print $1}' >PUTBCK.UPD.SUM
fi
#                                       If that worked get the last
#                                       good dates
if [ "$Status" = "OK" ] ; then
   LASTREMOVE=`cat LASTREMOVED.DAT`; export LASTREMOVE
   if [ "$LASTREMOVE" = "" ] ; then
      echo "" | tee -a $ErrorFile >> $LogFile
      echo "UPDCONTROL - `pwd`/LASTREMOVE.DAT = $LASTREMOVE" \
              | tee  -a $ErrorFile >> $LogFile
      echo "" | tee -a $ErrorFile >> $LogFile
      [ -t 1 ] && echo \
         "UPDCONTROL - Err: `pwd`/LASTREMOVE.DAT = $LASTREMOVE"
      Status=FAILED
   fi
fi
if [ "$Status" = "OK" ] ; then
   LASTCOPY=`cat LASTCOPY.DAT`; export LASTCOPY
   if [ "$LASTCOPY" = "" ] ; then
      echo "" | tee -a $ErrorFile >> $LogFile
      echo "UPDCONTROL - `pwd`/LASTCOPY.DAT = $LASTCOPY" \
              | tee  -a $ErrorFile >> $LogFile
      echo "" | tee -a $ErrorFile >> $LogFile
      [ -t 1 ] && echo "UPDCONTROL - Err: `pwd`/LASTCOPY.DAT = $LASTCOPY"
      Status=FAILED
   fi
fi
if [ "$Status" = "OK" ] ; then
   LASTCOMRPL=`cat LASTCOMRPL.DAT`; export LASTCOMRPL
   if [ "$LASTCOMRPL" = "" ] ; then
      echo "" | tee -a $ErrorFile >> $LogFile
      echo "UPDCONTROL - `pwd`/LASTCOMRPL.DAT = $LASTCOMRPL" \
              | tee -a $ErrorFile >> $LogFile
      echo "" | tee -a $ErrorFile >> $LogFile
      [ -t 1 ] && echo \
        "UPDCONTROL - Err: `pwd`/LASTCOMRPL.DAT = $LASTCOMRPL"
      Status=FAILED
   fi
fi
if [ "$Status" = "OK" ] ; then
   LASTCOMLNK=`cat LASTCOMLNK.DAT`; export LASTCOMLNK
   if [ "$LASTCOMLNK" = "" ] ; then
      echo "" | tee -a $ErrorFile >> $LogFile
      echo "UPDCONTROL - `pwd`/LASTCOMLNK.DAT = $LASTCOMLNK" \
              | tee  -a $ErrorFile >> $LogFile
      echo "" | tee -a $ErrorFile >> $LogFile
      [ -t 1 ] && echo \
         "UPDCONTROL - Err: `pwd`/LASTCOMLNK.DAT = $LASTCOMLNK"
      Status=FAILED
   fi
fi
#                                       If everything is still OK
#                                       then record the last good
#                                       dates in the log file
if [ "$Status" = "OK" ] ; then
   echo ""                                               >> $LogFile
   echo "UPDCONTROL - `pwd`/LASTREMOVE.DAT = $LASTREMOVE" >> $LogFile
   echo "UPDCONTROL - `pwd`/LASTCOPY.DAT = $LASTCOPY"     >> $LogFile
   echo "UPDCONTROL - `pwd`/LASTCOMRPL.DAT = $LASTCOMRPL" >> $LogFile
   echo "UPDCONTROL - `pwd`/LASTCOMLNK.DAT = $LASTCOMLNK" >> $LogFile
   echo ""                                               >> $LogFile
#                                       Select all entries newer than
#                                       LASTREMOVE from REMOVE.UPD
#                                       then sort and eliminate
#                                       redundancies.
   [ -t 1 ] && echo "UPDCONTROL - calling UPDSRTUNQ REMOVE"
   UPDSRTUNQ REMOVE $LASTREMOVE
#                                       Initialize REASONS.UNQ with a
#                                       header for the update report.
   echo ""                                               >  REASONS.UNQ
   echo ""                                               >> REASONS.UNQ
   echo "UPDCONTROL - Reasons for file updates on `date -u` (UT)" >> REASONS.UNQ
   echo ""                                               >> REASONS.UNQ
#                                       Append REASONS.UPD entries
#                                       later than LASTCOPY.
   [ -t 1 ] && echo "UPDCONTROL - calling UPDLSTDAT REASONS.UPD"
   UPDLSTDAT REASONS.UPD $LASTCOPY >> REASONS.UNQ
#                                       For all other files, select
#                                       entries later than the last
#                                       update, sort and remove
#                                       redundant and obsolete entries
   [ -t 1 ] && echo "UPDCONTROL - calling UPDSRTUNQ PUTBCK"
   UPDSRTUNQ PUTBCK $LASTCOPY
#                                       Select relevant changes from
#                                       PUTBCK.UNQ and add them to
#                                       COMRPL.UPD amd COMLNK.UPD
#                                       as appropriate.
   [ -t 1 ] && echo "UPDCONTROL - applying COMRPL/LNK.ADD to .UPD files"
   sed -n -f $SYSLOCAL/COMRPL.ADD PUTBCK.UNQ >> COMRPL.UPD
   sed -n -f $SYSLOCAL/COMLNK.ADD PUTBCK.UNQ >> COMLNK.UPD
#                                       Ignore AIPSSRC COMRPLs and
#                                       COMLNKs from "quarterly" update.
#                                       (there really shouldn't be any!)
   [ -t 1 ] && echo "UPDCONTROL - removing any aipssrc compiles/links"
   grep -v aipssrc COMRPL.UPD > COMRPL.TMP; mv COMRPL.TMP COMRPL.UPD
   grep -v aipssrc COMLNK.UPD > COMLNK.TMP; mv COMLNK.TMP COMLNK.UPD
#                                       Sort and uniquify entries
   [ -t 1 ] && echo "UPDCONTROL - Calling UPDSRTUNQ COMRPL"
   UPDSRTUNQ COMRPL $LASTCOMRPL
   [ -t 1 ] && echo "UPDCONTROL - Calling UPDSRTUNQ COMLNK"
   UPDSRTUNQ COMLNK $LASTCOMLNK
   [ -t 1 ] && echo "UPDCONTROL - Done."
#                                       If mini-job, weed out the
#                                       entries we don't want.
   if [ "$UpdMini" = "YES" ] ; then
      [ -t 1 ] && echo "UPDCONTROL - Weeding out for mini-MNJ"
#                                       May want to move this into its
#                                       own file at some point...
#                                       List of modules to be serviced
#                                       by the mini-midnight job
      if [ "$UpdMiniPRG" = "" ] ; then
         MINIPRG="AIPNOT:MSGSRV AIPNOT:TEKSRV AIPNOT:TVSERV AIPNOT:TPMON"
      else
         MINIPRG="$UpdMiniPRG"
      fi
      MINIAREAS=""
      m=`cat COMLNK.UNQ | wc -l`
      rm -f COMLNK.TMP; touch COMLNK.TMP
      for i in $MINIPRG ; do
         miniarea=`echo $i | awk -F: '{print $1}'`
         miniprog=`echo $i | awk -F: '{print $2}'`
         if [ "$MINIAREAS" = "" ] ; then
            MINIAREAS=$miniarea
#                                       Did we already get this area?
         elif echo $MINIAREAS | grep $miniarea >/dev/null 2>/dev/null
         then
            : skip it
         else
#                                       Nope, so add it to our list.
            MINIAREAS="$MINIAREAS $miniarea"
         fi
#                                       Also, extract this program only
#                                       if it is in the transaction log.
         grep "$miniarea * $miniprog" COMLNK.UNQ >>COMLNK.TMP \
          2>/dev/null
         if [ $? = 0 ] ; then
            [ -t 1 ] && echo "UPDCONTROL - added $miniarea/$miniprog"
         fi
      done
      mv COMLNK.TMP COMLNK.UNQ
      n=`cat COMLNK.UNQ | wc -l`
      [ -t 1 ] && \
         echo "UPDCONTROL - trimmed tasks, $n of $m left in COMLNK.UPD"
      echo "UPDCONTROL - trimmed tasks, $n of $m left in COMLNK.UPD" \
       >>$LogFile
#                                       Subroutines are trickier.  Scan
#                                       each program and make a list of
#                                       areas that are needed by the
#                                       subset of AIPS tasks.
      MINILIB=""
      for i in $MINIAREAS ; do
         j='$'$i; j=`eval echo $j`
         k=`LIBS $j`
         k=`eval echo $k`
         MINILIB="$MINILIB $k"
      done
      MINILIB=`echo $MINILIB | \
               awk '{ for (i=1; i<=NF; i++) printf "%s\n",$i}' | \
               sort -u`
#                                       Now see if any entries in the
#                                       COMRPL transaction file have
#                                       modules that would go in any of
#                                       the libraries.
      m=`cat COMRPL.UNQ | wc -l`
      rm -f COMRPL.TMP; touch COMRPL.TMP
      cat COMRPL.UNQ | while read line ; do
         i=`echo $line | awk '{print "$"$5"/"$6}'`
         a=`echo $line | awk '{print $5}'`
#                                       extract the relevant library
#                                       based on the area.
         lib=`grep ':0:\$'$a'$' $SYSLOCAL/LIBR.DAT | \
              sed -e 's,/SUBLIB.*,,g' -e 's,\\$,,g'`
         if echo $MINILIB | grep $lib >/dev/null 2>/dev/null ; then
            echo $line >>COMRPL.TMP
         fi
      done
      mv COMRPL.TMP COMRPL.UNQ
      n=`cat COMRPL.UNQ | wc -l`
      [ -t 1 ] && \
         echo "UPDCONTROL - trimmed subs,  $n of $m left in COMRPL.UPD"
      echo "UPDCONTROL - trimmed subs,  $n of $m left in COMRPL.UPD" \
       >>$LogFile
   fi
#                                       Intercept changes to SYSLOCAL stuff
#
   spfile=${RunTime}.SPECIAL; touch $spfile
   [ -t 1 ] && echo "UPDCONTROL - created temporary file $spfile"
#                                       but not for binary
   if [ $UpdRsync = "NO" ] ; then
#                                       Also SYSUNIX stuff
      for i in PP.FOR F2PS.C F2TEXT.C NEWEST.C REVENV.C ZTRLOP.C
      do
         ufile="PUTBCK.UNQ"
         if grep \ $i $ufile >/dev/null
         then
            echo "The UPDATE job has detected changes to $i" >>$spfile
            echo "for $VerName on $ClientName at `date -u` (UT)." >>$spfile
            echo "Please rebuild it as soon as possible." >>$spfile
#                                       Really need to give instructions
            case $i in
               PP.FOR|ZTRLOP.C)
                  echo "For PP.FOR: cd $SYSLOCAL" >>$spfile
                  echo "gcc  -c -I$INC ZTRLOP.c" >>$spfile
                  echo "g77 -O -o PP.EXE PP.f ZTRLOP.o" >>$spfile
                  echo "IBM and HP machines need more done" >>$spfile
                  ;;
               F2PS.C|F2TEXT.C|NEWEST.C|REVENV.C)
                  echo "For F2PS, F2TEXT, NEWEST, REVENV" >>$spfile
                  echo "cd $SYSLOCAL" >>$spfile
                  echo "rm NAME.c (where NAME is one of the above)" >>$spfile
                  echo "ln -s $SYSUNIX/NAME.C NAME.c" >>$spfile
                  echo "gcc -O -o NAME NAME.c" >>$spfile
                  echo "(Use the correct C compiler above)" >>$spfile
                  ;;
            esac
            [ -t 1 ] && echo "UPDCONTROL - $i change detected"
         fi
      done
   fi
#                                       and TPMON
   if [ -s COMLNK.UNQ ] ; then
      if grep TPMON COMLNK.UNQ >/dev/null
      then
         echo "The UPDATE job has detected a COMLNK TPMON for" >>$spfile
         echo "version $VerName on $ClientName at `date -u` (UT)." >>$spfile
         echo "Please restart TPMON daemons on $ARCH systems." >>$spfile
         [ -t 1 ] && echo "UPDCONTROL - TPMON found in COMLNK.UPD"
      fi
   fi
#                                       LIBR.DAT may be a problem...
   if grep \ LIBR\.DAT PUTBCK.UNQ >/dev/null
   then
      echo "The UPDATE job has detected a LIBR.DAT change for" >>$spfile
      echo "version $VerName on $ClientName at `date -u` (UT)." >>$spfile
      echo "It MAY be that it applies to architecture $ARCH;" >>$spfile
      echo "(Sorry, this dumb script can't tell for sure)" >>$spfile
      echo "if so, you  should copy $TST/$ARCH/SYSTEM/LIBR.DAT" >>$spfile
      echo "to your $SYSLOCAL area." >>$spfile
      [ -t 1 ] && echo "UPDCONTROL - LIBR.DAT found in PUTBCK.UPD"
   fi
#                                       Now see if there's stuff to mail
   if [ -s $spfile ] ; then
      [ -t 1 ] && echo "UPDCONTROL - mailing special file to $MailList"
      echo "UPDCONTROL - special action needed by aips mgr, notice" \
           "emailed" >> $LogFile
      [ "$MailList" = "" ] && MailList="$LOGNAME"
      if [ "$MailList" != "" ] ; then
         subj="$VerName $ARCH needs extra work"
         case $ARCH in
            SUN4|LINUX*|LNX64|IBM|MAC*)
               mail -s "$subj" $MailList <$spfile;;
            *) echo "Subject: $subj" >$spfile.tmp
               cat $spfile >>$spfile.tmp
               mail $MailList <$spfile.tmp
               rm -f $spfile.tmp;;
         esac
      fi
      rm -f $spfile
   else
      [ -t 1 ] && echo "UPDCONTROL - nothing special, removing $spfile"
      rm -f $spfile
   fi
#                                       Regenerate checksum in case we
#                                       are a master for another MNJ.
   for i in COMRPL COMLNK ; do
      [ -t 1 ] && echo "UPDCONTROL - regenerating $i.UPD.SUM"
      rm -f $i.UPD.SUM
      $sumcmd $i.UPD | awk '{print $1}' >$i.UPD.SUM
   done
fi
#
if [ "$Status" = "OK" ] ; then
   echo "UPDCONTROL - Everything seems in order" >> $LogFile
   exit 0
else
   echo "UPDCONTROL - Status is $Status, exiting with abnormal error" \
        "code" | tee -a $ErrorFile >> $LogFile
   exit 1
fi


More information about the Mnj mailing list