| 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
 | 
|---|