-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
NO.: 14641 VERSION: 22.2T1 TAG: passim ROUTINE NAME OR GLOBAL REF: DIAU REPORTER: CAROL MONAHAN DATE CHANGED: JAN 25,2013 PROGRAMMER: RICK MARSHALL PREVIOUS CHECKSUM: B37812759 CHANGE: Auditing: Overhaul Auditing Menu UPDATED UCIS: DEV RELATED CHANGE NUMBERS: [add Sam's post-install change when he's done] DOCUMENTATION NEEDED: YES DOCUMENTATION NOTES: Auditing Menu: New Ordering, Numbers, and Menu Text NEW VERSION: <22.2T1> LONG DESCRIPTION: With all the work George has done for auditing since version 22, and with the new documentation coming, we took this opportunity to reorganize, renumber, and rename the auditing options for clarity and ease of selection. Before: Choose from: 1 FIELDS BEING AUDITED 2 MONITOR A USER Type <Enter> to continue or '^' to exit: 3 PURGE DATA AUDITS 4 PURGE DD AUDITS 5 TURN DATA AUDIT ON/OFF 6 SHOW PAST CHANGES TO DD'S Select AUDIT OPTION: After: Choose from: 1 LIST FIELDS BEING AUDITED 2 TURN DATA AUDIT ON/OFF 3 DATA AUDIT TRAIL PURGE 4 SHOW DD AUDIT TRAIL 5 DD AUDIT TRAIL PURGE 6 MONITOR A USER Select AUDIT OPTION: While in DIAU, I also did a very light refactoring of header lines and last lines throughout the routine and reorganized the subroutines to follow the order of the new menu. EXPLANATION FOR TEST SITES: AUDITING: REORGANIZE AUDITING MENU DETAILED TESTING INSTRUCTIONS: Just run all the options to make sure they still work. Other than a possible displatching problem if I didn't match things up correctly, there shouldn't be any other kinds of errors possible with this change. Type <Enter> to continue or '^' to exit: NO.: 14642 VERSION: 22.2 TAG: 4+4 ROUTINE NAME OR GLOBAL REF: DIAU REPORTER: SMH DATE CHANGED: JAN 27,2013 PROGRAMMER: GEORGE TIMSON CHANGE: Better help for SHOW DD AUDIT TRAIL option on what to enter. DOCUMENTATION NEEDED: NO NEW VERSION: <22.2> LONG DESCRIPTION: This line is added: > S DIR("?")="Enter a date. All audited changes to Data Dictionaries, starting with that date, will be shown." DETAILED TESTING INSTRUCTIONS: Under the menu option, do a "?" to see if the text is there.
- Loading branch information
Fileman Development
committed
Jan 27, 2013
1 parent
35a4050
commit 5534bf6
Showing
1 changed file
with
247 additions
and
149 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,149 +1,247 @@ | ||
DIAU ;SFISC/XAK-AUDIT OPTIONS ;2013-01-16 11:50 AM | ||
;;22.2T1;VA FILEMAN;;Dec 14, 2012 | ||
;Per VHA Directive 2004-038, this routine should not be modified. | ||
0 S DIC="^DOPT(""DIAU""," | ||
I '$D(^DOPT("DIAU","B","MONITOR A USER")) D | ||
.S ^DOPT("DIAU",0)="AUDIT OPTION^1.01" K ^("B") | ||
.F X=1:1:6 S ^DOPT("DIAU",X,0)=$P($T(@X),";;",2) | ||
.S DIK=DIC D IXALL^DIK | ||
OPT ; | ||
S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN G 0 | ||
EN ; | ||
D @DI W !! | ||
Q K %,DIC,DIK,DI,DA,I,J,X,Y Q | ||
; | ||
1 ;;FIELDS BEING AUDITED | ||
D L^DICRW1 Q:'$D(DIC) S (DUB,DIB,DFF)=+Y,BY(0)="^DD(DFF,""AUDIT"",",L(0)=1 | ||
S Y=$O(^DIC(DIB(1))) I Y S DIB(1)=$O(^DD(Y),-1) S:'DIB(1) DIB(1)=DIB | ||
I $O(^DD(DIB,"AUDIT",""))="" F S DIB=$O(^DD(+DIB)) Q:'DIB!(DIB>DIB(1)) I $O(^DD(DIB,"AUDIT",""))]"" S (DUB,DFF)=DIB Q | ||
I 'DIB!(DIB>DIB(1)) G Q2 | ||
S FLDS="W DFF;C1;L9;""FILE"",.001;L9,.01;L20,.25;L15,1.1",DISUPNO=1 | ||
S L=0,DHD="AUDITED FIELDS",DIS(0)="I $D(^DD(DFF,D0,""AUDIT"")),""n""'[^(""AUDIT"")" | ||
S DIA=1,DIC="^DD(DFF,",DIOEND="G L^DIDC" D EN1^DIP | ||
G Q2 | ||
; | ||
; | ||
2 ;;MONITOR A USER | ||
N DIAUSR,%DT,DHIT,DWHEN,DIC,DIAUIDEN | ||
S DIC=200,DIC(0)="AQEM",DIC("A")="Select a USER who has signed on to this system: ",DIC("S")="I $G(^(1.1))" D ^DIC K DIC Q:Y<0 S DIAUSR=+Y | ||
D R1^DICRW ;Creates a DIC("S") that screens out files user has no access to | ||
S DIC("S")=DIC("S")_" I $D(^DIA(+Y,""D"",DIAUSR))",DIC=1,DIC(0)="QAEI",DIC("A")="Select AUDITED File: " | ||
S Y=$G(^DISV(DUZ,"^DIC(")) I Y X DIC("S") I S DIC("B")=Y | ||
D ^DIC K DIC | ||
Q:$G(Y)'>0 S DIA=+Y,DIAUIDEN=$G(^DD(DIA,0,"ID","WRITE")) | ||
K ^UTILITY("DIAU",$J) | ||
S B=0,%DT="AEPT",%DT("A")="START WITH DATE: FIRST// " D ^%DT S DWHEN=" SINCE "_$$DATE^DIUTL(Y) I Y<1 Q:X]"" S Y=0,DWHEN="" | ||
S A=$O(^DIA(DIA,"C",Y-.0001)) Q:'A S B=$O(^(A,0))-.01 | ||
F A=B:0 S A=$O(^DIA(DIA,"D",DIAUSR,A)) Q:'A S P=$G(^DIA(DIA,A,0)) I P D | ||
.I $D(^UTILITY("DIAU",$J,0,+P)) S $P(^(+P),U,2)=A Q | ||
.S ^UTILITY("DIAU",$J,0,+P)=A,DP=$$GET1^DIQ(DIA,+P,.01) S:DP]"" ^UTILITY("DIAU",$J,1,DP,+P)="" ;BY NAME | ||
WRITE S BY(0)="^UTILITY(""DIAU"","_$J_",1,",L(0)=2,FLDS="" | ||
S DHD="W ! D WUSRDHD^DIAU" | ||
S DIC=^DIC(DIA,0,"GL") | ||
S DIOEND="K ^UTILITY(""DIAU"","_$J_")",DHIT="D WUSR^DIAU(D0)" | ||
D EN1^DIP | ||
Q2 K DIA,A,B,DIJ,DP,P,BY,FLDS,DIS,DHD,DCC,L,DNP,DFF,DIB,DIJS,DIPQ,DIMS,DIPP,DUB,DIOEND Q | ||
; | ||
WUSRDHD ;CALLED BY DHD | ||
W $P(^DIC(DIA,0),U)," RECORDS ACCESSED BY ",$P(^VA(200,DIAUSR,0),U)," (DUZ=",DIAUSR,") ",DWHEN,?IOM-8,"Page ",DC,! | ||
W ?IOM-50,"EARLIEST ACCESS",?IOM-25,"LATEST ACCESS",! | ||
W $TR($J("",IOM)," ","-"),! | ||
Q | ||
; | ||
WUSR(Y) ;CALLED BY DHIT | ||
N X,DIAU,DIC,DITAB | ||
W $$GET1^DIQ(DIA,Y,.01) ;NAME | ||
S DITAB=IOM-50 D:DIAUIDEN]"" | ||
.;I IOM>131 W ?80 S $X=19 | ||
.;E D N^DIO2 W ?19 | ||
.S DIC=^DIC(DIA,0,"GL") I $G(@(DIC_"+Y,0)"))]"" X DIAUIDEN ;CALL ^DD(2,0,"ID","WRITE") WITH NAKED REFERENCE | ||
.I IOM<132 D N^DIO2 | ||
S DIAU=^UTILITY("DIAU",$J,0,D0),X=+DIAU | ||
W ?DITAB D W ?DITAB+25 S X=$P(DIAU,U,2) D:X | ||
.N Y S Y=$P(^DIA(DIA,X,0),U,2) X ^DD("DD") W Y | ||
D N^DIO2 | ||
Q | ||
; | ||
; | ||
3 ;;PURGE DATA AUDITS | ||
S DIC("S")="I $D(^DIA(+Y)),'$D(^DD(+Y,0,""AUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC" | ||
S DIA="" D AU^DICRW K DIC("S") G Q2:$D(DTOUT),Q2:Y<0,Q2:'$D(DIC) | ||
S DDA="DATA" D ALL G Q2:$D(DIRUT) | ||
I Y W !!,"..." K ^DIA(DIA) H 3 W "DELETED" G Q2 | ||
W ! S L="PURGE AUDIT RECORDS",DIOEND="D ENDKILL^DIAU",DISTOP=0 | ||
S FLDS="",DHD="PURGE OF AUDIT DATA: "_$O(^DD(DIA,0,"NM",0))_" FILE",DISUPNO=1 | ||
S DHIT="D KILLDIA^DIAU",DIACNT=0 | ||
D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT G Q2 | ||
; | ||
KILLDIA ;CALLED FROM DHIT | ||
S X=$G(^DIA(DIA,D0,0)) K ^DIA(DIA,D0) | ||
S Y=$P(X,U) I Y K ^DIA(DIA,"B",Y,D0) | ||
S Y=$P(X,U,2) I Y K ^DIA(DIA,"C",Y,D0) | ||
S Y=$P(X,U,4) K ^DIA(DIA,"D",+Y,D0) | ||
S DIACNT=DIACNT+1 Q | ||
; | ||
ENDKILL ;CHECK DANGLERS | ||
S $P(^(0),U,4)=$P($G(^DIA(DIA,0)),U,4)-DIACNT | ||
W !!,"...",! W $$DANGLE(DIA)," POINTERS FIXED." | ||
W !!,DIACNT," RECORDS PURGED." | ||
Q | ||
; | ||
DANGLE(DIA) ;CLEAN DANGLERS | ||
N A,B,D0,AA,C | ||
S C=0 | ||
F AA=1,2,4 S A=$E("BC D",AA),B="" D | ||
.F S B=$O(^DIA(DIA,A,B)) Q:B="" D | ||
..F D0=0:0 S D0=$O(^DIA(DIA,A,B,D0)) Q:'D0 I $P($G(^DIA(DIA,D0,0)),U,AA)'=B K ^DIA(DIA,A,B,D0) S C=C+1 | ||
Q C | ||
; | ||
; | ||
4 ;;PURGE DD AUDITS | ||
S DIC("S")="I '$D(^DD(+Y,0,""DDAUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC" | ||
S DIA="DDA",DDA="DD" D A^DICRW G Q:$D(DTOUT)!(Y<0)!'$D(DIC) | ||
D ALL G:$D(DIRUT) Q I Y S X=DIA D PR G Q | ||
W ! S L="PURGE DD AUDIT RECORDS",DIOEND="G M^DIAU",DISTOP=0,DISUPNO=1 | ||
S FLDS="",DHD="PURGE OF DD AUDIT: "_$O(^DD(DIA,0,"NM",0))_" FILE" | ||
S DHIT="S DIK=DCC,DA=D0,DIACNT=DIACNT+1 D ^DIK",DIACNT=0,DIC="^DDA(DDA," | ||
S DDA=DIA D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT G Q2 | ||
; | ||
; | ||
5 ;;TURN DATA AUDIT ON/OFF | ||
N J,DUOUT,DIRUT,DA,DDA,DIAU,DIA,C,D,%,DIC,X,Y,DIR | ||
S (DDA,DIA)=0 D AU^DICRW I 'DIA Q | ||
51 S DIC="^DD("_DIA_",",DIC(0)="QEANIZ",DA(1)=DIA | ||
S DIC("S")="I 1 S %=$P(^(0),U,2) I $E(%)'=""C""" | ||
52 S DIC("W")="N %,%A S %A=$G(^(""AUDIT"")),%=$P(^(0),U,2) W:% $S($P(^DD(+%,.01,0),U,2)[""W"":"" (word-processing)"",1:"" (multiple)"") S:% %A=$G(^(""AUDIT"")) W "" "",%A" | ||
D ^DIC I Y<0 K DIA G Q | ||
I $P(Y(0),U,2) S DA(1)=+$P(Y(0),U,2),DIC="^DD("_DA(1)_"," G 52 | ||
K DIC,DIR S DDA=+Y S:$D(^("AUDIT")) DIR("B")=^("AUDIT") | ||
S DIR(0)="0,1.1" D ^DIR I $D(DIRUT) Q:X'="@" S Y="n" | ||
D TURNON^DIAUTL(DA(1),DDA,Y) I $D(DIRUT) K ^DD(DA(1),DDA,"AUDIT") | ||
W !! G 51 | ||
; | ||
ALL S DIR(0)="Y",DIR("B")="NO" | ||
S DIR("A")="DO YOU WANT TO PURGE ALL "_DDA_" AUDIT RECORDS" | ||
S DIR("??")="^W !!?5,""Answer 'YES' to purge all the "_DDA_" audit records for this file, or"",!?5,""answer 'NO' to sort out the records to be purged.""" | ||
D ^DIR Q:$D(DIRUT) I Y S DIR("A")="ARE YOU SURE" D ^DIR | ||
K DIR Q | ||
; | ||
PR ; | ||
N DIA S DIA=X N X K ^DDA(DIA) | ||
F X=0:0 S X=$O(^DD(DIA,"SB",X)) Q:X'>0 D PR | ||
Q | ||
M S DDA=$O(^DDA(DDA)) | ||
I DDA'>0!(DDA-1>DIA) W !!,DIACNT," RECORDS PURGED." G QM | ||
S %=0,X=DDA D UP G P:%,M:'% | ||
UP Q:'$D(^DD(X,0,"UP")) S X=^("UP") I X=DIA S %=1 Q | ||
G UP | ||
P K ^UTILITY($J,0) S %X="DIPP(",%Y="DPP(" D %XY^%RCR | ||
S DPP=DIPP,L=0,DJ=DIJS,DPQ=DIPQ,M=DIMS,C=",",DIOSL=IOSL G ^DIO | ||
Q | ||
QM ;RETURN TO ^DIO4 FROM LINE TAG M+1 | ||
G STOP^DIO4 | ||
; | ||
; | ||
6 ;;SHOW PAST CHANGES TO DD'S | ||
N DIR,DIRB,%DT S DIRB=$$EZBLD^DIALOG(7065) | ||
S DIR(0)="FO^^S:X=DIRB X=1900 S %DT=""EP"" D ^%DT",DIR("A")="Show Data Dictionary changes since",DIR("B")=DIRB | ||
D ^DIR I Y>0 D DISP^DIAUTL(Y) | ||
Q | ||
DIAU ;SFISC/XAK-AUDIT OPTIONS ; 27JAN2013 | ||
;;22.2T1;VA FILEMAN;;Dec 14, 2012 | ||
;Per VHA Directive 2004-038, this routine should not be modified. | ||
; | ||
; | ||
; Contents | ||
; | ||
; ^DIAU/O/OPT: Run Audit Menu (Rebuild If Necessary) | ||
; EN/Q: Run an Audit Option | ||
; | ||
; 1/WRITE/Q2: LIST FIELDS BEING AUDITED | ||
; 2/21/22: TURN DATA AUDIT ON/OFF | ||
; 3: DATA AUDIT TRAIL PURGE | ||
; 4: SHOW DD AUDIT TRAIL | ||
; 5: DD AUDIT TRAIL PURGE | ||
; 6: MONITOR A USER | ||
; | ||
; KILLDIA: DHIT Code for Option 3 (DATA AUDIT TRAIL PURGE) | ||
; ENDKILL: DIOEND Code for Option 3 (DATA AUDIT TRAIL PURGE) | ||
; $$DANGLE: Clean Danglers for ENDKILL | ||
; ALL: Confirm Purge of All Audit Records for Options 3 & 5 | ||
; PR: Purge All Audit Records for a File & Its Subfiles for Option 5 | ||
; M/UP/P/QM: DIOEND Code for Option 5 (DD AUDIT TRAIL PURGE) | ||
; WUSRDHD: DHD Code for Option 6 (MONITOR A USER) | ||
; WUSR: DHIT Code for Option 6 (MONITOR A USER) | ||
; | ||
; | ||
0 ; Rebuild DOPT Audit Menu If Necessary | ||
; | ||
S DIC="^DOPT(""DIAU""," | ||
I '$D(^DOPT("DIAU","B","MONITOR A USER")) D | ||
.S ^DOPT("DIAU",0)="AUDIT OPTION^1.01" K ^("B") | ||
.F X=1:1:6 S ^DOPT("DIAU",X,0)=$P($T(@X),";;",2) | ||
.S DIK=DIC D IXALL^DIK | ||
; | ||
OPT ; Run Audit Menu | ||
; | ||
S DIC(0)="AEQIZ" D ^DIC G Q:Y<0 S DI=+Y D EN | ||
; | ||
GOTO 0 ; end of ^DIAU/0/OPT | ||
; | ||
; | ||
EN ; Run an Audit Option | ||
; | ||
D @DI W !! | ||
; | ||
Q K %,DIC,DIK,DI,DA,I,J,X,Y | ||
; | ||
QUIT ; end of EN/Q | ||
; | ||
; | ||
1 ;;LIST FIELDS BEING AUDITED | ||
; | ||
D L^DICRW1 Q:'$D(DIC) S (DUB,DIB,DFF)=+Y,BY(0)="^DD(DFF,""AUDIT"",",L(0)=1 | ||
S Y=$O(^DIC(DIB(1))) I Y S DIB(1)=$O(^DD(Y),-1) S:'DIB(1) DIB(1)=DIB | ||
I $O(^DD(DIB,"AUDIT",""))="" F S DIB=$O(^DD(+DIB)) Q:'DIB!(DIB>DIB(1)) I $O(^DD(DIB,"AUDIT",""))]"" S (DUB,DFF)=DIB Q | ||
I 'DIB!(DIB>DIB(1)) G Q2 | ||
S FLDS="W DFF;C1;L9;""FILE"",.001;L9,.01;L20,.25;L15,1.1",DISUPNO=1 | ||
S L=0,DHD="AUDITED FIELDS",DIS(0)="I $D(^DD(DFF,D0,""AUDIT"")),""n""'[^(""AUDIT"")" | ||
S DIA=1,DIC="^DD(DFF,",DIOEND="G L^DIDC" D EN1^DIP | ||
; | ||
GOTO Q2 ; end of 1 (LIST FIELDS BEING AUDITED) | ||
; | ||
; | ||
2 ;;TURN DATA AUDIT ON/OFF | ||
; | ||
N J,DUOUT,DIRUT,DA,DDA,DIAU,DIA,C,D,%,DIC,X,Y,DIR | ||
S (DDA,DIA)=0 D AU^DICRW I 'DIA Q | ||
21 S DIC="^DD("_DIA_",",DIC(0)="QEANIZ",DA(1)=DIA | ||
S DIC("S")="I 1 S %=$P(^(0),U,2) I $E(%)'=""C""" | ||
22 S DIC("W")="N %,%A S %A=$G(^(""AUDIT"")),%=$P(^(0),U,2) W:% $S($P(^DD(+%,.01,0),U,2)[""W"":"" (word-processing)"",1:"" (multiple)"") S:% %A=$G(^(""AUDIT"")) W "" "",%A" | ||
D ^DIC I Y<0 K DIA G Q | ||
I $P(Y(0),U,2) S DA(1)=+$P(Y(0),U,2),DIC="^DD("_DA(1)_"," G 22 | ||
K DIC,DIR S DDA=+Y S:$D(^("AUDIT")) DIR("B")=^("AUDIT") | ||
S DIR(0)="0,1.1" D ^DIR I $D(DIRUT) Q:X'="@" S Y="n" | ||
D TURNON^DIAUTL(DA(1),DDA,Y) I $D(DIRUT) K ^DD(DA(1),DDA,"AUDIT") | ||
W !! | ||
; | ||
GOTO 21 ; end of 2/21/22 (TURN DATA AUDIT ON/OFF) | ||
; | ||
; | ||
3 ;;DATA AUDIT TRAIL PURGE | ||
; | ||
S DIC("S")="I $D(^DIA(+Y)),'$D(^DD(+Y,0,""AUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC" | ||
S DIA="" D AU^DICRW K DIC("S") G Q2:$D(DTOUT),Q2:Y<0,Q2:'$D(DIC) | ||
S DDA="DATA" D ALL G Q2:$D(DIRUT) | ||
I Y W !!,"..." K ^DIA(DIA) H 3 W "DELETED" G Q2 | ||
W ! S L="PURGE AUDIT RECORDS",DIOEND="D ENDKILL^DIAU",DISTOP=0 | ||
S FLDS="",DHD="PURGE OF AUDIT DATA: "_$O(^DD(DIA,0,"NM",0))_" FILE",DISUPNO=1 | ||
S DHIT="D KILLDIA^DIAU",DIACNT=0 | ||
D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT | ||
; | ||
GOTO Q2 ; end of 3 (DATA AUDIT TRAIL PURGE) | ||
; | ||
; | ||
ALL ; Confirm Purge of All Audit Records for Options 3 & 5 | ||
; | ||
S DIR(0)="Y",DIR("B")="NO" | ||
S DIR("A")="DO YOU WANT TO PURGE ALL "_DDA_" AUDIT RECORDS" | ||
S DIR("??")="^W !!?5,""Answer 'YES' to purge all the "_DDA_" audit records for this file, or"",!?5,""answer 'NO' to sort out the records to be purged.""" | ||
D ^DIR Q:$D(DIRUT) I Y S DIR("A")="ARE YOU SURE" D ^DIR | ||
K DIR | ||
; | ||
QUIT ; end of ALL | ||
; | ||
; | ||
KILLDIA ; DHIT Code for Option 3 (DATA AUDIT TRAIL PURGE) | ||
; | ||
; called from DHIT | ||
S X=$G(^DIA(DIA,D0,0)) K ^DIA(DIA,D0) | ||
S Y=$P(X,U) I Y K ^DIA(DIA,"B",Y,D0) | ||
S Y=$P(X,U,2) I Y K ^DIA(DIA,"C",Y,D0) | ||
S Y=$P(X,U,4) K ^DIA(DIA,"D",+Y,D0) | ||
S DIACNT=DIACNT+1 | ||
; | ||
QUIT ; end of KILLDIA | ||
; | ||
; | ||
ENDKILL ; DIOEND Code for Option 3 (DATA AUDIT TRAIL PURGE) | ||
; | ||
; check danglers | ||
S $P(^(0),U,4)=$P($G(^DIA(DIA,0)),U,4)-DIACNT | ||
W !!,"...",! W $$DANGLE(DIA)," POINTERS FIXED." | ||
W !!,DIACNT," RECORDS PURGED." | ||
; | ||
QUIT ; end of ENDKILL | ||
; | ||
; | ||
DANGLE(DIA) ; Clean Danglers for ENDKILL | ||
; | ||
N A,B,D0,AA,C | ||
S C=0 | ||
F AA=1,2,4 S A=$E("BC D",AA),B="" D | ||
.F S B=$O(^DIA(DIA,A,B)) Q:B="" D | ||
..F D0=0:0 S D0=$O(^DIA(DIA,A,B,D0)) Q:'D0 I $P($G(^DIA(DIA,D0,0)),U,AA)'=B K ^DIA(DIA,A,B,D0) S C=C+1 | ||
; | ||
Q C ; end of $$DANGLE | ||
; | ||
; | ||
4 ;;SHOW DD AUDIT TRAIL | ||
; | ||
N DIR,DIRB,%DT S DIRB=$$EZBLD^DIALOG(7065) | ||
S DIR(0)="FO^^S:X=DIRB X=1900 S %DT=""EP"" D ^%DT",DIR("A")="Show Data Dictionary changes since",DIR("B")=DIRB | ||
S DIR("?")="Enter a date. All audited changes to Data Dictionaries, starting with that date, will be shown." | ||
D ^DIR I Y>0 D DISP^DIAUTL(Y) | ||
; | ||
QUIT ; end of 4 (SHOW DD AUDIT TRAIL) | ||
; | ||
; | ||
5 ;;DD AUDIT TRAIL PURGE | ||
; | ||
S DIC("S")="I '$D(^DD(+Y,0,""DDAUDPURGEFORBID"")) S DIAC=""AUDIT"",DIFILE=+Y D ^DIAC I DIAC" | ||
S DIA="DDA",DDA="DD" D A^DICRW G Q:$D(DTOUT)!(Y<0)!'$D(DIC) | ||
D ALL G:$D(DIRUT) Q I Y S X=DIA D PR G Q | ||
W ! S L="PURGE DD AUDIT RECORDS",DIOEND="G M^DIAU",DISTOP=0,DISUPNO=1 | ||
S FLDS="",DHD="PURGE OF DD AUDIT: "_$O(^DD(DIA,0,"NM",0))_" FILE" | ||
S DHIT="S DIK=DCC,DA=D0,DIACNT=DIACNT+1 D ^DIK",DIACNT=0,DIC="^DDA(DDA," | ||
S DDA=DIA D EN1^DIP K DISTOP,DHIT,DIK,DA,DIACNT | ||
; | ||
GOTO Q2 ; end of 5 (DD AUDIT TRAIL PURGE) | ||
; | ||
; | ||
PR ; Purge All Audit Records for a File & Its Subfiles for Option 5 | ||
; | ||
N DIA S DIA=X N X K ^DDA(DIA) | ||
F X=0:0 S X=$O(^DD(DIA,"SB",X)) Q:X'>0 D PR | ||
; | ||
QUIT ; end of PR | ||
; | ||
; | ||
M ; DIOEND Code for Option 5 (DD AUDIT TRAIL PURGE) | ||
; | ||
S DDA=$O(^DDA(DDA)) | ||
I DDA'>0!(DDA-1>DIA) W !!,DIACNT," RECORDS PURGED." G QM | ||
S %=0,X=DDA D UP | ||
GOTO P:%,M:'% | ||
; | ||
UP Q:'$D(^DD(X,0,"UP")) S X=^("UP") I X=DIA S %=1 Q | ||
GOTO UP | ||
; | ||
P K ^UTILITY($J,0) S %X="DIPP(",%Y="DPP(" D %XY^%RCR | ||
S DPP=DIPP,L=0,DJ=DIJS,DPQ=DIPQ,M=DIMS,C=",",DIOSL=IOSL G ^DIO | ||
QUIT | ||
; | ||
QM ; return to ^DIO4 from line tag M+3 | ||
; | ||
GOTO STOP^DIO4 ; end of M/UP/P/QM | ||
; | ||
; | ||
6 ;;MONITOR A USER | ||
; | ||
N DIAUSR,%DT,DHIT,DWHEN,DIC,DIAUIDEN | ||
S DIC=200,DIC(0)="AQEM",DIC("A")="Select a USER who has signed on to this system: ",DIC("S")="I $G(^(1.1))" D ^DIC K DIC Q:Y<0 S DIAUSR=+Y | ||
D R1^DICRW ;Creates a DIC("S") that screens out files user has no access to | ||
S DIC("S")=DIC("S")_" I $D(^DIA(+Y,""D"",DIAUSR))",DIC=1,DIC(0)="QAEI",DIC("A")="Select AUDITED File: " | ||
S Y=$G(^DISV(DUZ,"^DIC(")) I Y X DIC("S") I S DIC("B")=Y | ||
D ^DIC K DIC | ||
Q:$G(Y)'>0 S DIA=+Y,DIAUIDEN=$G(^DD(DIA,0,"ID","WRITE")) | ||
K ^UTILITY("DIAU",$J) | ||
S B=0,%DT="AEPT",%DT("A")="START WITH DATE: FIRST// " D ^%DT S DWHEN=" SINCE "_$$DATE^DIUTL(Y) I Y<1 Q:X]"" S Y=0,DWHEN="" | ||
S A=$O(^DIA(DIA,"C",Y-.0001)) Q:'A S B=$O(^(A,0))-.01 | ||
F A=B:0 S A=$O(^DIA(DIA,"D",DIAUSR,A)) Q:'A S P=$G(^DIA(DIA,A,0)) I P D | ||
.I $D(^UTILITY("DIAU",$J,0,+P)) S $P(^(+P),U,2)=A Q | ||
.S ^UTILITY("DIAU",$J,0,+P)=A,DP=$$GET1^DIQ(DIA,+P,.01) S:DP]"" ^UTILITY("DIAU",$J,1,DP,+P)="" ;BY NAME | ||
; | ||
WRITE ; Display Monitor a User Report | ||
; | ||
S BY(0)="^UTILITY(""DIAU"","_$J_",1,",L(0)=2,FLDS="" | ||
S DHD="W ! D WUSRDHD^DIAU" | ||
S DIC=^DIC(DIA,0,"GL") | ||
S DIOEND="K ^UTILITY(""DIAU"","_$J_")",DHIT="D WUSR^DIAU(D0)" | ||
D EN1^DIP | ||
; | ||
Q2 K DIA,A,B,DIJ,DP,P,BY,FLDS,DIS,DHD,DCC,L,DNP,DFF,DIB,DIJS,DIPQ,DIMS,DIPP,DUB,DIOEND | ||
; | ||
QUIT ; end of 6/WRITE/Q2 (MONITOR A USER) | ||
; | ||
; | ||
WUSRDHD ; DHD Code for Option 6 (MONITOR A USER) | ||
; | ||
; called by DHD | ||
W $P(^DIC(DIA,0),U)," RECORDS ACCESSED BY ",$P(^VA(200,DIAUSR,0),U)," (DUZ=",DIAUSR,") ",DWHEN,?IOM-8,"Page ",DC,! | ||
W ?IOM-50,"EARLIEST ACCESS",?IOM-25,"LATEST ACCESS",! | ||
W $TR($J("",IOM)," ","-"),! | ||
; | ||
QUIT ; end of WUSRDHD | ||
; | ||
; | ||
WUSR(Y) ; DHIT Code for Option 6 (MONITOR A USER) | ||
; | ||
; called by DHIT | ||
N X,DIAU,DIC,DITAB | ||
W $$GET1^DIQ(DIA,Y,.01) ;NAME | ||
S DITAB=IOM-50 D:DIAUIDEN]"" | ||
.;I IOM>131 W ?80 S $X=19 | ||
.;E D N^DIO2 W ?19 | ||
.S DIC=^DIC(DIA,0,"GL") I $G(@(DIC_"+Y,0)"))]"" X DIAUIDEN ;CALL ^DD(2,0,"ID","WRITE") WITH NAKED REFERENCE | ||
.I IOM<132 D N^DIO2 | ||
S DIAU=^UTILITY("DIAU",$J,0,D0),X=+DIAU | ||
W ?DITAB D W ?DITAB+25 S X=$P(DIAU,U,2) D:X | ||
.N Y S Y=$P(^DIA(DIA,X,0),U,2) X ^DD("DD") W Y | ||
D N^DIO2 | ||
; | ||
QUIT ; end of WUSR | ||
; | ||
; | ||
EOR ; end of routine DIAU |