[896] | 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
|
---|