$ sav_verify = 'f$verify(0) $ sav_message = f$environment("MESSAGE") $ set = "set" $ set symbol/scope=noglobal $ delete /symbol/local set $! $ if f$trnlnm("LMFUNIT$DEBUG") .nes. "" then set verify $ set control = Y $ on control_y then GOTO Control_y $ set noon $! $ action = "" $ if P1 .NES. "" $ then $ action = P1 $ goto Menu_action $ endif $! $Display_Menu: $!------------ $! $ type sys$input hp OpenVMS Industry Standard 64 PPL License Units Management Utility Choose an action from the list below: 1. Create Units Data Text CSV File from the License Database 2. Generate Units Assignment Procedure from a CSV Text File 3. Generate MODIFY LICENSE /INCLUDE commands from a CSV Text File 4. Generate MODIFY LICENSE /EXCLUDE commands from a CSV Text File 5. Display the Contents of a Units Data Text CSV File 99. Print Utility Disclaimer and Description Enter ? or "HELP" at any prompt to obtain help Enter Z, "Quit" or "Exit" to exit immediately $! $ read/End_of_File=Main_Exit/Error=time_expired/timeout=255 - /prompt="What action do you want to perform? (1-5,99,EXIT,HELP): " - SYS$COMMAND action $! $ action = f$edit(action,"COMPRESS,UPCASE") $ if action .eqs. "" then GOTO Display_Menu $ if (F$locate(action,"EXIT") .eq. 0 ) .or. (F$locate(action,"QUIT") .eq. 0) then GOTO Main_Exit $ if action .eqs. "?" .or. (F$locate(action,"HELP") .eq. 0) $ then $ GOTO Display_Menu $ endif $! $Menu_action: $ if action .eqs. "1" then GOTO Create_Units_File $ if action .eqs. "2" then GOTO Generate_Procedure $ if action .eqs. "3" then GOTO Include_List $ if action .eqs. "4" then GOTO Exclude_list $ if action .eqs. "5" then GOSUB Type_Units_File $ if action .eqs. "99" then GOSUB Print_Utility_Description $! $ IF F$TRNLNM("UNITS_FILE") .NES. "" THEN CLOSE UNITS_FILE $! $ GOTO Display_Menu $! $Time_expired: $!------------ $ write sys$output "Timeout on input, exiting..." $! $Control_y: $!--------- $! $Main_Exit: $!--------- $! $ IF F$TRNLNM("UNITS_FILE") .NES. "" THEN CLOSE UNITS_FILE $ EXIT 1+0*'f$verify(sav_verify) $! $! ! $!+----------------------------------------------------------------------------- $! Create a new units CSV file $!+----------------------------------------------------------------------------- $Create_Units_File: $!------------------- $ CALL GENERATE_CLUSTER_PPL_DATA $ GOTO Display_Menu $! $! ! $!+----------------------------------------------------------------------------- $! Read a CSV file and generate DCL commands $!+----------------------------------------------------------------------------- $Generate_Procedure: $!----------------- $ CALL CLUSTER_ASSIGN_UNITS 'P2' 'P3' $ GOTO Display_Menu $! $!+----------------------------------------------------------------------------- $! copy DCL command procedure $!+----------------------------------------------------------------------------- $Copy_Procedure: $!--------------- $ GOSUB NOT_IMPLEMENTED $ GOTO Display_Menu $! $! $!+----------------------------------------------------------------------------- $! remove DCL command procedure $!+----------------------------------------------------------------------------- $Remove_Procedure: $!---------------- $ GOSUB NOT_IMPLEMENTED $ GOTO Display_Menu $! $! $!+----------------------------------------------------------------------------- $! type a units assignment csv file $!+----------------------------------------------------------------------------- $Type_Units_File: $!---------------- $ Ufile="" $ INQUIRE Ufile "Enter the name of the Units Text file to list" $ IF Ufile .EQS. "" THEN RETURN $ Tfile = F$PARSE(Ufile,,,,"SYNTAX_ONLY") $ IF Tfile .eqs. "" $ THEN $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-INVFILNAM, Invalid file name ''CSV_FILE'" $ RETURN $ ENDIF $! $! $ WRITE SYS$OUTPUT "" $ WRITE SYS$OUTPUT "Listing Contents of ''Tfile'" $ WRITE SYS$OUTPUT "" $! $ Type 'Tfile' $! $ WRITE SYS$OUTPUT "" $ INQUIRE Ufile "Hit any key to continue" $! $ RETURN $! $!+----------------------------------------------------------------------------- $! Generate Exclude list commands $!+----------------------------------------------------------------------------- $Exclude_List: $!------------ $! $ zero_response = "Yes" $ Lic_qualifier = "/EXCLUDE=(" $! $ gosub Get_yes_no $ if zero_response .EQS. "EXIT" THEN goto Exclude_List_Ret $! $Exclude_List_file: $ Ufile="" $ INQUIRE Ufile "Enter the name of the Units Text file to process" $ IF Ufile .EQS. "" THEN GOTO Exclude_List_Ret $ Tfile = F$PARSE(Ufile,,,,"SYNTAX_ONLY") $ IF Tfile .eqs. "" $ THEN $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-INVFILNAM, Invalid file name ''Ufile'" $ GOTO Exclude_List_Ret $ ENDIF $! $ if f$search("''Ufile'") .EQS. "" $ then $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-FNF,''Ufile' file not found." $ GOTO Exclude_List_file $ ENDIF $! $ Modify_command_file = f$parse(Ufile,,,"NAME") + ".COM" $ UNITS_WORK_FILE = "" $ GOSUB Process_modify_list $! $Exclude_List_Ret: $! $ GOTO Display_Menu $! $!+----------------------------------------------------------------------------- $! Generate Include list commands $!+----------------------------------------------------------------------------- $Include_List: $!------------ $! $ zero_response = "No" $ Lic_qualifier = "/INCLUDE=(" $! $ gosub Get_yes_no $ if zero_response .EQS. "EXIT" THEN goto Include_List_RET $! $Include_List_file: $ Ufile="" $ INQUIRE Ufile "Enter the name of the Units Text file to process" $ IF Ufile .EQS. "" THEN GOTO Include_List_RET $ Tfile = F$PARSE(Ufile,,,,"SYNTAX_ONLY") $ IF Tfile .eqs. "" $ THEN $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-INVFILNAM, Invalid file name ''Ufile'" $ GOTO Include_List_file $ ENDIF $! $ if f$search("''Ufile'") .EQS. "" $ then $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-FNF, ''Ufile' file not found." $ GOTO Include_List_file $ ENDIF $! $ Modify_command_file = f$parse(Ufile,,,"NAME") + ".COM" $ UNITS_WORK_FILE = "" $ GOSUB Process_modify_list $ $! $Include_List_RET: $ GOTO Display_Menu $! $!+--------------------------------------------------------- $! $!---------------------------------------------------------- $Process_modify_list: $!-------------------- $! $! find the "License Name" record $! $ open/read/error=Process_modify_list_Err units_file 'Ufile' $ license_record = "" $! $Read_0010: $ READ/END_OF_FILE=No_License_Record/ERROR=Process_modify_list_Err units_file units_record $ units_record = F$EDIT(units_record,"COLLAPSE,UPCASE") $ IF F$LOCATE("!",UNITS_RECORD) .NES. F$LENGTH(UNITS_RECORD) $ THEN $ UNITS_RECORD = F$EXTRACT(0,F$LOCATE("!",UNITS_RECORD),UNITS_RECORD) $ ENDIF $ IF UNITS_RECORD .EQS. "" THEN GOTO Read_0010 $ IF F$EXTRACT(0,1,UNITS_RECORD) .EQS. "!" THEN GOTO Read_0010 $! $ INDEX=0 $ FIELD0 = F$EDIT(F$ELEMENT(INDEX,",",UNITS_RECORD),"UPCASE") $! $ IF F$EXTRACT(0,7,FIELD0) .NES. "LICENSE" THEN GOTO Read_0010 $ IF F$EXTRACT(7,1,FIELD0) .NES. "N" THEN GOTO Read_0010 $! $ license_record = units_record $! $! build a record for each license/node/units value $Build_Temp_file: $!-------------- $ UNITS_WORK_FILE = F$UNIQUE() + ".TMP" $ open/write/error=Process_modify_list_Err UNITS_WFILE 'UNITS_WORK_FILE' $! $Read_030: $!-------- $ READ/END_OF_FILE=No_More_nodes/ERROR=Process_modify_list_Err units_file units_record $! $ UNITS_RECORD = F$EDIT(UNITS_RECORD,"COLLAPSE,UPCASE") $ IF UNITS_RECORD .EQS. "" THEN GOTO Read_030 $! skip the information records $ IF F$EXTRACT(0,1,UNITS_RECORD) .EQS. "!" THEN GOTO Read_030 $ IF F$EXTRACT(0,8,UNITS_RECORD) .EQS. "LICENSEU" THEN GOTO Read_030 $ IF F$EXTRACT(0,9,UNITS_RECORD) .EQS. "ASSIGNEDU" THEN GOTO Read_030 $ IF F$EXTRACT(0,9,UNITS_RECORD) .EQS. "REMAINING" THEN GOTO Read_030 $! $ index = 0 $ node_name = f$element(index,",",UNITS_RECORD) $! $write_temp_rec: $ index = index + 1 $ license_name = f$element(index,",",license_record) $ if license_name .EQS. "," then goto Read_030 $ if license_name .EQS. "REQUIRED" then goto write_temp_rec $! $ units_value = f$element(index,",",UNITS_RECORD) $ temp_rec = f$fao("!31AS ,!AS,!AS",license_name,node_name,units_value) $ write UNITS_WFILE temp_rec $! $ goto write_temp_rec $! $No_More_nodes: $!------------- $ CLOSE UNITS_FILE $ CLOSE UNITS_WFILE $! $ SORT 'UNITS_WORK_FILE' 'UNITS_WORK_FILE' $! $ open/read/error=Process_modify_list_Err UNITS_WFILE 'UNITS_WORK_FILE' $ write sys$output "%LMFUNIT-I-CREFIL, Creating file ''Modify_command_file'" $ open/write/error=Process_modify_list_Err cmd_file 'Modify_command_file' $! $! read the first record $ Read UNITS_WFILE UNITS_RECORD $! $ license_name = f$edit(f$element(0,",",UNITS_RECORD),"COLLAPSE") $ node_name = f$edit(f$element(1,",",UNITS_RECORD),"COLLAPSE") $ units = f$edit(f$element(2,",",UNITS_RECORD),"COLLAPSE") $! $ node_list = "" $ prev_license_name = license_name $! $Update_node_list: $ IF Lic_qualifier .EQS. "/EXCLUDE=(" then gosub do_exclude $ IF Lic_qualifier .EQS. "/INCLUDE=(" then gosub do_include $ $ Read/end_of_file=finish_node_list UNITS_WFILE UNITS_RECORD $ license_name = f$edit(f$element(0,",",UNITS_RECORD),"COLLAPSE") $ node_name = f$edit(f$element(1,",",UNITS_RECORD),"COLLAPSE") $ units = f$edit(f$element(2,",",UNITS_RECORD),"COLLAPSE,UPCASE") $ $ if license_name .EQS. prev_license_name then goto Update_node_list $ if node_list .NES. "" $ then $ node_list = f$extract(0,(f$length(node_list)-1),node_list) $ cmd_rec = "$ LICENSE MODIFY ''prev_license_name' ''Lic_qualifier'''node_list')" $ write cmd_file cmd_rec $ node_list = "" $ endif $! $ prev_license_name = license_name $ goto Update_node_list $ $finish_node_list: $ if node_list .NES. "" $ then $ node_list = f$extract(0,(f$length(node_list)-1),node_list) $ cmd_rec = "$ LICENSE MODIFY ''prev_license_name' ''Lic_qualifier'''node_list')" $ write cmd_file cmd_rec $ node_list = "" $ endif $! $ close cmd_file $ close UNITS_WFILE $ goto Process_modify_list_Err $! $No_License_Record: $!---------------- $ write sys$output "%LMFUNIT-E-NOLICNAM, License Name record not found in ''Ufile' ." $Process_modify_list_Err: $!---------------------- $ IF F$TRNLNM("UNITS_FILE") .NES. "" THEN CLOSE UNITS_FILE $ IF F$TRNLNM("UNITS_WFILE") .NES. "" THEN CLOSE UNITS_WFILE $ IF F$TRNLNM("cmd_file") .NES. "" THEN CLOSE cmd_file $ if f$search("''UNITS_WORK_FILE'") .NES. "" then delete/nolog 'UNITS_WORK_FILE';* $Process_modify_list_Ret: $ RETURN $! $! check if this node belongs on the license include list $! $do_include: $!---------- $ if units .eqs. "" then goto do_include_ret ! no value - skip $ if f$locate("EX",units) .ne. f$length(units) then goto do_include_ret ! "exclude" in value field - skip $ if f$locate("IN",units) .ne. f$length(units) then goto do_include_node ! "include" in value field $ if f$type(units) .EQS. "STRING" then goto do_include_ret ! a string != "exclude" or "include" - skip $ numunits = f$integer(units) ! a number check for inclusion $ if numunits .gt. 0 then goto do_include_node $ if f$extract(0,1,zero_response) .EQS. "N" then goto do_include_ret $! $do_include_node: $ node_list = node_list + node_name + "," $! $do_include_ret: $ RETURN $! $do_exclude: $!---------- $ if units .eqs. "" then goto do_exclude_ret ! no value - skip $ if f$locate("EX",units) .ne. f$length(units) then goto do_exclude_node ! "exclude" in value field $ if f$locate("IN",units) .ne. f$length(units) then goto do_include_ret ! "include" in value field - skip $ if f$type(units) .EQS. "STRING" then goto do_exclude_ret ! a string != "exclude" or "include" - skip $ numunits = f$integer(units) ! a number check for inclusion $ if numunits .gt. 0 then goto do_exclude_ret $ if f$extract(0,1,zero_response) .EQS. "N" then goto do_include_ret $! $do_exclude_node: $ node_list = node_list + node_name + "," $ $do_exclude_ret: $ RETURN $! $NOT_IMPLEMENTED: $!--------------- $ type sys$input %LMFUNIT-E-NOTIMP, The chosen menu item is not currently implemented. Please select another menu item. $! $ $! $ RETURN $! $Get_yes_no: $!---------- $ default_response = zero_response $ $ read/End_of_File=Get_yes_no_xit/Error=Get_yes_no_xit/timeout=255 - /prompt="Add zero valued nodes to include list:[''zero_response']" - SYS$COMMAND zero_response $! $ zero_response = f$edit(zero_response,"collapse,UPCASE") $ if zero_response .EQS. "" then zero_response = default_response $ if f$extract(0,1,zero_response) .NES. "Y" .AND. - f$extract(0,1,zero_response) .NES. "N" then goto Get_yes_no $ $ if f$extract(0,1,zero_response) .EQS. "Y" $ then $ zero_response = "YES" $ else $ zero_response = "NO" $ endif $! $ GOTO Get_yes_no_RET $! $Get_yes_no_xit: $ zero_response = "EXIT" $Get_yes_no_RET: $ delete/symbol default_response $ RETURN $! $!+----------------------------------------------------------------------------- $ $Print_Utility_Description: $!------------------------- $ type/page sys$input **** DISCLAIMER **** Use this tool IF AND ONLY IF you need to override normal License Management Facility LICENSE LOAD behavior. The accuracy and results of this procedure are not covered under warranty. The user of this procedure must verify the contents, accuracy and completeness of the files and procedures generated by this tool. The user of this procedure and of the files generated by this procedure is solely responsible for the results of their use. ****** The PPL License Units Management Utility provide tools to help manage license units for OpenVMS Per Processor Licenses(PPL). The management uses Comma Separated Variable (CSV) text files to describe the management values. The use of a CSV file allows the file to be open and updated with any text editor or spreadsheet program. Here is an example of a CSV file generated by the selection "1. Create Units Data Text CSV File from the License Database". > TYPE SAMPLE.CSV License Name,Required,OPENVMS-I64-FOE,OPENVMS-I64-MCOE,DVNETEXT,VAXSET License Units,4,1,20,20,20 ADU26B,2,2,2,2,exclude ARTOS2,2,exclude,1,0,0 Assigned Units,4,2,3,2,1 Remaining Units,0,-1,17,18,19 > This file contains data about 4 PPL Licenses and how 2 nodes use the licenses. ROW 1: License Description Record - Required License Name,Required,OPENVMS-I64-FOE,OPENVMS-I64-MCOE,DVNETEXT,VAXSET The first record of the CSV file should contain the key "License Name" in column one and lists the PPL licenses represented in the file. The optional "Required" keyword in the second column means that column 2 represents the license units value required for license compliance/ Row 2: Licensed Units Description Record - Optional License Units,4,1,20,20,20 The record with the keyword "License Units" lists the number of units purchased for the Licenses. The "required" column sums the compliance values for the nodes in the file. Row 3,4: Node Description Record - Required ADU26B,2,2,2,2,exclude ARTOS2,2,exclude,1,0,0 The node description record tell the utility how many units are assigned for a license. In this example, column two indicates that nodes ADU26B and ARTOS2 each required 2 units for PPL license compliance. The value "exclude" in a column indicates the node was in the /EXCLUDE list or was NOT in the /INCLUDE list for the corresponding license. The value "1" in column four of node ARTOS2's record means 1 unit is/will be loaded for the OPENVMS-I64-MCOE license. Since column two's value is "2", the MCOE license is non-compliant/ The value "0" in a column does not mean zero units will be loaded for the license. If the CSV file is created by the tool, a zero value means the license was not loaded on the node at the time the tool was run. The zero value means the license will take the default action if loaded on the node, that is load the number of units for compliance. So the following two rows are equivalent: ADU26B,2,2,2,2,exclude ADU26B,2,0,0,0,exclude The last two rows of the file contain optional information about the number of allocated units and the number of available units for the corresponding licenses. Assigned Units,4,2,3,2,1 Remaining Units,0,-1,17,18,19 $! $ RETURN $! $!+--------------------------------------------------------------------------- $! $!+--------------------------------------------------------------------------- $ CLUSTER_ASSIGN_UNITS: SUBROUTINE $! $! $! DEFINE INDEX SYMBOLS $! $ FOUND_COMPLIANCE_COLUMN="FALSE" $ FOUND_TOTALS_RECORD="FALSE" $ FOUND_LICENSE_RECORD="FALSE" $ FOE_INDEX=0 $ EOE_INDEX=0 $ MCOE_INDEX=0 $ COMP_INDEX=0 $! $! initialize the total units symbols $! $ FOE_TOTAL_UNITS=99999 $ EOE_TOTAL_UNITS=99999 $ MCOE_TOTAL_UNITS=99999 $ COMP_TOTAL_UNITS=99999 $! $! initialize the remaining units symbols $! $ FOE_REM_UNITS=FOE_TOTAL_UNITS $ EOE_REM_UNITS=EOE_TOTAL_UNITS $ MCOE_REM_UNITS=MCOE_TOTAL_UNITS $! $ FOE_UNITS="" $ EOE_UNITS="" $ MCOE_UNITS="" $ COMPLIANCE_UNITS=0 $ UNITS="" $ INDEX=0 $ FIELD="" $ FIELD0="" $! $ LMF$WRITE_OUTPUT = "WRITE/ERROR=OUTPUT_ERROR OUTPUT_FILE OUTPUT_RECORD" $! $ INPUT_FILE = "" $ IF P1 .NES. "" $ THEN $ INPUT_FILE = P1 $ ELSE $ INQUIRE INPUT_FILE "Enter the location of a units allocation csv file" $ ENDIF $! $ INPUT_FILE = F$PARSE(INPUT_FILE,,,,"SYNTAX_ONLY") $ IF F$SEARCH(INPUT_FILE) .EQS. "" $ THEN $ write sys$output "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-FNF, ''INPUT_FILE' file not found" $ GOTO INPUT_FILE_ERROR $ ENDIF $! $ OPEN/READ/ERROR=INPUT_FILE_ERROR UNITS_FILE 'INPUT_FILE' $ $ OUTPUT_FILE = "LMF$ASSIGN_CLUSTER_OE_UNITS.COM" $! $ LOGICAL_FILE = F$PARSE(OUTPUT_FILE,,,,"SYNTAX_ONLY") $ IF LOGICAL_FILE .EQS. "" $ THEN $ WRITE SYS$OUTPUT "%LMFUNIT-E-INVFILNAM, Invalid file name ''OUTPUT_FILE'" $ GOTO NO_MORE_INPUT $ ENDIF $ WRITE SYS$OUTPUT "%LMFUNIT-I-CREFIL, Creating file ''LOGICAL_FILE'" $! $! Terminate if warning or greater encountered $! $ ON WARNING THEN GOTO OUTPUT_ERROR $! $! $! check if the first records of the file contain license name $! and license total units information. $! $READ_UNITS_HEADER: $!---------------- $ READ/END_OF_FILE=NO_MORE_INPUT/ERROR=NO_MORE_INPUT UNITS_FILE UNITS_RECORD $ UNITS_RECORD = F$EDIT(UNITS_RECORD,"COLLAPSE,UPCASE") $ IF F$LOCATE("!",UNITS_RECORD) .NES. F$LENGTH(UNITS_RECORD) $ THEN $ UNITS_RECORD = F$EXTRACT(0,F$LOCATE("!",UNITS_RECORD),UNITS_RECORD) $ ENDIF $! $ IF UNITS_RECORD .EQS. "" THEN GOTO READ_UNITS_HEADER $ IF F$EXTRACT(0,1,UNITS_RECORD) .EQS. "!" THEN GOTO READ_UNITS_HEADER $! $ INDEX=0 $ FIELD0 = F$EDIT(F$ELEMENT(INDEX,",",UNITS_RECORD),"UPCASE") $! $ IF F$EXTRACT(0,7,FIELD0) .NES. "LICENSE" THEN GOTO PROCESS_NODE_RECORD $! $ IF F$EXTRACT(7,1,FIELD0) .EQS. "N" $ THEN $ GOSUB PROCESS_LICENSE_RECORD $ ELSE $ IF F$EXTRACT(7,1,FIELD0) .EQS. "U" $ THEN $ GOSUB PROCESS_TOTAL_UNITS $ ENDIF $ ENDIF $ $ GOTO READ_UNITS_HEADER $ $PROCESS_NODE_RECORD: $!------------------- $ OPEN/WRITE /ERROR=NO_MORE_INPUT OUTPUT_FILE 'LOGICAL_FILE' $ OUTPUT_RECORD = "$!" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$! File : LMF$ASSIGN_CLUSTER_OE_UNITS.COM" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$! Copy this file to the SYS$MANAGER directory to override" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$! the units loaded for an Operating Environment License." $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$! SYLOGICALS.COM will execute this file when it is found" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$! in the SYS$MANAGER directory." $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$!" $ LMF$WRITE_OUTPUT $! $ OUTPUT_RECORD = "$ LMF$CLUSTER_ASSIGN_UNITS_NODE = """"" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$ LMF$CLUSTER_ASSIGN_UNITS_NODE = F$GETSYI(""NODENAME"")" $ LMF$WRITE_OUTPUT $! $ GOTO PARSE_UNITS_VALUES $! $READ_UNITS_RECORD: $!------------------ $ READ/END_OF_FILE=NO_MORE_INPUT/ERROR=NO_MORE_INPUT UNITS_FILE UNITS_RECORD $ UNITS_RECORD = F$EDIT(UNITS_RECORD,"COLLAPSE,UPCASE") $ IF F$LOCATE("!",UNITS_RECORD) .NES. F$LENGTH(UNITS_RECORD) $ THEN $ UNITS_RECORD = F$EXTRACT(0,F$LOCATE("!",UNITS_RECORD),UNITS_RECORD) $ ENDIF $! $ IF UNITS_RECORD .EQS. "" THEN GOTO READ_UNITS_RECORD $ IF F$EXTRACT(0,1,UNITS_RECORD) .EQS. "!" THEN GOTO READ_UNITS_RECORD $! $PARSE_UNITS_VALUES: $!----------------- $ NODENAME = F$ELEMENT(0,",",UNITS_RECORD) $ IF NODENAME .EQS. "" THEN GOTO READ_UNITS_RECORD $ if F$LENGTH(NODENAME) .GT. 7 THEN GOTO READ_UNITS_RECORD $! $ COMPLIANCE_UNITS = 0 $ FOE_UNITS="" $ EOE_UNITS="" $ MCOE_UNITS="" $! $ IF FOUND_COMPLIANCE_COLUMN $ THEN $ UNITS = F$ELEMENT(COMP_INDEX,",",UNITS_RECORD) $ IF F$TYPE(UNITS) .EQS. "INTEGER" .AND. F$INTEGER(UNITS) .GT. 0 $ THEN $ COMPLIANCE_UNITS = F$INTEGER(UNITS) $ ELSE $ COMPLIANCE_UNITS = 0 $ ENDIF $ ENDIF $! $ IF FOE_INDEX .GT. 0 $ THEN $ INDEX = FOE_INDEX $ GOSUB FORMAT_UNITS_VALUE $ FOE_UNITS = UNITS $ IF FOE_UNITS .NES. "" $ THEN $ FOE_REM_UNITS = FOE_REM_UNITS - F$INTEGER(UNITS) $ ENDIF $ ENDIF $! $ IF EOE_INDEX .GT. 0 $ THEN $ INDEX = EOE_INDEX $ GOSUB FORMAT_UNITS_VALUE $ EOE_UNITS = UNITS $ IF EOE_UNITS .NES. "" $ THEN $ EOE_REM_UNITS = EOE_REM_UNITS - F$INTEGER(UNITS) $ ENDIF $ ENDIF $! $ IF MCOE_INDEX .GT. 0 $ THEN $ INDEX = MCOE_INDEX $ GOSUB FORMAT_UNITS_VALUE $ MCOE_UNITS = UNITS $ IF MCOE_UNITS .NES. "" $ THEN $ MCOE_REM_UNITS = MCOE_REM_UNITS - F$INTEGER(UNITS) $ ENDIF $ ENDIF $! $ IF FOE_UNITS .NES. "" .OR. EOE_UNITS .NES. "" .OR. MCOE_UNITS .NES. "" $ THEN $ OUTPUT_RECORD = "$ IF LMF$CLUSTER_ASSIGN_UNITS_NODE .EQS. ""''NODENAME'""" $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = "$ THEN" $ LMF$WRITE_OUTPUT $! $ IF FOE_UNITS .NES. "" $ THEN $ OUTPUT_RECORD = "$ DEFINE/SYSTEM/EXEC LMF$SET_FOE_CHARGE ''FOE_UNITS'" $ LMF$WRITE_OUTPUT $ ENDIF $! $ IF EOE_UNITS .NES. "" $ THEN $ OUTPUT_RECORD = "$ DEFINE/SYSTEM/EXEC LMF$SET_EOE_CHARGE ''EOE_UNITS'" $ LMF$WRITE_OUTPUT $ ENDIF $! $ IF MCOE_UNITS .NES. "" $ THEN $ OUTPUT_RECORD = "$ DEFINE/SYSTEM/EXEC LMF$SET_MCOE_CHARGE ''MCOE_UNITS'" $ LMF$WRITE_OUTPUT $ ENDIF $! $ OUTPUT_RECORD = "$ ENDIF" $ LMF$WRITE_OUTPUT $ ENDIF $! $ GOTO READ_UNITS_RECORD $! $OUTPUT_ERROR: $!------------ $ IF F$TRNLNM("OUTPUT_FILE") .NES. "" $ THEN $ WRITE SYS$OUTPUT "%LMFUNIT-E-WRITERROR, Error writing to file ''LOGICAL_FILE'" $ CLOSE OUTPUT_FILE $ DELETE 'LOGICAL_FILE' $ ENDIF $ $INPUT_FILE_ERROR: $!---------------- $ $NO_MORE_INPUT: $!------------- $ IF F$TRNLNM("UNITS_FILE") .NES. "" THEN CLOSE UNITS_FILE $ IF F$TRNLNM("OUTPUT_FILE") .NES. "" THEN CLOSE OUTPUT_FILE $ $ IF .NOT. FOUND_TOTALS_RECORD THEN GOTO MAIN_EXIT $! $ IF FOE_TOTAL_UNITS .GT. 0 $ THEN $ WRITE SYS$OUTPUT "FOE units available :",FOE_TOTAL_UNITS $ WRITE SYS$OUTPUT "FOE units assigned :",(FOE_TOTAL_UNITS - FOE_REM_UNITS) $ WRITE SYS$OUTPUT "FOE units remaining :",FOE_REM_UNITS $ ENDIF $! $ IF EOE_TOTAL_UNITS .GT. 0 $ THEN $ WRITE SYS$OUTPUT "EOE units available :",EOE_TOTAL_UNITS $ WRITE SYS$OUTPUT "EOE units assigned :",(EOE_TOTAL_UNITS - EOE_REM_UNITS) $ WRITE SYS$OUTPUT "EOE units remaining :",EOE_REM_UNITS $ ENDIF $! $ IF MCOE_TOTAL_UNITS .GT. 0 $ THEN $ WRITE SYS$OUTPUT "MCOE units available :",MCOE_TOTAL_UNITS $ WRITE SYS$OUTPUT "MCOE units assigned :",(MCOE_TOTAL_UNITS - MCOE_REM_UNITS) $ WRITE SYS$OUTPUT "MCOE units remaining :",MCOE_REM_UNITS $ ENDIF $ $MAIN_EXIT: $!--------- $ EXIT $! $! $GET_INPUT_RECORD: $!---------------- $! $! $! $! This routine takes process the record that begins with "license name" $! and determines which index should be used for the licenses units value. $! $PROCESS_LICENSE_RECORD: $!======================= $! $ FOUND_LICENSE_RECORD="TRUE" $ INDEX=0 $GET_FIELD: $ INDEX=INDEX+1 $ FIELD = F$EDIT(F$ELEMENT(INDEX,",",UNITS_RECORD),"UPCASE") $! $ IF FIELD .EQS. "," THEN GOTO CHECK_LICENSE_INDICIES $ IF FIELD .EQS. "" THEN GOTO GET_FIELD $! $ IF FIELD .EQS. "OPENVMS-I64-FOE" THEN FOE_INDEX=INDEX $ IF FIELD .EQS. "OPENVMS-I64-EOE" THEN EOE_INDEX=INDEX $ IF FIELD .EQS. "OPENVMS-I64-MCOE" THEN MCOE_INDEX=INDEX $ IF FIELD .EQS. "REQUIRED" $ THEN $ COMP_INDEX = INDEX $ FOUND_COMPLIANCE_COLUMN="TRUE" $ ENDIF $! $ GOTO GET_FIELD $! $CHECK_LICENSE_INDICIES: $ TEMP = FOE_INDEX + EOE_INDEX + MCOE_INDEX + COMP_INDEX $! $! IF NOTHING FOUND, USE DEFAULT INDEX SETTINGS $! $ IF TEMP .EQ. 0 $ THEN $ COMP_INDEX=1 $ FOE_INDEX = 2 $ EOE_INDEX = 3 $ MCOE_INDEX = 4 $ DELETE/SYMBOL TEMP $ ENDIF $! $ RETURN $! $PROCESS_TOTAL_UNITS: $!------------------- $ FOUND_TOTALS_RECORD="TRUE" $! $ IF FOE_INDEX .EQ. 0 $ THEN $ FOE_TOTAL_UNITS = 0 $ ELSE $ UNITS = F$EDIT(F$ELEMENT(FOE_INDEX,",",UNITS_RECORD),"COLLAPSE,UPCASE") $ IF F$TYPE(UNITS) .EQS. "INTEGER" .AND. F$INTEGER(UNITS) .GT. 0 $ THEN $ FOE_TOTAL_UNITS = F$INTEGER(UNITS) $ ELSE $ FOE_TOTAL_UNITS = 0 $ ENDIF $ ENDIF $! $ FOE_REM_UNITS = FOE_TOTAL_UNITS $! $ IF EOE_INDEX .EQ. 0 $ THEN $ EOE_TOTAL_UNITS = 0 $ ELSE $ UNITS = F$EDIT(F$ELEMENT(EOE_INDEX,",",UNITS_RECORD),"COLLAPSE,UPCASE") $ IF F$TYPE(UNITS) .EQS. "INTEGER" .AND. F$INTEGER(UNITS) .GT. 0 $ THEN $ EOE_TOTAL_UNITS = F$INTEGER(UNITS) $ ELSE $ EOE_TOTAL_UNITS = 0 $ ENDIF $ ENDIF $! $ EOE_REM_UNITS = EOE_TOTAL_UNITS $! $ IF MCOE_INDEX .EQ. 0 $ THEN $ MCOE_TOTAL_UNITS = 0 $ ELSE $ UNITS = F$EDIT(F$ELEMENT(MCOE_INDEX,",",UNITS_RECORD),"COLLAPSE,UPCASE") $ IF F$TYPE(UNITS) .EQS. "INTEGER" .AND. F$INTEGER(UNITS) .GT. 0 $ THEN $ MCOE_TOTAL_UNITS = F$INTEGER(UNITS) $ ELSE $ MCOE_TOTAL_UNITS = 0 $ ENDIF $ ENDIF $! $ MCOE_REM_UNITS = MCOE_TOTAL_UNITS $! $ IF COMP_INDEX .EQ. 0 $ THEN $ COMP_TOTAL_UNITS = 0 $ ELSE $ UNITS = F$EDIT(F$ELEMENT(COMP_INDEX,",",UNITS_RECORD),"COLLAPSE,UPCASE") $ IF F$TYPE(UNITS) .EQS. "INTEGER" .AND. F$INTEGER(UNITS) .GT. 0 $ THEN $ COMP_TOTAL_UNITS = F$INTEGER(UNITS) $ ELSE $ COMP_TOTAL_UNITS = 0 $ ENDIF $ ENDIF $! $ COMP_REM_UNITS = COMP_TOTAL_UNITS $! $ RETURN $! $!------------------------------------------------------------------ $! $! set INDEX to the f$element value for the license, put the value $! of the element in UNITS. We only need to override the value when $! the units is less than the value required for compliance. $! $!------------------------------------------------------------------ $FORMAT_UNITS_VALUE: $!------------------ $ UNITS = F$ELEMENT(INDEX,",",UNITS_RECORD) $ IF (F$TYPE(UNITS) .EQS. "INTEGER") .AND. (F$INTEGER(UNITS) .GT. 0) $ THEN $ IF COMPLIANCE_UNITS .GT. 0 $ THEN $ IF F$INTEGER(UNITS) .GE. COMPLIANCE_UNITS $ THEN $ UNITS = "" $ ENDIF $ ENDIF $ ELSE $ UNITS = "" $ ENDIF $! $ RETURN $! $ ENDSUBROUTINE ! CLUSTER_ASSIGN_UNITS $! $!+--------------------------------------------------------------------------- $! $!+--------------------------------------------------------------------------- $GENERATE_CLUSTER_PPL_DATA: SUBROUTINE $!======================== $ sav_message = f$environment("MESSAGE") $ set noon $ on control_y then goto OUTPUT_ERROR $ NOLICMATCH = %X107880D3 $ NOMATCHES = %X18D78053 ! search no matches $! $ INDEX=0 $! set defaults $ COMPLIANCE_INDEX=1 $ FOE_INDEX=-1 $ EOE_INDEX=-1 $ MCOE_INDEX=-1 $! $ COMP_UNITS="" $ COMP_REM_UNITS=COMP_UNITS $ UNITS="" $ THIS_NODE = F$getsyi("nodename") $ THIS_DIR = F$ENVIRONMENT("default") $! $ PPL_LICENSE_NAME_LIST="" $ PPL_LICENSE_UNITS_LIST="" $ PPL_ALLOCATE_UNITS_LIST="" $ PPL_AVAILABLE_UNITS_LIST="" $ PPL_NODE_LIST="" $ PPL_NODE_REQ_UNITS="" $! $ UNITS_WORK_FILE="" $ licence_record_tag = "License Name,Required," $ licence_totals_tag = "License Units," $ license_alo_tag = "Assigned Units," $ license_avl_tag = "Remaining Units," $! $ oe_license_list = ",FOE,EOE,MCOE" $ oe_prefix = "OPENVMS-I64-" $! $ LMF$WRITE_OUTPUT = "WRITE/ERROR=OUTPUT_ERROR OUTPUT_FILE OUTPUT_RECORD" $! $ CSV_FILE = "CLUSTER_OE_UNITS.CSV" $ IF P1 .NES. "" $ THEN $ CSV_FILE = P1 $ ELSE $ INQUIRE P1 "Enter a name for the output CSV file" $ IF P1 .NES. "" THEN CSV_FILE = P1 $ ENDIF $! $ OUTPUT_FILE = F$PARSE(CSV_FILE,".csv;",,,"SYNTAX_ONLY") $ IF OUTPUT_FILE .EQS. "" $ THEN $ WRITE SYS$OUTPUT "Invalid file name ''CSV_FILE'" $ EXIT $ ENDIF $! $ License_name_head = licence_record_tag $ License_units_head = licence_totals_tag $ License_alo_tail = license_alo_tag $ license_avl_tail = license_avl_tag $ GOSUB GET_CLUSTER_REQUIREMENTS $ IF COMP_UNITS .EQS. "" THEN GOTO NO_MORE_INPUT ! ERROR IN GOSUB $ License_units_head = License_units_head + F$STRING(COMP_UNITS) + "," $ License_alo_tail = License_alo_tail + F$STRING(COMP_UNITS) + "," $ license_avl_tail = license_avl_tail + "0," $ GOSUB GET_NODE_REQUIREMENTS $! $ IF .NOT. $STATUS THEN GOTO NO_MORE_INPUT $! $ write sys$output "Building PPL License List from License Database..." $ GOSUB GET_PPL_LICENSE_LIST $ IF .NOT. $STATUS THEN GOTO NO_MORE_INPUT $ GOSUB EDIT_PPL_LICENSE_LIST $ IF .NOT. $STATUS THEN GOTO NO_MORE_INPUT $! $! don't need these symbols anymore $! $ delete /symbol/local foe_index $ delete /symbol/local eoe_index $ delete /symbol/local mcoe_index $ delete /symbol/local PPL_LICENSE_NAME_LIST $ delete /symbol/local PPL_LICENSE_UNITS_LIST $ delete /symbol/local PPL_ALLOCATE_UNITS_LIST $ delete /symbol/local PPL_AVAILABLE_UNITS_LIST $! $ CSV_FILE = OUTPUT_FILE $! $ OPEN/WRITE /ERROR=NO_MORE_INPUT OUTPUT_FILE 'CSV_FILE' $! $ WRITE SYS$OUTPUT "Creating file ''CSV_FILE'" $! $ OUTPUT_RECORD = License_name_head $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = License_units_head $ LMF$WRITE_OUTPUT $! $ license_exclude_tail = "/(IN)EXclude,yes/no," $! $! $! Process the nodes in the PPL_NODE_LIST $! $ WRITE SYS$OUTPUT "Creating Units Assignment CSV file for each node, please wait..." $ GOSUB WRITE_NODE_RECORDS $ WRITE SYS$OUTPUT "Writing Units Assignment CSV trailer records" $! $! Write the trailing rows with allocated and available units values $! $ OUTPUT_RECORD = license_alo_tail $ LMF$WRITE_OUTPUT $ OUTPUT_RECORD = license_avl_tail $ LMF$WRITE_OUTPUT $! $OUTPUT_ERROR: $NO_MORE_INPUT: $!------------- $ IF F$TRNLNM("OUTPUT_FILE") .NES. "" THEN CLOSE OUTPUT_FILE $! $MAIN_EXIT: $!--------- $ SET MESSAGE 'sav_message' $ IF F$SEARCH("''sysman_out_temp'") .NES. "" THEN DELETE/NOLOG 'sysman_out_temp'; $ IF F$TRNLNM("REMOTE_CMDS") .NES. "" THEN CLOSE/DISPOSITION=DELETE REMOTE_CMDS $ IF F$SEARCH("''SYSMAN_CMD_FILE'") .NES. "" THEN DELETE/NOLOG 'SYSMAN_CMD_FILE';* $ IF F$TRNLNM("TUSAGE_FILE") .NES. "" THEN CLOSE/DISPOSITION=DELETE TUSAGE_FILE $ IF F$SEARCH("''temp_file'") .NES. "" THEN DELETE/NOLOG 'temp_file';* $ IF F$TRNLNM("CHARGE_FILE") .NES. "" THEN CLOSE/DISPOSITION=DELETE CHARGE_FILE $ IF F$SEARCH("''UNITS_WORK_FILE'") .NES. "" THEN DELETE/NOLOG 'UNITS_WORK_FILE'; $ IF F$TRNLNM("PPL_FILE") .NES. "" THEN CLOSE/DISPOSITION=DELETE PPL_FILE $ IF F$SEARCH("''PPL_WORK_FILE'") .NES. "" THEN DELETE/NOLOG 'PPL_WORK_FILE'; $ IF F$TRNLNM("SHOWLIC_FILE") .NES. "" $ THEN $ CLOSE/DISPOSITION=DELETE SHOWLIC_FILE $ ELSE $ IF F$SEARCH("''show_lic_file'") .NES. "" THEN DELETE/NOLOG 'show_lic_file';* $ ENDIF $! $ EXIT $! $GET_CLUSTER_REQUIREMENTS: $!======================== $ write sys$output "Obtaining Cluster License Unit Requirements" $! $ UNITS_WORK_FILE = F$UNIQUE() + ".TMP" $ set message /NOFACILITY/NOSEVERITY/NOIDENTIFICATION/NOTEXT $ DEFINE/USER SYS$ERROR NL: $ SHOW LICENSE/Cluster/UNIT_REQUIREMENTS/OUT='UNITS_WORK_FILE' $ TEMP_STATUS = $STATUS $ SET MESSAGE 'sav_message' $ IF .NOT. TEMP_STATUS THEN RETURN TEMP_STATUS $ DEFINE/USER SYS$ERROR NL: $ SEARCH/NOOUTPUT 'UNITS_WORK_FILE' "Type: PPL" $ IF $STATUS .EQ. NOMATCHES $ THEN $ WRITE SYS$OUTPUT "" $ WRITE SYS$OUTPUT "%LMFUNIT-E-NONODPPL, No nodes support PPL Licensing" $ GOTO GET_CHARGE_END $ ENDIF $! $ OPEN/READ/ERROR=GET_CHARGE_ERROR CHARGE_FILE 'UNITS_WORK_FILE' $READ_CHARGE_REC: $ READ/END=GET_CHARGE_END CHARGE_FILE CHARGE_REC $ IF F$EXTRACT(0,9,CHARGE_REC) .NES. "Type: PPL" THEN GOTO READ_CHARGE_REC $! $ TEMP = F$ELEMENT(2,":",CHARGE_REC) $ UNITS = F$EDIT(F$EXTRACT(0,(F$LOCATE("(",TEMP) - 1),TEMP),"TRIM") $! $ IF F$TYPE(UNITS) .EQS. "INTEGER" THEN COMP_UNITS = F$INTEGER(UNITS) $ COMP_REM_UNITS = COMP_UNITS $ GOTO GET_CHARGE_END $! $GET_CHARGE_ERROR: $ WRITE SYS$OUTPUT "%LMFUNIT-E-ERRUNI, Error: Units Requirement cannot be determined" $GET_CHARGE_END: $ IF F$TRNLNM("CHARGE_FILE") .NES. "" THEN CLOSE CHARGE_FILE $! $GET_CHARGE_RETURN: $!---------------- $ RETURN $! $! $! $! GET_PPL_LICENSE_LIST creates lists of PPL licenses and licensed units. $! $ GET_PPL_LICENSE_LIST: $!====================== $ PPL_WORK_FILE = F$UNIQUE() + ".TMP" $ set message /NOFACILITY/NOSEVERITY/NOIDENTIFICATION/NOTEXT $ PIPE LICENSE LIST /FULL/SINCE/TERMINATION_DATE/PRODUCER=HP | - SEARCH/OUT='PPL_WORK_FILE' sys$pipe "Product Name:","Units:","Options:" $! $ OPEN/READ/ERROR=GET_PPL_ERROR PPL_FILE 'PPL_WORK_FILE' $READ_PPL_LIC_REC: $!---------------- $ READ/END=GET_PPL_RET/ERROR=GET_PPL_RET PPL_FILE PPL_REC $! $ PPL_REC = F$EDIT(PPL_REC,"collapse") $ ppl_lic_name = f$element(1,":",PPL_REC) $! $ READ/END=GET_PPL_RET/ERROR=GET_PPL_RET PPL_FILE PPL_REC $ PPL_REC = F$EDIT(PPL_REC,"collapse,upcase") $ ppl_lic_units = f$element(1,":",PPL_REC) $! $ READ/END=GET_PPL_RET/ERROR=GET_PPL_RET PPL_FILE PPL_REC $ PPL_REC = F$EDIT(PPL_REC,"collapse,upcase") $! $! check for "modified units" value to override units $! $ IF F$EXTRACT(0,14,PPL_REC) .EQS. "MODIFIEDUNITS:" $ THEN $ ppl_lic_units = f$element(1,":",PPL_REC) $ READ/END=GET_PPL_RET/ERROR=GET_PPL_RET PPL_FILE PPL_REC $ PPL_REC = F$EDIT(PPL_REC,"collapse,upcase") $ ENDIF $! $! check the options line for PPL $! $ IF F$LOCATE("PPL",PPL_REC) .EQS. F$LENGTH(PPL_REC) THEN GOTO READ_PPL_LIC_REC $! $ IF ppl_lic_units .EQS. "0" $ THEN $ ppl_lic_units = "unlimited" $ ppl_avl_units = "unlimited" $ ppl_alo_units = "unlimited" $ GOTO PPL_APPEND_DATA $ ENDIF $! $ ppl_avl_units = "0" $ ppl_alo_units = "0" $! $ GOSUB GET_USAGE_DATA $! $PPL_APPEND_DATA: $! write sys$output "Adding ''ppl_lic_name' UNITS: ''ppl_lic_units'" $ PPL_LICENSE_NAME_LIST = PPL_LICENSE_NAME_LIST + "''ppl_lic_name'," $ PPL_LICENSE_UNITS_LIST = PPL_LICENSE_UNITS_LIST + "''ppl_lic_units'," $ PPL_ALLOCATE_UNITS_LIST = PPL_ALLOCATE_UNITS_LIST + "''ppl_alo_units'," $ PPL_AVAILABLE_UNITS_LIST = PPL_AVAILABLE_UNITS_LIST + "''ppl_avl_units'," $! $PPL_GET_NEXT_LIC: $!---------------- $ ppl_lic_name="" $ ppl_lic_units="" $ ppl_alo_units="" $ ppl_avl_units="" $! $NEXT_PPL_LICREC: $!--------------- $ GOTO READ_PPL_LIC_REC $! $GET_PPL_ERROR: $! $GET_PPL_RET: $!----------- $! $ IF F$TRNLNM("PPL_FILE") .NES. "" THEN CLOSE PPL_FILE $ SET MESSAGE 'sav_message' $! $ RETURN $! $!---------------------------------------------------------------------- $! EDIT_PPL_LICENSE_LIST - put the operating environment licenses in the $! lower CSV columns $! $!---------------------------------------------------------------------- $EDIT_PPL_LICENSE_LIST: $!--------------------- $ INDEX = 0 ! index into oe_license_list $! $Get_Next_OE: $!----------- $ INDEX = INDEX + 1 $ OENAME = F$ELEMENT(INDEX,",",oe_license_list) $ IF OENAME .EQS. "," THEN GOTO FINISH_EDIT_PPL_LICENSE_LIST $! $ NAME = oe_prefix + OENAME $! $ IF F$LOCATE(NAME,PPL_LICENSE_NAME_LIST) .EQS. F$LENGTH(PPL_LICENSE_NAME_LIST) $ THEN $ GOTO Get_Next_OE $ ENDIF $! $ I = 0 $find_oe_index: $ temp = f$element(I,",",PPL_LICENSE_NAME_LIST) $ if temp .EQS. "," THEN GOTO Get_Next_OE $ IF temp .EQS. NAME $ THEN $ 'OENAME'_INDEX = I $ License_name_head = License_name_head + NAME + "," $ License_units_head = License_units_head + f$element(I,",",PPL_LICENSE_UNITS_LIST) + "," $ License_alo_tail = License_alo_tail + f$element(I,",",PPL_ALLOCATE_UNITS_LIST) + "," $ License_avl_tail = License_avl_tail + f$element(I,",",PPL_AVAILABLE_UNITS_LIST) + "," $ GOTO Get_Next_OE $ ENDIF $! $ I = I + 1 $ GOTO find_oe_index $! $ $FINISH_EDIT_PPL_LICENSE_LIST: $ I = 0 $get_next_lic_ele: $! $ temp = f$element(I,",",PPL_LICENSE_NAME_LIST) $ IF temp .EQS. "," THEN GOTO EDIT_PPL_RET $ IF temp .EQS. "" $ THEN $ I = I + 1 $ GOTO get_next_lic_ele $ ENDIF $ IF (I .EQ. FOE_INDEX) .OR. (I .EQ. EOE_INDEX) .OR. - (I .EQ. MCOE_INDEX) $ THEN $ I = I + 1 $ GOTO get_next_lic_ele $ ENDIF $! $ License_name_head = License_name_head + temp + "," $ License_units_head = License_units_head + f$element(I,",",PPL_LICENSE_UNITS_LIST) + "," $ License_alo_tail = License_alo_tail + f$element(I,",",PPL_ALLOCATE_UNITS_LIST) + "," $ License_avl_tail = License_avl_tail + f$element(I,",",PPL_AVAILABLE_UNITS_LIST) + "," $ I = I + 1 $ GOTO get_next_lic_ele $! $EDIT_PPL_RET: $ License_name_head = f$extract(0,f$length(License_name_head)-1,License_name_head) $ License_units_head = f$extract(0,f$length(License_units_head)-1,License_units_head) $ License_avl_tail = f$extract(0,f$length(License_avl_tail)-1,License_avl_tail) $ License_alo_tail = f$extract(0,f$length(License_alo_tail)-1,License_alo_tail) $! $ RETURN $! $! $! $! Parse the output of the $show license/cluster/units and write a row $! for each node that supports PPL licensing $! $! $GET_NODE_REQUIREMENTS: $!--------------------- $ write sys$output "Gathering Node specific charge information..." $ OPEN/READ/ERROR=GET_NODE_ERROR CHARGE_FILE 'UNITS_WORK_FILE' $! $! Skip the two header lines $ READ/END=GET_CHARGE_ERROR CHARGE_FILE CHARGE_REC $ READ/END=GET_CHARGE_ERROR CHARGE_FILE CHARGE_REC $! $READ_NODE_REC: $ READ/END=GET_CHARGE_ERROR CHARGE_FILE CHARGE_REC $! $ IF F$LENGTH(CHARGE_REC) .LT. 71 THEN GOTO GET_NODE_RETURN $! $ NODENAME = F$EDIT(F$EXTRACT(0,F$LOCATE(" ",CHARGE_REC),CHARGE_REC),"COLLAPSE") $ IF NODENAME .EQS. "Type:" THEN GOTO GET_NODE_RETURN $! $ PPL_STRING = F$EDIT(F$EXTRACT(71,5,CHARGE_REC),"COLLAPSE") $ IF PPL_STRING .EQS. "-" THEN GOTO READ_NODE_REC $! $! set values for cluster totals $! $ PPL_NODE_LIST = PPL_NODE_LIST + NODENAME + "," $ PPL_NODE_REQ_UNITS = PPL_NODE_REQ_UNITS + PPL_STRING + "," $! $ GOTO READ_NODE_REC $ $GET_NODE_RETURN: $ IF F$TRNLNM("CHARGE_FILE") .NES. "" THEN CLOSE/DISPOSITON=DELETE CHARGE_FILE $ IF F$SEARCH("''UNITS_WORK_FILE'") .NES. "" THEN DELETE 'UNITS_WORK_FILE'; $ PPL_NODE_LIST = f$extract(0,f$length(PPL_NODE_LIST)-1,PPL_NODE_LIST) $ PPL_NODE_REQ_UNITS = f$extract(0,f$length(PPL_NODE_REQ_UNITS)-1,PPL_NODE_REQ_UNITS) $ $ RETURN $! $! $! for each node on the PPL_NODE_LIST, write a csv row for each license column $! $WRITE_NODE_RECORDS: $!------------------ $! $ write sys$output "Writing Node Usage Values..." $ node_index = 0 $ I = 0 ! index for licenses $! $Get_Node: $!-------- $ NODENAME = F$ELEMENT(node_index,",",PPL_NODE_LIST) $ IF NODENAME .EQS. "," THEN GOTO No_More_Nodes $ write sys$output "Processing node ''NODENAME'" $ UNITS = F$ELEMENT(node_index,",",PPL_NODE_REQ_UNITS) $! $! $! first two values in a row are nodename, required units $! $ OUTPUT_RECORD = "''NODENAME',''UNITS'," $! $ I = 2 ! index for license name/usage $! $ set message /NOFACILITY/NOSEVERITY/NOIDENTIFICATION/NOTEXT $! $Get_License_Usage: $!----------------- $ ppl_lic_name = f$element(I,",",License_name_head) $ if ppl_lic_name .EQS. "," $ then $ GOTO Get_Next_Node $ endif $! $! see if the node is in the EXCLUDE list for the license $! $Exclude_list_test: $! is there an exclude list $ PIPE license list/full 'ppl_lic_name' | search/nooutput sys$pipe "Exclude:" $ IF $STATUS .EQ. NOMATCHES THEN GOTO Include_list_test $! Is this node in the exclude list $ PIPE license list/full 'ppl_lic_name' | search/nooutput/match=AND sys$pipe "Exclude:","''NODENAME'" $ IF $STATUS .EQ. NOMATCHES THEN GOTO Get_usage_value $! $ UNITS = "exclude" $ GOTO Put_usage_value $! $Include_list_test: $! is there an include list $ PIPE license list/full 'ppl_lic_name' | search/nooutput sys$pipe "Include:" $ IF $STATUS .EQ. NOMATCHES THEN GOTO Get_usage_value $! is this node on the include list $ PIPE license list/full 'ppl_lic_name' | search/nooutput/match=AND sys$pipe "Include:","''NODENAME'" $ IF $STATUS .EQ. NOMATCHES $ THEN $ UNITS = "exclude" $ GOTO Put_usage_value $ ENDIF $! $Get_usage_value: $! $ UNITS = "0" ! default to no usage $ ppl_lic_units = f$element(I,",",License_units_head) $! $ if ppl_lic_units .eqs. "unlimited" $ then $ UNITS = "unlimited" $ GOTO Put_usage_value $ endif $! $! search the usage output for the node name $! if NOMATCHES usage = 0 $! $ IF NODENAME .EQS. this_node $ THEN $ search_cmd = "search/match=XOR " $ search_string = """''NODENAME'"",""View of""" $ ELSE $ search_cmd = "search " $ search_string = "''NODENAME'" $ ENDIF $! $ temp_file = F$UNIQUE() + ".TMP" $ temp_units = 0 $! $ PIPE SHOW LICENSE/usage/full 'ppl_lic_name' | 'search_cmd'/out='temp_file' sys$pipe 'search_string' $ IF $STATUS .EQ. NOMATCHES $ THEN $ IF NODENAME .NES. this_node $ THEN $ GOSUB GET_LOADED_REMOTE $ ENDIF $ GOTO Put_usage_value $ ENDIF $! $! found a units value, set to zero on errors $! $ OPEN/READ/ERROR=Put_usage_value USAGE_FILE 'temp_file' $! $Read_usage_record: $ READ/END=Put_usage_value USAGE_FILE USAGE_REC $ USAGE_REC = F$EDIT(USAGE_REC,"TRIM,COMPRESS") $! $! validate it is a units line before putting the value $! $ temp_node = f$element(1," ",USAGE_REC) $ if temp_node .NES. NODENAME THEN GOTO Read_usage_record $ temp_units = f$element(0," ",USAGE_REC) $! $! need to check for non-compliant LICENSE output here "*****" $! use SHOW LICENSE to obtain units loaded value $! $ IF F$TYPE(temp_units) .EQS. "STRING" $ THEN $ IF F$EXTRACT(0,2,temp_units) .NES. "**" THEN GOTO Read_usage_record $ temp_units = F$ELEMENT(node_index,",",PPL_NODE_REQ_UNITS) $ ENDIF $! $ $Put_usage_value: $! $ UNITS = temp_units $! $! $ IF F$TRNLNM("USAGE_FILE") .NES. "" THEN CLOSE/DISPOSITION=DELETE USAGE_FILE $ IF F$SEARCH("''temp_file'") .NES. "" THEN DELETE 'temp_file'; $! $ OUTPUT_RECORD = OUTPUT_RECORD + "''UNITS'," $! $Get_next_license: $ I = I + 1 $ GOTO Get_License_Usage $! $! $Get_Next_node: $!------------- $ OUTPUT_RECORD = f$extract(0,f$length(OUTPUT_RECORD)-1,OUTPUT_RECORD) $ LMF$WRITE_OUTPUT $ node_index = node_index + 1 $ GOTO Get_Node $! $No_More_Nodes: $! $ SET MESSAGE 'sav_message' $ RETURN $! $!----------------------------------------------------------------------- $! $! SYMBOL ppl_lic_name hold license name for this operation. $! $! Get the allocated and available units for a license. Try the local $! node first. If no match, try all the nodes in the node list $! $! $GET_USAGE_DATA: $!---------------- $ temp_file = f$unique() + ".TMP" $ PIPE SHOW LICENSE/USAGE/FULL 'ppl_lic_name' | search/out='temp_file' sys$pipe "Units loaded:" $ IF $STATUS .EQ. NOMATCHES THEN GOTO GET_USAGE_REMOTE $! $ GOTO PARSE_USAGE_DATA $! $GET_USAGE_REMOTE: $! $ sysman_out_temp = F$UNIQUE() + ".TMP" $ I = -1 $! $GET_USAGE_NEXTNODE: $!------------------ $ I = I + 1 $ IF F$SEARCH("''TEMP_FILE'") .NES. "" THEN DELETE/NOLOG 'TEMP_FILE'; $ IF F$SEARCH("''sysman_out_temp'") .NES. "" THEN DELETE/NOLOG 'sysman_out_temp'; $ NODENAME = F$ELEMENT(I,",",PPL_NODE_LIST) $ IF NODENAME .EQS. "," THEN GOTO GET_USAGE_DATA_RET $ IF NODENAME .EQS. THIS_NODE THEN GOTO GET_USAGE_NEXTNODE $! $ SYSMAN_CMD_FILE = F$UNIQUE() + ".COM" $ OPEN/WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS 'SYSMAN_CMD_FILE' $ WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS "$RUN SYS$SYSTEM:SYSMAN" $ WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS "SET ENVIRON/NODE=''NODENAME'" $ WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS - "DO PIPE SHOW LICENSE/USAGE/FULL ''ppl_lic_name' | search sys$pipe ""Units loaded:""" $ WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS "EXIT" $ WRITE/ERROR=GET_USAGE_DATA_RET REMOTE_CMDS "$EXIT" $ CLOSE REMOTE_CMDS $! $ $ @'SYSMAN_CMD_FILE'/OUT='sysman_out_temp' $ DELETE/NOLOG 'SYSMAN_CMD_FILE'; $ search/out='temp_file' 'sysman_out_temp' "Units allocated:" $ IF $STATUS .EQ. NOMATCHES THEN GOTO GET_USAGE_NEXTNODE $ DELETE/NOLOG 'sysman_out_temp'; $! $PARSE_USAGE_DATA: $! $ OPEN/READ/ERROR=GET_USAGE_DATA_RET TUSAGE_FILE 'temp_file' $ READ/END=GET_USAGE_DATA_RET TUSAGE_FILE TUSAGE_REC $! $ ppl_alo_units = f$extract((f$locate("Units allocated:",TUSAGE_REC)+F$length("Units allocated:")),6,TUSAGE_REC) $ ppl_alo_units = f$edit(ppl_alo_units,"collapse") $ ppl_avl_units = f$extract((f$locate("Units available:",TUSAGE_REC)+F$length("Units available:")),6,TUSAGE_REC) $ ppl_avl_units = f$edit(ppl_avl_units,"collapse") $! $GET_USAGE_DATA_RET: $!------------------ $ IF F$TRNLNM("REMOTE_CMDS") .NES. "" THEN CLOSE/DISPOSITION=DELETE REMOTE_CMDS $ IF F$SEARCH("''SYSMAN_CMD_FILE'") .NES. "" THEN DELETE 'SYSMAN_CMD_FILE';* $ IF F$TRNLNM("TUSAGE_FILE") .NES. "" THEN CLOSE/DISPOSITION=DELETE TUSAGE_FILE $ IF F$SEARCH("''temp_file'") .NES. "" THEN DELETE 'temp_file';* $ RETURN $! $GET_LOADED_LOCAL: $!---------------- $ temp_units = "0" ! initialize so failures return 0 units $ show_lic_file = F$UNIQUE() + ".TMP" $ PIPE SHOW LICENSE 'ppl_lic_name' | search/out='show_lic_file' sys$pipe "''ppl_lic_name'" $ IF $STATUS .EQ. NOMATCHES $ THEN $ GOTO GET_LOADED_LOCAL_RET $ ENDIF $! $ OPEN/READ/ERROR=GET_LOADED_LOCAL_RET SHOWLIC_FILE 'show_lic_file' $ READ/END=GET_LOADED_LOCAL_RET SHOWLIC_FILE SHOWLIC_REC $ SHOWLIC_REC = F$EDIT(SHOWLIC_REC,"TRIM,COMPRESS") $ temp_units = F$ELEMENT(3," ",SHOWLIC_REC) $ DELETE /SYMBOL/LOCAL SHOWLIC_REC $ IF F$TYPE(temp_units) .NES. "INTEGER" THEN temp_units = "0" $! $GET_LOADED_LOCAL_RET: $ IF F$TRNLNM("SHOWLIC_FILE") .NES. "" $ THEN $ CLOSE/DISPOSITION=DELETE SHOWLIC_FILE $ ELSE $ IF F$SEARCH("''show_lic_file'") .NES. "" THEN DELETE/NOLOG 'show_lic_file';* $ ENDIF $! $ RETURN $! $GET_LOADED_REMOTE: $!----------------- $ temp_units = "0" ! initialize so failures return 0 units $ show_lic_file = F$UNIQUE() + ".TMP" $ show_lic_cmd = F$UNIQUE() + ".COM" $ show_lic_rem = F$UNIQUE() + ".TMP" $! $ OPEN/WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM 'show_lic_cmd' $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "$RUN SYS$SYSTEM:SYSMAN" $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "SET PROFILE/NOVERIFY " $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "SET ENVIRON/NODE=''NODENAME'" $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "DO show license ''ppl_lic_name'" $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "EXIT" $ WRITE/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_REM "$EXIT" $! $ CLOSE SHOWLIC_REM $! $ @'show_lic_cmd'/out='show_lic_rem' $ search/match=XOR /out='show_lic_file' 'show_lic_rem' "''ppl_lic_name'","DO show license" $ IF $STATUS .EQ. NOMATCHES $ THEN $ GOTO GET_LOADED_REMOTE_RET $ ENDIF $! $ OPEN/READ/ERROR=GET_LOADED_REMOTE_RET SHOWLIC_FILE 'show_lic_file' $ READ/END=GET_LOADED_REMOTE_RET SHOWLIC_FILE SHOWLIC_REC $ SHOWLIC_REC = F$EDIT(SHOWLIC_REC,"TRIM,COMPRESS") $ temp_units = F$ELEMENT(3," ",SHOWLIC_REC) $ DELETE /SYMBOL/LOCAL SHOWLIC_REC $ IF F$TYPE(temp_units) .NES. "INTEGER" THEN temp_units = "0" $! $GET_LOADED_REMOTE_RET: $ IF F$TRNLNM("SHOWLIC_FILE") .NES. "" $ THEN $ CLOSE/DISPOSITION=DELETE SHOWLIC_FILE $ ELSE $ IF F$SEARCH("''show_lic_file'") .NES. "" THEN DELETE/NOLOG 'show_lic_file';* $ ENDIF $ IF F$TRNLNM("SHOWLIC_REM") .NES. "" $ THEN $ CLOSE/DISPOSITION=DELETE SHOWLIC_REM $ ELSE $ IF F$SEARCH("''show_lic_cmd'") .NES. "" THEN DELETE/NOLOG 'show_lic_cmd';* $ ENDIF $ IF F$SEARCH("''show_lic_rem'") .NES. "" THEN DELETE/NOLOG 'show_lic_rem';* $! $ RETURN $! $ ENDSUBROUTINE ! GENERATE_CLUSTER_PPL_DATA $! $!+----------------------------------------------------------------------------- $! License Units Assignment Utility $! $! This is an unsupported utility to help OpenVMS system managers $! allocate PPL and Operating Environment License units among cluster $! members. It is expected that an existing system management tool or a new $! system management tool will replace this procedure. $! $! Original Version: David Sweeney $! $! Modification History: $! $!+----------------------------------------------------------------------------- $! ************************************************************************* $! * * $! * © Copyright 2003 Hewlett-Packard Development Company, L.P. * $! * * $! * Confidential computer software. Valid license from HP and/or * $! * its subsidiaries required for possession, use, or copying. * $! * * $! * Consistent with FAR 12.211 and 12.212, Commercial Computer Software, * $! * Computer Software Documentation, and Technical Data for Commercial * $! * Items are licensed to the U.S. Government under vendor's standard * $! * commercial license. * $! * * $! * Neither HP nor any of its subsidiaries shall be liable for technical * $! * or editorial errors or omissions contained herein. The information * $! * in this document is provided "as is" without warranty of any kind and * $! * is subject to change without notice. The warranties for HP products * $! * are set forth in the express limited warranty statements accompanying * $! * such products. Nothing herein should be construed as constituting an * $! * additional warranty. * $! * * $! *************************************************************************