$!-------------------------------------------------------------------------o $! I M A G E C N T ! $! ! $! Author: franco.brunetta@libero.it Version 1.5 ! $! Created: 4-DEC-1987 ! $! Last revision: 3-SEP-2001 (FB) (1.5) ! $! ! $!-------------------------------------------------------------------------o $! >>>DOCUMENTATION AT THE BOTTOM<<< ! $!-------------------------------------------------------------------------- $! Inizializzazioni varie $!-------------------------------------------------------------------------- $ IF P2 .EQS. "NOASK" THEN SET NOVERIFY $ ON CONTROL_Y THEN GOTO CTRL_Y $ ON ERROR THEN GOTO Basta $ WW := Write Sys$Output $ WS := Write Sys$Error $ WO := Write Out $ WB := Write Banner $ SUB_TIMES="$CCUU_UTIL_L:[SUB_TIMES]SUB_TIMES" $!## INSTALL :== "$INSTALL/comman" $ WKDIR = F$ELEMENT(0,"]",F$ENVIRONMENT("PROCEDURE"))+"]" $ WKFILE1 = "''WKDIR'LISTINST.SCRATCH;" $ WKFILE2 = "''WKDIR'LISTIMM.SCRATCH;" $ WKFILE3 = "''WKDIR'TMPOUT.SCRATCH;" $ parte_dir = "" $!-------------------------------------------------------------------------- $! Detecting P3, P1 & P2 $!-------------------------------------------------------------------------- $ IF P3 .EQS. "" THEN GOTO Check_P1 $ IF F$INTEGER(P3) .GT. 0 THEN GOTO Check_P1 $ WS "%IMAGECNT-I-BADP3, parameter P3 not valid; give an integer > 0" $ WS "\",P3,"\" $ EXIT $Check_P1: $ IF .NOT. ((P2 .EQS. "NOASK") .AND. (P1 .EQS. "")) THEN - GOTO Inspect_out $ WS "%IMAGECNT-F-BADPAR, if P2=NOASK, P1 cannot be omitted!" $ WS "%IMAGECNT-I-ABORTED, procedure execution aborted." $ EXIT $!-------------------------------------------------------------------------- $! Determinazione file di uscita $!-------------------------------------------------------------------------- $Inspect_out: $ OUTFILE = "TT" $ IF P1 .EQS. "" THEN GOTO Test_Upday $ lungh = f$length(p1) $ IF F$LOCATE("]",P1) .EQ. lungh then goto Filename $!------------------------------- $ parte_fil = f$extract(f$locate("]",P1)+1,lungh,P1) $ parte_dir = P1 - parte_fil $ P1 = parte_fil $Filename: $ lungh = f$length(p1) $ IF F$LOCATE(".",P1) .LT. lungh THEN GOTO Tutto_ok $ P1 = "''P1'.DAT;" $Tutto_ok: $ OUTFILE=WKFILE3 $!-------------------------------------------------------------------------- $! Individuazione uptime; controllo contro eventuale upday minimo $!-------------------------------------------------------------------------- $Test_Upday: $ Now = F$TIME() $ SUB_TIMES /MAJOR='Now'/MINOR='F$GETSYI("BOOTTIME")'/SYMBOL=Uptime $ UPday = F$EXTRACT(0,4,Uptime) $ IF (UPday .GE. P3) .OR. (P3 .EQS. "") THEN GOTO Message $ WW " " $ WW "%IMAGECNT-I-INVUPT, uptime is less than minimum requested in P3" $ WW " uptime: ",Uptime $ WW " Minimum uptime: ",P3," 00:00:00.00" $ WW "_IMAGECNT-W-NOLIST, no operations." $ WW " " $ WW " " $ EXIT $!-------------------------------------------------------------------------- $! Prima videata di uscita $!-------------------------------------------------------------------------- $Message: $ IF parte_dir .NES. "" THEN P1 = "''parte_dir'''P1'" $ IF P2 .EQS. "NOASK" THEN GOTO Listing $ COPY SYS$INPUT SYS$ERROR ---------------------------------- IMAGECNT 1.5 Images Usage Statistics Procedure ---------------------------------- Wait please... $!-------------------------------------------------------------------------- $! Estrazione listing/full immagini $!-------------------------------------------------------------------------- $Listing: $ WS "%IMAGECNT-I-WAIT1, Writing listing file..." $ SET NOCONTROL=Y !Per evitare interruzioni di INSTALL $ def/user sys$output 'WKFILE1' $ INSTALL LIST/FULL $ SET CONTROL=Y $ ON CONTROL_Y THEN GOTO CTRL_Y $!-------------------------------------------------------------------------- $! Selezione record. In versione 1.3, e` stata aggiunta la ricerca $! di "Open", "Hdr" e "Shar" con uso /EXACT (per evitare confusioni $! tra la caratteristica "Shar" e il privilegio "SHARE"). 16/12/91 FB $!-------------------------------------------------------------------------- $ WS "%IMAGECNT-I-WAIT2, Writing selected records..." $ SEAR/OUT='WKFILE2'/Exact 'WKFILE1' - ! con patch ";","Open","Hdr","Shar","access","Current" ! V. 1.3 $ IF P2 .EQS. "NOASK" THEN GOTO Apertura $ WS "-----------------------------------------------------" $ WS " Information collected " $ WS " since: ''f$getsyi("BOOTTIME")'" $ WS " to: ''now'" $ WS " Uptime: ''Uptime'" $ WS "-----------------------------------------------------" $!-------------------------------------------------------------------------- $! Apertura files di lavoro $!-------------------------------------------------------------------------- $Apertura: $ OPEN/READ tmpfile 'WKFILE2' $ OPEN/WRITE out 'outfile' $ IF P1 .NES. "" THEN WS "%IMAGECNT-I-WAIT3, creating output file..." $!-------------------------------------------------------------------------- $! Preparazione output. Output vero e proprio $!-------------------------------------------------------------------------- $Loop: $ read/end=sort_ask tmpfile st1 $ read/end=sort_ask tmpfile st1_bis $!----------------------------------------------------------------- $! Patch di versione 1.3: se il nome dell'immagine supera una $! certa lunghezza, il listato di INSTALL spezza la prima linea di $! output (immagine piu` caratteristiche OPEN, HDR, SHAR, PRIV, ecc.) $! in DUE LINEE. E` quindi necessario controllare se la seconda linea $! letta ad ogni loop contiene la seconda parte della prima linea $! (in tal caso, si uniscono la linea letta nr. 1 e la nr. 2 e si $! legge nuovamente una linea), o le note relative al numero di accessi $! (in tal caso, nessuna lettura aggiuntiva e` necessaria). PATCH $! bruttarella ma efficace. Creata e collaudata in VMS 5.4-1. 16/12/91 FB $!----------------------------------------------------------------- $ Control1 = F$LOCATE("Shar",st1_bis) $ Control2 = F$LOCATE("Open",st1_bis) $ control3 = F$LOCATE("Hdr",st1_bis) $ IF control1 .lt. F$LENGTH(st1_bis) .OR.- control2 .lt. F$LENGTH(st1_bis) .OR.- control3 .lt. F$LENGTH(st1_bis) $ THEN St1=St1+St1_bis $ Read/End=Sort_ask Tmpfile St2 $ ELSE St2=St1_Bis $ ENDIF $!-- $ img = f$ELEMENT(1," ",F$EDIT(st1,"compress")) $ use = f$integer(f$ELEMENT(5," ",F$EDIT(st2,"compress"))) $ shr=" No shared" $ lc1 = F$LOCATE("shar",st1) $ lc2 = F$LOCATE("Open",st1) $ lc3 = F$LOCATE("HDR",st1) $ IF lc1 .EQ. F$LENGTH(st1) .AND.- lc2 .EQ. F$LENGTH(st1) .AND.- lc3 .EQ. F$LENGTH(st1) THEN GOTO Noshr $ read/end=sort_ask tmpfile st3 $ shr = f$element(1,"=",st3) $Noshr: $ volte="times." $ IF use .EQ. 1 THEN volte="time. " $ WO - f$fao("Image: !12 Used !10 ''volte' Share: ''shr'",img,use) $ goto loop $!-------------------------------------------------------------------------- $! Opzione sort (solo se output diverso da video o se P2=NOASK) $!-------------------------------------------------------------------------- $sort_ask: $ IF F$TRNLNM("TMPFILE") .NES. "" THEN CLOSE TMPFILE $ IF F$TRNLNM("OUT") .NES. "" THEN CLOSE OUT $ SET NOCONTROL=Y $ IF P1 .EQS. "" THEN GOTO Basta $ IF P2 .EQS. "NOASK" THEN GOTO Sorting $ INQUIRE/NOPUNCT testsort "_IMAGECNT, should sort output? (Y/N, def. N): $ IF testsort .nes. "Y" then goto No_sort $Sorting: $ WS "%IMAGECNT-I-SORTING, sorting..." $ SORT/key=(pos:31,siz:7,desce) 'WKFILE3' 'wkfile3' $!-------------------------------------------------------------------------- $! Preparazione testata. Creazione file definitivo di output. $!-------------------------------------------------------------------------- $No_sort: $ OPEN/Write Banner 'P1' $ WB " Usage statistics for" $ WB " known (installed) images" $ WB " $ WB " Analysis since: ''F$GETSYI("BOOTTIME")'" $ WB " to: ''now'" $ WB " Uptime: ''Uptime'" $ WB " " $ CLOSE banner $ APPEND 'wkfile3' 'P1' $ WS "%IMAGECNT-I-OUTFILE, output file is ''P1'" $ GOTO Basta $!-------------------------------------------------------------------------- $! Gestione CTRL_Y $!-------------------------------------------------------------------------- $CTRL_Y: $ WW "%IMAGECNT-I-CTRLY, procedure aborted using CTRL-Y." $!-------------------------------------------------------------------------- $! Chiusura e cancellazione workfiles. $!-------------------------------------------------------------------------- $Basta: $ IF F$TRNLNM("TMPFILE") .NES. "" THEN CLOSE TMPFILE $ IF F$TRNLNM("OUT") .NES. "" THEN CLOSE OUT $ IF F$TRNLNM("BANNER") .NES. "" THEN CLOSE BANNER $ IF F$SEARCH("''WKFILE1'") .NES. "" THEN DEL 'WKFILE1'* $ IF F$SEARCH("''WKFILE2'") .NES. "" THEN DEL 'WKFILE2'* $ IF F$SEARCH("''WKFILE3'") .NES. "" THEN DEL 'WKFILE3'* $ IF P2 .NES. "NOASK" THEN - WS "%IMAGECNT-I-END, end of operations" $ SET CONTROL=Y $ EXIT $!-------------------------------------------------------------------------! $!------------------------D O C U M E N T A Z I O N E----------------------! $!-------------------------------------------------------------------------! $! I M A G E C N T ! $! ! $! Rapporto informativo sull'utilzzo della immagini GIA` instal- ! $! late a partire dall'ultimo BOOTSTRAP. ! $! ! $! Questa procedura produce un listato (di tipo "FULL") dall'u- ! $! tility INSTALL, esamina il file cosi` creato, estraendone le ! $! informazioni necessarie, e associa, per ognuna delle immagini ! $! installate, l'effettivo utilizzo, a partire dalla data ! $! dell'ultimo bootstrap effettuato. L'output puo` essere river- ! $! sato indipendentemente su terminale (per default) o in un ! $! file (il cui nome deve essere indicato come parametro -P1-). ! $! Nel secondo caso, e` possibile ottenere una selezione in ! $! ordine decrescente sul campo della quantita` di utilizzo. ! $! NB: Facendosi furbi, e` possibile ottenere anche un'output ! $! SORTATO direttamente su terminale. E` sufficiente indicare in ! $! P1 il nome del device (TTE6, TTB2, TT), purche` SEMPRE SEGUI- ! $! TO DAI DUE PUNTI! In questo caso, verra` utilizzato un file ! $! di lavoro temporaneo e TRASPARENTE, e il sort avverra` diret- ! $! tamente su video. Attenzione: in questo caso il messaggio ! $! informativo sul nome del file di uscita NON E` ATTENDIBILE. ! $! Ignorarlo! ! $! ! $! La procedura individua il tempo in cui il sistema e` stato ! $! attivo, a partire dall'ultimo bootstrap; specificando, con ! $! parametro P3, un numero maggiore di zero, e` possibile coman- ! $! dare ad IMAGECNT di NON eseguire le sue operazioni se il tem- ! $! po di attivita` del sistema (dall'ultimo bootstrap alla data ! $! corrente) e` inferiore, in numero di giorni, a quello appunto ! $! specificato in P3. Ad esempio, fornendo come parametro P3 il ! $! valore intero 3, le operazioni non verranno eseguite se il ! $! sistema non e` stato attivo ALMENO per tre giorni. Se il pa- ! $! rametro P3 non viene fornito, le operazioni vengono eseguite ! $! comunque, indipententemente dall'UPTIME. ! $! Non e` corretto specificare un P3 contenente caratteri non ! $! numerici, o cifre non intere, o il numero zero. ! e! ! $! IMAGECNT indica, per ogni immagine installata come "OPEN, HDR ! $! o SHAR,", il corrente e il massimo numero di accessi condivi- ! $! si all'immagine stessa. ! $! ! $! La procedura puo` venir eseguita anche in modalita` non in- ! $! terattiva, vale a dire senza domande da parte della procedu- ! $! ra, e senza videate device-dependent. Basta dare il valore ! $! "NOASK" al SECONDO PARAMETRO (P2). In questo caso, pero`, IL ! $! PARAMETRO P1 NON PUO` ESSERE NULLO, altrimenti la procedura ! $! abortisce. Ad esempio, e` chiamata valida: ! $! $ @IMAGECNT Uscita.dat NOASK ! $! ma non $ @IMAGECNT "" NOASK ! $! ! $! L'utilizzo di "NOASK" comporta automaticamente un output ! $! "SORTED", nonche` un NOVERIFY automatico (per evitare files ! $! di log ENORMI in caso di esecuzione batch). Tanto, chevvefre- ! $! ga? ! $! ! $! Questa opzione e` stata introdotta per consentire una rapida ! $! e semplice esecuzione della procedura da parte del file di ! $! comandi standard-VMS SYSHUTDWN.COM. ! $! ! $! E` possibile interrompere l'esecuzione con un Control_Y (sal- ! $! vo che in due particolari fasi della procedura). Non e` la ! $! migliore procedura che ho fatto, ma funziona. ! $! ! $! ATTENZIONE: per il momento non ho ancora trovato un metodo ! $! RAPIDO per ottenere, dall'immagine INSTALL, un LIST/FULL se- ! $! lettivo (ad esempio, un LIST/FULL di solo SYS$SYSTEM), per- ! $! cio` attualmente viene visualizzato l'utilizzo di TUTTE le ! $! immagini (sia SYS$SYSTEM:* che SYS$LIBRARY:* che [.EUNICE...] ! $! eccetera). Questo puo` condurre a qualche equivoco nell'i- ! $! dentificazione delle immagini: ad esempio, MAIL e` un pro- ! $! gramma SIA in SYS$SYSTEM che in Eunice; si troveranno quindi ! $! alcune OMONIMIE. Beh, pazienza! Che pretendete da me? ! $! ! $!-------------------------------------------------------------------------! $! PARAMETRI: P1 Nome file di uscita. ! $! P2 Se = "NOASK", esecuzione senza necessita` ! $! di input interattivo. ! $! P3 Minimo uptime (in nr. di giorni); deve es- ! $! sere fornito un numero intero; se P3 e` ! $! omesso, le operazioni vengono eseguite in ! $! ogni caso. ! $!-------------------------------------------------------------------------! $! A G G I O R N A M E N T I ! $! (cambi versione) ! $! V1.0 versione di partenza. ! $! 9/12/87 FB: Aggiunto controllo sulla validita` ! $! del parametro P1: se mancante del file-type, ! $! viene aggiunto un .DAT di default. E` cosi` pos- ! $! sibile indicare come file di uscita anche un no- ! $! me-file senza file_type. Gestito anche l'output ! $! su file con specifica di directory. ! $! V1.1 11/12/87 FB: implementato uso P2 (=NOASK) per ! $! inibire richieste interattive da parte della ! $! procedura. Ottimo per esecuzioni BATCH o diret- ! $! tamente da SYSHUTDWN.COM. ! $! 23/12/87 FB: Modificata la stringa di output: se ! $! il contatore di utilizzo e` 1, al posto di VOLTE ! $! viene usata la parola VOLTA. ! $! V1.2 1/2/88 FB: implementata ricerca di corrente/mas- ! $! simo numero di accessi condivisi (solo per imma- ! $! gini installate con qualificatore /OPEN, /SHARE- ! $! ABLE o /HEADER_RESIDENT). ! $! V1.3 16/12/91 FB: corretto un problema nella sequenza ! $! di search e in quella di lettura del listato di ! $! Install, dal momento che tale utility spezza la ! $! prima linea di ogni "loop" in DUE se il nome ! $! dell'immagine e` troppo lungo. ! $! 20/12/91 FB: aggiunta esecuzione SUB_TIMES per ! $! rapido calcolo di UPTIME di sistema. ! $! V1.4 4/3/92 FB: implementato parametro P3, come mini- ! $! mo uptime (in nr. giorni, intero) di sistema ne- ! $! cessario per eseguire le operazioni. ! $! 4/10/93 FB: rimosso definizione di simbolo glo- ! $! bale "install" che da VMS 5.* in poi non e` piu` ! $! necessario. ! $! V1.5 3/sep/2001 FB: output messages converted to ! $! english. Suppressed ESC sequences (now using ! $! plain text only). ! $!-------------------------------------------------------------------------o