1 | TMGPAT2 ;TMG/kst/Patching tools Suport;09/17/08
|
---|
2 | ;;1.0;TMG-LIB;**1**;09/17/08
|
---|
3 | ;
|
---|
4 | ;"Kevin Toppenberg MD
|
---|
5 | ;"GNU General Public License (GPL) applies
|
---|
6 | ;"9/17/08
|
---|
7 |
|
---|
8 | ;"=======================================================================
|
---|
9 | ;" API -- Public Functions.
|
---|
10 | ;"=======================================================================
|
---|
11 | ;"MAKFRESH(PckInit,Msg,PckDirFName) --ensure that the Package list of files avilable on server is fresh
|
---|
12 | ;"RefreshPackge(PckInit,.Msg,NeedsRefresh,PckDirFName) -- query server for one package, and refresh info stored in TMG REMOTE PATCH SOURCE file
|
---|
13 | ;"GetNextIENS(LastPatch,NextPatchName) -- return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
14 | ;"GetIENS(PatchName) -- Given patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
15 | ;"GetIENS2(PatchName) -- Given partial patch name, return IENS in file 22709.01
|
---|
16 | ;"FORCEPAT -- All user to enter a patch entry
|
---|
17 | ;"IsInstalled(PatchName) -- return if a given patch has already been installed.
|
---|
18 | ;"ParsePatchName(PatchName,PckInit,Ver,PatchNum,SeqNum) -- parse a patch name into it's composit parts.
|
---|
19 | ;"EnsureLocal(IENS,Info,Msg,Option) -- Ensure files downloaded from server and stored locally
|
---|
20 | ;"DownloadPatch(PatchName,protocol,Option,Msg,Info) -- Ensure that the Patch has been downloaded from server and stored locally
|
---|
21 | ;"MakePatchEntry(PatchName,Msg) -- make pseudo-entries to show that something was processed.
|
---|
22 | ;"AddMsg(s,IsError,Msg) -- add a message to Msg Array
|
---|
23 | ;"ShowMsg(Msg) -- display the message array
|
---|
24 |
|
---|
25 | ;"=======================================================================
|
---|
26 | ;"Private Functions
|
---|
27 | ;"=======================================================================
|
---|
28 | ;"EmptyPackage(IEN9d4,Msg) - delete info for Package in file TMG REMOTE PATCH SOURCE
|
---|
29 | ;"LoadPackage(IEN9d4,Array,protocol,Msg,SomeAdded) -- load info for Package info file TMG REMOTE PATCH SOURCE
|
---|
30 | ;"LoadOne(PckIEN,Ver,PatchNum,SeqNum,RemoteURL,Msg) -- file one entry info TMG REMOTE PATCH SOURCE
|
---|
31 |
|
---|
32 | ;"=======================================================================
|
---|
33 | ;"=======================================================================
|
---|
34 |
|
---|
35 | MAKFRESH(PckInit,Msg,PckDirFName)
|
---|
36 | ;"Purpose: to ensure that the Package list of files avilable on server is fresh
|
---|
37 | ;"Input: PckInit -- this is the namespace of the package to get patches for, e.g. 'DI' for fileman
|
---|
38 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
39 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
40 | ;" Msg("ERROR")=count of last error
|
---|
41 | ;" Message are store in Msg(x)=Message
|
---|
42 | ;" Msg=count of last message+1
|
---|
43 | ;" PckDirFName -- Optional. PASS BY REFERNCE, an OUT PARAMETER. Filled with HFS filename of file
|
---|
44 | ;"Results: none
|
---|
45 |
|
---|
46 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
47 | if IEN9d4'>0 do goto ENSFDone
|
---|
48 | . do AddMsg("Can't find PACKAGE named '"_PckInit_"'",1,.Msg)
|
---|
49 | new PckIEN,lastFMDate
|
---|
50 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
51 | if PckIEN>0 set lastFMDate=$piece($get(^TMG(22709,PckIEN,2)),"^",1)
|
---|
52 | else set lastFMDate=""
|
---|
53 | new %,X,X1,X2,NeedsRefresh
|
---|
54 | set NeedsRefresh=0
|
---|
55 | if lastFMDate'="" do
|
---|
56 | . do NOW^%DTC ;"returns date in X
|
---|
57 | . set X1=lastFMDate,X2=X
|
---|
58 | . do ^%DTC
|
---|
59 | . if X>7 set NeedsRefresh=1 ;"hard code in fresh if > 7 days since last scan.
|
---|
60 | else set NeedsRefresh=1
|
---|
61 | if $$RefreshPackge(PckInit,.Msg,NeedsRefresh,.PckDirFName)
|
---|
62 | ENSFDone
|
---|
63 | quit
|
---|
64 |
|
---|
65 | RefreshPackge(PckInit,Msg,NeedsRefresh,PckDirFName,Option)
|
---|
66 | ;"Purpose: To query server for one package, and refresh info stored in TMG REMOTE PATCH SOURCE file
|
---|
67 | ;"Input: PckInit -- this is the namespace of the package to get patches for, e.g. 'DI' for fileman
|
---|
68 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
69 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
70 | ;" Msg("ERROR")=count of last error
|
---|
71 | ;" Message are store in Msg(x)=Message
|
---|
72 | ;" Msg=count of last message+1
|
---|
73 | ;" NeedsRefresh -- 0 if refreshing not needed (just return PckDirFName, but ensure file exists)
|
---|
74 | ;" PckDirFName -- Optional. PASS BY REFERANCE, an OUT PARAMETER. Filled with HFS filename of file
|
---|
75 | ;" Option -- Optional. PASS BY REFERANCE.
|
---|
76 | ;" Option("VERBOSE")=1 puts out text to console. (1 is default value)
|
---|
77 | ;"Result : 1=success, 0=failure
|
---|
78 |
|
---|
79 | new Array,result
|
---|
80 | new verbose set verbose=+$get(Option("VERBOSE"),1)
|
---|
81 | set NeedsRefresh=+$get(NeedsRefresh)
|
---|
82 | if NeedsRefresh,verbose write "Fetching list of available "_PckInit_" patches from VA ftp server..."
|
---|
83 | set result=$$GetPckList^TMGKERNL(PckInit,.Array,.NeedsRefresh,.PckDirFName)
|
---|
84 | if NeedsRefresh,verbose write " Done.",!
|
---|
85 | if $get(NeedsRefresh)'>0 goto RPDone
|
---|
86 | if result=0 goto RPDone
|
---|
87 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
88 | if IEN9d4'>0 do goto RPDone
|
---|
89 | . do AddMsg("Can't find PACKAGE named '"_PckInit_"'",1,.Msg)
|
---|
90 | new SomeAdded
|
---|
91 | set result=$$LoadPackage(IEN9d4,.Array,"ftp://",.Msg,.SomeAdded)
|
---|
92 | RPDone
|
---|
93 | quit result
|
---|
94 |
|
---|
95 |
|
---|
96 | EmptyPackage(IEN9d4,Msg)
|
---|
97 | ;"Purpose: to delete info for Package in file TMG REMOTE PATCH SOURCE
|
---|
98 | ;"Input: IEN9d4 -- IEN in 9.4 to get patches for
|
---|
99 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
100 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
101 | ;" Msg("ERROR")=count of last error
|
---|
102 | ;" Message are store in Msg(x)=Message
|
---|
103 | ;" Msg=count of last message+1
|
---|
104 |
|
---|
105 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
106 | if PckIEN=0 goto EPDone
|
---|
107 | new TMGFDA,TMGMSG
|
---|
108 | set TMGFDA(22709,PckIEN_",",.01)="@"
|
---|
109 | do FILE^DIE("EK","TMGFDA","TMGMSG")
|
---|
110 | if $data(TMGMSG("DIERR")) do
|
---|
111 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
112 |
|
---|
113 | EPDone quit
|
---|
114 |
|
---|
115 |
|
---|
116 | LoadPackage(IEN9d4,Array,protocol,Msg,SomeAdded)
|
---|
117 | ;"Purpose: to load info for Package info file TMG REMOTE PATCH SOURCE
|
---|
118 | ;"Input: IEN9d4 -- IEN in 9.4 to get patches for
|
---|
119 | ;" Array -- This is file with available filepaths, as returned from GetPckList
|
---|
120 | ;" protocol -- OPTIONAL. Default is 'ftp://'
|
---|
121 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
122 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
123 | ;" Msg("ERROR")=count of last error
|
---|
124 | ;" Message are store in Msg(x)=Message
|
---|
125 | ;" Msg=count of last message+1
|
---|
126 | ;" SomeAdded -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
127 | ;" set to 1 if some added, otherwise 0
|
---|
128 | ;"Result : 2=patch added, 1=no problems, 0=failure or error occured
|
---|
129 |
|
---|
130 | new result set result=1
|
---|
131 | set SomeAdded=0
|
---|
132 | set protocol=$get(protocol,"ftp://")
|
---|
133 | set IEN9d4=+$get(IEN9d4)
|
---|
134 | if IEN9d4'>0 do goto LPDone
|
---|
135 | . do AddMsg("Can't find record #"_IEN9d4_" in INSTALL file.",1,.Msg)
|
---|
136 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
137 | new TMGFDA,TMGMSG,TMGIEN,X,%
|
---|
138 | do NOW^%DTC ;"output in %
|
---|
139 | if PckIEN>0 do
|
---|
140 | . set TMGFDA(22709,PckIEN_",",2)=%
|
---|
141 | . do FILE^DIE("K","TMGFDA","TMGMSG")
|
---|
142 | else do
|
---|
143 | . set TMGFDA(22709,"+1,",.01)=IEN9d4
|
---|
144 | . set TMGFDA(22709,"+1,",2)=% ;"the time downloaded
|
---|
145 | . do UPDATE^DIE("K","TMGFDA","TMGIEN","TMGMSG")
|
---|
146 | . set PckIEN=$get(TMGIEN(1))
|
---|
147 | if $data(TMGMSG("DIERR")) do
|
---|
148 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
149 | if PckIEN'>0 goto LPDone
|
---|
150 |
|
---|
151 | new i set i=0 ;"skip first line, a header line
|
---|
152 | for set i=$order(Array(i)) quit:(i="") do
|
---|
153 | . new Name,Path,FullNamePath,Ver,PatchNum,SeqNum
|
---|
154 | . set FullNamePath=$get(Array(i)) quit:FullNamePath=""
|
---|
155 | . do SplitFNamePath^TMGIOUTL(FullNamePath,.Path,.Name,"/")
|
---|
156 | . if (Path="")!(Name="") quit
|
---|
157 | . new UName set UName=$$UP^XLFSTR(Name)
|
---|
158 | . if UName?2.4A1"_"1.4N1"_"0.1"P"1.N1".KID" do ;"e.g. DG_53_P481.KID or EAS_1_47.KID
|
---|
159 | . . set Ver=$piece($piece(Name,"_",2),"_",1)
|
---|
160 | . . new verIEN set verIEN=+$order(^TMG(22709,PckIEN,1,"C",Ver,""))
|
---|
161 | . . if verIEN=0 set Ver="" quit
|
---|
162 | . . set Ver=$piece($get(^TMG(22709,PckIEN,1,verIEN,0)),"^",1)
|
---|
163 | . . if Ver="" quit
|
---|
164 | . . set PatchNum=$piece($piece(Name,"_",3),".",1)
|
---|
165 | . . if PatchNum?1A.N set PatchNum=$extract(PatchNum,2,99)
|
---|
166 | . . set SeqNum="" ;"signal for no seq number provided
|
---|
167 | . else do
|
---|
168 | . . set Ver=$piece($piece(Name,"_",1),"-",2) quit:(Ver="")
|
---|
169 | . . if Ver?.N1(1"p",1"P").N set Ver=$translate(Ver,"Pp","..")
|
---|
170 | . . set SeqNum=$piece($piece(Name,"_",2),"-",2) quit:(SeqNum="")
|
---|
171 | . . set PatchNum=$piece($piece(Name,"_",3),"-",2) quit:(PatchNum="")
|
---|
172 | . . set PatchNum=$piece(PatchNum,".",1) quit:(PatchNum="")
|
---|
173 | . if Ver="" do quit
|
---|
174 | . . do AddMsg("Unable to process file name: "_Name_". Couldn't determine version number.",1,.Msg)
|
---|
175 | . ;"if SeqNum="" do quit ;Removed because sometimes the sequence # comes from the TXT file, not the patch file.
|
---|
176 | . ;". do AddMsg("Unable to process file name: "_Name_". Couldn't determine sequence number.",1,.Msg)
|
---|
177 | . if PatchNum="" do quit
|
---|
178 | . . do AddMsg("Unable to process file name: "_Name_". Couldn't determine patch number.",1,.Msg)
|
---|
179 | . new tempResult
|
---|
180 | . set tempResult=$$LoadOne(PckIEN,Ver,PatchNum,SeqNum,protocol_FullNamePath)
|
---|
181 | . if tempResult=2 set SomeAdded=1
|
---|
182 |
|
---|
183 | LPDone
|
---|
184 | quit result
|
---|
185 |
|
---|
186 |
|
---|
187 | LoadOne(PckIEN,Ver,PatchNum,SeqNum,RemoteURL,Msg)
|
---|
188 | ;"Purpose: to file one entry info TMG REMOTE PATCH SOURCE
|
---|
189 | ;" This doesn't actually get the file from the server, just store
|
---|
190 | ;" the directory info, for later retrieval
|
---|
191 | ;"Input: PckIEN -- the IEN in TMG REMOTE PATCH SOURCE for Package
|
---|
192 | ;" Ver -- the version of the patch
|
---|
193 | ;" PatchNum -- the patch number
|
---|
194 | ;" SeqNum -- the patch sequence number (the release sequence number) (if provided)
|
---|
195 | ;" RemoteURL -- The protocol_remoteURL of the patch on the server
|
---|
196 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
197 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
198 | ;" Msg("ERROR")=count of last error
|
---|
199 | ;" Message are store in Msg(x)=Message
|
---|
200 | ;" Msg=count of last message+1
|
---|
201 | ;"Result : 1=success, 0=failure
|
---|
202 |
|
---|
203 | new result set result=0 ;"default to failure
|
---|
204 | set PckIEN=+$get(PckIEN) if PckIEN'>0 goto LODone
|
---|
205 | set Ver=$get(Ver) if Ver="" goto LODone
|
---|
206 | if Ver'["." set Ver=Ver_".0"
|
---|
207 | set PatchNum=$get(PatchNum) if PatchNum="" goto LODone
|
---|
208 | set SeqNum=$get(SeqNum) ;"OK if no sequence number
|
---|
209 | new VerIEN set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
210 | if VerIEN'>0 do
|
---|
211 | . new TMGFDA,TMGIEN,TMGMSG
|
---|
212 | . set TMGFDA(22709.01,"+1,"_PckIEN_",",".01")=Ver
|
---|
213 | . set TMGFDA(22709.01,"+1,"_PckIEN_",",".02")=$translate(Ver,".","") ;"synonym
|
---|
214 | . do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
215 | . if $data(TMGMSG("DIERR")) do
|
---|
216 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
217 | . set VerIEN=+$get(TMGIEN(1))
|
---|
218 | if VerIEN'>0 goto LODone
|
---|
219 | new patchIEN set patchIEN=+$order(^TMG(22709,PckIEN,1,VerIEN,1,"B",PatchNum,""))
|
---|
220 | if patchIEN'>0 do
|
---|
221 | . new TMGFDA,TMGIEN,TMGMSG
|
---|
222 | . set TMGFDA(22709.11,"+1,"_VerIEN_","_PckIEN_",",".01")=PatchNum
|
---|
223 | . do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
224 | . if $data(TMGMSG("DIERR")) do
|
---|
225 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
226 | . set patchIEN=+$get(TMGIEN(1))
|
---|
227 | . set result=2 ;"something added
|
---|
228 | if patchIEN'>0 goto LODone
|
---|
229 | new TMGFDA,TMGMSG
|
---|
230 | new Ext set Ext=$piece(RemoteURL,".",$length(RemoteURL,"."))
|
---|
231 |
|
---|
232 | new spec
|
---|
233 | set spec("'")="'\''",spec("*")="'\*'",spec("&")="'\&'",spec("?")="'\?'"
|
---|
234 | set spec("\ ")=" "
|
---|
235 | set RemoteURL=$$REPLACE^XLFSTR(RemoteURL,.spec)
|
---|
236 |
|
---|
237 | new field
|
---|
238 | if $$UP^XLFSTR(Ext)="TXT" set field=1.5
|
---|
239 | else set field=1
|
---|
240 | set TMGFDA(22709.11,patchIEN_","_VerIEN_","_PckIEN_",",field)=RemoteURL
|
---|
241 | if SeqNum'="" set TMGFDA(22709.11,patchIEN_","_VerIEN_","_PckIEN_",",".02")=SeqNum
|
---|
242 | do FILE^DIE("K","TMGFDA","TMGMSG")
|
---|
243 | if $data(TMGMSG("DIERR")) do
|
---|
244 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
245 | if $data(TMGMSG("DIERR"))=0 do
|
---|
246 | . if result>0 quit
|
---|
247 | . set result=1 ;"success
|
---|
248 | LODone
|
---|
249 | quit result
|
---|
250 |
|
---|
251 |
|
---|
252 | GetNextIENS(LastPatch,NextPatchName)
|
---|
253 | ;"Purpose: Given last patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
254 | ;" that points to record with information about next appropriate patch.
|
---|
255 | ;"Input: LastPatch -- expected Format: e.g. DI*22.0*100 SEQ #123
|
---|
256 | ;" NextPatchName -- PASS BY REFERENCE, an OUT PARAMETER
|
---|
257 | ;" Will be filled with name of next patch.
|
---|
258 | ;"Output: returns IENS to record in 22709.11, or "" if problem.
|
---|
259 |
|
---|
260 | new result set result=""
|
---|
261 | set NextPatchName=""
|
---|
262 | if $get(LastPatch)="" goto GNPDone
|
---|
263 |
|
---|
264 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
265 | do ParsePatchName(LastPatch,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
266 | if seqNum="" goto GNPDone
|
---|
267 |
|
---|
268 | new IEN9d4 set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
269 | if IEN9d4'>0 goto GNPDone
|
---|
270 | new PckIEN set PckIEN=+$order(^TMG(22709,"B",IEN9d4,""))
|
---|
271 | if PckIEN'>0 goto GNPDone
|
---|
272 | new VerIEN set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
273 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
274 | if VerIEN'>0 goto GNPDone
|
---|
275 |
|
---|
276 | new patchIEN,nextSeq
|
---|
277 | set nextSeq=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",seqNum))
|
---|
278 | if nextSeq'>0 goto GNPDone
|
---|
279 | set patchIEN=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",nextSeq,""))
|
---|
280 | if patchIEN'>0 goto GNPDone
|
---|
281 | set result=patchIEN_","_VerIEN_","_PckIEN_","
|
---|
282 | set NextPatchName=$piece(LastPatch," ",1)
|
---|
283 | new node0 set node0=$get(^TMG(22709,PckIEN,1,VerIEN,1,patchIEN,0))
|
---|
284 | new nextPatchNum set nextPatchNum=$piece(node0,"^",1)
|
---|
285 | set $piece(NextPatchName,"*",3)=nextPatchNum
|
---|
286 | set NextPatchName=NextPatchName_" SEQ #"_nextSeq
|
---|
287 |
|
---|
288 | GNPDone
|
---|
289 | quit result
|
---|
290 |
|
---|
291 |
|
---|
292 | GetIENS(PatchName)
|
---|
293 | ;"Purpose: Given patch name, return IENS in file TMG REMOTE PATCH SOURCE (22709)
|
---|
294 | ;"Input: PatchName -- expected Format: e.g. DI*22.0*100 SEQ #123
|
---|
295 | ;"Output: returns IENS to record in 22709.11, or "" if problem.
|
---|
296 |
|
---|
297 | new result set result=""
|
---|
298 | if $get(PatchName)="" goto GIDone
|
---|
299 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
300 | new IEN9d4,PckIEN,VerIEN,patchIEN
|
---|
301 | do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum) goto:(seqNum="") GIDone
|
---|
302 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(IEN9d4'>0) GIDone
|
---|
303 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,"")) goto:(PckIEN'>0) GIDone
|
---|
304 | set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
305 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
306 | if VerIEN'>0 goto GIDone
|
---|
307 | set patchIEN=+$order(^TMG(22709,PckIEN,VerIEN,"SEQ",seqNum,"")) goto:(patchIEN'>0) GIDone
|
---|
308 | set result=patchIEN_","_VerIEN_","_PckIEN_","
|
---|
309 | GIDone
|
---|
310 | quit result
|
---|
311 |
|
---|
312 |
|
---|
313 | GetIENS2(PatchName)
|
---|
314 | ;"Purpose: Given partial patch name, return IENS in file 22709.01
|
---|
315 | ;" (i.e. just patch*ver)
|
---|
316 | ;"Input: PatchName -- expected Format: e.g. DI*22.0*.... or DI*22.0
|
---|
317 | ;"Output: returns IENS to record in 22709.01, or "" if problem.
|
---|
318 |
|
---|
319 | new result set result=""
|
---|
320 | if $get(PatchName)="" goto GI2Done
|
---|
321 | new seqNum,PckInit,Ver,PatchNum,seqNum
|
---|
322 | new IEN9d4,PckIEN,VerIEN,patchIEN
|
---|
323 | do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
324 | if (PckInit="")!(Ver="") goto GI2Done
|
---|
325 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(IEN9d4'>0) GI2Done
|
---|
326 | set PckIEN=+$order(^TMG(22709,"B",IEN9d4,"")) goto:(PckIEN'>0) GI2Done
|
---|
327 | set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",Ver,""))
|
---|
328 | if VerIEN'>0 set VerIEN=+$order(^TMG(22709,PckIEN,1,"B",$piece(Ver,".0",1),""))
|
---|
329 | if VerIEN'>0 goto GI2Done
|
---|
330 | set result=VerIEN_","_PckIEN_","
|
---|
331 | GI2Done
|
---|
332 | quit result
|
---|
333 |
|
---|
334 |
|
---|
335 | EnsureLocal(IENS,Info,Msg,Option)
|
---|
336 | ;"Purpose: Ensure that the files have been downloaded from server and stored locally
|
---|
337 | ;"Input: IENS -- IENS in 22709.11
|
---|
338 | ;" Info -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
339 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
340 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
341 | ;" Msg("ERROR")=count of last error
|
---|
342 | ;" Message are store in Msg(x)=Message
|
---|
343 | ;" Msg=count of last message+1
|
---|
344 | ;" Option -- optional. Pass by reference.
|
---|
345 | ;" Option("VERBOSE")=1, means messaages also written directly to output
|
---|
346 | ;"Output: Info will be filled as follows:
|
---|
347 | ;" Info("PATH")=Path in HFS
|
---|
348 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
349 | ;" Info("TEXT FILE")=HFS filename of .TXT accompanying patch
|
---|
350 | ;" Info("TEXT ONLY")=1 if there is a text file, but no .KIDS file
|
---|
351 | ;" Info("KID URL")=URL on server for KID file
|
---|
352 | ;" Info("TEXT URL")=URL on server for TXT file
|
---|
353 | ;"results: 1 if OK, 0 if problem.
|
---|
354 |
|
---|
355 | new TMGMSG,TMGDATA,TMGFDA
|
---|
356 | new verbose set verbose=$get(Option("VERBOSE"))
|
---|
357 | new result set result=1 ;"default to success
|
---|
358 | kill Info
|
---|
359 | if $get(IENS)="" goto ELDone
|
---|
360 | do GETS^DIQ(22709.11,IENS,"1;1.5;2;3;4","","TMGDATA","TMGMSG")
|
---|
361 | if $data(TMGMSG("DIERR")) do goto ELDone
|
---|
362 | . new tempS set tempS=$$GetErrStr^TMGDEBUG(.TMGMSG)
|
---|
363 | . do AddMsg(tempS,1,.Msg)
|
---|
364 | . if verbose write tempS,!
|
---|
365 | new URL set URL=$get(TMGDATA(22709.11,IENS,1))
|
---|
366 | set Info("KID URL")=URL
|
---|
367 | new textURL set textURL=$get(TMGDATA(22709.11,IENS,1.5))
|
---|
368 | set Info("TEXT URL")=textURL
|
---|
369 | if URL="" do
|
---|
370 | . if textURL'="" set Info("TEXT ONLY")=1 quit
|
---|
371 | . new tempS set tempS="No URL found for KIDS patch or accompanying Info text file in FM File #22709.22, IENS="_IENS
|
---|
372 | . do AddMsg(tempS,1,.Msg)
|
---|
373 | . if verbose write tempS,!
|
---|
374 |
|
---|
375 | new Path set Path=$get(TMGDATA(22709.11,IENS,2))
|
---|
376 | if Path="" do
|
---|
377 | . set Path=$get(^TMG("KIDS","PATCH DIR"),"/tmp/")
|
---|
378 | . set TMGFDA(22709.11,IENS,2)=Path
|
---|
379 | set Info("PATH")=Path
|
---|
380 | new Filename set Filename=$get(TMGDATA(22709.11,IENS,3))
|
---|
381 | new textFilename set textFilename=$get(TMGDATA(22709.11,IENS,4))
|
---|
382 |
|
---|
383 | if (Filename'=""),$$FileExists^TMGIOUTL(Path_Filename) do
|
---|
384 | . set Info("KID FILE")=Filename
|
---|
385 | else if (URL'="") do
|
---|
386 | . if verbose write "Downloading KID file from FTP.VA.GOV..."
|
---|
387 | . if $$DownloadFile^TMGKERNL(URL,Path)
|
---|
388 | . set Filename=$$FNameExtract^TMGIOUTL(URL)
|
---|
389 | . if $$FileExists^TMGIOUTL(Path_Filename) do
|
---|
390 | . . if $$Dos2Unix^TMGKERNL(Path_Filename)
|
---|
391 | . . set TMGFDA(22709.11,IENS,3)=Filename
|
---|
392 | . . set Info("KID FILE")=Filename
|
---|
393 | . else set result=0
|
---|
394 | . if verbose write !
|
---|
395 |
|
---|
396 | if (textFilename'=""),$$FileExists^TMGIOUTL(Path_textFilename) do
|
---|
397 | . set Info("TEXT FILE")=textFilename
|
---|
398 | else if (textURL'="") do
|
---|
399 | . if verbose write "Downloading TEXT file from FTP.VA.GOV..."
|
---|
400 | . if $$DownloadFile^TMGKERNL(textURL,Path)
|
---|
401 | . set textFilename=$$FNameExtract^TMGIOUTL(textURL)
|
---|
402 | . if $$FileExists^TMGIOUTL(Path_textFilename) do
|
---|
403 | . . set TMGFDA(22709.11,IENS,4)=textFilename
|
---|
404 | . . set Info("TEXT FILE")=textFilename
|
---|
405 | . set result=0
|
---|
406 | . if verbose write !
|
---|
407 |
|
---|
408 | set result=1 ;"success
|
---|
409 | ELDone
|
---|
410 | kill TMGMSG
|
---|
411 | if $data(TMGFDA) do
|
---|
412 | . do FILE^DIE("","TMGFDA","TMGMSG")
|
---|
413 | . if $data(TMGMSG("DIERR")) do
|
---|
414 | . . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
415 | . . set result=0
|
---|
416 | . . if verbose write Msg("ERROR",MsgI),!
|
---|
417 |
|
---|
418 | quit result
|
---|
419 |
|
---|
420 |
|
---|
421 | DownloadPatch(PatchName,protocol,Option,Msg,Info)
|
---|
422 | ;"Purpose: Ensure that the Patch has been downloaded from server and stored locally
|
---|
423 | ;"Input: PatchName -- the name of the patch to get, e.g. ABC*12.34*1234 [SEQ #123]
|
---|
424 | ;" protocol -- OPTIONAL. Default is 'ftp://'
|
---|
425 | ;" Option -- optional. Pass by reference.
|
---|
426 | ;" Option("VERBOSE")=1, means messaages also written directly to output
|
---|
427 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
428 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
429 | ;" Msg("ERROR")=count of last error
|
---|
430 | ;" Message are store in Msg(x)=Message
|
---|
431 | ;" Msg=count of last message+1
|
---|
432 | ;" Info -- PASS BY REFERENCE, an IN and OUT PARAMETER.
|
---|
433 | ;" Info("PATH")=Path in HFS
|
---|
434 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
435 | ;" Info("TEXT FILE")=HFS filename of .TXT accompanying patch
|
---|
436 | ;" Info("TEXT ONLY")=1 if there is a text file, but no .KIDS file
|
---|
437 | ;" Info("KID URL")=URL on server for KID file
|
---|
438 | ;" Info("TEXT URL")=URL on server for TXT file
|
---|
439 | ;"Output: Info will be filled as follows:
|
---|
440 | ;" Info("PATH")=Path in HFS
|
---|
441 | ;" Info("KID FILE")=HFS filename of .KID patch
|
---|
442 | ;"results: 1 if OK, 0 if problem.
|
---|
443 |
|
---|
444 | new result set result=1
|
---|
445 | new seqNum,PckInit,Ver,PatchNum,seqNum,PckDirFName,URL
|
---|
446 | new verbose set verbose=($get(Option("VERBOSE"))=1)
|
---|
447 | set protocol=$get(protocol,"ftp://")
|
---|
448 | if PatchName?2.4N1"*"1.3N.(1"."1.4N)1"*"1.4N do
|
---|
449 | . do ParsePatchName(PatchName,.PckInit,.Ver,.PatchNum,.seqNum)
|
---|
450 | else if PatchName?1.4A1"_".E do
|
---|
451 | . set PckInit=$piece(PatchName,"_",1)
|
---|
452 | else do goto:(result=0) DLPDone
|
---|
453 | . new tempName set tempName=$get(Info("TEXT FILE"))
|
---|
454 | . if tempName="" set result=0 quit
|
---|
455 | . if tempName?1.4A1"_".E do
|
---|
456 | . . set PckInit=$piece(tempName,"_",1)
|
---|
457 | . else if tempName?1.4A1"-".E do
|
---|
458 | . . set PckInit=$piece(tempName,"-",1)
|
---|
459 | . if $get(PckInit)="" set result=0
|
---|
460 |
|
---|
461 | set result=$$RefreshPackge(PckInit,.Msg,0,.PckDirFName) goto:(result=0) DLPDone
|
---|
462 | set result=$$FindMultPatch^TMGPAT4(PatchName,PckInit,.Option,.URL,.Info) goto:(result=0) DLPDone
|
---|
463 |
|
---|
464 | new Filename,Path
|
---|
465 | set Path=$get(^TMG("KIDS","PATCH DIR"),"/tmp/")
|
---|
466 | set Info("PATH")=Path
|
---|
467 | set Filename=$$FNameExtract^TMGIOUTL(URL)
|
---|
468 | if $$FileExists^TMGIOUTL(Path_Filename) goto DLPDone
|
---|
469 | if verbose write "Downloading "_Filename_" from FTP.VA.GOV...",!
|
---|
470 | new spec set spec("\ ")="%20"
|
---|
471 | set URL=$$REPLACE^XLFSTR(URL,.spec)
|
---|
472 | if $$DownloadFile^TMGKERNL(protocol_URL,Path,0)
|
---|
473 | if $$FileExists^TMGIOUTL(Path_Filename)=0 set result=0 goto DLPDone
|
---|
474 | if $$Dos2Unix^TMGKERNL(Path_Filename)
|
---|
475 | set Info("KID FILE")=Filename
|
---|
476 | DLPDone
|
---|
477 | quit result
|
---|
478 |
|
---|
479 | FORCEPAT
|
---|
480 | ;"Purpose: All user to enter a patch entry
|
---|
481 |
|
---|
482 | new PckInit,Ver,DIR,PatchNum,SeqNum,NewPatch
|
---|
483 | do GetPckVer^TMGPAT1(.PckInit,.Ver)
|
---|
484 | set DIR(0)="N",DIR("A")="Enter PATCH NUMBER"
|
---|
485 | do ^DIR write !
|
---|
486 | set PatchNum=Y
|
---|
487 | if $get(DIRUT) goto FPDone
|
---|
488 | set DIR(0)="N",DIR("A")="Enter SEQUENCE NUMBER"
|
---|
489 | do ^DIR write !
|
---|
490 | set SeqNum=Y
|
---|
491 | if $get(DIRUT) goto FPDone
|
---|
492 | do ForceP2(.PckInit,.Ver,.PatchNum,.SeqNum)
|
---|
493 | quit
|
---|
494 |
|
---|
495 | ForceP2(PckInit,Ver,PatchNum,SeqNum)
|
---|
496 | ;"Purpose: Hack write a patch into Package file, based in componant parts.
|
---|
497 | ;"Results: None
|
---|
498 |
|
---|
499 | new NewPatch set NewPatch=PckInit_"*"_Ver_"*"_PatchNum_" SEQ #"_SeqNum
|
---|
500 | new DIR set DIR(0)="Y"
|
---|
501 | set DIR("A")="HACK/FORCE an entry in the Package file for: "_NewPatch_" (Y/N)"
|
---|
502 | do ^DIR write !
|
---|
503 | if $get(DIRUT)!(Y'=1) goto FPDone
|
---|
504 | new Msg
|
---|
505 | if $$MakePatchEntry^TMGPAT2(NewPatch,.Msg)
|
---|
506 | if $$ShowMsg^TMGPAT2(.Msg)
|
---|
507 | FPDone
|
---|
508 | quit
|
---|
509 |
|
---|
510 |
|
---|
511 | MakePatchEntry(PatchName,Msg)
|
---|
512 | ;"Purpose: For times when a patch was informational only, and there was
|
---|
513 | ;" no KIDS file to actually install, then this can make pseudo-entries
|
---|
514 | ;" to show that something was processed.
|
---|
515 | ;"Input: PatchName -- The name of the patch. Eg: DI*22*123 SEQ #456"
|
---|
516 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
517 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
518 | ;" Msg("ERROR")=count of last error
|
---|
519 | ;" Message are store in Msg(x)=Message
|
---|
520 | ;" Msg=count of last message+1
|
---|
521 |
|
---|
522 | ;"Results: 1 if OK, 0 if error
|
---|
523 |
|
---|
524 | new %,X,result
|
---|
525 | new TMGMSG,TMGFDA,TMGIEN
|
---|
526 | set result=1
|
---|
527 | new justPatch set justPatch=$piece(PatchName," SEQ",1)
|
---|
528 | new tempIEN set tempIEN=+$order(^XPD(9.7,"B",justPatch,""))
|
---|
529 | if tempIEN>0 goto MPE2 ;"INSTALL entry already made
|
---|
530 |
|
---|
531 | do NOW^%DTC
|
---|
532 | set TMGFDA(9.7,"+1,",.01)=justPatch
|
---|
533 | set TMGFDA(9.7,"+1,",.02)=3 ;"2 = status
|
---|
534 | set TMGFDA(9.7,"+1,",6)="Text_Only "_PatchName ;"6 = file comment
|
---|
535 | set TMGFDA(9.7,"+1,",9)=DUZ ;"9 = Installed by
|
---|
536 | set TMGFDA(9.7,"+1,",11)=% ;"11 = Install start time
|
---|
537 | set TMGFDA(9.7,"+1,",17)=% ;"17 = Install completion time
|
---|
538 | do UPDATE^DIE("","TMGFDA","TMGIEN","TMGMSG")
|
---|
539 | if $data(TMGMSG("DIERR")) do
|
---|
540 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
541 | . set result=0
|
---|
542 |
|
---|
543 | MPE2 set PckInit=$piece(PatchName,"*",1)
|
---|
544 | set Ver=$piece(PatchName,"*",2)
|
---|
545 | if (PckInit="")!(Ver="") set result=0 goto MPEDone
|
---|
546 | new IEN9d4,IEN9d49
|
---|
547 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
548 | if IEN9d4'>0 set result=0 goto MPEDone
|
---|
549 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
550 | if IEN9d49'>0 set result=0 goto MPEDone
|
---|
551 |
|
---|
552 | new PatchSeq set PatchSeq=$piece(PatchName,"*",3)
|
---|
553 | set tempIEN=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",PatchSeq,""))
|
---|
554 | if tempIEN>0 do goto MPE3
|
---|
555 | . set TMGIEN(1)=tempIEN
|
---|
556 | new IENS set IENS="+1,"_IEN9d49_","_IEN9d4_","
|
---|
557 | kill TMGFDA,TMGMSG,TMGIEN
|
---|
558 | set TMGFDA(9.4901,IENS,.01)=PatchSeq ;".01=Patch Hx, e.g. 10 SEQ #10
|
---|
559 | set TMGFDA(9.4901,IENS,.02)="NOW" ;".02=date applied
|
---|
560 | set TMGFDA(9.4901,IENS,.03)="`"_DUZ ;".03=Applied by
|
---|
561 | do UPDATE^DIE("E","TMGFDA","TMGIEN","TMGMSG")
|
---|
562 | if $data(TMGMSG("DIERR")) do
|
---|
563 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
564 | . set result=0
|
---|
565 |
|
---|
566 | MPE3 if result=0 goto MPEDone
|
---|
567 | new TMGWP
|
---|
568 | kill TMGFDA,TMGMSG
|
---|
569 | set TMGWP(1)="Patch was informational only. No installed code etc."
|
---|
570 | set TMGWP(2)="This entry was created as a marker that information was processed."
|
---|
571 | set IENS=TMGIEN(1)_","_IEN9d49_","_IEN9d4_","
|
---|
572 | do WP^DIE(9.4901,IENS,1,"","TMGWP","TMGMSG")
|
---|
573 | if $data(TMGMSG("DIERR")) do
|
---|
574 | . do AddMsg($$GetErrStr^TMGDEBUG(.TMGMSG),1,.Msg)
|
---|
575 | . set result=0
|
---|
576 |
|
---|
577 | MPEDone
|
---|
578 | quit result
|
---|
579 |
|
---|
580 | IsInstalled(PatchName)
|
---|
581 | ;"Purpose: To return if a given patch has already been installed.
|
---|
582 | ;"Input: PatchName -- format aaaa*nn.nn*mmm [SEQ #xxx]
|
---|
583 | ;"Result: 1 if installed, 0 if not, or problem.
|
---|
584 |
|
---|
585 | new result set result=0
|
---|
586 | new PckInit,Ver,PatchNum
|
---|
587 |
|
---|
588 | set PatchName=$piece(PatchName," ",1)
|
---|
589 | set PatchName=$$TrimRType^TMGSTUTL(PatchName,"C") ;"trim any characters off end of patch name, e.g. 'ABC*5.5*123<=='
|
---|
590 | set PckInit=$piece(PatchName,"*",1)
|
---|
591 | set Ver=$piece(PatchName,"*",2)
|
---|
592 | set PatchNum=$piece(PatchName,"*",3)
|
---|
593 | if (PckInit="")!(Ver="")!(PatchNum="") goto IIDone
|
---|
594 |
|
---|
595 | new IEN9d4,IEN9d49
|
---|
596 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
---|
597 | if IEN9d4'>0 goto IIDone
|
---|
598 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
---|
599 | if IEN9d49'>0 do
|
---|
600 | . new oneVer set oneVer=""
|
---|
601 | . new found set found=0
|
---|
602 | . for set oneVer=$order(^DIC(9.4,IEN9d4,22,"B",oneVer)) quit:(oneVer="")!found do
|
---|
603 | . . new Int,oneInt,Dec,oneDec
|
---|
604 | . . set Int=$piece(Ver,".",1),Dec=+$piece(Ver,".",2)
|
---|
605 | . . set oneInt=$piece(oneVer,".",1),oneDec=+$piece(oneVer,".",2)
|
---|
606 | . . if (Int=oneInt)&(Dec=oneDec) do
|
---|
607 | . . . set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",oneVer,""))
|
---|
608 | . . . set found=1
|
---|
609 | if IEN9d49'>0 goto IIDone
|
---|
610 |
|
---|
611 | goto:(IEN9d49'>0) IIDone
|
---|
612 |
|
---|
613 | new i,array,done
|
---|
614 | set i="",done=0
|
---|
615 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="") do
|
---|
616 | . new onePatchNum set onePatchNum=$piece(i," ",1)
|
---|
617 | . if onePatchNum=PatchNum do
|
---|
618 | . . set result=1,done=1
|
---|
619 |
|
---|
620 | IIDone
|
---|
621 | quit result
|
---|
622 |
|
---|
623 |
|
---|
624 | ParsePatchName(PatchName,PckInit,Ver,PatchNum,SeqNum)
|
---|
625 | ;"Purpose: to parse a patch name into it's composit parts.
|
---|
626 | ;"Input: PatchName -- the patch name to parse, e.g. ABC*12.34*1234 SEQ #123
|
---|
627 | ;" PckInit,Ver,PatchNum,SeqNum -- PASS BY REFERENCE, OUT PARAMETERS
|
---|
628 | ;"Results: none
|
---|
629 | set SeqNum=+$piece(PatchName,"SEQ #",2)
|
---|
630 | set PatchName=$piece(PatchName," SEQ #",1)
|
---|
631 | set PckInit=$piece(PatchName,"*",1)
|
---|
632 | set Ver=$piece(PatchName,"*",2)
|
---|
633 | set PatchNum=$piece(PatchName,"*",3)
|
---|
634 | quit
|
---|
635 |
|
---|
636 |
|
---|
637 |
|
---|
638 | AddMsg(s,IsError,Msg)
|
---|
639 | ;"Purpose: to add a message to Msg Array
|
---|
640 | ;"Input: s -- message. May be a string, or an array (or both) in format of:
|
---|
641 | ;" s=A line
|
---|
642 | ;" s(1)=line 1
|
---|
643 | ;" s(2)=line 2
|
---|
644 | ;" IsError -- 1 if is an error message
|
---|
645 | ;" Msg -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
646 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
647 | ;" Msg("ERROR")=count of last error
|
---|
648 | ;" Message are store in Msg(x)=Message
|
---|
649 | ;" Msg=count of last message+1
|
---|
650 | ;"Results: none
|
---|
651 |
|
---|
652 | set IsError=+$get(IsError)
|
---|
653 | new oneLine,subI set subI=""
|
---|
654 | set oneLine=$get(s)
|
---|
655 | for do set subI=$order(s(subI)) quit:(subI="") set oneLine=$get(s(subI))
|
---|
656 | . if IsError do
|
---|
657 | . . new MsgI set MsgI=$get(Msg("ERROR"),0)+1
|
---|
658 | . . set Msg("ERROR",MsgI)=oneLine
|
---|
659 | . . set Msg("ERROR")=MsgI
|
---|
660 | . else do
|
---|
661 | . . set Msg=+$get(Msg,1)
|
---|
662 | . . set Msg(Msg)=oneLine,Msg=Msg+1
|
---|
663 | quit
|
---|
664 |
|
---|
665 |
|
---|
666 | ShowMsg(Msg,NoPause)
|
---|
667 | ;"Purpose: to display the message array
|
---|
668 | ;"Input: Msg - PASS BY REFERENCE. The message array to display.
|
---|
669 | ;" NoPause -- OPTIONAL. If 1, then user not prompted to hit enter to cont.
|
---|
670 | ;"Results: 0 if OK, 1 if ERROR found in message array.
|
---|
671 | new errorFound set errorFound=0
|
---|
672 | if $data(Msg) do
|
---|
673 | . new i set i=""
|
---|
674 | . for set i=$order(Msg(i)) quit:(+i'>0) write " ",$get(Msg(i)),!
|
---|
675 | . if $data(Msg("ERROR")) do
|
---|
676 | . . write !!,"NOTE: ERRORS ENCOUNTERED:",!
|
---|
677 | . . set i=""
|
---|
678 | . . for set i=$order(Msg("ERROR",i)) quit:(+i'>0) write " ",$get(Msg("ERROR",i)),!
|
---|
679 | . . set errorFound=1
|
---|
680 | . if $get(NoPause)'=1 do PressToCont^TMGUSRIF
|
---|
681 |
|
---|
682 | quit errorFound |
---|