| [796] | 1 | TMGPAT1 ;TMG/kst/Patching tools ;09/17/08
|
|---|
| 2 | ;;1.0;TMG-LIB;**1**;09/17/08
|
|---|
| 3 | ;
|
|---|
| 4 | ;"Kevin Toppenberg MD
|
|---|
| 5 | ;"GNU General Public License (GPL) applies
|
|---|
| 6 | ;"9/17/08
|
|---|
| 7 |
|
|---|
| 8 | ;"=======================================================================
|
|---|
| 9 | ;" API -- Public Functions.
|
|---|
| 10 | ;"=======================================================================
|
|---|
| 11 | ;"DONEXT -- Ask for package, and install next appropriate patch
|
|---|
| 12 | ;"DONEXTPJ -- do next patch within the same project
|
|---|
| 13 | ;"FIXMISEQ -- allow fixing a missing patch, based on sequence order
|
|---|
| 14 | ;"FIXMISPT -- allow fixing a missing patch, based on patch number
|
|---|
| 15 | ;"DONEXTPK(PckInit,Ver)-- a common entry point
|
|---|
| 16 | ;"GO(Option,Info,Msg) -- Entry point to allow automatic loading and installation of a patch.
|
|---|
| 17 | ;"LOAD -- Entry point to allow manual loading of a patch (like old way, but using new code)
|
|---|
| 18 |
|
|---|
| 19 | ;"=======================================================================
|
|---|
| 20 | ;"Private Functions
|
|---|
| 21 | ;"=======================================================================
|
|---|
| 22 | ;"Logo
|
|---|
| 23 | ;"FixMissing(Mode) allow fixing a missing patch, even if it is out of sequence order
|
|---|
| 24 | ;"FixMisInit(PckInit,Ver,Mode) -- Based on PckInit, and Version, allow fixing a missing patch, even if it is out of sequence order
|
|---|
| 25 | ;"DoFixMissing(IENS,Mode) -- fix a missing patch, even if it is out of sequence order
|
|---|
| 26 | ;"DoIENS(NextIENS,NextPatch,PckDirFName) -- install patch, given IENS to it's entry in 22709.11
|
|---|
| 27 | ;"GetPckVer(PckInit,Ver) -- query user for package, and desired version
|
|---|
| 28 | ;"GetLastPackage(PckInit,Ver) -- for given package initials, return the last patch applied
|
|---|
| 29 | ;"GetPVIEN(PckInit,Ver,IEN9d4,IEN9d49) -- convert PckInit and Ver into IEN's for file 9.4 ad 9.49
|
|---|
| 30 | ;"GetLastInst(PckInit,Ver,InstIEN) -- for given package initials, return the last patch applied in INSTALL file
|
|---|
| 31 | ;"GetVers(PckInit,VerArray) --for given package initials, return possible versions
|
|---|
| 32 | ;"PickFile(pArray) -- Pick a filename from a list, in a menu
|
|---|
| 33 |
|
|---|
| 34 | ;"=======================================================================
|
|---|
| 35 |
|
|---|
| 36 | Logo write !!,"===================",!
|
|---|
| 37 | write "TMG Patcher Helper",!
|
|---|
| 38 | write "===================",!
|
|---|
| 39 | quit
|
|---|
| 40 |
|
|---|
| 41 | DONEXT
|
|---|
| 42 | ;"Purpose: Ask for package, and install next appropriate patch
|
|---|
| 43 | do Logo
|
|---|
| 44 | new PckInit,Ver
|
|---|
| 45 | do GetPckVer(.PckInit,.Ver)
|
|---|
| 46 | if Ver="^" goto DNDone
|
|---|
| 47 | do DONEXTPK(PckInit,Ver)
|
|---|
| 48 | goto DONEXT
|
|---|
| 49 | DNDone
|
|---|
| 50 | quit
|
|---|
| 51 |
|
|---|
| 52 | DONEXTPJ
|
|---|
| 53 | ;"Purpose: to do next patch within the same project
|
|---|
| 54 | do Logo
|
|---|
| 55 | new PckInit,Ver
|
|---|
| 56 | new s set s=$get(^TMG("KIDS","PROJECT"))
|
|---|
| 57 | if s'="" do
|
|---|
| 58 | . set PckInit=$piece(s,"^",1)
|
|---|
| 59 | . set Ver=$piece(s,"^",2)
|
|---|
| 60 | else do
|
|---|
| 61 | . do GetPckVer(.PckInit,.Ver)
|
|---|
| 62 | . set s=PckInit_"^"_Ver
|
|---|
| 63 | . set ^TMG("KIDS","PROJECT")=s
|
|---|
| 64 | if Ver="^" goto DNDone
|
|---|
| 65 | do DONEXTPK(PckInit,Ver)
|
|---|
| 66 | DNPJDone
|
|---|
| 67 | quit
|
|---|
| 68 |
|
|---|
| 69 |
|
|---|
| 70 | FIXMISEQ
|
|---|
| 71 | ;"Purpose: to allow fixing a missing patch, based on sequence order
|
|---|
| 72 | do FixMissing(1)
|
|---|
| 73 | quit
|
|---|
| 74 |
|
|---|
| 75 |
|
|---|
| 76 | FIXMISPT
|
|---|
| 77 | ;"Purpose: to allow fixing a missing patch, based on patch number
|
|---|
| 78 | do FixMissing(2)
|
|---|
| 79 | quit
|
|---|
| 80 |
|
|---|
| 81 |
|
|---|
| 82 | FixMissing(Mode)
|
|---|
| 83 | ;"Purpose: to allow fixing a missing patch, even if it is out of sequence order
|
|---|
| 84 | ;" This will prepare, then call DoFixMissing()
|
|---|
| 85 | ;"Input: Mode -- 1: search by SEQ#, 2: search by Patch#
|
|---|
| 86 | do Logo
|
|---|
| 87 | write "Fix missing patches, regardless of order",!
|
|---|
| 88 | new PckInit,Ver
|
|---|
| 89 | do GetPckVer(.PckInit,.Ver) goto:(Ver="^") FMIDone
|
|---|
| 90 | ;"set IENS=$$AskIENS^TMGDBAPI(22709.01) goto:(IENS="") FMIDone
|
|---|
| 91 | do FixMisInit(.PckInit,.Ver,.Mode)
|
|---|
| 92 | FMDone quit
|
|---|
| 93 |
|
|---|
| 94 |
|
|---|
| 95 | FixMisInit(PckInit,Ver,Mode)
|
|---|
| 96 | ;"Purpose: Based on PckInit, and Version, allow fixing a missing patch, even if it is out of sequence order
|
|---|
| 97 | ;" This will prepare, then call DoFixMissing()
|
|---|
| 98 | ;"Input: Mode -- 1: search by SEQ#, 2: search by Patch#
|
|---|
| 99 | set PckInit=$get(PckInit) goto:(PckInit="") FMIDone
|
|---|
| 100 | set Ver=$get(Ver) goto:(Ver="") FMIDone
|
|---|
| 101 | new IENS set IENS=$$GetIENS2^TMGPAT2(PckInit_"*"_Ver) goto:(IENS="") FMIDone
|
|---|
| 102 | do DoFixMissing(IENS,.Mode)
|
|---|
| 103 | FMIDone quit
|
|---|
| 104 |
|
|---|
| 105 |
|
|---|
| 106 | DoFixMissing(IENS,Mode)
|
|---|
| 107 | ;"Purpose: fix a missing patch, even if it is out of sequence order
|
|---|
| 108 | ;"Input: IENS -- should be IENS from file 27709.01
|
|---|
| 109 | ;" i.e. 'IEN22709d01,IEN22709,'
|
|---|
| 110 | ;" Mode -- 1: search by SEQ#, 2: search by Patch#
|
|---|
| 111 |
|
|---|
| 112 | new PckInit,Ver,Y,PatchName,Msg,PckDirFName
|
|---|
| 113 | new IEN1 set IEN1=+$piece(IENS,",",2) goto:(IEN1'>0) FMSDone
|
|---|
| 114 | new IEN2 set IEN2=+$piece(IENS,",",1) goto:(IEN2'>0) FMSDone
|
|---|
| 115 | new IEN9d4 set IEN9d4=$piece($get(^TMG(22709,IEN1,0)),"^",1) goto:(IEN9d4'>0) FMSDone
|
|---|
| 116 | set PckInit=$piece($get(^DIC(9.4,IEN9d4,0)),"^",2)
|
|---|
| 117 | set Ver=$piece($get(^TMG(22709,IEN1,1,IEN2,0)),"^",1) goto:(Ver="") FMSDone
|
|---|
| 118 | new saveIENS set saveIENS=IENS
|
|---|
| 119 | set Mode=+$get(Mode,1)
|
|---|
| 120 |
|
|---|
| 121 | do MAKFRESH^TMGPAT2(PckInit,.Msg,.PckDirFName)
|
|---|
| 122 | FMLoop new SrchNum,DIR
|
|---|
| 123 | set DIR(0)="N^1:9999:0"
|
|---|
| 124 | if Mode=1 set DIR("A")="Enter missing patch SEQUENCE NUMBER"
|
|---|
| 125 | else set DIR("A")="Enter missing PATCH NUMBER"
|
|---|
| 126 | do ^DIR write !
|
|---|
| 127 | if $get(DIRUT) goto FMSDone
|
|---|
| 128 | set SrchNum=+Y
|
|---|
| 129 |
|
|---|
| 130 | ;"Search for specified Patch/Seq #
|
|---|
| 131 | new found set found=0
|
|---|
| 132 | new IEN3 set IEN3=0
|
|---|
| 133 | new PatchNum set PatchNum=0
|
|---|
| 134 | new SeqNum set SeqNum=0
|
|---|
| 135 | for set IEN3=$order(^TMG(22709,IEN1,1,IEN2,1,IEN3)) quit:(IEN3'>0)!found do
|
|---|
| 136 | . set PatchNum=$piece($get(^TMG(22709,IEN1,1,IEN2,1,IEN3,0)),"^",1)
|
|---|
| 137 | . set SeqNum=$piece($get(^TMG(22709,IEN1,1,IEN2,1,IEN3,0)),"^",2)
|
|---|
| 138 | . if (Mode=1),(SeqNum=SrchNum) set found=IEN3
|
|---|
| 139 | . else if (Mode=2),(PatchNum=SrchNum) set found=IEN3
|
|---|
| 140 | . if found do
|
|---|
| 141 | . . set IENS=IEN3_","_IENS
|
|---|
| 142 | . . set PatchName=PckInit_"*"_Ver_"*"_PatchNum_" SEQ #"_SeqNum
|
|---|
| 143 |
|
|---|
| 144 | if found=0 do goto FMSDone
|
|---|
| 145 | . write "Sorry. Can't find that Patch/Seq Number in downloaded info from ftp.va.gov",!
|
|---|
| 146 |
|
|---|
| 147 | write "Found: ",PatchName," on ftp.va.gov server.",!
|
|---|
| 148 |
|
|---|
| 149 | ;"Now see if already installed
|
|---|
| 150 | new DIC,X,Y,IEN9d49
|
|---|
| 151 | ;"set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
|---|
| 152 | set DIC="^DIC(9.4,"_IEN9d4_",22,"
|
|---|
| 153 | set DIC(0)="M"
|
|---|
| 154 | set X=Ver
|
|---|
| 155 | do ^DIC
|
|---|
| 156 | set IEN9d49=+Y
|
|---|
| 157 | if IEN9d49'>0 do goto FMSDone
|
|---|
| 158 | . write "?? Can't find that version in the PACKAGE file",!
|
|---|
| 159 |
|
|---|
| 160 | set found=0
|
|---|
| 161 | new i set i=""
|
|---|
| 162 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="")!found do
|
|---|
| 163 | . new onePatchNum set onePatchNum=$piece(i," ",1)
|
|---|
| 164 | . ;"write onePatchNum,!
|
|---|
| 165 | . if onePatchNum=PatchNum set found=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i,""))
|
|---|
| 166 |
|
|---|
| 167 | if found do goto FMSMore
|
|---|
| 168 | . new newIENS set newIENS=found_","_IEN9d49_","_IEN9d4
|
|---|
| 169 | . write "Sorry, that patch is already installed. IENS='",newIENS,"'",!
|
|---|
| 170 | . do ForceP2^TMGPAT2(PckInit,Ver,PatchNum,SeqNum)
|
|---|
| 171 |
|
|---|
| 172 |
|
|---|
| 173 | new % set %=1
|
|---|
| 174 | write "Do you want to work on this patch now (out of sequence order)" do YN^DICN write !
|
|---|
| 175 | if %'=1 goto FMSDone
|
|---|
| 176 |
|
|---|
| 177 | if $$DoIENS(IENS,PatchName,.PckDirFName) ;"actually process patch
|
|---|
| 178 |
|
|---|
| 179 | FMSMore set %=1
|
|---|
| 180 | write "Fix others in this same Package-Version" do YN^DICN write !
|
|---|
| 181 | if %=1 do goto FMLoop
|
|---|
| 182 | . set IENS=saveIENS
|
|---|
| 183 |
|
|---|
| 184 | FMSDone
|
|---|
| 185 | quit
|
|---|
| 186 |
|
|---|
| 187 |
|
|---|
| 188 | DONEXTPK(PckInit,Ver)
|
|---|
| 189 | ;"Purpose: a common entry point
|
|---|
| 190 | ;"Input: PckInit -- package initials
|
|---|
| 191 | ;" Ver -- version e.g. '22.0'
|
|---|
| 192 | ;"Result: None
|
|---|
| 193 |
|
|---|
| 194 | new LastPck,NextIENS,NextPatch,LastInst,PckDirFName
|
|---|
| 195 | new Info,Msg,Option,result,restart,InstIEN,abort,chgVer
|
|---|
| 196 |
|
|---|
| 197 | set (abort,restart,chgVer)=0
|
|---|
| 198 | do MAKFRESH^TMGPAT2(PckInit,.Msg,.PckDirFName)
|
|---|
| 199 | DNP1 set LastPck=$$GetLastPackage(PckInit,Ver)
|
|---|
| 200 | if LastPck="" do goto AllDone
|
|---|
| 201 | . write "Sorry, can't find any installed packges in that version.",!
|
|---|
| 202 | set LastInst=$$GetLastInst(PckInit,Ver,.InstIEN)
|
|---|
| 203 | write "The last patch installed into PACKAGE file was: ",?50,LastPck,!
|
|---|
| 204 | if LastInst="" goto DNP2
|
|---|
| 205 | write "The last patch loaded into the INSTALL file was: ",?50,LastInst," (FYI)",!
|
|---|
| 206 | if +$piece(LastPck,"SEQ #",2)<+$piece(LastInst,"SEQ #",2) do goto:(restart) AllDone
|
|---|
| 207 | . new % set %=2
|
|---|
| 208 | . write !,"Undelete entry in INSTALL FILE" do YN^DICN write !
|
|---|
| 209 | . if %=1 do quit
|
|---|
| 210 | . . do EN1^TMGXPDIU(InstIEN)
|
|---|
| 211 | . . set restart=1
|
|---|
| 212 | . set %=1
|
|---|
| 213 | . write "Try to continue with existing files" do YN^DICN write !
|
|---|
| 214 | . if %'=1 set restart=1 quit
|
|---|
| 215 | if restart goto AllDone
|
|---|
| 216 | DNP2 set NextIENS=$$GetNextIENS^TMGPAT2(LastPck,.NextPatch)
|
|---|
| 217 | new pendingCt set pendingCt=$$Rpt1Avail^TMGPAT3(LastPck)
|
|---|
| 218 | if pendingCt>0 write "Number of pending patches for this package:",?50,pendingCt,!
|
|---|
| 219 | else do goto:(chgVer) DNP1
|
|---|
| 220 | . if $$RptAvail^TMGPAT3(PckInit)=0 set chgVer=0 quit
|
|---|
| 221 | . do AskVer(PckInit,.Ver)
|
|---|
| 222 | . set chgVer=1
|
|---|
| 223 |
|
|---|
| 224 | if $$DoIENS(NextIENS,NextPatch,.PckDirFName)=0 goto AllDone
|
|---|
| 225 |
|
|---|
| 226 | More set %=1
|
|---|
| 227 | write "Do more patch installations in this package" do YN^DICN write !!
|
|---|
| 228 | if %=1 goto DNP1
|
|---|
| 229 | AllDone
|
|---|
| 230 | quit
|
|---|
| 231 |
|
|---|
| 232 | DoIENS(NextIENS,NextPatch,PckDirFName)
|
|---|
| 233 | ;"Purpose: install patch, given IENS to it's entry in 22709.11
|
|---|
| 234 | ;"Input: NextIENS -- IENS for entry in 22709.11
|
|---|
| 235 | ;" NextPatch -- Patch Name of patch to be applied.
|
|---|
| 236 | ;"Results: 1 if OK, 0 if problem.
|
|---|
| 237 |
|
|---|
| 238 | new abort set abort=0
|
|---|
| 239 | if NextPatch'="" do
|
|---|
| 240 | . write "Next patch to install is: ",?50,NextPatch,!
|
|---|
| 241 | else do goto DNPDone
|
|---|
| 242 | . write "No more patches available for this package.",!
|
|---|
| 243 | . set abort=1
|
|---|
| 244 | . quit; ;"//kt fix below later...
|
|---|
| 245 | . write "View list of all patches for this package on ftp server"
|
|---|
| 246 | . set %=2
|
|---|
| 247 | . do YN^DICN write !
|
|---|
| 248 | . if %=1 if $$EditHFSFile^TMGKERNL(PckDirFName)
|
|---|
| 249 | . if %=-1 set restart=1 quit
|
|---|
| 250 | new Option set Option("VERBOSE")=1
|
|---|
| 251 | set result=$$EnsureLocal^TMGPAT2(NextIENS,.Info,.Msg,.Option)
|
|---|
| 252 | if result=0 do goto DNPDone
|
|---|
| 253 | . do AddMsg^TMGPAT2("Unable to find patch on local file system.",1,Msg)
|
|---|
| 254 | . if $$ShowMsg^TMGPAT2(.Msg)
|
|---|
| 255 |
|
|---|
| 256 | new % set %=1
|
|---|
| 257 | if $get(Info("KID FILE"))'="" do PAnalyze^TMGPAT4(.Info,.Option)
|
|---|
| 258 | if $get(Info("TEXT FILE"))'="" do goto:(abort=1) DNPDone
|
|---|
| 259 | . do Analyze^TMGPAT4(.Info,.Option)
|
|---|
| 260 | . new tempMsg
|
|---|
| 261 | . do ShowAnalysis^TMGPAT4(.Info,.tempMsg)
|
|---|
| 262 | . if $$ShowMsg^TMGPAT2(.tempMsg,1)
|
|---|
| 263 | . kill tempMsg
|
|---|
| 264 | . new FilePathName set FilePathName=$get(Info("PATH"))_$get(Info("TEXT FILE"))
|
|---|
| 265 | . set %=1
|
|---|
| 266 | . write "View INFO FILE for patch" do YN^DICN write !
|
|---|
| 267 | . if %=-1 quit
|
|---|
| 268 | . if %=1 if $$EditHFSFile^TMGKERNL(FilePathName)
|
|---|
| 269 | . if $get(Info("KID FILE"))="" do
|
|---|
| 270 | . . new FName set FName=""
|
|---|
| 271 | . . if $get(Info("MULTI-PATCH","FILENAME"))'="" do
|
|---|
| 272 | . . . set Info("KID FILE")=Info("MULTI-PATCH","FILENAME")
|
|---|
| 273 | . . else if ($$ListCt^TMGMISC($name(Info("PATCH CATEGORY")))=1)&($data(Info("PATCH CATEGORY","Informational"))) quit
|
|---|
| 274 | . . else if $data(Info("MISC KID FILES")) do
|
|---|
| 275 | . . . write !,"No typical KIDS file found for this patch. However, one or more filenames",!
|
|---|
| 276 | . . . write "were scraped from the TEXT file. Having read the TEXT file, see if one of these",!
|
|---|
| 277 | . . . write "names is correct.",!!
|
|---|
| 278 | . . . set Info("KID FILE")=$$PickFile($name(Info("MISC KID FILES")))
|
|---|
| 279 | . . if $get(Info("KID FILE"))'="" set Info("TEXT ONLY")=0
|
|---|
| 280 | . . set FName=$get(Info("KID FILE"))
|
|---|
| 281 | . . if FName="" quit
|
|---|
| 282 | . . set %=2
|
|---|
| 283 | . . write !,"Attempt to download ",FName," from ftp.va.gov?",!
|
|---|
| 284 | . . write "NOTE: if this file doesn't exist on the server, then the process will HANG.",!
|
|---|
| 285 | . . write "If this happens, then use a utility to abort process #",$J," from OS prompt.",!
|
|---|
| 286 | . . write "Download '",FName,"'" do YN^DICN write !
|
|---|
| 287 | . . if %'=1 quit
|
|---|
| 288 | . . if $$DownloadPatch^TMGPAT2(FName,"ftp://",.Option,.tempMsg,.Info)=0
|
|---|
| 289 | . . . write "ERROR: Can't download file: ",Info("KID FILE")," from ftp server.",!
|
|---|
| 290 | . . . do PressToCont^TMGUSRIF
|
|---|
| 291 | . . . ;"handle error here...
|
|---|
| 292 | . . if $$ShowMsg^TMGPAT2(.tempMsg,1)
|
|---|
| 293 | if %=-1 goto DNPDone
|
|---|
| 294 |
|
|---|
| 295 | if $data(Info("STILL NEEDED")) do goto:(abort=1) DNPDone
|
|---|
| 296 | . new pArray set pArray=$name(Info("STILL NEEDED"))
|
|---|
| 297 | . do StoreMissing^TMGPAT3(PckInit,pArray)
|
|---|
| 298 | . write "It seems that the system is not ready for this patch.",!
|
|---|
| 299 | . write "(However, sometimes this can be ignored and one can proceed anyway.)",!
|
|---|
| 300 | . set %=1
|
|---|
| 301 | . write "Quit this patch and try another" do YN^DICN write !
|
|---|
| 302 | . if %'=2 set abort=1
|
|---|
| 303 |
|
|---|
| 304 | if $get(Info("TEXT ONLY"))=1 do goto DNPDone
|
|---|
| 305 | . write "This 'patch' doesn't have a corresponding KID file.",!
|
|---|
| 306 | . write "Perhaps it was informational only. I'm not smart enough to figure that out.",!
|
|---|
| 307 | . write "If you didn't read the INFO FILE, then answer NO, and loop back and read it.",!
|
|---|
| 308 | . set %=2
|
|---|
| 309 | . write "Ready to consider the patch 'installed'" do YN^DICN write !
|
|---|
| 310 | . if %'=1 quit
|
|---|
| 311 | . if $$MakePatchEntry^TMGPAT2(NextPatch,.Msg)
|
|---|
| 312 |
|
|---|
| 313 | if $get(Info("KID FILE"))="" do goto DNPDone
|
|---|
| 314 | . write "?? No name for KID file ??",!
|
|---|
| 315 |
|
|---|
| 316 | set %=1
|
|---|
| 317 | write "Ready to load patch "_Info("KID FILE")_" into system" do YN^DICN write !
|
|---|
| 318 | if %'=1 set %=-1 goto DNPDone
|
|---|
| 319 | new result set result=$$GO(.Option,.Info,.Msg)
|
|---|
| 320 |
|
|---|
| 321 | quit result
|
|---|
| 322 |
|
|---|
| 323 |
|
|---|
| 324 | GO(Option,Info,Msg)
|
|---|
| 325 | ;"Purpose: Entry point to allow automatic loading and installation of a patch.
|
|---|
| 326 | ;"Input: Option -- PASS BY REFERENCE. Can be an empty array.
|
|---|
| 327 | ;" Info -- PASS BY REFERENCE.
|
|---|
| 328 | ;" Msg -- PASS BY REFERNCE.
|
|---|
| 329 | ;"Results: 1 if OK, 0 if problem.
|
|---|
| 330 |
|
|---|
| 331 | new abort set abort=0
|
|---|
| 332 | set Option("HFSNAME")=$get(Info("PATH"))_Info("KID FILE")
|
|---|
| 333 | set Option("FORCE CONT LOAD")=1
|
|---|
| 334 | set Option("DO ENV CHECK")=1
|
|---|
| 335 | do EN1^TMGXPDIL(.Option,.Msg)
|
|---|
| 336 | new errorFound set errorFound=$$ShowMsg^TMGPAT2(.Msg,1)
|
|---|
| 337 | if errorFound goto DNP3
|
|---|
| 338 | new InstallName set InstallName=$get(Option("INSTALL NAME"))
|
|---|
| 339 | if InstallName="" do goto DNPDone
|
|---|
| 340 | . write "No installation name found. Aborting.",!
|
|---|
| 341 | . set abort=1
|
|---|
| 342 | new % set %=1
|
|---|
| 343 | write "Proceed with installation" do YN^DICN write !
|
|---|
| 344 | kill Msg
|
|---|
| 345 | new Option ;"... FINISH..., add presets to avoid user interactivity later...
|
|---|
| 346 | set Option("Want to DISABLE Scheduled Options, Menu Options, and Protocols","DEFAULT")="NO"
|
|---|
| 347 | set Option("Want KIDS to INHIBIT LOGONs during the install","DEFAULT")="NO"
|
|---|
| 348 | set Option("Want KIDS to Rebuild Menu Trees Upon Completion of Install","DEFAULT")="NO"
|
|---|
| 349 | if %=1 do EN^TMGXPDI(InstallName,.Option,.Msg)
|
|---|
| 350 | if $$ShowMsg^TMGPAT2(.Msg,1)
|
|---|
| 351 | DNP3
|
|---|
| 352 | new tempNull
|
|---|
| 353 | if $data(PckInit) do
|
|---|
| 354 | . do StoreMissing^TMGPAT3(PckInit,"tempNull") ;"clear out pending patches...
|
|---|
| 355 | else goto DNPDone
|
|---|
| 356 |
|
|---|
| 357 | set %=1
|
|---|
| 358 | write "Clean up local files for this patch" do YN^DICN write !
|
|---|
| 359 | if %=-1 goto DNPDone
|
|---|
| 360 | if %=1 do
|
|---|
| 361 | . new path set path=$get(Info("PATH"))
|
|---|
| 362 | . new fileName set fileName=$get(Info("KID FILE"))
|
|---|
| 363 | . if fileName'="" if $$DelFile^TMGIOUTL(path_fileName)
|
|---|
| 364 | . set fileName=$get(Info("TEXT FILE"))
|
|---|
| 365 | . if fileName'="" if $$DelFile^TMGIOUTL(path_fileName)
|
|---|
| 366 |
|
|---|
| 367 | DNPDone quit (abort=0)
|
|---|
| 368 |
|
|---|
| 369 |
|
|---|
| 370 | LOAD
|
|---|
| 371 | ;"Purpose: Entry point to allow manual loading of a patch (like old way, but using new code)
|
|---|
| 372 | do Logo^TMGPAT1 write !
|
|---|
| 373 | new FPName,FPath,FName,Msg,Option,Info
|
|---|
| 374 | set FPName=$$GetFName^TMGIOUTL("Select Patch to Load",,,,.FPath,.FName)
|
|---|
| 375 | if (FPName'="")&(FPName'="^") do
|
|---|
| 376 | . set Info("PATH")=FPath,Info("KID FILE")=FName
|
|---|
| 377 | . new result set result=$$GO(.Option,.Info,.Msg)
|
|---|
| 378 | quit
|
|---|
| 379 |
|
|---|
| 380 |
|
|---|
| 381 | GetPckVer(PckInit,Ver)
|
|---|
| 382 | ;"Purpose: query user for package, and desired version
|
|---|
| 383 | ;"Input: PckInit - PASS BY REFERENCE. An OUT PARAMETER. The package initials, e.g. 'DI' in the case of filemant
|
|---|
| 384 | ;" Ver -- PASS BY REFERENCE. An OUT PARAMETER. The version of the package to match.
|
|---|
| 385 | ;"results: none; (if user aborted, Ver="^")
|
|---|
| 386 |
|
|---|
| 387 | set Ver="^"
|
|---|
| 388 | new DIC,X,Y
|
|---|
| 389 | set DIC=9.4,DIC(0)="MAEQ" ;"ask for package name
|
|---|
| 390 | do ^DIC write !
|
|---|
| 391 | if +Y'>0 goto GPVDone
|
|---|
| 392 | new Package set Package=$piece(Y,"^",2)
|
|---|
| 393 | set PckInit=$piece($get(^DIC(9.4,+Y,0)),"^",2)
|
|---|
| 394 | if PckInit="" do goto GPVDone
|
|---|
| 395 | . write "Error. Unable to obtain package prefix.",!
|
|---|
| 396 | do AskVer(PckInit,.Ver)
|
|---|
| 397 |
|
|---|
| 398 | GPVDone quit
|
|---|
| 399 |
|
|---|
| 400 | AskVer(PckInit,Ver,Package)
|
|---|
| 401 | ;"Purpose: query user for desired version from specified package
|
|---|
| 402 | ;"Input: PckInit - The package initials, e.g. 'DI' in the case of filemant
|
|---|
| 403 | ;" Ver -- PASS BY REFERENCE. An OUT PARAMETER. The version of the package to match.
|
|---|
| 404 | ;" Package -- OPTIONAL. Name of Package. Default is same as PckInit
|
|---|
| 405 | ;"results: none; (if user aborted, Ver="^")
|
|---|
| 406 |
|
|---|
| 407 | new VerArray
|
|---|
| 408 | do GetVers(PckInit,.VerArray)
|
|---|
| 409 | if $data(VerArray)=0 do goto AVrDone
|
|---|
| 410 | . write "Error. No version number available.",!
|
|---|
| 411 | if $get(Package)="" set Package=PckInit
|
|---|
| 412 | ;
|
|---|
| 413 | new Menu,i,Usr
|
|---|
| 414 | set Menu(0)="Select Version of "_Package
|
|---|
| 415 | set Ver="",i=0
|
|---|
| 416 | for set Ver=$order(VerArray(Ver)) quit:(Ver="") do
|
|---|
| 417 | . set i=i+1
|
|---|
| 418 | . new tempPatch set tempPatch=PckInit_"*"_Ver_"*1"
|
|---|
| 419 | . new count set count=+$$Rpt1Avail^TMGPAT3(tempPatch)
|
|---|
| 420 | . set Menu(i)="Version "_Ver_" ("_count_" patches pending)"_$C(9)_Ver
|
|---|
| 421 | if i=1 set Ver=$order(VerArray("")) ;"must be only one option, so skip menu
|
|---|
| 422 | else do
|
|---|
| 423 | . set Ver=$$Menu^TMGUSRIF(.Menu,"^")
|
|---|
| 424 | ;
|
|---|
| 425 | AVrDone quit
|
|---|
| 426 |
|
|---|
| 427 |
|
|---|
| 428 | GetPVIEN(PckInit,Ver,IEN9d4,IEN9d49)
|
|---|
| 429 | ;"Purpose: to convert PckInit and Ver into IEN's for file 9.4 ad 9.49
|
|---|
| 430 | ;"Input: PckInit - . The package initials, e.g. 'DI' in the case of filemant
|
|---|
| 431 | ;" Ver -- The version of the package to match.
|
|---|
| 432 | ;" IEN9d4 - PASS BY REFERENCE. The IEN in 9.4 to return
|
|---|
| 433 | ;" IEN9d49 -- PASS BY REFERENCE. The IEN in 9.49 to return
|
|---|
| 434 | ;"result: 1 if OK, 0 if not found.
|
|---|
| 435 |
|
|---|
| 436 | new result set result=0
|
|---|
| 437 | ;
|
|---|
| 438 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
|---|
| 439 | if IEN9d4'>0 goto GPVIDne
|
|---|
| 440 | new DIC,X,Y
|
|---|
| 441 | set DIC="^DIC(9.4,"_IEN9d4_",22,"
|
|---|
| 442 | set DIC(0)="M"
|
|---|
| 443 | set X=Ver
|
|---|
| 444 | do ^DIC
|
|---|
| 445 | set IEN9d49=+Y
|
|---|
| 446 | if IEN9d49'>0 goto GPVIDne
|
|---|
| 447 | set result=1
|
|---|
| 448 | ;
|
|---|
| 449 | GPVIDne quit result
|
|---|
| 450 |
|
|---|
| 451 |
|
|---|
| 452 | GetLastPackage(PckInit,Ver)
|
|---|
| 453 | ;"Purpose: for given package initials, return the last patch applied
|
|---|
| 454 | ;" This searches the PACKAGE file
|
|---|
| 455 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
|---|
| 456 | ;" Ver -- the version of the package to match.
|
|---|
| 457 | ;"Results: returns e.g. 'DI*22.0*140 SEQ# 123'
|
|---|
| 458 | ;" or "" if problem or not found.
|
|---|
| 459 |
|
|---|
| 460 | new result set result=""
|
|---|
| 461 | set Ver=$get(Ver)
|
|---|
| 462 | set PckInit=$get(PckInit)
|
|---|
| 463 | if (PckInit="")!(Ver="") goto GLPDone
|
|---|
| 464 | new IEN9d4,IEN9d49
|
|---|
| 465 | set IEN9d4=+$order(^DIC(9.4,"C",PckInit,""))
|
|---|
| 466 | if IEN9d4'>0 goto GLPDone
|
|---|
| 467 | set IEN9d49=+$order(^DIC(9.4,IEN9d4,22,"B",Ver,""))
|
|---|
| 468 | if IEN9d49'>0 goto GLPDone
|
|---|
| 469 |
|
|---|
| 470 | new i,array
|
|---|
| 471 | set i=""
|
|---|
| 472 | for set i=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i)) quit:(i="") do
|
|---|
| 473 | . new patchNum set patchNum=$piece(i," ",1)
|
|---|
| 474 | . new seqNum set seqNum=$piece(i,"SEQ #",2)
|
|---|
| 475 | . new tempName set tempName=i
|
|---|
| 476 | . if seqNum="" do
|
|---|
| 477 | . . set tempName=PckInit_"*"_Ver_"*"_patchNum
|
|---|
| 478 | . . set tempName=$$GetSeq^TMGPAT4(tempName)
|
|---|
| 479 | . . set seqNum=$piece(tempName,"SEQ #",2)
|
|---|
| 480 | . . if seqNum="" quit
|
|---|
| 481 | . . new IEN9d4901 set IEN9d4901=$order(^DIC(9.4,IEN9d4,22,IEN9d49,"PAH","B",i,""))
|
|---|
| 482 | . . ;"write "The PACKAGE file entry for patch "_PckInit_"*"_Ver_"*"_patchNum_" doesn't have a SEQ #",!
|
|---|
| 483 | . . ;"write "By comparing this to patch files available on ftp.va.gov network site, it",!
|
|---|
| 484 | . . ;"write "appears that this patch should be SEQ #",tempName,!
|
|---|
| 485 | . . ;"new % set %=1
|
|---|
| 486 | . . ;"write "Shall I correct this in the PACKAGE file" do YN^DICN write !
|
|---|
| 487 | . . ;"if %'=1 quit
|
|---|
| 488 | . . new TMGFDA,TMGMSG
|
|---|
| 489 | . . set TMGFDA(9.4901,IEN9d4901_","_IEN9d49_","_IEN9d4_",",.01)=patchNum_" SEQ #"_seqNum
|
|---|
| 490 | . . do FILE^DIE("K","TMGFDA","TMGMSG")
|
|---|
| 491 | . . ;"do ShowIfDIERR^TMGDEBUG(.TMGMSG)
|
|---|
| 492 | . ;"if seqNum is still "" at this point, it won't find the patch, could be bug...
|
|---|
| 493 | . set seqNum=$$RJ^XLFSTR(seqNum,6,"0")
|
|---|
| 494 | . if tempName["*" set tempName=$piece(tempName,"*",3)
|
|---|
| 495 | . set array(seqNum)=tempName
|
|---|
| 496 |
|
|---|
| 497 | set i=$order(array(""),-1)
|
|---|
| 498 | if i'="" set result=PckInit_"*"_Ver_"*"_$get(array(i))
|
|---|
| 499 | else set result=PckInit_"*"_Ver_"*0 SEQ #0"
|
|---|
| 500 | ;"else set result=$piece($get(^DIC(9.4,IEN9d4,0)),"^",1)_" SEQ #0"
|
|---|
| 501 |
|
|---|
| 502 | GLPDone
|
|---|
| 503 | quit result
|
|---|
| 504 |
|
|---|
| 505 | GetLastInst(PckInit,Ver,InstIEN)
|
|---|
| 506 | ;"Purpose: for given package initials, return the last patch applied
|
|---|
| 507 | ;" This searches the INSTALL file
|
|---|
| 508 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
|---|
| 509 | ;" Ver -- the version of the package to match.
|
|---|
| 510 | ;" InstIEN -- Optional. Pass by Reference, an OUT PARAMETER.
|
|---|
| 511 | ;"Results: returns last patch + 'SEQ# 123' (123 is example)
|
|---|
| 512 | ;" or "" if problem or not found.
|
|---|
| 513 |
|
|---|
| 514 | new result set result=""
|
|---|
| 515 | new array
|
|---|
| 516 | set Ver=$get(Ver)
|
|---|
| 517 | new i set i=$get(PckInit)
|
|---|
| 518 | if (i="")!(Ver="") goto GLIDone
|
|---|
| 519 | new done set done=0
|
|---|
| 520 | for set i=$order(^XPD(9.7,"B",i)) quit:(i="")!done do
|
|---|
| 521 | . if $piece(i,"*",1)'=PckInit set done=1 quit
|
|---|
| 522 | . if $piece(i,"*",2)'=Ver quit
|
|---|
| 523 | . new patch set patch=$piece(i,"*",3)
|
|---|
| 524 | . set patch=$$RJ^XLFSTR(patch,6,"0")
|
|---|
| 525 | . new IEN set IEN=$order(^XPD(9.7,"B",i,""))
|
|---|
| 526 | . if IEN=0 quit
|
|---|
| 527 | . new seq set seq=$$GET1^DIQ(9.7,IEN_",",42001)
|
|---|
| 528 | . if seq="" quit
|
|---|
| 529 | . ;"write "SEQ #"_seq_" "_i,!
|
|---|
| 530 | . set array(seq)=i_" SEQ #"_seq_"^"_IEN
|
|---|
| 531 |
|
|---|
| 532 | set i=$order(array(""),-1)
|
|---|
| 533 | set result=$get(array(i))
|
|---|
| 534 | set InstIEN=$piece(result,"^",2)
|
|---|
| 535 | set result=$piece(result,"^",1)
|
|---|
| 536 |
|
|---|
| 537 | if result'="" do
|
|---|
| 538 | . new PatIEN set PatIEN=+$order(^XPD(9.7,"B",result,""))
|
|---|
| 539 | . if PatIEN=0 quit
|
|---|
| 540 | . new Seq set Seq=$$GET1^DIQ(9.7,PatIEN_",",42001)
|
|---|
| 541 | . if Seq="" quit
|
|---|
| 542 | . set result=result_" SEQ #"_Seq
|
|---|
| 543 |
|
|---|
| 544 | GLIDone
|
|---|
| 545 | quit result
|
|---|
| 546 |
|
|---|
| 547 |
|
|---|
| 548 |
|
|---|
| 549 | GetVers(PckInit,VerArray)
|
|---|
| 550 | ;"Purpose: for given package initials, return possible versions
|
|---|
| 551 | ;"Input: PckInit - the package initials, e.g. 'DI' in the case of filemant
|
|---|
| 552 | ;" VerArray -- PASS BY REFERENCE -- an OUT PARAMETER. Format
|
|---|
| 553 | ;" VerArray("22")=""
|
|---|
| 554 | ;" VerArray("23")=""
|
|---|
| 555 | ;"Results: none
|
|---|
| 556 |
|
|---|
| 557 | new ver
|
|---|
| 558 | kill VerArray
|
|---|
| 559 | if $get(PckInit)="" goto GVDone
|
|---|
| 560 | new done set done=0
|
|---|
| 561 | new ien9d4 set ien9d4=+$order(^DIC(9.4,"C",PckInit,"")) goto:(ien9d4'>0) GVDone
|
|---|
| 562 | set ver=""
|
|---|
| 563 | for set ver=$order(^DIC(9.4,ien9d4,22,"B",ver)) quit:(ver="")!done do
|
|---|
| 564 | . if ver'="" set VerArray(ver)=""
|
|---|
| 565 |
|
|---|
| 566 | GVDone quit
|
|---|
| 567 |
|
|---|
| 568 | ;"Discard below later ============================================
|
|---|
| 569 | for set i=$order(^XPD(9.7,"B",i)) quit:(i="")!done do
|
|---|
| 570 | . if i["*" do
|
|---|
| 571 | . . if $piece(i,"*",1)'=PckInit set done=1 quit
|
|---|
| 572 | . . set ver=$piece(i,"*",2)
|
|---|
| 573 | . else do
|
|---|
| 574 | . . new ien set ien=+$order(^XPD(9.7,"B",i,""))
|
|---|
| 575 | . . write i,!
|
|---|
| 576 | . . write "From the above name, please enter version number"
|
|---|
| 577 | . . new DIR set DIR(0)="N^0:999:2" do ^DIR write !
|
|---|
| 578 | . . if $data(DIRUT) set ver="" quit
|
|---|
| 579 | . . set ver=X ;"why doesn't Y return decimals???
|
|---|
| 580 | . . set done=1
|
|---|
| 581 | . if ver'="" set VerArray(ver)=""
|
|---|
| 582 | ;"Discard above later ============================================
|
|---|
| 583 |
|
|---|
| 584 |
|
|---|
| 585 | PickFile(pArray)
|
|---|
| 586 | ;"Purpose: Pick a filename from a list, in a menu
|
|---|
| 587 | ;"Input: pArray -- PASS BY NAME. format:
|
|---|
| 588 | ;" @pArray@(name)=""
|
|---|
| 589 | ;" @pArray@(name)=""
|
|---|
| 590 | ;"Result: the chosen name, or "" if problem.
|
|---|
| 591 |
|
|---|
| 592 | new menu set menu(0)="Select IF one of the following files is the patch file."
|
|---|
| 593 | new count set count=1
|
|---|
| 594 | new name set name=""
|
|---|
| 595 | for set name=$order(@pArray@(name)) quit:(name="") do
|
|---|
| 596 | . set menu(count)=name_$C(9)_name
|
|---|
| 597 | . set count=count+1
|
|---|
| 598 | set menu(count)="(None of these / Cancel)"_$C(9)_"@"
|
|---|
| 599 | set count=count+1
|
|---|
| 600 |
|
|---|
| 601 | set result=$$Menu^TMGUSRIF(.menu)
|
|---|
| 602 | if "@^"[result set result=""
|
|---|
| 603 | quit result |
|---|