1 | TMGXPDIL ;TMG/kst/Custom version of XPDIL ;09/17/08
|
---|
2 | ;;1.0;TMG-LIB;**1**;09/17/08
|
---|
3 |
|
---|
4 | ;"Original header....
|
---|
5 | ;"XPDIL ;SFISC/RSD - load Distribution Global ;05/28/99 09:41
|
---|
6 | ;" ;;8.0;KERNEL;**15,44,58,68,108**;Jul 10, 1995
|
---|
7 |
|
---|
8 | ;
|
---|
9 | ;"Kevin Toppenberg MD
|
---|
10 | ;"GNU General Public License (GPL) applies
|
---|
11 | ;"9/17/08
|
---|
12 |
|
---|
13 |
|
---|
14 | EN1(Option,Msg)
|
---|
15 | ;"Purpose: Provide an API for KIDS load a distribution
|
---|
16 | ;"Input: Option -- PASS BY REFERENCE. Entries are required unless marked optional
|
---|
17 | ;" Option("HFSNAME")=FilePathNameOnHFS
|
---|
18 | ;" Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
|
---|
19 | ;" Option("DO ENV CHECK")=# 1=do check, 0=don't do check
|
---|
20 | ;" Option("VERBOSE")=1 for output
|
---|
21 | ;" Msg -- PASS BY REFERANCE, an OUT PARAMETER
|
---|
22 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
23 | ;" Msg("ERROR")=count of last error
|
---|
24 | ;" Message are store in Msg(x)=Message
|
---|
25 | ;" Msg=count of last message+1
|
---|
26 | ;"Output: Option -- Option("INSTALL NAME")=Name to use to install package
|
---|
27 |
|
---|
28 | N POP,XPDA,XPDST,XPDIT,XPDT,XPDGP,XPDQUIT,XPDREQAB,XPDSKPE
|
---|
29 | S:'$D(DT) DT=$$DT^XLFDT S:'$D(U) U="^"
|
---|
30 | S XPDST=0
|
---|
31 | set Msg=+$get(Msg,1)
|
---|
32 |
|
---|
33 | new temp set temp=$$ST(.Option,.Msg) ;"Load in patch
|
---|
34 | if (temp=0)!($G(XPDQUIT)) do goto EnDone
|
---|
35 | . D ABRTALL^TMGXPDI(1,,.Msg) ;"(not interactive)
|
---|
36 | . do AddMsg^TMGPAT2("**NOTHING LOADED**",1,.Msg)
|
---|
37 |
|
---|
38 | ;"XPDST= starting Build
|
---|
39 | ;"XPDT("DA",ien)=seq # to install
|
---|
40 | ;"XPDT("NM",build name)=seq #
|
---|
41 | ;"XPDT(seq #)=ien^Build name
|
---|
42 | ;"XPDT("GP",global)= 1-replace, 0-overwrite^ien
|
---|
43 | ;"XPDGP=globals from a Global Package
|
---|
44 | ;"XPDSKPE=1 don't run Environment Check^has question been asked
|
---|
45 | S XPDIT=0,XPDSKPE="0^0"
|
---|
46 | F S XPDIT=$O(XPDT(XPDIT)) Q:'XPDIT D Q:'$D(XPDT)
|
---|
47 | . S XPDA=+XPDT(XPDIT)
|
---|
48 | . if $$CheckLocal^TMGPAT4($name(^XTMP("XPDI",XPDA)),.Option)=1 do
|
---|
49 | . . ;"if $get(Option("VERBOSE"))'=1 quit
|
---|
50 | . . write "WARNING. This code overwrites local mods!",!
|
---|
51 | . . do PressToCont^TMGUSRIF
|
---|
52 | . ;"Check if this Build has an Envir. Check
|
---|
53 | . I $G(^XTMP("XPDI",XPDA,"PRE"))]"" D
|
---|
54 | . . ;"Quit if we already asked this question
|
---|
55 | . . Q:$P(XPDSKPE,U,2)
|
---|
56 | . . S $P(XPDSKPE,U,2)=1
|
---|
57 | . . set Y=$get(Option("DO ENV CHECK"))
|
---|
58 | . . if Y'=1 set XPDSKPE="1^1"
|
---|
59 | . I $G(XPDQUIT) D ABRTALL^TMGXPDI(1,,.Msg) Q
|
---|
60 | . D PKG^TMGXPDL1(XPDA,.Option,.Msg)
|
---|
61 |
|
---|
62 | ;"Global Package
|
---|
63 | G:$D(XPDGP) ^XPDIGP
|
---|
64 | I $D(XPDT),$D(^XPD(9.7,+XPDST,0)) do
|
---|
65 | . do AddMsg^TMGPAT2("Use INSTALL NAME: "_$P(^(0),U)_" to install this Distribution.",0,.Msg)
|
---|
66 | . set Option("INSTALL NAME")=$P(^(0),U)
|
---|
67 | EnDone
|
---|
68 | Q
|
---|
69 |
|
---|
70 |
|
---|
71 | ST(Option,Msg)
|
---|
72 | ;"Purpose: 'global input'
|
---|
73 | ;"Input: Option -- PASS BY REFERENCE. Entries are required unless marked optional
|
---|
74 | ;" Option("HFSNAME")=FilePathNameOnHFS
|
---|
75 | ;" Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
|
---|
76 | ;" Option("INTERACTIVE")=1 if 1 then direct user input asked if needed
|
---|
77 | ;" Msg -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
78 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
79 | ;" Msg("ERROR")=count of last error
|
---|
80 | ;" Message are store in Msg(x)=Message
|
---|
81 | ;" Msg=count of last message+1
|
---|
82 | ;"Results: 1=success, 0=error
|
---|
83 | new result set result=1
|
---|
84 | N DIR,DIRUT,GR,IOP,X,Y,Z,%ZIS
|
---|
85 | I '$D(^%ZIS(1,"B","HFS")) do goto STDone
|
---|
86 | . do AddMsg^TMGPAT2("You must have a device called 'HFS' in order to load a distribution!",1,.Msg)
|
---|
87 | . S XPDQUIT=1
|
---|
88 | D HOME^%ZIS
|
---|
89 | set Y=$get(Option("HFSNAME"))
|
---|
90 | if (Y="")&($get(Option("INTERACTIVE"))=1) do
|
---|
91 | . set DIR("A")="Enter a Host File",DIR("?")="Enter a filename and/or path to input Distribution."
|
---|
92 | . set Y=$$GetFName^TMGIOUTL(DIR("?"),"/tmp/","","","","",DIR("A")_": ")
|
---|
93 | if Y="" do goto STDone
|
---|
94 | . do AddMsg^TMGPAT2("No host file system filename provided!",1,.Msg)
|
---|
95 | . S XPDQUIT=1
|
---|
96 | S %ZIS="",%ZIS("HFSNAME")=Y,%ZIS("HFSMODE")="R",IOP="HFS"
|
---|
97 | D ^%ZIS
|
---|
98 | I POP do
|
---|
99 | . do AddMsg^TMGPAT2("Couldn't open file or HFS device!!",1,.Msg)
|
---|
100 | . set result=0
|
---|
101 | ;"don't close device if we have a global package, we need to bring in the globals now
|
---|
102 | D GI(.Option,.Msg) ;"Get file loaded in
|
---|
103 | do ^%ZISC:'$D(XPDGP)!$G(XPDQUIT)
|
---|
104 | STDone
|
---|
105 | if $get(XPDQUIT)=1 set result=0
|
---|
106 | Q result
|
---|
107 |
|
---|
108 |
|
---|
109 | GI(Option,Msg) ;"Get In
|
---|
110 | ;"Purpose: Open file and load in.
|
---|
111 | ;"Input: Option -- PASS BY REFERENCE. Entries are required unless marked optional
|
---|
112 | ;" Option("HFSNAME")=FilePathNameOnHFS
|
---|
113 | ;" Option("FORCE CONT LOAD")=1 <-- if not given, then load won't continue
|
---|
114 | ;" Msg -- PASS BY REFERENCE, an OUT PARAMETER.
|
---|
115 | ;" Errors are stored in Msg("ERROR",x)=Message
|
---|
116 | ;" Msg("ERROR")=count of last error
|
---|
117 | ;" Message are store in Msg(x)=Message
|
---|
118 | ;" Msg=count of last message+1
|
---|
119 |
|
---|
120 | N X,XPDSEQ,Y,Z
|
---|
121 | U IO ;"open KIDS text file for input
|
---|
122 | do DoRead(.X,1)
|
---|
123 | do DoRead(.Y,1)
|
---|
124 |
|
---|
125 | do AddMsg^TMGPAT2(X,0,.Msg)
|
---|
126 | do AddMsg^TMGPAT2("Comment: "_Y,0,.Msg)
|
---|
127 | S XPDST("H")=Y
|
---|
128 | if Y="Extracted from mail message" do
|
---|
129 | . S XPDST("H1")=X
|
---|
130 | else do
|
---|
131 | . S XPDST("H1")=Y_" ;Created on "_$P(X,"KIDS Distribution saved on ",2)
|
---|
132 | ;"Z is the string of Builds in this file
|
---|
133 | F X=1:1 do Q:Z=""
|
---|
134 | . do DoRead(.Z,1)
|
---|
135 | . S Z=$P(Z,"**KIDS**",2,99)
|
---|
136 | . Q:Z=""
|
---|
137 | . S X(X)=Z
|
---|
138 | U IO(0)
|
---|
139 | I $G(X(1))="" do goto GIDone
|
---|
140 | . do AddMsg^TMGPAT2("This is not a Distribution HFS File!",1,.Msg)
|
---|
141 | . S XPDQUIT=1
|
---|
142 |
|
---|
143 | ;"global package, set XPDGP=flag;global^flag;global^... flag=1 replace
|
---|
144 | I $P(X(1),":")="GLOBALS" S XPDGP=$P(X(1),U,2,99),X(1)=$P(X(1),U)
|
---|
145 | S XPDIT=0,X(1)=$P(X(1),":",2,99)
|
---|
146 |
|
---|
147 | do AddMsg^TMGPAT2("This Distribution contains Transport Globals for the following Package(s):",0,.Msg)
|
---|
148 | kill XPDQUIT
|
---|
149 | F X=1:1:X-1 do Q:$get(XPDQUIT)=1
|
---|
150 | . F Z=1:1 do Q:(Y="")!($get(XPDQUIT)=1)
|
---|
151 | . . S Y=$P(X(X),U,Z)
|
---|
152 | . . Q:Y=""
|
---|
153 | . . ;"can't install if global exist, that means Build never finish install
|
---|
154 | . . ;"INST will show name
|
---|
155 | . . S XPDIT=XPDIT+1
|
---|
156 | . . new temp set temp=$$INST^TMGXPDL1(Y,.Option,.Msg)
|
---|
157 | . . ;" //kt removed I temp=0 S XPDQUIT=1 Q
|
---|
158 | if $G(XPDQUIT) goto GIDone
|
---|
159 |
|
---|
160 | do AddMsg^TMGPAT2("Distribution OK",0,.Msg)
|
---|
161 |
|
---|
162 | if $D(XPDGP) do DISP^TMGXPDIG(Msg)
|
---|
163 | if $get(Option("FORCE CONT LOAD"))'=1 do goto GIDone
|
---|
164 | . do AddMsg^TMGPAT2("Option(""FORCE CONT LOAD"")=1 not found in passed options.",1,.Msg)
|
---|
165 | . S XPDQUIT=1
|
---|
166 | do AddMsg^TMGPAT2("Loading Distribution...",0,.Msg)
|
---|
167 |
|
---|
168 | ;"reset expiration date to T+7 on transport global
|
---|
169 | S ^XTMP("XPDI",0)=$$FMADD^XLFDT(DT,7)_U_DT
|
---|
170 | ;"start reading the HFS again
|
---|
171 | U IO
|
---|
172 | do DoRead(.X,0)
|
---|
173 | do DoRead(.Y,0)
|
---|
174 | ;"R X:0,Y:0
|
---|
175 | ;"the next read must be the INSTALL NAME
|
---|
176 | I X'="**INSTALL NAME**"!'$D(XPDT("NM",Y)) do goto GIDone
|
---|
177 | . do AddMsg^TMGPAT2("ERROR in HFS file format!",1,.Msg)
|
---|
178 | . S XPDQUIT=1
|
---|
179 |
|
---|
180 | ;"XPDSEQ is the disk sequence number
|
---|
181 | S %=XPDT("NM",Y)
|
---|
182 | set GR="^XTMP(""XPDI"","_+XPDT(%)_","
|
---|
183 | set XPDSEQ=1
|
---|
184 | ;"X=global ref, Y=global value.
|
---|
185 | F do DoRead(.X,0) Q:X="**END**" D I $D(DIRUT) S XPDQUIT=1 Q
|
---|
186 | . do DoRead(.Y,0)
|
---|
187 | . I X="**INSTALL NAME**" D Q
|
---|
188 | . . S %=+$G(XPDT("NM",Y))
|
---|
189 | . . set GR="" ;"//kt added Allows ignoring parts of multipatch not needed
|
---|
190 | . . ;"I '% S DIRUT=1 Q ;"//kt
|
---|
191 | . . I '% Q ;"//kt
|
---|
192 | . . S GR="^XTMP(""XPDI"","_+XPDT(%)_","
|
---|
193 | . if GR'="" S @(GR_X)=Y
|
---|
194 | U IO(0)
|
---|
195 | GIDone
|
---|
196 | Q
|
---|
197 |
|
---|
198 | DoRead(S,timeOut)
|
---|
199 | ;"Purpose: Do Read, but strip trailling #13 if needed.
|
---|
200 | ;"Input: S -- pass by reference, and OUT PARAMETER
|
---|
201 | ;" timeOut -- time out var to pass to READ command
|
---|
202 | ;"Results: none
|
---|
203 | read S:timeOut
|
---|
204 | new l set l=$length(S)
|
---|
205 | new ch set ch=$ascii($extract(S,l))
|
---|
206 | if ch=13 set S=$extract(S,1,l-1)
|
---|
207 | quit
|
---|
208 |
|
---|
209 |
|
---|
210 | NEXTD I ^%ZOSF("OS")'["MSM" U IO(0) W !!,"Error in disk, ABORTING load!!" S XPDQUIT=1 Q
|
---|
211 | N DIR
|
---|
212 | ;"close current device
|
---|
213 | C IO U IO(0)
|
---|
214 | S XPDSEQ=XPDSEQ+1,DIR(0)="E"
|
---|
215 | S DIR("A")="Insert the next diskette, #"_XPDSEQ_", and Press the return key"
|
---|
216 | S DIR("?")="This distribution is continued on another diskette"
|
---|
217 | D ^DIR Q:$D(DIRUT)
|
---|
218 | W " OK",!
|
---|
219 | ;MSM specific code to open HFS
|
---|
220 | O @(""""_IO_""":"_IOPAR) U IO
|
---|
221 | ;"R X:0,Y:0
|
---|
222 | do DoRead(.X,1)
|
---|
223 | do DoRead(.Y,1)
|
---|
224 |
|
---|
225 | ;"quit if comments are not the same on each diskette
|
---|
226 | G:Y'=XPDST("H") NEXTQ
|
---|
227 | ;"quit if not the expected sequence, Z is for the blank line
|
---|
228 | ;"R Y:0,Z:0
|
---|
229 | do DoRead(.Y,1)
|
---|
230 | do DoRead(.Z,1)
|
---|
231 | G:Y'=("**SEQ**:"_XPDSEQ) NEXTQ
|
---|
232 | Q
|
---|
233 | ;
|
---|
234 | NEXTQ U IO(0) W !!,"This is NOT the correct diskette!! The comment on this diskette is:",!,X,!!
|
---|
235 | S XPDSEQ=XPDSEQ-1
|
---|
236 | G NEXTD
|
---|
237 | ;
|
---|
238 | NONE W !!,"**NOTHING LOADED**",!
|
---|
239 | Q
|
---|
240 |
|
---|
241 |
|
---|
242 | USER
|
---|
243 | ;"Purpose: Ask user questions questions before running silent EN1^TMGXPDIL
|
---|
244 |
|
---|
245 | new Options
|
---|
246 | new Option,Msg
|
---|
247 | new DIR
|
---|
248 | set DIR("A")="Enter a Host File"
|
---|
249 | set DIR("?")="Enter a filename and/or path to input Distribution."
|
---|
250 | if $get(TMGPATNM)'="" set Y=TMGPATNM ;"allow preset file name
|
---|
251 | set Option("HFSNAME")=$$GetFName^TMGIOUTL(DIR("?"),"/tmp/","","","","",DIR("A")_": ")
|
---|
252 |
|
---|
253 | new %
|
---|
254 | set %=2
|
---|
255 | write "Do Environmental check" do YN^DICN write !
|
---|
256 | if %=-1 goto UDone
|
---|
257 | set Option("DO ENV CHECK")=(%=1)
|
---|
258 |
|
---|
259 | set %=1
|
---|
260 | write "Force continue load" do YN^DICN write !
|
---|
261 | if %=-1 goto UDone
|
---|
262 | set Option("FORCE CONT LOAD")=(%=1)
|
---|
263 |
|
---|
264 | do EN1(.Option,.Msg)
|
---|
265 | if $data(Msg) zwr Msg
|
---|
266 |
|
---|
267 | UDone
|
---|