XTPMSTAT ;OAK/BP - PRINT PATCH STATISTICS BY REPORT GROUP; 2/7/06
;;7.3;TOOLKIT;**98,100**; Apr 25, 1995;Build 4
;
S IOP="HOME" D ^%ZIS K IOP
EN W @IOF,"Patch Monitor Statistics",!!!
W "Please select the REPORTING GROUP. You may select as many groups as you",!
W "wish for each report. Each group will be reported in a separate section.",!!!
K TMP("XTBGRP"),TMP("XTBPKG")
N DIC,DA S DIC(0)="AEQM",DIC="^XPD(9.95," D ^DIC S DA(1)=+Y
I DA(1)>0 N DIC S DIC(0)="AEQM",DIC="^XPD(9.95,DA(1),2," F D ^DIC Q:Y<0 DO
.I $D(TMP("XTBGRP",$P(Y,U,2))) W $C(7),". . . You already have that one" Q
.S TMP("XTBGRP",$P(Y,U,2))=+Y
G:X[U EXIT
G:'$D(TMP("XTBGRP")) EXIT
W !!,"Do you want a new form/screen between REPORTING GROUPS" S %=1 D YN^DICN S XTBPGF=%
;
DATE W ! S %DT="AEP"
S %DT("A")="Enter BEGINNING Compliance date: " D ^%DT G:Y<0 EXIT S XTBBDT=Y X ^DD("DD") S XTBBDT1=Y
S %DT="AE",%DT("A")=" and ENDING Compliance date: " D ^%DT G:Y<0 EXIT S XTBEDT=Y X ^DD("DD") S XTBEDT1=Y
I XTBEDT<XTBBDT W !!,$C(7),"Starting date is later than ending date.",!! H 2 G DATE
;
DEV W !! S %ZIS="AEQ" D ^%ZIS G:POP EXIT
I $D(IO("Q")) S ZTIO=ION,ZTRTN="SORT^XTPMSTAT",ZTSAVE("XTB*")="",ZTSAVE("TMP*")="",ZTDESC="Patch Monitor Statistics" D ^%ZTLOAD D HOME^%ZIS
I $D(ZTSK) W !,"Queued as task #",ZTSK H 2 G EXIT
;
; sort patches by compliance date
SORT U IO F XTBCPLDT=(XTBBDT-.0001):0 S XTBCPLDT=$O(^XPD(9.9,"D",XTBCPLDT)) Q:XTBCPLDT=""!(XTBCPLDT>XTBEDT) DO
.F XTBDA=0:0 S XTBDA=$O(^XPD(9.9,"D",XTBCPLDT,XTBDA)) Q:XTBDA="" DO
..S XTBDTA=$G(^XPD(9.9,XTBDA,0)) Q:XTBDTA=""
..S XTBPTNAM=$P(XTBDTA,U,1),XTBNMSP=$P($P(XTBDTA,U,4)," - ",1) Q:XTBNMSP="" ;parent package missing in file
..S XTBRELDT=$P(XTBDTA,U,2),XTBPRIOR=$P(XTBDTA,U,3)
..S TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA)=XTBRELDT_U_XTBPRIOR
PRINT ; read and print sorted groups
S Y=DT X ^DD("DD") S XTBCURDT=Y
K XTBLINE S $P(XTBLINE,"-",(IOM-2))="-"
S PG=0,XTBGRP="",XTBGRP=$O(TMP("XTBGRP",XTBGRP)) G:XTBGRP="" EXIT D HDR ; first header
S (XTBGRP,XTBNMSP,XTBPTNAM,XTBOLDNM,XTBOLGRP)="",(XTBTPTCH,XTBTLATE)=0
F S XTBGRP=$O(TMP("XTBGRP",XTBGRP)) Q:XTBGRP="" S XTBGPDA=TMP("XTBGRP",XTBGRP) DO Q:$D(XTBOUT)
.; read param file for monitored groups
.F S XTBNMSP=$O(^XPD(9.95,1,2,XTBGPDA,1,"B",XTBNMSP)) Q:XTBNMSP="" I $D(TMP("XTBPKG",XTBNMSP)) DO Q:$D(XTBOUT)
..; read sorted namespaces
..F XTBCPLDT=0:0 S XTBCPLDT=$O(TMP("XTBPKG",XTBNMSP,XTBCPLDT)) Q:XTBCPLDT="" F S XTBPTNAM=$O(TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM)) Q:XTBPTNAM="" DO Q:$D(XTBOUT)
...F XTBDA=0:0 S XTBDA=$O(TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA)) Q:XTBDA="" DO Q:$D(XTBOUT)
....S XTBTPTCH=XTBTPTCH+1
....S XTBDTA=TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA)
....S XTBRELDT=$P(XTBDTA,U),XTBPRIOR=$P(XTBDTA,U,2)
....S XTBRCVDT=$P($G(^XPD(9.9,XTBDA,0)),U,2)
....S XTBPTYPE=$P($G(^XPD(9.9,XTBDA,0)),U,10)
....I +XTBPTYPE=0 S D0=XTBDA D ^XTPMKPCF S XTBINSDT=X K D0
....I +XTBPTYPE=1 S XTBINSDT=$P($G(^XPD(9.9,XTBDA,0)),U,11)
....I XTBINSDT]"" S X1=XTBINSDT,X2=XTBCPLDT D ^%DTC S XTBDAYLT=X
....I XTBINSDT="" S X1=DT,X2=XTBCPLDT D ^%DTC S XTBDAYLT=X
....S XTBGRPHD="Report group: "_XTBGRP
....I XTBOLGRP="",PG=1 W XTBGRPHD,!!
....I XTBOLDNM'="",XTBNMSP'=XTBOLDNM W !
....I XTBOLDNM'="",XTBGRP'=XTBOLGRP,XTBPGF=1 D:IOST?1"C-".E PAUSE Q:$D(XTBOUT) D HDR W XTBGRPHD,!!
....I XTBOLDNM'="",XTBGRP'=XTBOLGRP,XTBPGF=0 W !,XTBGRPHD,!!
....I $Y>(IOSL-6),IOST?1"C-".E D PAUSE Q:$D(XTBOUT) D HDR I XTBGRP'=XTBOLGRP W XTBGRPHD,!!
....S Y=XTBINSDT X ^DD("DD") S XTBINSDT=Y
....S Y=XTBCPLDT X ^DD("DD") S XTBCPLDX=Y
....S Y=XTBRELDT X ^DD("DD") S XTBRELDT=Y
....S XTBPRIOR=$S(XTBPRIOR="m":"Mandatory",XTBPRIOR="e":"Emergency",1:"Unknown")
....W XTBCPLDX,?14,XTBPTNAM,?27,XTBRELDT,?41,XTBINSDT,?55,XTBPRIOR
....I XTBDAYLT>0 W ?67,$J(XTBDAYLT,3,0)_$S(XTBDAYLT>1:" days",1:" day") S XTBTLATE=XTBTLATE+1
....W ! S XTBOLDNM=XTBNMSP,XTBOLGRP=XTBGRP
....I $Y>(IOSL-6),IOST?1"C-".E D PAUSE Q:$D(XTBOUT)
....I $Y>(IOSL-6) D HDR I XTBGRP'=XTBOLGRP W XTBGRPHD,!!
G:$D(XTBOUT) EXIT
I $Y>(IOSL-6),IOST?1"C-".E D HDR
W !!?6,"Totals patches received for date range: ",XTBTPTCH,!
W "Total patches installed past compliance date: ",XTBTLATE,!!
S XTBDIVOK=0 I XTBTPTCH>0 S XTBDIVOK=1
W ?25,"Delinquent patch % : ",$S(XTBDIVOK=1:$J((XTBTLATE/XTBTPTCH*100),6,2),1:0)_" %",!
W ?25," Compliance % : ",$S(XTBDIVOK=1:$J(100-(XTBTLATE/XTBTPTCH*100),6,2),1:0)," %",!
I IOST?1"C-".E K XTBANS W !!,"Press ENTER to end " R XTBANS:DTIME
;
EXIT I IOST?1"C-".E W @IOF,!
D ^%ZISC
K %,%DT,%ZIS,XTBNMSP,XTBANS,XTBBDT,XTBBDT1,XTBCPLDT,XTBCPLDX,XTBDA,XTBEDT,XTBEDT1,XTBDAYLT,TMP
K XTBGRPDA,XTBGRP,XTBINSDT,XTBLINE,XTBNMSP,XTBOLDNM,XTBNMSP,XTBPTNAM,XTBPTYPE,XTBDTA,XTBGPDA
K XTBRCVDT,XTBTLATE,XTBTPTCH,D0,DIC,PG,POP,X,X1,X2,Y,ZTDESC,ZTIO,ZTRTN,ZTSAVE,%T,%Y,XTBGRPHD
K TMP("XTBGRP"),TMP("XTBPKG"),XTBOUT,XTBPGF,XTBOLGRP,ZTSK,XTBRELDT,XTBPRIOR,XTBCURDT,XTBDIVOK
Q
;
HDR S PG=PG+1 I IOST?1"P-".E,PG>1 W @IOF
I IOST?1"C-".E W @IOF
W XTBCURDT S X="Patch Statistical Report for "_^DD("SITE")
W ?(IOM-$L(X)\2),X,?(IOM-12),"Page: ",PG,!
S X="Date range: "_XTBBDT1_" to "_XTBEDT1 W ?(IOM-$L(X)\2),X,!
W !,"Compliance",?14,"Patch",?27,"Release",?41,"Install",?67,"# Days",!
W "Date",?14,"Number",?27,"Date",?41,"Date",?55,"Priority",?67,"Delinquent",!,XTBLINE,!
Q
;
PAUSE Q:IOST'?1"C-".E
K XTBANS,XTBOUT W !!,"Press ENTER to continue or '^' to end " R XTBANS:DTIME
I XTBANS[U!('$T) S (XTBNMSP,XTBPTNAM,XTBCPLDT,XTBDA)="ZZZZZZ",XTBOUT=1
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXTPMSTAT 5590 printed Dec 13, 2024@02:41:39 Page 2
XTPMSTAT ;OAK/BP - PRINT PATCH STATISTICS BY REPORT GROUP; 2/7/06
+1 ;;7.3;TOOLKIT;**98,100**; Apr 25, 1995;Build 4
+2 ;
+3 SET IOP="HOME"
DO ^%ZIS
KILL IOP
EN WRITE @IOF,"Patch Monitor Statistics",!!!
+1 WRITE "Please select the REPORTING GROUP. You may select as many groups as you",!
+2 WRITE "wish for each report. Each group will be reported in a separate section.",!!!
+3 KILL TMP("XTBGRP"),TMP("XTBPKG")
+4 NEW DIC,DA
SET DIC(0)="AEQM"
SET DIC="^XPD(9.95,"
DO ^DIC
SET DA(1)=+Y
+5 IF DA(1)>0
NEW DIC
SET DIC(0)="AEQM"
SET DIC="^XPD(9.95,DA(1),2,"
FOR
DO ^DIC
if Y<0
QUIT
Begin DoDot:1
+6 IF $DATA(TMP("XTBGRP",$PIECE(Y,U,2)))
WRITE $CHAR(7),". . . You already have that one"
QUIT
+7 SET TMP("XTBGRP",$PIECE(Y,U,2))=+Y
End DoDot:1
+8 if X[U
GOTO EXIT
+9 if '$DATA(TMP("XTBGRP"))
GOTO EXIT
+10 WRITE !!,"Do you want a new form/screen between REPORTING GROUPS"
SET %=1
DO YN^DICN
SET XTBPGF=%
+11 ;
DATE WRITE !
SET %DT="AEP"
+1 SET %DT("A")="Enter BEGINNING Compliance date: "
DO ^%DT
if Y<0
GOTO EXIT
SET XTBBDT=Y
XECUTE ^DD("DD")
SET XTBBDT1=Y
+2 SET %DT="AE"
SET %DT("A")=" and ENDING Compliance date: "
DO ^%DT
if Y<0
GOTO EXIT
SET XTBEDT=Y
XECUTE ^DD("DD")
SET XTBEDT1=Y
+3 IF XTBEDT<XTBBDT
WRITE !!,$CHAR(7),"Starting date is later than ending date.",!!
HANG 2
GOTO DATE
+4 ;
DEV WRITE !!
SET %ZIS="AEQ"
DO ^%ZIS
if POP
GOTO EXIT
+1 IF $DATA(IO("Q"))
SET ZTIO=ION
SET ZTRTN="SORT^XTPMSTAT"
SET ZTSAVE("XTB*")=""
SET ZTSAVE("TMP*")=""
SET ZTDESC="Patch Monitor Statistics"
DO ^%ZTLOAD
DO HOME^%ZIS
+2 IF $DATA(ZTSK)
WRITE !,"Queued as task #",ZTSK
HANG 2
GOTO EXIT
+3 ;
+4 ; sort patches by compliance date
SORT USE IO
FOR XTBCPLDT=(XTBBDT-.0001):0
SET XTBCPLDT=$ORDER(^XPD(9.9,"D",XTBCPLDT))
if XTBCPLDT=""!(XTBCPLDT>XTBEDT)
QUIT
Begin DoDot:1
+1 FOR XTBDA=0:0
SET XTBDA=$ORDER(^XPD(9.9,"D",XTBCPLDT,XTBDA))
if XTBDA=""
QUIT
Begin DoDot:2
+2 SET XTBDTA=$GET(^XPD(9.9,XTBDA,0))
if XTBDTA=""
QUIT
+3 ;parent package missing in file
SET XTBPTNAM=$PIECE(XTBDTA,U,1)
SET XTBNMSP=$PIECE($PIECE(XTBDTA,U,4)," - ",1)
if XTBNMSP=""
QUIT
+4 SET XTBRELDT=$PIECE(XTBDTA,U,2)
SET XTBPRIOR=$PIECE(XTBDTA,U,3)
+5 SET TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA)=XTBRELDT_U_XTBPRIOR
End DoDot:2
End DoDot:1
PRINT ; read and print sorted groups
+1 SET Y=DT
XECUTE ^DD("DD")
SET XTBCURDT=Y
+2 KILL XTBLINE
SET $PIECE(XTBLINE,"-",(IOM-2))="-"
+3 ; first header
SET PG=0
SET XTBGRP=""
SET XTBGRP=$ORDER(TMP("XTBGRP",XTBGRP))
if XTBGRP=""
GOTO EXIT
DO HDR
+4 SET (XTBGRP,XTBNMSP,XTBPTNAM,XTBOLDNM,XTBOLGRP)=""
SET (XTBTPTCH,XTBTLATE)=0
+5 FOR
SET XTBGRP=$ORDER(TMP("XTBGRP",XTBGRP))
if XTBGRP=""
QUIT
SET XTBGPDA=TMP("XTBGRP",XTBGRP)
Begin DoDot:1
+6 ; read param file for monitored groups
+7 FOR
SET XTBNMSP=$ORDER(^XPD(9.95,1,2,XTBGPDA,1,"B",XTBNMSP))
if XTBNMSP=""
QUIT
IF $DATA(TMP("XTBPKG",XTBNMSP))
Begin DoDot:2
+8 ; read sorted namespaces
+9 FOR XTBCPLDT=0:0
SET XTBCPLDT=$ORDER(TMP("XTBPKG",XTBNMSP,XTBCPLDT))
if XTBCPLDT=""
QUIT
FOR
SET XTBPTNAM=$ORDER(TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM))
if XTBPTNAM=""
QUIT
Begin DoDot:3
+10 FOR XTBDA=0:0
SET XTBDA=$ORDER(TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA))
if XTBDA=""
QUIT
Begin DoDot:4
+11 SET XTBTPTCH=XTBTPTCH+1
+12 SET XTBDTA=TMP("XTBPKG",XTBNMSP,XTBCPLDT,XTBPTNAM,XTBDA)
+13 SET XTBRELDT=$PIECE(XTBDTA,U)
SET XTBPRIOR=$PIECE(XTBDTA,U,2)
+14 SET XTBRCVDT=$PIECE($GET(^XPD(9.9,XTBDA,0)),U,2)
+15 SET XTBPTYPE=$PIECE($GET(^XPD(9.9,XTBDA,0)),U,10)
+16 IF +XTBPTYPE=0
SET D0=XTBDA
DO ^XTPMKPCF
SET XTBINSDT=X
KILL D0
+17 IF +XTBPTYPE=1
SET XTBINSDT=$PIECE($GET(^XPD(9.9,XTBDA,0)),U,11)
+18 IF XTBINSDT]""
SET X1=XTBINSDT
SET X2=XTBCPLDT
DO ^%DTC
SET XTBDAYLT=X
+19 IF XTBINSDT=""
SET X1=DT
SET X2=XTBCPLDT
DO ^%DTC
SET XTBDAYLT=X
+20 SET XTBGRPHD="Report group: "_XTBGRP
+21 IF XTBOLGRP=""
IF PG=1
WRITE XTBGRPHD,!!
+22 IF XTBOLDNM'=""
IF XTBNMSP'=XTBOLDNM
WRITE !
+23 IF XTBOLDNM'=""
IF XTBGRP'=XTBOLGRP
IF XTBPGF=1
if IOST?1"C-".E
DO PAUSE
if $DATA(XTBOUT)
QUIT
DO HDR
WRITE XTBGRPHD,!!
+24 IF XTBOLDNM'=""
IF XTBGRP'=XTBOLGRP
IF XTBPGF=0
WRITE !,XTBGRPHD,!!
+25 IF $Y>(IOSL-6)
IF IOST?1"C-".E
DO PAUSE
if $DATA(XTBOUT)
QUIT
DO HDR
IF XTBGRP'=XTBOLGRP
WRITE XTBGRPHD,!!
+26 SET Y=XTBINSDT
XECUTE ^DD("DD")
SET XTBINSDT=Y
+27 SET Y=XTBCPLDT
XECUTE ^DD("DD")
SET XTBCPLDX=Y
+28 SET Y=XTBRELDT
XECUTE ^DD("DD")
SET XTBRELDT=Y
+29 SET XTBPRIOR=$SELECT(XTBPRIOR="m":"Mandatory",XTBPRIOR="e":"Emergency",1:"Unknown")
+30 WRITE XTBCPLDX,?14,XTBPTNAM,?27,XTBRELDT,?41,XTBINSDT,?55,XTBPRIOR
+31 IF XTBDAYLT>0
WRITE ?67,$JUSTIFY(XTBDAYLT,3,0)_$SELECT(XTBDAYLT>1:" days",1:" day")
SET XTBTLATE=XTBTLATE+1
+32 WRITE !
SET XTBOLDNM=XTBNMSP
SET XTBOLGRP=XTBGRP
+33 IF $Y>(IOSL-6)
IF IOST?1"C-".E
DO PAUSE
if $DATA(XTBOUT)
QUIT
+34 IF $Y>(IOSL-6)
DO HDR
IF XTBGRP'=XTBOLGRP
WRITE XTBGRPHD,!!
End DoDot:4
if $DATA(XTBOUT)
QUIT
End DoDot:3
if $DATA(XTBOUT)
QUIT
End DoDot:2
if $DATA(XTBOUT)
QUIT
End DoDot:1
if $DATA(XTBOUT)
QUIT
+35 if $DATA(XTBOUT)
GOTO EXIT
+36 IF $Y>(IOSL-6)
IF IOST?1"C-".E
DO HDR
+37 WRITE !!?6,"Totals patches received for date range: ",XTBTPTCH,!
+38 WRITE "Total patches installed past compliance date: ",XTBTLATE,!!
+39 SET XTBDIVOK=0
IF XTBTPTCH>0
SET XTBDIVOK=1
+40 WRITE ?25,"Delinquent patch % : ",$SELECT(XTBDIVOK=1:$JUSTIFY((XTBTLATE/XTBTPTCH*100),6,2),1:0)_" %",!
+41 WRITE ?25," Compliance % : ",$SELECT(XTBDIVOK=1:$JUSTIFY(100-(XTBTLATE/XTBTPTCH*100),6,2),1:0)," %",!
+42 IF IOST?1"C-".E
KILL XTBANS
WRITE !!,"Press ENTER to end "
READ XTBANS:DTIME
+43 ;
EXIT IF IOST?1"C-".E
WRITE @IOF,!
+1 DO ^%ZISC
+2 KILL %,%DT,%ZIS,XTBNMSP,XTBANS,XTBBDT,XTBBDT1,XTBCPLDT,XTBCPLDX,XTBDA,XTBEDT,XTBEDT1,XTBDAYLT,TMP
+3 KILL XTBGRPDA,XTBGRP,XTBINSDT,XTBLINE,XTBNMSP,XTBOLDNM,XTBNMSP,XTBPTNAM,XTBPTYPE,XTBDTA,XTBGPDA
+4 KILL XTBRCVDT,XTBTLATE,XTBTPTCH,D0,DIC,PG,POP,X,X1,X2,Y,ZTDESC,ZTIO,ZTRTN,ZTSAVE,%T,%Y,XTBGRPHD
+5 KILL TMP("XTBGRP"),TMP("XTBPKG"),XTBOUT,XTBPGF,XTBOLGRP,ZTSK,XTBRELDT,XTBPRIOR,XTBCURDT,XTBDIVOK
+6 QUIT
+7 ;
HDR SET PG=PG+1
IF IOST?1"P-".E
IF PG>1
WRITE @IOF
+1 IF IOST?1"C-".E
WRITE @IOF
+2 WRITE XTBCURDT
SET X="Patch Statistical Report for "_^DD("SITE")
+3 WRITE ?(IOM-$LENGTH(X)\2),X,?(IOM-12),"Page: ",PG,!
+4 SET X="Date range: "_XTBBDT1_" to "_XTBEDT1
WRITE ?(IOM-$LENGTH(X)\2),X,!
+5 WRITE !,"Compliance",?14,"Patch",?27,"Release",?41,"Install",?67,"# Days",!
+6 WRITE "Date",?14,"Number",?27,"Date",?41,"Date",?55,"Priority",?67,"Delinquent",!,XTBLINE,!
+7 QUIT
+8 ;
PAUSE if IOST'?1"C-".E
QUIT
+1 KILL XTBANS,XTBOUT
WRITE !!,"Press ENTER to continue or '^' to end "
READ XTBANS:DTIME
+2 IF XTBANS[U!('$TEST)
SET (XTBNMSP,XTBPTNAM,XTBCPLDT,XTBDA)="ZZZZZZ"
SET XTBOUT=1
+3 QUIT