1 | TMGKERNL ;TMG/kst/OS Specific functions ;11/01/04
|
---|
2 | ;;1.0;TMG-LIB;**1**;04/24/09
|
---|
3 |
|
---|
4 | ;"TMG KERNEL FUNCTIONS
|
---|
5 | ;"I.e. functions that are OS specific.
|
---|
6 | ;"Kevin Toppenberg MD
|
---|
7 | ;"GNU General Public License (GPL) applies
|
---|
8 | ;"7-12-2005
|
---|
9 |
|
---|
10 | ;"=======================================================================
|
---|
11 | ;" API -- Public Functions.
|
---|
12 | ;"=======================================================================
|
---|
13 | ;"$$Dos2Unix^TMGKERNL(FullNamePath)
|
---|
14 | ;"$$IsDir^TMGKERNL(Path)
|
---|
15 | ;"$$Move^TMGKERNL(Source,Dest)
|
---|
16 | ;"$$Copy^TMGKERNL(Source,Dest)
|
---|
17 | ;"$$mkdir(Dir) -- provide a shell for the Linux command 'mkdir'
|
---|
18 | ;"$$rmdir(Dir) -- provide a shell for the Linux command 'rmdir'
|
---|
19 | ;"$$Convert^TMGKERNL(FPathName,NewType) -- convert a graphic image to new type
|
---|
20 | ;"$$XLTLANG(Phrase,langPair) -- execute a linux OS call to convert a phrase into another spoken language
|
---|
21 | ;"$$GetPckList(PckInit,Array,NeedsRefresh,PckDirFName) -- launch special linux script to get patch file list from ftp.va.gov
|
---|
22 | ;"$$DownloadFile^TMGKERNL(URL,DestDir) -- Interact with Linux to download a file with wget
|
---|
23 | ;"$$EditHFSFile^TMGKERNL(FilePathName) -- interact with Linux to edit a file on the host file system
|
---|
24 | ;"ZSAVE -- to save routine out to HFS
|
---|
25 | ;"MAKEBAKF^TMGKERNL(FilePathName,NodeDiv) ;Make Backup File if original exists
|
---|
26 | ;"IOCapON -- redirect IO to a HFS file, so that it can be captured.
|
---|
27 | ;"IOCapOFF(pOutArray) -- restore IO channel to that prior IOCapON was called, and return captured output in OutArray
|
---|
28 | ;"KillPID(JobNum) -- send message to MUPIP to kill Job
|
---|
29 | ;"MJOBS(array) -- execute a linux OS call to get list of all 'mumps' jobs using: 'ps -C mumps'
|
---|
30 | ;"$$GetScrnSize(ROWS,COLS) --query the OS and get the dimensions of the terminal window.
|
---|
31 |
|
---|
32 | ;"=======================================================================
|
---|
33 | ;"Dependancies
|
---|
34 | ;"=======================================================================
|
---|
35 |
|
---|
36 | ;"=======================================================================
|
---|
37 |
|
---|
38 | Dos2Unix(FullNamePath)
|
---|
39 | ;"Purpose: To execute the unix command Dos2Unix on filename path
|
---|
40 | ;"FullNamePath: The filename to act on.
|
---|
41 | ;"Result: 0 if no error; >0 if error
|
---|
42 | ;"Notice!!!! The return code here is DIFFERENT from usual
|
---|
43 |
|
---|
44 | new result set result=0
|
---|
45 | if $get(FullNamePath)="" goto DUDone
|
---|
46 | new spec set spec(" ")="\ "
|
---|
47 | set FullNamePath=$$REPLACE^XLFSTR(FullNamePath,.spec)
|
---|
48 |
|
---|
49 | new HookCmd set HookCmd="dos2unix -q "_FullNamePath
|
---|
50 | zsystem HookCmd
|
---|
51 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only)
|
---|
52 |
|
---|
53 | DUDone
|
---|
54 | quit result
|
---|
55 |
|
---|
56 |
|
---|
57 | FileSize(FullNamePath)
|
---|
58 | ;"Purpose: To return the size of the file, in bytes.
|
---|
59 | ;"Input: FullNamePath: The filename to act on.
|
---|
60 | ;"Result: -1 if error, or returns size in bytes
|
---|
61 |
|
---|
62 | new result set result=-1
|
---|
63 | new p set p="myTerm"
|
---|
64 | open p:(COMMAND="stat --format=%s "_FullNamePath:readonly)::"pipe"
|
---|
65 | use p
|
---|
66 | new x read x
|
---|
67 | close p use $p
|
---|
68 | ;"write "reply was :",x,!
|
---|
69 | if x'["cannot stat" set result=+x
|
---|
70 | quit result
|
---|
71 |
|
---|
72 | IsDir(Path,NodeDiv)
|
---|
73 | ;"Purpose: To determine if Path is a path to a directory (i.e. are there sub files)
|
---|
74 | ;"Input: Path to test, e.g. "/home/user" or "/home/user/"
|
---|
75 | ;" NodeDiv: [OPTIONAL] -- the character that separates folders (e.g. "/")
|
---|
76 | ;" if not supplied, then default value is "/"
|
---|
77 | ;"Result: 1 filepath is actually a directory
|
---|
78 | ;"Note: NEW! Will now return 1 if Path is a valid path to a directory, but there are no files in directory
|
---|
79 |
|
---|
80 | set Path=$get(Path)
|
---|
81 | set NodeDiv=$get(NodeDiv,"/")
|
---|
82 | if $extract(Path,$length(Path))'=NodeDiv set Path=Path_NodeDiv
|
---|
83 |
|
---|
84 | new p set p="myTerm"
|
---|
85 | open p:(COMMAND="stat --format=%F "_Path:readonly)::"pipe"
|
---|
86 | use p
|
---|
87 | new x read x
|
---|
88 | close p use $p
|
---|
89 | quit (x="directory")
|
---|
90 |
|
---|
91 | ;" ==== old code/method below (slower) ===
|
---|
92 | ;"Old results
|
---|
93 | ;"Result: 1 if there are files in path, 0 otherwise
|
---|
94 | ;"Note: if Path is a valid path to a directory, but there are no files in directory, 0 returned.
|
---|
95 |
|
---|
96 | new TMGMask set TMGMask("*")=""
|
---|
97 | new TMGFiles
|
---|
98 | new result set result=0
|
---|
99 |
|
---|
100 | new spec set spec(" ")="\ "
|
---|
101 | set Path=$$REPLACE^XLFSTR(Path,.spec)
|
---|
102 |
|
---|
103 | ;"Note: I can't seem to get this to work with names containing spaces.
|
---|
104 | if $$LIST^%ZISH(Path,"TMGMask","TMGFiles")=1 do
|
---|
105 | . new index set index=$order(TMGFiles(""))
|
---|
106 | . if index'="" set result=1
|
---|
107 |
|
---|
108 | quit result
|
---|
109 |
|
---|
110 |
|
---|
111 | Move(Source,Dest)
|
---|
112 | ;"Purpose to provide a shell for the Linux command 'mv'
|
---|
113 | ;" This can serve to move or rename a file
|
---|
114 | ;"Note: a platform independant version of the this could be constructed later...
|
---|
115 | ;"Result: 0 if no error; >0 if error
|
---|
116 | ;"Notice!!!! The return code here is DIFFERENT from usual
|
---|
117 |
|
---|
118 | new HookCmd,result
|
---|
119 | new Srch
|
---|
120 | set Srch(" ")="\ "
|
---|
121 | set Source=$$REPLACE^XLFSTR(Source,.Srch)
|
---|
122 | set Dest=$$REPLACE^XLFSTR(Dest,.Srch)
|
---|
123 | set HookCmd="mv "_Source_" "_Dest
|
---|
124 | zsystem HookCmd
|
---|
125 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only)
|
---|
126 | quit result
|
---|
127 |
|
---|
128 |
|
---|
129 | Copy(Source,Dest)
|
---|
130 | ;"Purpose to provide a shell for the Linux command 'cp'
|
---|
131 | ;" This can serve to move or rename a file
|
---|
132 | ;"Note: a platform independant version of the this could be constructed later...
|
---|
133 | ;"Result: 0 if no error; >0 if error
|
---|
134 | ;"Notice!!!! The return code here is DIFFERENT from usual
|
---|
135 |
|
---|
136 | new HookCmd,result
|
---|
137 | new Srch
|
---|
138 | set Srch(" ")="\ "
|
---|
139 | set Source=$$REPLACE^XLFSTR(Source,.Srch)
|
---|
140 | set Dest=$$REPLACE^XLFSTR(Dest,.Srch)
|
---|
141 | set HookCmd="cp "_Source_" "_Dest
|
---|
142 | zsystem HookCmd
|
---|
143 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only)
|
---|
144 | quit result
|
---|
145 |
|
---|
146 | mkdir(Dir)
|
---|
147 | ;"Purpose to provide a shell for the Linux command 'mkdir'
|
---|
148 | ;"Note: a platform independant version of the this could be constructed later...
|
---|
149 | ;"Result: 0 if no error; >0 if error
|
---|
150 | ;"Notice!!!! The return code here is DIFFERENT from usual
|
---|
151 |
|
---|
152 | new HookCmd,result
|
---|
153 | new Srch set Srch(" ")="\ "
|
---|
154 | set Dir=$$REPLACE^XLFSTR(Dir,.Srch)
|
---|
155 | set HookCmd="mkdir "_Dir
|
---|
156 | zsystem HookCmd
|
---|
157 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only)
|
---|
158 | quit result
|
---|
159 |
|
---|
160 | rmdir(Dir)
|
---|
161 | ;"Purpose to provide a shell for the Linux command 'rmdir'
|
---|
162 | ;"Note: a platform independant version of the this could be constructed later...
|
---|
163 | ;"Result: 0 if no error; >0 if error
|
---|
164 | ;"Notice!!!! The return code here is DIFFERENT from usual
|
---|
165 |
|
---|
166 | new HookCmd,result
|
---|
167 | new Srch set Srch(" ")="\ "
|
---|
168 | set Dir=$$REPLACE^XLFSTR(Dir,.Srch)
|
---|
169 | set HookCmd="rmdir "_Dir
|
---|
170 | zsystem HookCmd
|
---|
171 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only)
|
---|
172 | quit result
|
---|
173 |
|
---|
174 |
|
---|
175 | Convert(FPathName,NewType)
|
---|
176 | ;"Purpose: to convert a graphic image on the linux host to new type
|
---|
177 | ;" i.e. image.jpg --> image.png. This is more than a simple renaming.
|
---|
178 | ;"Input: FPathName -- full path, filename and extention. E.g. "\tmp\image.jpg"
|
---|
179 | ;" NewType -- the new image type (without '.'),
|
---|
180 | ;" E.g. "jpg", or "JPG", or "TIFF", or "pcd" (NOT ".jpg" etc)
|
---|
181 | ;"Output: New FPathName (with new extension) to new image file, or "" if problem
|
---|
182 | ;"
|
---|
183 | ;"Note: If the conversion is successful, then the original image will be deleted
|
---|
184 | ;"Note: This function depends on the ImageMagick graphic utility "convert" to be
|
---|
185 | ;" installed on the host linux system, and in the path so that it can be
|
---|
186 | ;" launched from any directory.
|
---|
187 |
|
---|
188 | new newFPathName set newFPathName=""
|
---|
189 | set NewType=$get(NewType)
|
---|
190 | if NewType="" goto ConvDone
|
---|
191 |
|
---|
192 | new FName,FPath,FileSpec
|
---|
193 | do SplitFNamePath^TMGIOUTL(FPathName,.FPath,.FName,"/")
|
---|
194 | set FileSpec(FName)=""
|
---|
195 |
|
---|
196 | set newFPathName=$piece(FPathName,".",1)_"."_NewType
|
---|
197 |
|
---|
198 | ;"Setup and launch linux command to execute convert
|
---|
199 | new CmdStr
|
---|
200 | set CmdStr="convert "_FPathName_" "_newFPathName
|
---|
201 | do
|
---|
202 | . ;"new $ETRAP,$ZTRAP
|
---|
203 | . ;"set $ETRAP="S $ECODE="""""
|
---|
204 | . zsystem CmdStr ;"Launch command
|
---|
205 |
|
---|
206 | ;"get result of execution. (low byte only) -- if wanted
|
---|
207 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
208 | if CmdResult'=0 do goto ConvDone
|
---|
209 | . set newFPathName=""
|
---|
210 |
|
---|
211 | ;"Delete old image file
|
---|
212 | ;"**** temp!!!!! REMOVE COMMENTS LATER
|
---|
213 | ;"new temp set temp=$$DEL^%ZISH(FPath,"FileSpec")
|
---|
214 |
|
---|
215 | ConvDone
|
---|
216 | quit newFPathName
|
---|
217 |
|
---|
218 |
|
---|
219 | XLTLANG(Phrase,langPair)
|
---|
220 | ;"Purpose: To execute a linux OS call to convert a phrase into another
|
---|
221 | ;" spoken language
|
---|
222 | ;"Input: Phrase -- The text to be translated.
|
---|
223 | ;" LangPair -- a language pair (as allowed by Google translater)
|
---|
224 | ;" for now, tested pairs are:
|
---|
225 | ;" "en-es" -- english -> spanish
|
---|
226 | ;" "en-fr" -- english --> french
|
---|
227 | ;" "en-da" -- english --> ?
|
---|
228 | ;"Result: The translated text, or "" if error.
|
---|
229 | ;"Note: This depends on the "tw" package be installed in the host OS
|
---|
230 | ;" I got this on 7/11/08 from: http://savannah.nongnu.org/projects/twandgtw/
|
---|
231 | ;"Note: This is not working for some reason.....
|
---|
232 |
|
---|
233 | new result set result=""
|
---|
234 | set langPair=$get(langPair,"en-es")
|
---|
235 | set Phrase=$get(Phrase,"?? Nothing Provided ??")
|
---|
236 |
|
---|
237 | new msgFName set msgFName=$$UNIQUE^%ZISUTL("/tmp/TransLang.txt")
|
---|
238 |
|
---|
239 | ;"Setup and launch linux command to execute tw command
|
---|
240 | new CmdStr
|
---|
241 | set CmdStr="tw translate.google.com."_langPair_" """_Phrase_""" > """_msgFName_""""
|
---|
242 |
|
---|
243 | ;"write "About to execute zsystem command:",!,CmdStr,!
|
---|
244 | zsystem CmdStr ;"Launch command in linux OS
|
---|
245 | ;"write "Back from zsystem",!
|
---|
246 |
|
---|
247 | ;"get result of execution. (low byte only) -- if wanted
|
---|
248 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
249 | if CmdResult'=0 goto TLDone
|
---|
250 |
|
---|
251 | new FName,FPath
|
---|
252 | do SplitFNamePath^TMGIOUTL(msgFName,.FPath,.FName,"/")
|
---|
253 | new resultArray
|
---|
254 | if $$FTG^%ZISH(FPath,FName,"resultArray(0)",1)=0 goto TLDone
|
---|
255 | set result=$get(resultArray(0))
|
---|
256 |
|
---|
257 | TLDone
|
---|
258 | quit result
|
---|
259 |
|
---|
260 |
|
---|
261 | TestTrans
|
---|
262 | set langPair=$get(langPair,"en-es")
|
---|
263 | set Phrase=$get(Phrase,"Hello friend")
|
---|
264 | new msgFName set msgFName=$$UNIQUE^%ZISUTL("/tmp/TransLang.txt")
|
---|
265 |
|
---|
266 | new CmdStr
|
---|
267 | new qtChar set qtChar="'"
|
---|
268 |
|
---|
269 | set CmdStr="sh /var/local/OpenVistA_UserData/twlang.sh "_qtChar_langPair_qtChar_" "_qtChar_Phrase_qtChar_" "_msgFName
|
---|
270 | write "About to execute zsystem command:",!,CmdStr,!
|
---|
271 | zsystem CmdStr ;"Launch command in linux OS
|
---|
272 | write "Back from zsystem",!
|
---|
273 |
|
---|
274 | set qtChar=""""
|
---|
275 | set CmdStr="sh /var/local/OpenVistA_UserData/twlang.sh "_qtChar_langPair_qtChar_" "_qtChar_Phrase_qtChar_" "_msgFName
|
---|
276 | write "About to execute zsystem command:",!,CmdStr,!
|
---|
277 | zsystem CmdStr ;"Launch command in linux OS
|
---|
278 | write "Back from zsystem",!
|
---|
279 |
|
---|
280 | quit
|
---|
281 |
|
---|
282 |
|
---|
283 | GetPckList(PckInit,Array,NeedsRefresh,PckDirFName)
|
---|
284 | ;"Purpose: Call Linux, launching special script to get patch file list from ftp.va.gov
|
---|
285 | ;" This is a support function for automating the KIDS installation of patches.
|
---|
286 | ;"Input: PckInit -- this is the namespace of the package to get patches for, e.g. 'DI' for fileman
|
---|
287 | ;" Array -- PASS BY REFERENCE. An OUT parameter. Format:
|
---|
288 | ;" Array(0)=1st line
|
---|
289 | ;" Array(1)=2nd line etc.
|
---|
290 | ;" NeedsRefresh -- if 0 then no refresh needed, just set PckDirFName (but ensure file exists)
|
---|
291 | ;" PckDirFName -- Optional. PASS BY REFERNCE, an OUT PARAMETER. Filled with HFS filename of file
|
---|
292 | ;"Result : 1=success, 0=failure
|
---|
293 |
|
---|
294 | new result set result=1 ;"success
|
---|
295 | kill Array
|
---|
296 | if $get(PckInit)="" set result=0 goto GPLDone
|
---|
297 |
|
---|
298 | ;"Results will be stored in /<dir>/ftp.va.gov-dirFor-'PckInit'
|
---|
299 | new FName,FPath
|
---|
300 | ;"Fix this.... check if path exists.....
|
---|
301 | set FPath=$get(^TMG("KIDS","PATCH DIR"))
|
---|
302 | if (FPath="")!($$IsDir^TMGKERNL(FPath)=0) do
|
---|
303 | . new Msg set Msg="Please choose a file path for storing VA patches in."
|
---|
304 | . set FPath=$$GetDirName^TMGIOUTL2(Msg,DefPath,"/","Pick directory")
|
---|
305 | if FPath="" set result=0 goto GPLDone
|
---|
306 | set FName="ftp.va.gov-dirFor-"_PckInit
|
---|
307 | set PckDirFName=FPath_FName
|
---|
308 | if ($get(NeedsRefresh)'>0)&($$FileExists^TMGIOUTL(PckDirFName)) goto GPLDone
|
---|
309 |
|
---|
310 | new FPScript set FPScript=$get(^TMG("KIDS","VA FTP Script"))
|
---|
311 | if (FPScript'=""),($$FileExists^TMGIOUTL(FPScript)=0) do
|
---|
312 | . kill ^TMG("KIDS","VA FTP Script")
|
---|
313 | . set FPScript=""
|
---|
314 | if FPScript="" do
|
---|
315 | . new msg set msg="Linux script needed: vaftp_launcher.sh\n"
|
---|
316 | . set msg=msg_"Please browse to this script and select it after the pause."
|
---|
317 | . set FPScript=$$GetFName^TMGIOUTL(msg,"/","vaftp_launcher.sh")
|
---|
318 | . if $$FileExists^TMGIOUTL(FPScript) do
|
---|
319 | . . set ^TMG("KIDS","VA FTP Script")=FPScript
|
---|
320 | . else do
|
---|
321 | . . write "ERROR: Choice of "_FPScript_" is invalid. Aborting."
|
---|
322 | . . set FPScript=""
|
---|
323 | if FPScript="" set result=0 goto GPLDone
|
---|
324 |
|
---|
325 | new CmdStr set CmdStr=FPScript_" "_PckInit_" "_FPath
|
---|
326 | zsystem CmdStr ;"Launch command in linux OS
|
---|
327 |
|
---|
328 | ;"get result of execution. (low byte only) -- if wanted
|
---|
329 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
330 | if CmdResult'=0 do
|
---|
331 | . ;"Failed, so get log file instead of results
|
---|
332 | . set FName="ftp.va.gov_log"
|
---|
333 | . set result=1 ;"success
|
---|
334 |
|
---|
335 | GPL2 ;"Get results file (or log file if problem)
|
---|
336 | if $$FTG^%ZISH(FPath,FName,"Array(0)",1)=0 set result=0 goto GPLDone
|
---|
337 |
|
---|
338 | GPLDone
|
---|
339 | quit result
|
---|
340 |
|
---|
341 |
|
---|
342 | DownloadFile(URL,DestDir,Verbose)
|
---|
343 | ;"Purpose: Interact with Linux to download a file with wget
|
---|
344 | ;"Input: URL -- this is the URL of the file to be downloaded, as to be passed to wget
|
---|
345 | ;" if the server is an FTP server, then URL should start with 'ftp://'
|
---|
346 | ;" NOTE: the URL will be enclosed in " ", so it may contain spaces etc,
|
---|
347 | ;" but should NOT have escaped characters, i.e. "Not\ this"
|
---|
348 | ;" Exception "April Fool'\''s Day" is proper
|
---|
349 | ;" DestDir -- this is the destination directory, on the HFS, where file should be stored
|
---|
350 | ;" Verbose -- OPTIONAL. If 1, then output from wget is shown. Default is 0
|
---|
351 | ;"result: 1 if success, 0 if failure
|
---|
352 |
|
---|
353 | ;"NOTE: This needs to be rewritten to use the vawget_launcher because wget it
|
---|
354 | ;" hanging when the file doesn't exist, and the process has to be aborted...
|
---|
355 |
|
---|
356 | new CmdStr,qFlag
|
---|
357 | ;"Setup and launch linux command to execute command
|
---|
358 | if +$get(Verbose) set qFlag=""
|
---|
359 | else set qFlag="-q "
|
---|
360 | set CmdStr="wget "_qFlag_"-P """_DestDir_""" """_URL_""""
|
---|
361 | zsystem CmdStr ;"Launch command in linux OS
|
---|
362 |
|
---|
363 | ;"get result of execution. (low byte only)
|
---|
364 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
365 | new result set result=(CmdResult=0)
|
---|
366 |
|
---|
367 | quit result
|
---|
368 |
|
---|
369 |
|
---|
370 | EditHFSFile(FilePathName)
|
---|
371 | ;"Purpose: interact with Linux to edit a file on the host file system
|
---|
372 | ;"Input: FilePathName -- the full path of the file to edit.
|
---|
373 | ;"result: 1 if success, 0 if failure
|
---|
374 |
|
---|
375 | ;"Setup and launch linux command to execute command
|
---|
376 | new CmdStr set CmdStr="nano "_FilePathName
|
---|
377 | zsystem CmdStr ;"Launch command in linux OS
|
---|
378 |
|
---|
379 | ;"get result of execution. (low byte only)
|
---|
380 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
381 | new result set result=(CmdResult=0)
|
---|
382 | quit result
|
---|
383 |
|
---|
384 |
|
---|
385 | ZSAVE
|
---|
386 | ;"Purpose: to save routine out to HFS
|
---|
387 | ;"Input: globally scoped variable X should hold routine name
|
---|
388 |
|
---|
389 | ;"NOTE: this was moved out of ^DD("OS",19,"ZS")
|
---|
390 | ;"Original line there was (all three lines were one long line)
|
---|
391 | ;"N %I,%F,%S S %I=$I,%F=$P($P($ZRO,")"),"(",2)_"/"_X_".m" O %F:(NEWVERSION)
|
---|
392 | ;"U %F X "S %S=0 F S %S=$O(^UTILITY($J,0,%S)) Q:%S="""" Q:'$D(^(%S)) S %=
|
---|
393 | ;"^UTILITY($J,0,%S) I $E(%)'="";"" W %,!" C %F U %I
|
---|
394 |
|
---|
395 | ;"NOTE: The KIDS system seems to be using X ^%ZOSF("SAVE") instead of this.
|
---|
396 |
|
---|
397 | new %I,%F,%S
|
---|
398 | new % ;"//kt added -- not newing this caused problems in SAVE^DIKZ
|
---|
399 | set %I=$I
|
---|
400 | new %DIR set %DIR=$P($P($ZRO,")"),"(",2)
|
---|
401 | set %DIR=$piece(%DIR," ",$length(%DIR," "))
|
---|
402 | set %F=%DIR_"/"_X_".m"
|
---|
403 | open %F:(NEWVERSION)
|
---|
404 | use %F
|
---|
405 | set %S=0
|
---|
406 | for set %S=$O(^UTILITY($J,0,%S)) Q:%S="" Q:'$D(^(%S)) do
|
---|
407 | . set %=^UTILITY($J,0,%S)
|
---|
408 | . if $E(%)'=";" W %,!
|
---|
409 | close %F
|
---|
410 | use %I
|
---|
411 |
|
---|
412 | quit
|
---|
413 |
|
---|
414 |
|
---|
415 | MAKEBAKF(FilePathName,NodeDiv) ;"Make Backup File if original exists
|
---|
416 | ;"Purpose: to COPY existing File to File-ext_#.bak, creating a backup
|
---|
417 | ;" e.g. /tmp/dir1/FName.txt --> /tmp/dir1/FName-txt_1.bak
|
---|
418 | ;"Input: FilePathName -- the name, e.g. /tmp/dir1/filename.txt
|
---|
419 | ;" NodeDiv -- OPTIONAL. Default is "/"
|
---|
420 | ;" The node divider. "/" for unix, "\" for Microsoft
|
---|
421 | ;"results: none
|
---|
422 | ;"Note: This assumes that the HFS supports filenames like FName-txt_1.bak,
|
---|
423 | ;" and length file name is not limited (e.g. not old 8.3 DOS style)
|
---|
424 | ;" Also, if backup file, then number is incremented until a filename is found that doesn't exists
|
---|
425 | ;" e.g. /tmp/dir1/FName-txt_1.bak
|
---|
426 | ;" /tmp/dir1/FName-txt_2.bak
|
---|
427 | ;" /tmp/dir1/FName-txt_3.bak
|
---|
428 |
|
---|
429 | set NodeDiv=$get(NodeDiv,"/")
|
---|
430 | if $$FileExists^TMGIOUTL(FilePathName) do ;"backup file if it exists
|
---|
431 | . new count set count=0
|
---|
432 | . new FName,FPath,done
|
---|
433 | . do SplitFNamePath^TMGIOUTL(FilePathName,.FPath,.FName,NodeDiv)
|
---|
434 | . for do quit:done
|
---|
435 | . . set count=count+1
|
---|
436 | . . new bakName set bakName=FName_"_"_count
|
---|
437 | . . set bakName=FPath_$translate(bakName,".","-")_".bak"
|
---|
438 | . . if $$FileExists^TMGIOUTL(bakName) set done=0 quit
|
---|
439 | . . else do
|
---|
440 | . . . set done=1
|
---|
441 | . . . if $$Copy(FilePathName,bakName)
|
---|
442 |
|
---|
443 | quit
|
---|
444 |
|
---|
445 | IOCapON
|
---|
446 | ;"Purpose: to redirect IO to a HFS file, so that it can be captured.
|
---|
447 | ;"NOTE: CAUTION: If this is called, and then a routine asks for user input,
|
---|
448 | ;" then the program will appear to hang, because the message asking
|
---|
449 | ;" for input has gone to the output channel.
|
---|
450 |
|
---|
451 | set TMGIOCAP=IO
|
---|
452 | set TMGIOCPT="/tmp/"
|
---|
453 | set TMGIOCFN="io-capture-"_$J_".txt"
|
---|
454 | set IO=TMGIOCPT_TMGIOCFN
|
---|
455 | open IO:(REWIND)
|
---|
456 | use IO
|
---|
457 |
|
---|
458 | quit
|
---|
459 |
|
---|
460 |
|
---|
461 | IOCapOFF(pOutArray)
|
---|
462 | ;"Purpose: To restore IO channel to that prior IOCapON was called, and return
|
---|
463 | ;" captured output in OutArray
|
---|
464 | ;"NOTE: MUST call IOCapON prior to calling this function
|
---|
465 | ;"Input: Globally-scoped TMGIOCAP is used.
|
---|
466 | ;" pOutArray -- PASS BY NAME, an OUT PARAMETER. Prior contents are killed.
|
---|
467 | ;"results: none
|
---|
468 |
|
---|
469 | close IO
|
---|
470 | if $get(TMGIOCAP)="" use $P goto IOCDone
|
---|
471 | set IO=TMGIOCAP
|
---|
472 | use IO
|
---|
473 | if $get(pOutArray)="" goto IOCDone
|
---|
474 | kill @pOutArray
|
---|
475 |
|
---|
476 | if ($get(TMGIOCPT)="")!($get(TMGIOCFN)="") goto IOCDone
|
---|
477 | if $$FTG^%ZISH(TMGIOCPT,TMGIOCFN,$name(@pOutArray@(0)),1)
|
---|
478 | new TMGA set TMGA(TMGIOCFN)=""
|
---|
479 | if $$DEL^%ZISH(TMGIOCPT,"TMGA")
|
---|
480 |
|
---|
481 | IOCDone quit
|
---|
482 |
|
---|
483 | KillPID(JobNum)
|
---|
484 | ;"Purpose: send message to MUPIP to kill Job
|
---|
485 | new CmdStr set CmdStr="mupip stop "_JobNum
|
---|
486 | zsystem CmdStr ;"Launch command in linux OS
|
---|
487 | ;"do PressToCont^TMGUSRIF
|
---|
488 | quit
|
---|
489 |
|
---|
490 | TEST
|
---|
491 | new array
|
---|
492 | new p set p="temp"
|
---|
493 | open p:(COMMAND="ps -C mumps":readonly)::"pipe"
|
---|
494 | use p
|
---|
495 | new lineIn
|
---|
496 | for do quit:($zeof)
|
---|
497 | . read lineIn
|
---|
498 | . new ch for do quit:(ch'=" ")
|
---|
499 | . . set ch=$extract(lineIn,1,1)
|
---|
500 | . . if ch=" " set lineIn=$extract(lineIn,2,40)
|
---|
501 | . if +lineIn=0 quit
|
---|
502 | . set array(+lineIn)=lineIn
|
---|
503 | close p
|
---|
504 | use $p
|
---|
505 | zwr array
|
---|
506 | quit
|
---|
507 |
|
---|
508 | MJOBS(array)
|
---|
509 | ;"Purpose: To execute a linux OS call to get list of all 'mumps' jobs
|
---|
510 | ;" using: 'ps -C mumps'
|
---|
511 | ;"Input: array -- PASS BY REFERNCE, an OUT PARAMETER.
|
---|
512 | ;"Output: array is filled as follows: (Prior data is killed)
|
---|
513 | ;" array(job#)=InfoLineFromOS
|
---|
514 | ;" array(job#)=InfoLineFromOS
|
---|
515 | ;" e.g. array(4483)=' 4883 pts/8 00:00:00 mumps'
|
---|
516 | ;" e.g. array(19308)='19308 ? 00:00:00 mumps'
|
---|
517 | ;" e.g. array(27454)='27454 pts/5 00:00:53 mumps'
|
---|
518 | ;"Result: none
|
---|
519 |
|
---|
520 | new p set p="temp"
|
---|
521 | open p:(COMMAND="ps -C mumps":readonly)::"pipe"
|
---|
522 | use p
|
---|
523 | new lineIn,ch
|
---|
524 | for do quit:($zeof)
|
---|
525 | . read lineIn
|
---|
526 | . for do quit:(ch'=" ")
|
---|
527 | . . set ch=$extract(lineIn,1,1) quit:(ch'=" ")
|
---|
528 | . . set lineIn=$extract(lineIn,2,40)
|
---|
529 | . if +lineIn=0 quit
|
---|
530 | . set array(+lineIn)=lineIn
|
---|
531 | close p
|
---|
532 | use $p
|
---|
533 | quit
|
---|
534 |
|
---|
535 | ;"====== old method below ==============
|
---|
536 | kill array
|
---|
537 | new msgFName set msgFName=$$UNIQUE^%ZISUTL("/tmp/mjobslist.txt")
|
---|
538 | new CmdStr set CmdStr="ps -C mumps > """_msgFName_""""
|
---|
539 | zsystem CmdStr ;"Launch command in linux OS
|
---|
540 | ;
|
---|
541 | ;"get result of execution. (low byte only) -- if wanted
|
---|
542 | new CmdResult set CmdResult=$ZSYSTEM&255
|
---|
543 | if CmdResult'=0 goto MJDone
|
---|
544 | ;
|
---|
545 | new FName,FPath
|
---|
546 | do SplitFNamePath^TMGIOUTL(msgFName,.FPath,.FName,"/")
|
---|
547 | new resultArray
|
---|
548 | if $$FTG^%ZISH(FPath,FName,"resultArray(0)",1)=0 goto TLDone
|
---|
549 | ;
|
---|
550 | ;"Delete temp info file
|
---|
551 | new FileSpec set FileSpec(FName)=""
|
---|
552 | new temp set temp=$$DEL^%ZISH(FPath,"FileSpec")
|
---|
553 | ;
|
---|
554 | ;"Format resulting array
|
---|
555 | new i set i=0
|
---|
556 | for set i=$order(resultArray(i)) quit:(i'>0) do
|
---|
557 | . new j set j=$extract(resultArray(i),1,5)
|
---|
558 | . new ch for do quit:(ch'=" ")
|
---|
559 | . . set ch=$extract(j,1,1)
|
---|
560 | . . if ch=" " set j=$extract(j,2,40)
|
---|
561 | . set array(+j)=resultArray(i)
|
---|
562 | ;
|
---|
563 | MJDone quit
|
---|
564 |
|
---|
565 |
|
---|
566 | GetScrnSize(ROWS,COLS)
|
---|
567 | ;"Purpose: To query the OS and get the dimensions of the terminal window
|
---|
568 | ;"Input: ROWS,COLS -- Optional. PASS BY REFERENCE. Filled with results
|
---|
569 | ;"Results: Row^Col e.g. '24^80', or '24^60' as a default if problem.
|
---|
570 | ;"Note: thanks Bhaskar for figuring this out!
|
---|
571 | new p set p="myTerm"
|
---|
572 | open p:(COMMAND="stty -a -F "_$p_"|grep columns":readonly)::"pipe"
|
---|
573 | ;"open p:(COMMAND="stty -a |grep columns":readonly)::"pipe"
|
---|
574 | new x
|
---|
575 | for use p read x quit:($zeof)!(x["columns")
|
---|
576 | close p use $p
|
---|
577 | set COLS=+$piece(x,"columns ",2)
|
---|
578 | set ROWS=+$piece(x,"rows ",2)
|
---|
579 | if (COLS=0)&(ROWS=0) do
|
---|
580 | . set COLS=60,ROWS=24
|
---|
581 | quit ROWS_"^"_COLS
|
---|