[Info-vax] Cleaning up license database

Phillip Helbig---undress to reply helbig at astro.multiCLOTHESvax.de
Thu Aug 11 01:30:52 EDT 2011


In article <4e430970$0$11115$c3e8da3 at news.astraweb.com>, Sum1
<not at here.com> writes: 

> Some years ago, some kind person (VAXman, JF….?  can't remember) posted 
> some DCL to clean up old licensed from the database, rather than doing 
> it one-by-one by hand….but I can't seem to locate a copy.
> 
> If someone has a working version of same, could you please post it here again?

$! Synopsis:   This command file disables all the terminated licenses
$!    in the active license database, which is defined by
$!    the current value of LMF$LICENSE.
$
$! Parameters: None
$
$! Author:  Robert Deininger
$! Created: January, 2001
$
$! Version:     V2.1 (generation 3)
$
$! Define some simple status codes.
$
$ lic__status  = %x10000000
$ lic__success = lic__status + %x0001
$ lic__ctrly   = lic__status + %x000C
$
$! Set up interrupt and error handlers.
$
$ status = lic__success
$ on control_y then goto control_y
$ on warning then goto error
$
$! Find subroutine library.
$ gosub jrddcl_init
$
$! Define some useful symbols.
$ say = "write sys$output"
$
$! The real work starts here.
$
$ tempfile1 = "terminated.lis;"
$ tempfile2 = "disable_terminated.com;"
$
$ current_ldb = f$search(f$trnlnm("lmf$license"))
$
$ type sys$input

 Utility to DISABLE all the terminated licenses in the active
 license database...

 The active database is:
$ say "   ",current_ldb
$ type sys$input

 This utility makes many changes to the license database.  Do you
 want a backup copy of the database file saved before changes
 are made?
$10:
$ on warning then goto 10
$ jrdcall ask lic__answer b "Save a backup copy?" "YES" U,S
$ on warning then goto error
$
$ if lic__answer
$ then
$    current_ldb = current_ldb - f$parse(current_ldb,,,"version")
$    say ""
$!   changed copy to backup to preserve dates
$    backup/log 'current_ldb' 'current_ldb'_backup;
$!   not needed anymore, but leave in for documentation
$    current_ldb = f$search(f$trnlnm("lmf$license"))
$    say ""
$!    say " The new highest version will be modified."
$!   added 20-OCT-2007
$    file_spec = f$element(0,";",current_ldb) + ";*"
$!    dir/dat=(c,m)/siz=all 'current_ldb'
$    dir/dat=(c,m)/siz=all 'file_spec'
$ endif
$
$ say " Finding terminated licenses..."
$ 
$! Get a list of terminated licenses.
$ license list/before/terminated/full/output='tempfile1'
$
$ say " Making a command file to disable licenses..."
$
$! Open the input and output files.
$ open/read  tempfile1 'tempfile1'
$ open/write tempfile2 'tempfile2'
$
$ target_string = "-----------------------"
$main_loop:
$ gosub find_string
$ if input_string .nes. ""
$ then
$!   We have read the "header" line for a single license.
$!   Look for expected beginnings on the next 4 lines, and save the good
$!   parts.
$
$    get_string = "Issuer:"
$    gosub get_string
$    if result_string .nes. ""
$    then
$       issuer = result_string
$    else
$       goto main_loop
$    endif
$
$    get_string = "Authorization:"
$    gosub get_string
$    if result_string .nes. ""
$    then
$       authorization = result_string
$    else
$       goto main_loop
$    endif
$
$    get_string = "Product Name:"
$    gosub get_string
$    if result_string .nes. ""
$    then
$       product_name = result_string
$    else
$       goto main_loop
$    endif
$
$    get_string = "Producer:"
$    gosub get_string
$    if result_string .nes. ""
$    then
$       producer = result_string
$    else
$       goto main_loop
$    endif
$
$    ! We have the 4 important pieces of information we wanted.  Generate
$    ! a LICENSE DISABLE command.
$    gosub write_command
$
$    goto main_loop
$ endif
$
$! We have processed the whole input file.
$ close tempfile1
$ write tempfile2 "$ exit"
$ close tempfile2
$
$20:
$ on warning then goto 20
$ jrdcall ask lic__answer b "Do you want to view the command file?" -
             "YES" U,S
$ on warning then goto error
$
$ if lic__answer
$ then
$    type/page 'tempfile2'
$ endif
$
$30:
$ on warning then goto 30
$ jrdcall ask lic__answer b -
     "Do you want to execute these commands to modify the license database?" -
     "" U,S
$ on warning then goto error
$
$ if lic__answer
$ then
$    @'tempfile2'
     type sys$input

 Disabling is complete.

 You may want to execute
   $ LICENSE DELETE */STATUS=DISABLED/LOG
 to completely remove all disabled licenses from the database.
$
$ else
$    say ""
$    say " Modifications cancelled."
$ endif
$
$ goto cleanup
$
$CONTROL_Y:
$ status = lic__ctrly
$ goto cleanup
$
$ERROR:
$ status = $status
$ goto cleanup
$
$CLEANUP:
$ if f$search(tempfile1) .nes. "" then delete/nolog/noconfirm 'tempfile1'*
$ if f$search(tempfile2) .nes. "" then delete/nolog/noconfirm 'tempfile2'*
$
$ if f$type(lic__answer) .nes. "" then delete/symbol/global/nolog lic__answer
$
$ exit status .or. %x10000000
$
$FIND_STRING:
$! This subroutine reads lines from tempfile1 until it obtains a line that
$! begins with target_string.  It returns with input_string equal to the
$! entire input line, or the null string if the end of the file was reached
$! without finding the target.
$
$find_loop:
$ read/end_of_file=end_of_file tempfile1 input_string
$ if f$locate(target_string,input_string) .eq. 0
$ then
$    ! The current string begins with the target.
$    return ! (FIND_STRING)
$ else
$    goto find_loop
$ endif
$
$end_of_file:
$ input_string = ""
$ return ! (FIND_STRING)
$
$GET_STRING:
$! This subroutine reads a line from tempfile1, checks that it starts
$! with get_string, and returns in result_string the last part of the
$! string.  The "last part" is the second element delimited by " ",
$! after the part matching get_string is removed.
$
$ read tempfile1 input_string
$ if f$locate(get_string,input_string) .eq. 0
$ then
$    ! The current string begins with the target.
$    temp = f$edit((input_string - get_string),"compress")
$    result_string = f$element(1," ",temp)
$
$ else
$    say "Unexpected line.  Expected ''get_string', found:"
$    say line
$    say ""
$
$    result_string = ""
$ endif
$
$ return ! (GET_STRING)
$
$WRITE_COMMAND:
$! This subroutine writes a single "license disable" command to tempfile2,
$! using the information in symbols PRODUCT_NAME, AUTHORIZATION, ISSUER,
$! and PRODUCER.
$
$ write tempfile2 "$ license disable/log ''product_name' -"
$ write tempfile2 "    /authorization=''authorization' -"
$ write tempfile2 "    /issuer=''issuer' -"
$ write tempfile2 "    /producer=''producer'"
$ write tempfile2 "$!"
$
$ return ! (WRITE_COMMAND)
$!---------------------------------------
$
$! Title:   Initialize symbol pointing to main DCL library file
$
$! Synopsis:
$!   This routine attempts to define the symbol JRDCALL to point to
$!   my library of DCL routines.  The library is either in a standard
$!   file located via logical name JRD_JRDDCL (on my own systems/accounts)
$!   or appended to this file (for DCL utilities that I distribute).
$!   This routine rarely changes; it is convenient to append it to any DCL
$!   file that uses JRDDCL.COM.
$! V1.0 (generation 1)
$
$
$JRDDCL_INIT:
$
$! Try the logical name first.
$ jrddcl_file = f$search("jrd_jrddcl")
$ if jrddcl_file .eqs. "" then goto jrddcl_init_nofile
$
$ jrdcall := @'jrddcl_file'
$ jrddcl_subroutine :=
$ call jrddcl_init_try
$ if $status then return
$
$JRDDCL_INIT_NOFILE:
$
$! Look for JRDDCL routines in this file.
$ jrdcall := call jrddcl_call_entry
$ jrddcl_subroutine := subroutine
$ call jrddcl_init_try
$ if $status then return
$
$JRDDCL_INIT_NOTFOUND:
$
$! Neither method worked, give up.
$ delete/symbol jrdcall
$ delete/symbol jrddcl_subroutine
$ write sys$output "Can't find JRDDCL subroutine library."
$ write sys$output "... define logical name JRD_JRDDCL or"
$ write sys$output "... append library to this file."
$ exit
$
$JRDDCL_INIT_TRY:
$ subroutine
$    on warning then exit $status
$    jrdcall test
$ endsubroutine
$
$ exit
$!---------------------------------------
$!   DCL subroutine library
$!      Modelled after the example in "Writing Real Programs in DCL, 2nd
$!      Edition."
$!   V2.2 (generation 4)
$
$ goto jrddcl_atsign_entry
$
$! CALL entry point used when this library is appended to another DCL file.
$JRDDCL_CALL_ENTRY:
$  jrddcl_subroutine  ! For CALL entry only, symbol substitution makes this
$                     ! a SUBROUTINE statement.
$
$! @-sign entry used when this library is in a separate file.
$JRDDCL_ATSIGN_ENTRY:
$
$  jrddcl__status = %x10000000
$  jrddcl__success = jrddcl__status + %x0001
$  on control_y then exit jrddcl__status + %x0004
$  on warning then exit $status .or. %x10000000
$
$  display = "write sys$output"
$  if f$type(jrdcall) .nes. "STRING"
$  then
$     jrdcall = "@" + f$environment("PROCEDURE")
$  endif
$  goto jrddcl_'p1'
$
$! Title:   Test accessibility of the DCL library
$
$! Synopsis:   This subroutine just returns a success status code.  It
$!    is intended to allow calling routines to verify that they know
$!    how to find the library.
$
$! Parameters:
$!    None.
$
$JRDDCL_TEST:
$
$  exit jrddcl__success
$
$! Title:   Ask a Question
$
$! Synopsis:   This subroutine asks the user a question and returns
$!    the answer.  The prompt for the question is composed
$!    of a query string and optionally a default answer.
$
$! Parameters:
$!    P2: A global symbol to receive the answer.
$!    P3: The data type of the answer.  B for boolean
$!        (yes,no); I for integer; S for string.
$!    P4: The query string for the question.  It must end
$!        with a punctuation character and no space.
$!    P5: The default answer (optional; if not specified
$!        then an answer must be entered).
$!    P6: A comma-separated list of options:
$!       H: Display help before asking question.
$!       S: Skip a line before asking question.
$!       U: Upcase the input string.
$!       Z: Allow Ctrl/Z as an nswer.
$!    P7: The help specifier (optional).  It must be in
$!        in the form "procedure [parameter...]".  The
$!        procedure is invoked with the @-sign command.
$
$JRDDCL_ASK:
$
$  signal = jrdcall + " signal ask"
$  if p3 .eqs. "B" .and. p5 .nes. "" .and. f$type(p5) .eqs. "INTEGER"
$       then
$     p5 = f$element(p5,"/","NO/YES")
$  endif
$  if p5 .nes. ""
$  then
$     p4 = f$extract(0,f$len(p4)-1,p4) + -
           " [" + p5 + "]" + f$extract(f$len(p4)-1,1,p4)
$  endif
$  if f$locate("S",p6) .ne. f$length(p6) then display ""
$  if f$locate("H",p6) .ne. f$length(p6) then @'p7'
$
$jrddcl_a10:
$  read sys$command/prompt="''p4' " input/end_of_file=a_eof
$  if input .eqs. "" then input = p5
$  input = f$edit(input,"TRIM")  
$  if input .eqs. ""
$  then
$     signal w inputreq "Please enter a value; there is no default."
$  else if input .eqs. "?"
$  then
$     if p7 .nes. "" then @'p7'
$     if p7 .eqs. "" then display "There is no help for this question."
$  else
$     goto jrddcl_a_'p3'
$jrddcl_a_B:
$     input = f$edit(input,"UPCASE")
$     if f$locate(input,"YES") .eq. 0 .or. -
         f$locate(input,"NO") .eq. 0
$     then
$        input = input .and. 1
$        goto jrddcl_a19
$     else
$        signal w yesnoreq "Please answer YES or NO."
$     endif
$     goto jrddcl_a15
$
$jrddcl_a_I:
$     if f$type(input) .eqs. "INTEGER"
$     then
$        input = f$integer(input)
$        goto jrddcl_a19
$     else
$        signal w intreq "The input must be an integer."
$     endif
$     goto jrddcl_a15
$
$jrddcl_a_S:
$     if f$locate("U",p6) .ne. f$length(p6)
$     then
$        input = f$edit(input,"UPCASE")
$     endif
$     goto jrddcl_a19
$jrddcl_a15:
$  endif
$  endif
$  goto jrddcl_a10
$jrddcl_a_eof:
$  input = "^Z"
$  if f$locate("Z",p6) .ne. f$length(p6) then goto jrddcl_a19
$  signal i invctrlz "End-of-file is not a valid response."
$  goto jrddcl_a10
$jrddcl_a19:
$  'p2' == input
$  exit jrddcl__success
$
$! Title:   Signal an Informational or Error Message
$
$! Synopsis:   This subroutine "signals" a message, producing one
$!    or more message lines in the standard OpenVMS format.
$!    It also exits with a status whose severity matches
$!    that of the message.
$
$! Parameters:
$!    P2: The message facility code.
$!    P3: The message serverity (S, I, W, E, or F).
$!    P4: The message identification.
$!    P5: The message text.
$!    Pn: Optional message lines or status codes whose
$!        corresponding message lines are to me included.
$
$! Status:  The severity of the exit status is equal to the
$!    message severity, except in the case of warnings.
$!    If the message severity is W, an informational
$!    severity is included in the status so that the
$!    caller's error handler is not invoked.
$
$JRDDCL_SIGNAL:
$
$  prefix = f$fao("%!AS-!AS-!AS, ",p2,p3,p4)
$  i = 4
$jrddcl_s10:
$     i = i + 1
$     if i .gt. 8 then goto jrddcl_s19
$     if p'i' .eqs. "" then goto jrddcl_s19
$     text = p'i'
$     if f$type(text) .eqs. "INTEGER"
$     then
$        text = f$message(text)
$     endif
$     if f$ext(0,1,text) .nes. "%" then text = prefix + text
$     if i .gt. 5 then text [0,1] := "-"
$     display text
$     goto jrddcl_s10
$jrddcl_s19:
$  if p3 .eqs. "W" then p3 = "I"
$  exit jrddcl__status + f$locate(p3,"WSEIF")
$
$! Title:   Display a Message
$
$! Synopsis:   This subroutine outputs a message, producing one
$!    or more message lines in the standard OpenVMS format.
$!    It exits with an informational status so the caller's
$!    error handler is not invoked.
$
$! Parameters:
$!    P2: The message facility code.
$!    P3: The message serverity (S, I, W, E, or F).
$!    P4: The message identification.
$!    P5: The message text.
$!    Pn: Optional message lines or status codes whose
$!        corresponding message lines are to me included.
$
$! Status:  Always success.  The caller's error handler is not
$!    invoked.
$
$JRDDCL_MESSAGE:
$
$  prefix = f$fao("%!AS-!AS-!AS, ",p2,p3,p4)
$  i = 4
$jrddcl_m10:
$     i = i + 1
$     if i .gt. 8 then goto jrddcl_m19
$     if p'i' .eqs. "" then goto jrddcl_m19
$     text = p'i'
$     if f$type(text) .eqs. "INTEGER"
$     then
$        text = f$message(text)
$     endif
$     if f$ext(0,1,text) .nes. "%" then text = prefix + text
$     if i .gt. 5 then text [0,1] := "-"
$     display text
$     goto jrddcl_m10
$jrddcl_m19:
$  p3 = "I"
$  exit jrddcl__status + f$locate(p3,"WSEIF")



More information about the Info-vax mailing list