Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XUSAP1

XUSAP1.m

Go to the documentation of this file.
  1. XUSAP1 ;OAK/KC - Connector Proxy Reports ;2/1/2012
  1. ;;8.0;KERNEL;**574**;Jul 10, 1995;Build 8
  1. ;Per VHA Directive 2004-038, this routine should not be modified.
  1. Q
  1. ; Option File entry points:
  1. ; EN1^XUSAP1: prompt user to select 1 connector proxy to display
  1. ; ENALL^XUSAP1: prompt user to display all connector proxies (can be scheduled)
  1. ;
  1. EN1 ;option entry point w/dialog to select 1 CP entry; calls task entry point
  1. N XUSCPSAV,XUSCPDUZ,DIC,X,Y,XUSCPSCANLOG,XUSCPSCANFLD
  1. I '$$GETCPIEN W !!,"ABORTING! 'CONNECTOR PROXY' USER CLASS UNDEFINED." Q
  1. ;select CP entry to print
  1. S DIC="^VA(200,",DIC(0)="AEMQZ",DIC("S")="I $$ISUSERCP^XUSAP1(Y)" D ^DIC Q:Y'>0
  1. S XUSCPDUZ=+Y,XUSCPSAV("XUSCPDUZ")=""
  1. K Y D ASKFLD Q:Y[U!(Y="") S XUSCPSCANFLD=+Y,XUSCPSAV("XUSCPSCANFLD")=""
  1. K Y D ASKLOG Q:Y[U!(Y="") S XUSCPSCANLOG=+Y,XUSCPSAV("XUSCPSCANLOG")=""
  1. D EN^XUTMDEVQ("Q1^XUSAP1","Connector Proxy Display",.XUSCPSAV)
  1. Q
  1. ;
  1. ENALL ;schedulable option entry point w/dialog to print all CPs; calls task entry point
  1. N XUSCPSAV,XUSCPSCANLOG,XUSCPSCANFLD
  1. I '$$GETCPIEN W !!,"Connector Proxy Report ABORTING! 'CONNECTOR PROXY' USER CLASS UNDEFINED." Q
  1. I $D(ZTQUEUED) S (XUSCPSCANLOG,XUSCPSCANFLD)=1 G QALL ; can run as scheduled option
  1. K Y D ASKFLD Q:Y[U!(Y="") S XUSCPSCANFLD=+Y,XUSCPSAV("XUSCPSCANFLD")=""
  1. K Y D ASKLOG Q:Y[U!(Y="") S XUSCPSCANLOG=+Y,XUSCPSAV("XUSCPSCANLOG")=""
  1. D EN^XUTMDEVQ("QALL^XUSAP1","Connector Proxy Report",.XUSCPSAV)
  1. Q
  1. ;
  1. ASKLOG ;ask if want to scan sign-on log too
  1. N DIR,DTOUT,DUOUT,DIRUT,DIROUT
  1. S DIR(0)="YO",DIR("B")="No"
  1. S DIR("A")="Scan sign-on log for connector proxy activity"
  1. S DIR("?")="Scanning the sign-on log will consume additional time before report completion."
  1. D ^DIR Q
  1. ;
  1. ASKFLD ;ask if want to analyze options
  1. N DIR,DTOUT,DUOUT,DIRUT,DIROUT
  1. S DIR(0)="YO",DIR("B")="Yes"
  1. S DIR("A")="Check/display connector proxy fields"
  1. S DIR("?")="More output will be contained in the report if connector proxy fields are checked/displayed."
  1. D ^DIR Q
  1. ;
  1. Q1 ;EN^XUTMDEVQ entry point, print 1
  1. ;input values:
  1. ; XUSCPDUZ (conn proxy DUZ)
  1. ; XUSCPSCANFLD (whether to scan NP flds in CP entries)
  1. ; XUSCPSCANLOG (whether to scan sign-on log)
  1. N XUSCPRNT,XUSCPDT,XUSCPSAEXP,XUSCPACTIVE,XUSCPQ,XUSCPLST,XUSCPOKFLDS,XUSCPWARNFLDS,XUSCPINACFLDS
  1. S XUSCPACTIVE=$$ACTIVE^XUSER(XUSCPDUZ)
  1. D VARSETUP
  1. I +$G(XUSCPSCANLOG) S XUSCPLST($P(XUSCPACTIVE,U),XUSCPDUZ)=$P(XUSCPACTIVE,U,2) D SCANLOG
  1. W:$E(IOST,1,2)="C-" @IOF D HDR,BLURB
  1. D P(XUSCPACTIVE,XUSCPDUZ)
  1. K ^TMP($J,"XUSCP"),^TMP($J,"XUSCPLOG") Q
  1. ;
  1. QALL ;EN^XUTMDEVQ entry point, print all
  1. ;input values (EN^XUTMDEVQ):
  1. ; XUSCPSCANFLD (whether to scan NP flds in CP entries)
  1. ; XUSCPSCANLOG (whether to scan sign-on log)
  1. N XUSCPRNT,XUSCPDT,XUSCPSAEXP,XUSCPACTIVE,XUSCPQ,XUSCPLST,XUSCPOKFLDS,XUSCPWARNFLDS,XUSCPINACFLDS
  1. D VARSETUP
  1. ;gather DUZ list of CPs in XUSCPLST
  1. D DUZLIST Q:+$G(ZTSTOP)
  1. D:+$G(XUSCPSCANLOG) SCANLOG Q:+$G(ZTSTOP)
  1. W:$E(IOST,1,2)="C-" @IOF D HDR,BLURB ;header for page 1
  1. ;loop through/sort by active, then inactive, CP DUZ list users, print detail if requested
  1. F XUSCPACTIVE=1,0 Q:+$G(XUSCPQ) D
  1. .S XUSCPDUZ=0 F S XUSCPDUZ=$O(XUSCPLST(XUSCPACTIVE,XUSCPDUZ)) Q:('XUSCPDUZ)!+$G(XUSCPQ) D P(XUSCPACTIVE,XUSCPDUZ)
  1. K ^TMP($J,"XUSCP"),^TMP($J,"XUSCPLOG") Q
  1. ;
  1. VARSETUP ;set up date,print,field list vars
  1. S XUSCPDT=$$HTFM^XLFDT($H),XUSCPSAEXP=1095 ;current date, + service acct expiry in days
  1. S XUSCPRNT("DT EXT")=$$FMTE^XLFDT(XUSCPDT,"1PM")
  1. S $P(XUSCPRNT("UL"),"-",IOM)="",$P(XUSCPRNT("EQ"),"=",IOM)="",XUSCPRNT("PG")=1
  1. D ADDFLDS("WARNFLDS",.XUSCPWARNFLDS) ;get fields processed in warning sections
  1. D ADDFLDS("OKFLDS",.XUSCPOKFLDS) ;get "ok to be populated" field list
  1. D ADDFLDS("INACFLDS",.XUSCPINACFLDS) ;get "ok for inactive user field list
  1. Q
  1. ;
  1. P(XUSCPACTIVE,XUSCPDUZ) ;print/display a CP entry
  1. ;input values: XUSCPDUZ, + VARSET values
  1. N XUSCPERR,I,J,XUSCPSTR
  1. I $$S^%ZTLOAD() S (XUSCPQ,ZTSTOP)=1 Q
  1. K ^TMP($J,"XUSCP")
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. D GETS^DIQ(200,XUSCPDUZ,"**","EINR","^TMP($J,""XUSCP"")","XUSCPERR") ;get populated fields int/ext
  1. I $D(XUSCPERR) D Q
  1. .W !," >>>>Error(s) processing Connector Proxy DUZ "_XUSCPDUZ_": "
  1. .S I=0 F S I=$O(XUSCPERR("DIERR",I)) Q:'I!(+$G(XUSCPQ)) D
  1. ..S J=0 F S J=$O(XUSCPERR("DIERR",I,"TEXT",J)) Q:'J!(+$G(XUSCPQ)) D
  1. ...W !," >>>>"_$G(XUSCPERR("DIERR",I))_" "_$G(XUSCPERR("DIERR",I,"TEXT",J)),!
  1. ...I $$HDRCHK(4) S XUSCPQ=1 Q
  1. ;
  1. S XUSCPSTR="Name: '"_$$NAME^XUSER(XUSCPDUZ)_"'"
  1. W !,XUSCPRNT("EQ"),!,XUSCPSTR,$$RJ^XLFSTR(" Active: "_$S(+XUSCPACTIVE:"YES",1:"NO"),IOM-$L(XUSCPSTR)-1," ")
  1. I '+XUSCPACTIVE,$L($G(XUSCPLST(XUSCPACTIVE,XUSCPDUZ))) W !,$$RJ^XLFSTR("("_XUSCPLST(XUSCPACTIVE,XUSCPDUZ)_")",IOM-1," ")
  1. W !,XUSCPRNT("EQ")
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. ;
  1. D PCREDCHK S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. I +$G(XUSCPSCANFLD) D Q:+$G(XUSCPQ)
  1. .D PWARN S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. .D POKFLDS S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. .D PBADFLDS S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. .D PBADMULT S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. D:+$G(XUSCPSCANLOG) PSCANLOG S:$$HDRCHK(4) XUSCPQ=1 Q:+$G(XUSCPQ)
  1. W !
  1. Q
  1. ;
  1. PCREDCHK ;display credential date checks
  1. ;input values: ^TMP($J,"XUSCP"), XUSCPDUZ, XUSCPDT
  1. N XUSCPDIFFDE,XUSCPDIFFVC,XUSCPOLDTIME,XUSCPDC
  1. S XUSCPOLDTIME="2950710.000101"
  1. ;check time since v/c last changed, WARN > 3 yrs
  1. ;if DATE VERIFY CODE LAST CHANGED="60000,1" then no date on record.
  1. S XUSCPDC=$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","DATE VERIFY CODE LAST CHANGED","I")) S:$L(XUSCPDC) XUSCPDC=$$HTFM^XLFDT(XUSCPDC,1) ; convert $H to FM
  1. S XUSCPDIFFDE=$$FMDIFF^XLFDT(XUSCPDT,$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","DATE ENTERED","I"),XUSCPOLDTIME))
  1. S XUSCPDIFFVC=$$FMDIFF^XLFDT(XUSCPDT,$G(XUSCPDC,XUSCPOLDTIME))
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. W !," Compliant w/3-year Service Account Mandate? " D
  1. .I (XUSCPDIFFDE<XUSCPSAEXP)!(XUSCPDIFFVC<XUSCPSAEXP) W "YES" Q ;one or both dates within exp
  1. .;both dates exp, verify code date is real OR if fake, there are no VOLD nodes
  1. .I ('($G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","DATE VERIFY CODE LAST CHANGED","I"))="60000,1"))!('$D(^VA(200,XUSCPDUZ,"VOLD"))) W $S(XUSCPACTIVE:"*** NO <---- MUST FIX ***",1:"No, but user not active.") Q
  1. .W $S(XUSCPACTIVE:"UNABLE TO DETERMINE",1:"unable to det. but not active.") Q ;fake verify code date AND VOLD nodes, so can't tell
  1. W !," Date User Created: "_$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","DATE ENTERED","E"))
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. W !," Date Verify Code Last Changed: "
  1. W $S('$L($G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","DATE VERIFY CODE LAST CHANGED","I"))):"never",$G(^("I"))'="60000,1":$G(^("E")),$D(^VA(200,XUSCPDUZ,"VOLD")):"(changed but date not recorded)",1:"never")
  1. ; if XUS Logon Attempt Count > 0, strongly indicates verify code-related login problem(s) from 1 or more adapters
  1. I +$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","XUS Logon Attempt Count","E")) W !," >>>Failed Logon Attempts: "_^("E")
  1. Q
  1. ;
  1. PWARN ;display warning for primary menus, other user classes defined, FM access code
  1. N XUSCPWRN,XUSCPMUL
  1. S:$L($G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","PRIMARY MENU OPTION","E"))) XUSCPWRN("PRIMARY")=^("E")
  1. S:$L($G(^TMP($J,"XUSCP",200,XUSCPDUZ_",","SSN","E"))) XUSCPWRN("SSN")="<masked>"
  1. I $D(^TMP($J,"XUSCP",200,XUSCPDUZ_",","FILE MANAGER ACCESS CODE")) S XUSCPWRN("FILE MANAGER ACCESS CODE")=""
  1. S XUSCPMUL="" F S XUSCPMUL=$O(^TMP($J,"XUSCP",200.07,XUSCPMUL)) Q:XUSCPMUL']"" D
  1. .I ^TMP($J,"XUSCP",200.07,XUSCPMUL,"User Class","I")'=$$GETCPIEN S XUSCPWRN("USC")=""
  1. I $D(XUSCPWRN) W !!," Warning(s):",!," -----------" D Q:+$G(XUSCPQ)!+$G(XUSCPQ)
  1. .I $D(XUSCPWRN("PRIMARY")) W !," Primary Menu defined (SHOULDN'T BE!): ",XUSCPWRN("PRIMARY")
  1. .I $D(XUSCPWRN("SSN")) W !," SSN defined (SHOULDN'T BE!): ",XUSCPWRN("SSN")
  1. .I $$HDRCHK(4) S XUSCPQ=1 Q
  1. .I $D(XUSCPWRN("USC")) W !," Non-CP User Classes defined (SHOULDN'T BE!): " D Q:+$G(XUSCPQ)
  1. ..S XUSCPMUL="" F S XUSCPMUL=$O(^TMP($J,"XUSCP",200.07,XUSCPMUL)) Q:XUSCPMUL']""!+$G(XUSCPQ) D
  1. ...Q:^TMP($J,"XUSCP",200.07,XUSCPMUL,"User Class","I")=$$GETCPIEN
  1. ...W !," - "_^TMP($J,"XUSCP",200.07,XUSCPMUL,"User Class","E")
  1. ...I $$HDRCHK(4) S XUSCPQ=1 Q
  1. .I $D(XUSCPWRN("FILE MANAGER ACCESS CODE")) W !," File Manager Access Code is defined (SHOULDN'T BE!): "_^TMP($J,"XUSCP",200,XUSCPDUZ_",","FILE MANAGER ACCESS CODE","E")
  1. Q
  1. ;
  1. POKFLDS ;display values of allowed fields
  1. N XUSCPFLD
  1. W !!," Values for other fields allowed/expected to be Populated:"
  1. W !," ----------------------------------------------------------"
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. S XUSCPFLD="" F S XUSCPFLD=$O(XUSCPOKFLDS(XUSCPFLD)) Q:'$L(XUSCPFLD)!(+$G(XUSCPQ)) D PFLD
  1. I 'XUSCPACTIVE S XUSCPFLD="" F S XUSCPFLD=$O(XUSCPINACFLDS(XUSCPFLD)) Q:'$L(XUSCPFLD)!(+$G(XUSCPQ)) D PFLD
  1. Q
  1. ;
  1. PFLD ; output a field
  1. ;input XUSCPFLD,XUSCPDUZ,^TMP values
  1. Q:'$D(^TMP($J,"XUSCP",200,XUSCPDUZ_",",XUSCPFLD,"I")) ; skip empty fields
  1. W !," "_$$RJ^XLFSTR(XUSCPFLD,29)_": "
  1. W $S(XUSCPFLD="NAME COMPONENTS":"entry# "_$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",",XUSCPFLD,"I")),1:$G(^TMP($J,"XUSCP",200,XUSCPDUZ_",",XUSCPFLD,"E")))
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. Q
  1. ;
  1. PBADFLDS ;display any unexpected (not part of CP template) top-level fields populated
  1. N XUSCPFLD,XUSCPCNT
  1. S XUSCPFLD="",XUSCPCNT=0 F S XUSCPFLD=$O(^TMP($J,"XUSCP",200,XUSCPDUZ_",",XUSCPFLD)) Q:XUSCPFLD']""!(+$G(XUSCPQ)) D
  1. .Q:$D(XUSCPOKFLDS(XUSCPFLD))!$D(XUSCPWARNFLDS(XUSCPFLD))
  1. .Q:$D(XUSCPINACFLDS(XUSCPFLD))&'XUSCPACTIVE
  1. .S XUSCPCNT=XUSCPCNT+1 I XUSCPCNT=1 D Q:+$G(XUSCPQ)
  1. ..W !!," Other Fields Populated:"
  1. ..W !," -----------------------"
  1. ..I $$HDRCHK(4) S XUSCPQ=1 Q
  1. .Q:+$G(XUSCPQ)
  1. .D PFLD
  1. Q
  1. ;
  1. PBADMULT ;display any unexpected multiples; skip those already processed:
  1. ;- 200.07 user class
  1. N XUSCPMUL,XUSCPFLD,XUSCPFILE,XUSCPCNT
  1. S (XUSCPFILE,XUSCPCNT)=0 F S XUSCPFILE=$O(^TMP($J,"XUSCP",XUSCPFILE)) Q:'XUSCPFILE!+$G(XUSCPQ) D
  1. .Q:XUSCPFILE=200!(XUSCPFILE="200.07")
  1. .S XUSCPCNT=XUSCPCNT+1 D:XUSCPCNT=1
  1. ..W !!," Other Multiples Populated:"
  1. ..W !," ---------------------------"
  1. .W !," ",XUSCPFILE,": ",$P($G(^DD(XUSCPFILE,0)),U)
  1. .S XUSCPMUL="" F S XUSCPMUL=$O(^TMP($J,"XUSCP",XUSCPFILE,XUSCPMUL)) Q:XUSCPMUL']""!+$G(XUSCPQ) D
  1. ..S XUSCPFLD="" F S XUSCPFLD=$O(^TMP($J,"XUSCP",XUSCPFILE,XUSCPMUL,XUSCPFLD)) Q:XUSCPFLD']""!(+$G(XUSCPQ)) D
  1. ...W !," "_$$RJ^XLFSTR(XUSCPFLD,29)_": "_$G(^TMP($J,"XUSCP",XUSCPFILE,XUSCPMUL,XUSCPFLD,"E"))
  1. ...I $$HDRCHK(4) S XUSCPQ=1 Q
  1. Q
  1. ;
  1. PSCANLOG ; output signon activity for this CP user found in SCANLOG pass
  1. N XUSCPIP,XUSCPSIGNON,XUSCPTOT
  1. ;input: ^TMP($J,"XUSCPLOG",XUSCPDUZ),XUSCPDUZ
  1. W !!," Connector Proxy Activity (Sign-On Log):"
  1. W !," --------------------------------------"
  1. I $$HDRCHK(4) S XUSCPQ=1 Q
  1. I '$D(^TMP($J,"XUSCPLOG",XUSCPDUZ)) W !," no signon activity found" Q
  1. S XUSCPIP="" F S XUSCPIP=$O(^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP)) Q:'+XUSCPIP!+$G(XUSCPQ) D
  1. .W !," IP address "_XUSCPIP_": "
  1. .W !," - Total active connections (current): ",+$G(^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP,"CUR"))
  1. .I $$HDRCHK(4) S XUSCPQ=1 Q
  1. .S (XUSCPSIGNON,XUSCPTOT)=0 F S XUSCPSIGNON=$O(^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP,XUSCPSIGNON)) Q:'+XUSCPSIGNON!+$G(XUSCPQ) D
  1. ..S XUSCPTOT=XUSCPTOT+$G(^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP,XUSCPSIGNON))
  1. .W !," - Total logons recorded in sign-on log: "_XUSCPTOT
  1. .W !," - Total logons by date: "
  1. .I $$HDRCHK(4) S XUSCPQ=1 Q
  1. .S XUSCPSIGNON=0 F S XUSCPSIGNON=$O(^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP,XUSCPSIGNON)) Q:'+XUSCPSIGNON!+$G(XUSCPQ) D
  1. ..W !," > "_$$FMTE^XLFDT(XUSCPSIGNON)_": "_^TMP($J,"XUSCPLOG",XUSCPDUZ,XUSCPIP,XUSCPSIGNON)
  1. ..I $$HDRCHK(4) S XUSCPQ=1 Q
  1. Q
  1. ;
  1. DUZLIST ;loop thru file 200, return list of CP user class DUZs in XUSCPLST in format:
  1. ;XUSCPLST(0 or 1,DUZ)=reason/description active/inactive
  1. ;0=inactive user, 1=active
  1. N XUSCPIEN,XUSCPACTIVE,XUSCPLOOPC,XUSCPQC
  1. ;get CP user class IEN
  1. S XUSCPIEN=$$GETCPIEN I 'XUSCPIEN W !!,"ABORTING! 'CONNECTOR PROXY' USER CLASS UNDEFINED." Q
  1. ;loop thru 200 for connector proxy users (USC3 xref)
  1. S XUSCPQC=100
  1. S (XUSCPDUZ,XUSCPLOOPC)=0 F S XUSCPDUZ=$O(^VA(200,XUSCPDUZ)) Q:'XUSCPDUZ!+$G(XUSCPQ) D
  1. .S XUSCPLOOPC=XUSCPLOOPC+1 I '+(XUSCPLOOPC#XUSCPQC) I $$S^%ZTLOAD() S (XUSCPQ,ZTSTOP)=1 Q
  1. .I $D(^VA(200,XUSCPDUZ,"USC3")) D
  1. ..Q:'$$ISUSERCP(XUSCPDUZ)
  1. ..S XUSCPACTIVE=$$ACTIVE^XUSER(XUSCPDUZ)
  1. ..S XUSCPLST($P(XUSCPACTIVE,U),XUSCPDUZ)=$P(XUSCPACTIVE,U,2)
  1. Q
  1. ;
  1. ISUSERCP(XUSCPDUZ) ;return 1 if any of DUZ's user classes are CP, 0 if not
  1. N XUSCP200P07IEN,XUSCP201IEN,XUSCPRET,XUSCPIEN
  1. S XUSCPRET=0
  1. I $D(^VA(200,XUSCPDUZ,"USC3")) D
  1. .;loop thru DUZ's user class multiple/look for CP
  1. .S XUSCP200P07IEN=0,XUSCPIEN=$$GETCPIEN
  1. .F S XUSCP200P07IEN=$O(^VA(200,XUSCPDUZ,"USC3",XUSCP200P07IEN)) Q:'XUSCP200P07IEN!$D(XUSCPLST(XUSCPDUZ)) D
  1. ..;get IEN of user class, check if CONNECTOR PROXY
  1. ..S XUSCP201IEN=$P(^VA(200,XUSCPDUZ,"USC3",XUSCP200P07IEN,0),U)
  1. ..S:(XUSCP201IEN=XUSCPIEN) XUSCPRET=1 ;user has CP user class
  1. Q XUSCPRET
  1. ;
  1. GETCPIEN() ;return CP IEN from User Class file
  1. Q +$O(^VA(201,"B","CONNECTOR PROXY",""))
  1. ;
  1. HDR ;
  1. W "CONNECTOR PROXY REPORT: ",XUSCPRNT("DT EXT"),?70,$$RJ^XLFSTR("PAGE "_XUSCPRNT("PG"),9),!,XUSCPRNT("UL"),!
  1. Q
  1. ;
  1. BLURB ;
  1. W !,">>>Always contact the National Help Desk or Customer Support, to determine"
  1. W !,"the best fix (and be alerted to known issues) for ANY problem listed below.",!
  1. W !?10,"Coordinate all account changes with affected remote"
  1. W !?15,"application to prevent service disruptions.",!
  1. Q
  1. ;
  1. HDRCHK(Y) ;Y=excess lines, return 1 to exit
  1. ;return 0 to continue
  1. Q:+$G(XUSCPQ) 1
  1. Q:$Y<(IOSL-Y) 0
  1. I $E(IOST,1,2)="C-" D Q:'Y 1
  1. .N DIR,I,J,K,X
  1. .S DIR(0)="E" D ^DIR
  1. S XUSCPRNT("PG")=XUSCPRNT("PG")+1
  1. W @IOF D HDR
  1. Q 0
  1. ;
  1. SCANLOG ;loop thru sign-on log for connector proxy activity, save results in ^TMP($J,"XUSCPLOG")
  1. N XUSCPSEC0,XUSCPSIGNON,XUSCPSECDUZ,XUSCPIP,XUSCPCUR,XUSCPLOOPC,XUSCPQ,XUSCPQC
  1. ;input: XUSCPLST(ACTIVE,DUZ) list of CPs
  1. ;search each ^XUSEC(0, date/time) 0-node
  1. SET (XUSCPSIGNON,XUSCPLOOPC)=0,XUSCPQC=100
  1. F SET XUSCPSIGNON=$O(^XUSEC(0,XUSCPSIGNON)) Q:'+XUSCPSIGNON!+$G(XUSCPQ) D
  1. .S XUSCPLOOPC=XUSCPLOOPC+1 I '+(XUSCPLOOPC#XUSCPQC) I $$S^%ZTLOAD() S (XUSCPQ,ZTSTOP)=1 Q
  1. .S XUSCPSEC0=^XUSEC(0,XUSCPSIGNON,0),XUSCPSECDUZ=$P(XUSCPSEC0,U) ; get XUSEC 0 node, DUZ
  1. .I +XUSCPSECDUZ,($D(XUSCPLST(0,XUSCPSECDUZ))!$D(XUSCPLST(1,XUSCPSECDUZ))) D ; check if DUZ in CP list
  1. ..S XUSCPIP=$P(XUSCPSEC0,U,11) S:XUSCPIP']"" XUSCPIP="unknown" ; get IP from XUSEC
  1. ..S XUSCPCUR=$D(^XUSEC(0,"CUR",XUSCPSECDUZ,XUSCPDT)) ; check if job currently logged on
  1. ..;increment logon count per IP per day
  1. ..S ^TMP($J,"XUSCPLOG",XUSCPSECDUZ,XUSCPIP,$P(XUSCPSIGNON,"."))=+$G(^TMP($J,"XUSCPLOG",XUSCPSECDUZ,XUSCPIP,$P(XUSCPSIGNON,".")))+1
  1. ..I $D(^XUSEC(0,"CUR",XUSCPSECDUZ,XUSCPSIGNON)) D ;increment currently signed on count
  1. ...S ^TMP($J,"XUSCPLOG",XUSCPSECDUZ,XUSCPIP,"CUR")=+$G(^TMP($J,"XUSCPLOG",XUSCPSECDUZ,XUSCPIP,"CUR"))+1
  1. Q
  1. ;
  1. ADDFLDS(XUSCPTAG,XUSCPARR) ;return list of fields in .XUSCPARR(fieldname)
  1. ; XUSCPTAG: tag to read field names from
  1. ; .XUSCPARR: array to populate (pass as .param)
  1. N I,XUSCPFLD
  1. F I=1:1 S XUSCPFLD=$P($T(@XUSCPTAG+I),";;",2) Q:'$L(XUSCPFLD) D
  1. .S XUSCPARR(XUSCPFLD)=""
  1. Q
  1. ;
  1. OKFLDS ;top-level fields OK/expected to be populated
  1. ;;ACCESS CODE
  1. ;;CREATOR
  1. ;;DISUSER
  1. ;;Entry Last Edit Date
  1. ;;LAST SIGN-ON DATE/TIME
  1. ;;MULTIPLE SIGN-ON
  1. ;;NAME
  1. ;;NAME COMPONENTS
  1. ;;PROVIDER KEY
  1. ;;SERVICE/SECTION
  1. ;;SIGNATURE BLOCK PRINTED NAME
  1. ;;TIMESTAMP
  1. ;;VERIFY CODE
  1. ;;VERIFY CODE never expires
  1. ;;XUS Active User
  1. ;
  1. INACFLDS ;fields OK to populate for an INACTIVE user
  1. ;;TERMINATION DATE
  1. ;
  1. WARNFLDS ;field checked in WARNING section
  1. ;;DATE ACCESS CODE LAST CHANGED
  1. ;;DATE VERIFY CODE LAST CHANGED
  1. ;;DATE ENTERED
  1. ;;FILE MANAGER ACCESS CODE
  1. ;;SSN
  1. ;;XUS Logon Attempt Count