| 1 | SCMCUT ;ALB/JLU;General utility routine;8/17/99@1515
 | 
|---|
| 2 |  ;;5.3;Scheduling;**177,205,204**;AUG 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;This is a general utility routine for the PCMM application.  Any
 | 
|---|
| 5 |  ;general purpose utility should be placed in this routine.
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 | CLNLST(SER,ARY,ACT) ;
 | 
|---|
| 9 |  ;This API is a function that returns the list of clients that
 | 
|---|
| 10 |  ;can run with the server that is passed in.
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ;INPUTs:  SER --- This is the server to check for.  It needs to be in
 | 
|---|
| 13 |  ;                 a patch format Ex. SD*5.3*177
 | 
|---|
| 14 |  ;         ARY --- This is the array root the list will be returned in.
 | 
|---|
| 15 |  ;                 If nothing is passed in a default will be used.  This
 | 
|---|
| 16 |  ;                 array must be clean before it is passed to this API.
 | 
|---|
| 17 |  ;                 No kills will be issued.
 | 
|---|
| 18 |  ;                 Ex. ^TMP("PCMM CLIENT LIST",$J,"1.2.0.0")=effective dt
 | 
|---|
| 19 |  ;                     ^TMP("PCMM CLIENT LIST",$J,"1.3.0.0")=effective dt
 | 
|---|
| 20 |  ;         ACT --- This variable indicates whether to:
 | 
|---|
| 21 |  ;                 1 - return only active clients (default)
 | 
|---|
| 22 |  ;                 0 - return all clients
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ;OUTPUTS --- The output of this function call is the data in the array
 | 
|---|
| 25 |  ;            variable but also the function itself.  It will either be
 | 
|---|
| 26 |  ;            1 for a success or -1 with an error message.
 | 
|---|
| 27 |  ;            Ex. "-1^not a valid server name"
 | 
|---|
| 28 |  ;                "1"
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  N RESULTS
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  ;checking input parameters
 | 
|---|
| 33 |  S SER=$G(SER)
 | 
|---|
| 34 |  I SER']"" S RESULTS="-1^Server variable not defined." G CLNLSTQ
 | 
|---|
| 35 |  S ARY=$G(ARY)
 | 
|---|
| 36 |  I ARY']"" S ARY=$NA(^TMP("PCMM CLIENT LIST",$J))
 | 
|---|
| 37 |  S ACT=$G(ACT,1)
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  ;checking existance of server in PCMM SERVER PATCH file.
 | 
|---|
| 40 |  I '$D(^SCTM(404.45,"B",SER)) S RESULTS="-1^This server is not in the PCMM SERVER PATCH file." G CLNLSTQ
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ;if ACT, checking if server is active
 | 
|---|
| 43 |  I ACT,'$$ACTSER(SER) S RESULTS="-1^This server is not active." G CLNLSTQ
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ;loop through the server patches and build the list of clients.
 | 
|---|
| 46 |  N CLT,SERIEN
 | 
|---|
| 47 |  S CLT="",RESULTS="-1^No clients found for this Server."
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 |  F  S CLT=$O(^SCTM(404.45,"ASER",SER,CLT)) Q:CLT=""  S SERIEN=$O(^SCTM(404.45,"ASER",SER,CLT,"")) Q:SERIEN=""  DO
 | 
|---|
| 50 |  .N NOD5,NOD6
 | 
|---|
| 51 |  .S NOD5=$G(^SCTM(404.45,SERIEN,0))
 | 
|---|
| 52 |  .Q:NOD5=""
 | 
|---|
| 53 |  .S NOD6=$G(^SCTM(404.46,$P(NOD5,U,2),0))
 | 
|---|
| 54 |  .Q:NOD6=""
 | 
|---|
| 55 |  .I ACT,$P(NOD6,U,2),$D(^SCTM(404.45,"ACT",SER,SERIEN)) S @ARY@($P(NOD6,U,1))=$P(NOD6,U,2,3),RESULTS=1
 | 
|---|
| 56 |  .I 'ACT S @ARY@($P(NOD6,U,1))=$P(NOD6,U,2,3),RESULTS=1
 | 
|---|
| 57 |  .Q
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 | CLNLSTQ Q RESULTS
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 | ACTCLT(CLT) ;Is this client active?
 | 
|---|
| 63 |  ;This function call returns whether the client passed in is active or
 | 
|---|
| 64 |  ;not .  It just tells the status of the client per its entry in PCMM 
 | 
|---|
| 65 |  ;CLIENT PATCH file.  It does not relate in anyway to the PCMM SERVER
 | 
|---|
| 66 |  ;PATCH file.
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ;INPUT:  CLT - This is the External Client version number
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  ;OUTPUT: 1 - ACTIVE
 | 
|---|
| 71 |  ;        0 - NOT ACTIVE
 | 
|---|
| 72 |  ;       -1^ERROR DESCRIPTION
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  N RESULTS
 | 
|---|
| 75 |  S CLT=$G(CLT)
 | 
|---|
| 76 |  I CLT']"" S RESULTS="-1^Client variable not defined." G ACTCLTQ
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  N CLTIEN,ACT
 | 
|---|
| 79 |  S CLTIEN=$O(^SCTM(404.46,"B",CLT,0))
 | 
|---|
| 80 |  I CLTIEN="" S RESULTS="-1^Client not defined in PCMM CLIENT PATCH file." G ACTCLTQ
 | 
|---|
| 81 |  S ACT=$P(^SCTM(404.46,CLTIEN,0),U,2)
 | 
|---|
| 82 |  S RESULTS=$S(ACT:ACT,1:0) ;This was done so that a null would be zero
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 | ACTCLTQ Q RESULTS
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 | ACTSER(SER,ARY) ; 
 | 
|---|
| 88 |  ; This function call is used to return the status of a server
 | 
|---|
| 89 |  ;  or a list of active servers at the sight.
 | 
|---|
| 90 |  ;  It does not return the IENs or multiples of 
 | 
|---|
| 91 |  ;  the same server value.
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  ;INPUTS  SER - [optional]: Test for a specific server version
 | 
|---|
| 94 |  ;        ARY - [optional]: This is the array root that the list
 | 
|---|
| 95 |  ;               is to be stored in, if SER is undefined.
 | 
|---|
| 96 |  ;              If nothing is passed then the default will be used.
 | 
|---|
| 97 |  ;              ^TMP("PCMM ACTIVE SERVERS",$J,SERVER NUMBER)=EFFECTIVE DT
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  ;OUTPUTS 1 - a success
 | 
|---|
| 100 |  ;        0 - none found.
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  N RESULTS,LP,IEN
 | 
|---|
| 103 |  S SER=$G(SER,"")
 | 
|---|
| 104 |  I SER]"" S RESULTS=$D(^SCTM(404.45,"ACT",SER))>0 G ACTSERQ
 | 
|---|
| 105 |  S ARY=$G(ARY,"^TMP(""PCMM ACTIVE SERVERS"",$J)")
 | 
|---|
| 106 |  S RESULTS=0,LP=""
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 |  I $O(^SCTM(404.45,"ACT",""))']"" G ACTSERQ
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  F  S LP=$O(^SCTM(404.45,"ACT",LP)) Q:LP=""  S IEN=$O(^SCTM(404.45,"ACT",LP,"")) Q:IEN=""  DO
 | 
|---|
| 111 |  .S IEN=$G(^SCTM(404.45,IEN,0))
 | 
|---|
| 112 |  .Q:IEN=""
 | 
|---|
| 113 |  .S @ARY@(LP)=$P(IEN,U,3)
 | 
|---|
| 114 |  .S RESULTS=1
 | 
|---|
| 115 |  .Q
 | 
|---|
| 116 |  I SER]"" S RESULTS=$D(@ARY@(SER))
 | 
|---|
| 117 |  ; 
 | 
|---|
| 118 | ACTSERQ Q RESULTS
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 | DISCLNTS() ;This function call is used to determine if all clients should
 | 
|---|
| 122 |  ;be disabled.
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 |  ;INPUTS  -- NONE
 | 
|---|
| 125 |  ;OUTPUTS -- 1 means YES disable all clients
 | 
|---|
| 126 |  ;           0 means NO
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  N IEN,RESULTS
 | 
|---|
| 129 |  S RESULTS=0
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  S IEN=+$O(^SCTM(404.44,0))
 | 
|---|
| 132 |  I 'IEN G DISQ
 | 
|---|
| 133 |  S IEN=$G(^SCTM(404.44,IEN,1))
 | 
|---|
| 134 |  S RESULTS=$S('$P(IEN,U,2):0,1:1)
 | 
|---|
| 135 |  ;
 | 
|---|
| 136 | DISQ Q RESULTS
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 | UPCLNLST(SCX) ;update 404.46/404.45 with new client/server pair (if enabled)
 | 
|---|
| 139 |  ; input  := SCX p1[required] : ServerPatch
 | 
|---|
| 140 |  ;               p2[required] : ^ClientVersion
 | 
|---|
| 141 |  ;               p3[optional] : ^EnabledOverride(1=bypass,0=no[default])
 | 
|---|
| 142 |  ;               p4[optional] : ^ActiveServer(1=yes[default],0=no)
 | 
|---|
| 143 |  ;               p5[optional] : ^ActiveClient(1=yes[default],0=no)
 | 
|---|
| 144 |  ; output := SCRESULT : 1 = success
 | 
|---|
| 145 |  ;                    : 0 = failure/not allowed
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  N SCRESULT,SCSER,SCCLI,SCASER,SCACLI,SCBYPASS,SCIEN
 | 
|---|
| 148 |  S SCRESULT=0
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  ; parse
 | 
|---|
| 151 |  S SCSER=$P(SCX,U)
 | 
|---|
| 152 |  I SCSER']"" G UPCLNQ
 | 
|---|
| 153 |  S SCCLI=$P(SCX,U,2)
 | 
|---|
| 154 |  I SCCLI']"" G UPCLNQ
 | 
|---|
| 155 |  S SCBYPASS=$P(SCX,U,3)
 | 
|---|
| 156 |  S SCBYPASS=$S(SCBYPASS=1:1,1:0)
 | 
|---|
| 157 |  S SCIEN=+$O(^SCTM(404.44,0))
 | 
|---|
| 158 |  I 'SCIEN G UPCLNQ
 | 
|---|
| 159 |  I 'SCBYPASS,$P($G(^SCTM(404.44,SCIEN,1)),U,3)=1 G UPCLNQ
 | 
|---|
| 160 |  S SCASER=$P(SCX,U,4)
 | 
|---|
| 161 |  S SCASER=$S(SCASER=0:0,1:1)
 | 
|---|
| 162 |  S SCACLI=$P(SCX,U,5)
 | 
|---|
| 163 |  S SCACLI=$S(SCACLI=0:0,1:1)
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 |  ;update client file
 | 
|---|
| 166 |  N SC1,SC1IEN,SC1ERR
 | 
|---|
| 167 |  S SC1(1,404.46,"?+1,",.01)=SCCLI       ;client version
 | 
|---|
| 168 |  S SC1(1,404.46,"?+1,",.02)=SCACLI      ;active?
 | 
|---|
| 169 |  S SC1(1,404.46,"?+1,",.03)=DT          ;today
 | 
|---|
| 170 |  D UPDATE^DIE("","SC1(1)","SC1IEN","SC1ERR")
 | 
|---|
| 171 |  I $D(SC1ERR)!(+$G(SC1IEN(1))<0) G UPCLNQ
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  ;update server file
 | 
|---|
| 174 |  N SC2,SC2IEN,SC2ERR
 | 
|---|
| 175 |  S SC2(1,404.45,"?+1,",.01)=SCSER       ;server version
 | 
|---|
| 176 |  S SC2(1,404.45,"?+1,",.02)=SC1IEN(1)   ;ptr - client version
 | 
|---|
| 177 |  S SC2(1,404.45,"?+1,",.03)=DT          ;today
 | 
|---|
| 178 |  S SC2(1,404.45,"?+1,",.04)=SCASER      ;active?
 | 
|---|
| 179 |  D UPDATE^DIE("","SC2(1)","SC2IEN","SC2ERR")
 | 
|---|
| 180 |  I $D(SC2ERR)!(+$G(SC2IEN(1))<0) G UPCLNQ
 | 
|---|
| 181 |  S SCRESULT=1
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 | UPCLNQ Q SCRESULT
 | 
|---|
| 184 |  ;
 | 
|---|