HP3000-L Archives

June 2015, Week 2

HP3000-L@RAVEN.UTC.EDU

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
"Dave Powell, MMfab" <[log in to unmask]>
Reply To:
Dave Powell, MMfab
Date:
Fri, 12 Jun 2015 17:03:42 -0700
Content-Type:
text/plain
Parts/Attachments:
text/plain (425 lines)
I'm not sure if this helps, but long ago I wrote a command file to checks 
the status of a device, set some variables, and optionally wait for the 
device to enter a certain state.
The required first parm is device number, and if that is all you feed it, it 
returns some info without waiting.
I  used it mostly to on my tape drive as part of my backup routine, but it 
works on printers too.


example
:devwait.syscmd.shr  6
LDEV       6  Status=SPOOLED    after    1 passes    OK-flag=FALSE (done)
:showvar dev@
DEV_ERRORS = 0
DEV_OK = FALSE
DEV_VALID = TRUE
DEV_LOOP_CNT = 1
DEV_CONTINUE = FALSE
DEV_RECORD =     6     SPOOLED
DEV_STATUS = SPOOLED
DEV_JOB_ID =
DEV_OWNER_FILES = 0
DEV_SESSION_IPADDR =
DEV_NUM = 6
DEV_OWNER =
DEV_SPOOLED_OUT = FALSE
DEV_ACCEPTS_JOBS = FALSE
DEV_ACCEPTS_DATA = FALSE
DEV_WRITE_ENABLED = FALSE
DEV_DOWN_PENDING = FALSE

---------------------------------------------------------------------------

option  nolist
parm _DEV        =   ""
parm _GOAL       =   'AVAIL'
parm _LIMIT      =   1
parm _SECONDS    =   5
parm _VOLUME     =   ' '

IF   BOUND (DEV_ERRORS)   OR   BOUND (DEV_OK)
     DELETEVAR   DEV_@
ENDIF
FILE  DEVSTATT   =   DEVSTATT, OLDTEMP
IF   FINFO ('*DEVSTATT','EXISTS')
     PURGE DEVSTATT, TEMP
ENDIF

SETVAR   DEV_ERRORS      0
SETVAR   DEV_OK          FALSE
SETVAR   DEV_VALID       FALSE

IF   '!_DEV'     =   ""
     SETVAR  DEV_ERRORS      DEV_ERRORS  +  1
     ECHO Parm-1 is required.  Ldev# (best) or device-class to &
          check.
ENDIF
IF   NOT NUMERIC ('!_LIMIT')
     SETVAR  DEV_ERRORS      DEV_ERRORS  +  1
     ECHO Parm-3 can only be digits (it is optional max # of times &
          to check the device).
ENDIF
IF   NOT NUMERIC ('!_SECONDS')
     SETVAR  DEV_ERRORS      DEV_ERRORS  +  1
     ECHO Parm-4 can only be digits (optional seconds to &
          pause between multiple checks).
ENDIF
IF   POS ( LFT ('|' + UPS('!_VOLUME') + '     ', 7), &
          '|      |LOUD  |QUIET ')  =   0  THEN
     SETVAR  DEV_ERRORS      DEV_ERRORS  +  1
     ECHO Parm-5, if entered, can only be 'LOUD' or 'QUIET'.
ENDIF
IF   DEV_ERRORS      >   0
   SETVAR  DEV_CONTINUE  FALSE
   SETVAR  DEV_STATUS    "*ERROR*"
   IF  ( HPINTERACTIVE )  OR  ( UPS('!_VOLUME') = 'LOUD' )
     ECHO !HPFILE inputs:
     ECHO    1:  LDEV# or device-class(required).  For a class, &
                 shows the highest ldev#.
     ECHO    2:  Status to wait for  (default = 'AVAIL').
     ECHO    3:  # of times to check (default = 1).  0 or 1 &
                 mean one pass with no pause.
     ECHO    4:  # of seconds to pause between tries &
                 (default = 5).  '0' is permitted.
     ECHO    5:  'volume' controls :echoes of status messages
     ECHO        ' '     Show final status only (default)
     ECHO        'QUIET' No messages
     ECHO        'LOUD'  Messages before each pause, and at end.
     ECHO Output:
     ECHO    DEV_STATUS variable - Ldev status when we are done, &
             or '*INVALID*'.
     ECHO    DEV_VALID  variable - true if the ldev exists.
     ECHO    DEV_OK     variable - true if exists at start & has &
             desired status at end.
#    ECHO    DEV_NUM    Ldev# of the device.  May matter &
#            if requested a device-class.
     ECHO    Other DEV_@ variables for ownership, errors, etc., &
             from SHOWDEV & JINFO.
     ECHO Byproducts:
     ECHO    DEVSTATT temp file, JUNK variable.
     ECHO Requires SM capability to inquire on session devices.
     ECHO Sets status variables on 1 ldev or waits for it to &
          have the requested status.
   ENDIF
   RETURN
ENDIF

BUILD DEVSTATT; CIR; REC=,,F,ASCII; DISC=1; TEMP

SETVAR   DEV_LOOP_CNT    0
SETVAR   DEV_CONTINUE    TRUE

WHILE    DEV_CONTINUE    DO
     SETVAR  DEV_LOOP_CNT    DEV_LOOP_CNT + 1
     IF  DEV_LOOP_CNT        >=  !_LIMIT
         SETVAR  DEV_CONTINUE    FALSE
     ENDIF
     IF  CIERROR     =   1581
         SETJCW      CIERROR     0
     ENDIF
     CONTINUE
     SHOWDEV  !_DEV      >   *DEVSTATT
     IF  CIERROR = 1581  OR  FINFO('*DEVSTATT','EOF') = 0
         SETVAR  DEV_STATUS      '*INVALID*'
         SETVAR  DEV_CONTINUE    FALSE
         SETVAR  DEV_VALID       FALSE
         IF  (DEV_LOOP_CNT = 1)
             SETVAR  DEV_ERRORS  DEV_ERRORS  +  1
         ELSEIF  (UPS ('!_GOAL')     =   '*INVALID*')
             SETVAR  DEV_OK      TRUE
         ENDIF
     ELSE
         INPUT   DEV_RECORD      <   *DEVSTATT
         SETVAR  DEV_RECORD      LFT (DEV_RECORD, 80)
         SETVAR  DEV_STATUS      WORD (STR (DEV_RECORD,11,15))
         SETVAR  DEV_VALID       TRUE
         IF  DEV_STATUS      =   UPS ('!_GOAL')
             SETVAR  DEV_CONTINUE    FALSE
             SETVAR  DEV_OK          TRUE
         ENDIF
     ENDIF
     IF  DEV_CONTINUE
         IF  UPS('!_VOLUME') =   'LOUD'
             ECHO LDEV![RHT('       !_DEV',8)]  &
                  Status=![LFT('!DEV_STATUS         ',12)] &
                  after![RHT('   !DEV_LOOP_CNT',4)] passes  &
                  Continue-flag=![LFT('!DEV_CONTINUE   ',5)]
         ENDIF
         PAUSE   !_SECONDS
     ENDIF
ENDWHILE
SETVAR   DEV_JOB_ID          ""
SETVAR   DEV_OWNER_FILES     0
SETVAR   DEV_SESSION_IPADDR  ""
IF   DEV_VALID
     SETVAR  DEV_NUM             WORD (DEV_RECORD)
     SETVAR  DEV_OWNER           RTRIM (STR (DEV_RECORD,25,18))
     SETVAR  DEV_SPOOLED_OUT     LFT (DEV_OWNER,11) = "SPOOLER OUT"
     SETVAR  JUNK                STR (DEV_RECORD, 9, 1)
     SETVAR  DEV_ACCEPTS_JOBS    (JUNK='J') OR (JUNK='A')
     SETVAR  DEV_ACCEPTS_DATA    (JUNK='D') OR (JUNK='A')
     SETVAR  DEV_WRITE_ENABLED   STR (DEV_RECORD,20,3) = '(W)'
     SETVAR  DEV_DOWN_PENDING    POS('; DP',RHT(DEV_RECORD,-25)) > 0
     IF  LFT(DEV_OWNER,1)    =   "#"
         SETVAR  DEV_JOB_ID          WORD(DEV_OWNER) - ':'
         CONTINUE
         SETVAR  DEV_SESSION_IPADDR  JINFO (DEV_JOB_ID,'IPADDR')
         IF  WORD (DEV_OWNER,,3) - ';'   =   'FILES'
             SETVAR  DEV_OWNER_FILES     ![WORD (DEV_OWNER,,2)]
         ENDIF
     ENDIF
ELSE
     SETVAR  DEV_OWNER       ""
     SETVAR  DEV_NUM         0
     SETVAR  DEV_ACCEPTS_JOBS    FALSE
     SETVAR  DEV_ACCEPTS_DATA    FALSE
     SETVAR  DEV_WRITE_ENABLED   FALSE
     SETVAR  DEV_SPOOLED_OUT     FALSE
     SETVAR  DEV_DOWN_PENDING    FALSE
ENDIF
IF   UPS('!_VOLUME')     <>  'QUIET'
     ECHO LDEV![RHT('       !_DEV',8)]  &
          Status=![LFT('!DEV_STATUS         ',12)] &
          after![RHT('   !DEV_LOOP_CNT',4)] passes  &
          OK-flag=![LFT('!DEV_OK   ',5)] &
          (done)
ENDIF
RETURN
#    'DEVWAIT'   command-file return some status info on a device
#                and/or wait for it to have a requested status.
#                Orig version 11/21/2003,    Dave Powell,  MMfab.
#
#                Tested on MPE 7.5 (only).  Requires recent
#                version of MPE with JINFO function.
#
#                Best with SM capability.
#
#        This poor sucker was started after device info was
#        requested on an enhancement ballot, and was finished
#        enough to announce to the world on the same day as HP
#        announced they were going to do a devinfo function.
#        Its original purpose was to be the backup plan if HP
#        didn't.
#
#    -   If you just want it to set variables for device info,
#        omit all but the 1st parm.  Example:
#        :devwait 6
#        :showvar dev@
#
#    -   For an immediate answer with no pauses, omit the
#        3rd parm ('_LIMIT') or pass it '1'.  In that case,
#        4th parm ('_SECONDS') does not matter.  Example:
#        'devwait 6 SPOOLED 1 999' = 'devwait 6 SPOOLED'
#
#    -   Max seconds to wait is ( _LIMIT - 1) * _SECONDS.
#
#    -   If you think a device might become UNAVAIL, then
#        AVAIL, and you are afraid you might catch it before
#        it becomes UNAVAIL, try something like this:
#            :DEVWAIT 7 UNAVAIL 5 1
#            :DEVWAIT 7 AVAIL   50   5
#
#    -   It counts as an error to ask about a device that does
#        not exist at the start, but not to ask about a network
#        session terminal ldev that disappears between checks
#        if the session logs off.
#        Example: DEVWAIT 34 *INVALID* 200 5 LOUD
#
#    -   To verify that a tape drive is ready for a backup, check
#        that 'DEV_WRITE_ENABLED' is true and status is AVAIL.
#
#    ----------------------------------------------
#
#    Details on some variables:
#
#    DEV_VALID   Indicates that the device exists at the end.
#            -   If making multiple passes on a network session
#                device, it may start TRUE and then become FALSE
#                if the session logs off.
#            -   Many other variables are set only if this is
#                TRUE at the end.
#
#    DEV_STATUS  SPOOLED, DOWN, DISC, AVAIL, UNAVAIL, etc.
#            -   Normally the 1st word of SHOWDEV's AVAIL
#                column;  '*INVALID*' for a device that does
#                not exist; '*ERROR*' for calling syntax errors.
#            -   For a network session device, may change
#                between passes from 'UNAVAIL' to '*INVALID*'.
#                Can use this to wait for a network session to
#                log off.
#
#    DEV_OK      True if the device exists at the start and
#                has the desired status at the end.
#            -   If request '*INVALID*' and multiple checks on
#                a network sesssion device, and it logs off in
#                time, this can actually end up TRUE with
#                DEV_VALID false.
#
#    DEV_WRITE_ENABLED   Indicates that a tape drive is on-line
#                        and ready to write to.
#                    -   Just having a write-enabled tape in the
#                        drive does not set this value, it has to be
#                        on-line.
#                    -   May not work on older versions of MPE;
#                        it depends on '(W)' in a certain spot
#                        in SHOWDEV's output, which works for
#                        MPE 7.5, but the 1996 manual says it
#                        would be just 'W', and implies a
#                        different location.
#
#    DEV_JOB_ID      From SHOWDEV's ownership column.  #Snnn
#                    format.  Filled in for session devices and
#                    for non-spooled printers being written to
#                    'hot', etc.
#                -   Not tested for other types of device ownership.
#                -   Empty string if SHOWDEV owner field does not
#                    start with '#'.
#
#    DEV_SESSION_IPADDR  For network session devices, the IP addr
#                        in dotted format.  Empty string for other
#                        devices, including network printers.
#
#    DEV_NUM     Ldev# that was checked on, in case we requested
#                a device class.
#
#    ------------------------------------------------
#
#    Notes & gotchas:
#    A:      Showdev on non-existent device gives cierror 1581.
#            After this error, a successful SHOWDEV does NOT
#            set cierror back.
#
#    B:      Results are valid for individual device numbers
#            or device classes with only one member.  Asking
#            for status of 'disc' gives the status of the
#            highest-numbered disc.
#
#    C:  Printer status / availability / ownership:
#        -   Status 'SPOOLER' + ouwership blank may mean
#            "SPOOLER n; STOP; OPENQ"
#        -   Ownership 'SPOOLER OUT' is the indicator that the
#            spooler can actually print to it.
#        -   Status 'AVAIL' may mean a 'SPOOLER n; STOP' and
#            printing would be 'hot'.
#
#    ----------------------------------------------
#
#    Still to do:
#    -   Capture more JINFO items for session devices, such as
#        logon user & acct.
#
#    ?   Check for '(W)' indicating writeable tape with pmatch
#        or pos, instead of just checking bytes 20/22.
#        maybe   if pmatch ('@(W)@', DEV_RECORD)
#        or      if pos ('(W)', DEV_RECORD)  > 0
#
#    ?   Protect against session# & #-of-files being so high that
#        the word 'FILES' gets pushed out of the normal
#        ownership columns.
#
#    ?   Smoother handling of the jinfo security error on
#        ip# without SM capability.
#
#    ?   Bullet-proof the JINFO calls so we don't die if the
#        session that owns the device logs off at the wrong
#        split second ???   (what are the odds?)
#
#    ?   Special status if the device is 3000 :)
#    ?   Wait till 2007 if the device is HP3000 and requested
#        status is 'UNSUPPORTED' :(
#
#    ?   Set CIERROR back to its original value, esp if > 1581?
#
#    ?   Test on other versions of MPE besides 7.5 ?
#
#    ?   Set variables for:
#        ?   association ?
#        ?   tape labels ?
#        ?   etc
#
#    ----------------------------------------------
#
#    Maintenance:
#
#    04/01/2004  -   Make 1 the default _LIMIT, to make it easier
#                    to get an immediate answer.
#                -   Add output variables for device ownership
#                    & ldev#
#
#    05/17/2004  -   Setting owner's job-id & #-of-files
#                -   Unshifting volume & goal
#                -   Vars for job-accepting & data-accepting.
#
#    05/26/2004  -   Boolean DEV_SPOOLED_OUT, true only if
#                    ownership is 'SPOOLER OUT'
#                -   DEV_SESSION_IPADDR for network sessions,
#                    empty string for other devices.
#                    (this reqires SM capability)
#                -   Separate messages for each type of input error.
#                -   Boolean DEV_DOWN_PENDING, caused by a 'DOWN'
#                    command that has not completed.  True if
#                    '; DP' is found past position 25 of the
#                    showdev record.  Assumes that the ownership
#                    column will never be just 'DP' because the
#                    DOWN would have completed if the device wasn't
#                    owned by something.
#                    Note: other ownership info can push the
#                    '; DP' out of the normal ownership columns into
#                    the 'volid' area, so we can't just check the
#                    ownership variable for the '; DP'.  Example:
#                    '  127   J UNAVAIL       #S1591: 24 FILES; DP'



-----Original Message----- 
From: Johnson, Tracy
Sent: Thursday, June 11, 2015 06:56
To: [log in to unmask]
Subject: [HP3000-L] Reverse Osmosis on Checking Spooled LDEVs

I noticed there is no easy way in MPEX to return the value of LDEV if it is 
a spooled and active printer.  Returning an active spool file is easy but 
the returning the LDEV is not.

In other words there is no such thing:

IF LDEV = SPOOLED true AND SPOOLER(LDEV)=ACTIVE
  ECHO ***** DO SOMETHING TO LDEV HERE *****
ENDIF

The following method is slow and tedius because we have 15000 spool files. 
It takes 6 seconds to pass through each ldev and check 15000 spoolfles 
before it goes to the next LDEV.

We have 1200 ldevs, 50 are disc, 350 are sessions, 800 printers, The below 
would must also check nonexistent LDEVs to the upper limit of LDEV 
numbering,   At 6 seconds per LDEV, the below test would take seven and a 
half hours:

REPEAT
CONTINUE
SHOWOUT @[log in to unmask]@(SPOOL.DEVICE="!i" AND SPOOL.ISACTIVE=TRUE)
IF MPEXNUMSUCCEEDED > 0 THEN
  ECHO ***** DO SOMETHING TO LDEV HERE *****
ENDIF
FORNUM I=100,4679

Of course, YES I could use a traditional method like performing a SHODEV 
PRINTER (becasue I assigned that class), and reading the $STDLIST into a 
file and cropping out the spaces to pic up each LDEV number.  Then execute a 
script on each line of the edited file.

However my mind was thinking in a serial mode this morning.  Or it could be 
it is just too early.

Tracy Johnson
00 1 757 766 4318 tel
00 1 757 755-6470 mobile

* To join/leave the list, search archives, change list settings, *
* etc., please visit http://raven.utc.edu/archives/hp3000-l.html * 

* To join/leave the list, search archives, change list settings, *
* etc., please visit http://raven.utc.edu/archives/hp3000-l.html *

ATOM RSS1 RSS2