1 | TMGEDIT ;TMG/kst/Interface to allow use of linux editor in Fileman ;03/25/06
|
---|
2 | ;;1.0;TMG-LIB;**1**;7/19/08
|
---|
3 |
|
---|
4 | ;"TMG EDITOR FUNCTIONS
|
---|
5 |
|
---|
6 | ;"=======================================================================
|
---|
7 | ;" API -- Public Functions.
|
---|
8 | ;"=======================================================================
|
---|
9 | ;"$$EDIT(Editor)
|
---|
10 |
|
---|
11 | ;"=======================================================================
|
---|
12 | ;"PRIVATE API FUNCTIONS
|
---|
13 | ;"=======================================================================
|
---|
14 |
|
---|
15 |
|
---|
16 | ;"=======================================================================
|
---|
17 | ;"=======================================================================
|
---|
18 |
|
---|
19 | EDIT(Editor)
|
---|
20 | ;"Purpose: This will be a shell for a linux editor
|
---|
21 | ;"Input: Editor -- the name of the linux editor to use (i.e. vim, joe, pico etc)
|
---|
22 | ;" Allowed values: joe,vim,pico
|
---|
23 | ;"Note: When this function gets called, VistA sets up some variables
|
---|
24 | ;" first to tell what should be edited etc.
|
---|
25 | ;" DIC=The global root of the WP field where the text to be edited is
|
---|
26 | ;" stored (or where new text should be stored)
|
---|
27 | ;" e.g. "^TMG(22702,27,DV,"
|
---|
28 | ;" (DV is also predefined, so reference to DV in DIC is covered.)
|
---|
29 | ;" There are other variables set up re margins etc. I will be ignoring these.
|
---|
30 | ;"Results: none
|
---|
31 |
|
---|
32 | new result set result=0
|
---|
33 | new GlobalP
|
---|
34 |
|
---|
35 | ;"By limiting value to certain values, it prevents a rouge user from putting a wedged
|
---|
36 | ;"linux command into "Editor" and executing a system command through zsystem.
|
---|
37 | set Editor=$get(Editor,"rvim")
|
---|
38 | if (Editor'="rvim")&(Editor'="joe")&(Editor'="pico")&(Editor'="nano") goto EditAbort
|
---|
39 |
|
---|
40 | ;"Only allow users with programmer access to use joe
|
---|
41 | if (Editor="joe") do if result=1 goto EditAbort
|
---|
42 | . new AccessCode set AccessCode=$get(DUZ(0))
|
---|
43 | . if AccessCode'["@" do
|
---|
44 | . . write !!,"*** Sorry. Insufficient security clearance to use insecure 'joe' editor. ***",!
|
---|
45 | . . write "Fileman access code of @ required, because JOE can shell out to linux prompt.",!!
|
---|
46 | . . write "Please enter 'User's Toolbox', then 'Edit User Characteristics' at a menu",!
|
---|
47 | . . write " option to change PREFERRED EDITOR to something other than JOE.",!!
|
---|
48 | . . set result=1
|
---|
49 |
|
---|
50 | new EditErrFile set EditErrFile="/tmp/trashjoeoutput.txt"
|
---|
51 |
|
---|
52 | set GlobalP=$extract(DIC,1,$length(DIC)-1)_")" ;"convert to closed form
|
---|
53 | new Filename set Filename=$$UNIQUE^%ZISUTL("/tmp/vistaedit.tmp")
|
---|
54 | set result=$$WP2HFSfp^TMGIOUTL(GlobalP,Filename)
|
---|
55 | if result=0 goto EditDone
|
---|
56 |
|
---|
57 |
|
---|
58 | new HookCmd
|
---|
59 | set HookCmd=Editor_" "_Filename_" 2>"_EditErrFile ;"use NULL instead??
|
---|
60 | zsystem HookCmd
|
---|
61 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only). 0=success
|
---|
62 | if result>0 goto EditDone
|
---|
63 |
|
---|
64 | ;"read file back into global WP
|
---|
65 | set result=$$HFS2WPfp^TMGIOUTL(Filename,GlobalP)
|
---|
66 | ;"if result=1 do
|
---|
67 |
|
---|
68 | EditDone
|
---|
69 | new temp set temp=$$DelFile^TMGIOUTL(Filename)
|
---|
70 | set temp=$$DelFile^TMGIOUTL(Filename_"~") ;"joe editor copies output to filename~ as a backup
|
---|
71 | set temp=$$DelFile^TMGIOUTL(EditErrFile)
|
---|
72 | EditAbort
|
---|
73 | quit
|
---|
74 |
|
---|
75 |
|
---|
76 |
|
---|
77 | LinuxEdit(Editor,FullPathName)
|
---|
78 | ;"Purpose: This will be a shell for a linux editor
|
---|
79 | ;"Input: Editor -- the name of the linux editor to use (i.e. vim, joe, pico etc)
|
---|
80 | ;" Allowed values: joe,vim,pico
|
---|
81 | ;" FullPathName -- the path name on the Linux HFS to edit.
|
---|
82 | ;"Results: none
|
---|
83 |
|
---|
84 | new result set result=0
|
---|
85 | new GlobalP
|
---|
86 |
|
---|
87 | ;"By limiting value to certain values, it prevents a rouge user from putting a wedged
|
---|
88 | ;"linux command into "Editor" and executing a system command through zsystem.
|
---|
89 | set Editor=$get(Editor,"rvim")
|
---|
90 | if (Editor'="rvim")&(Editor'="joe")&(Editor'="pico") goto LEditAbort
|
---|
91 |
|
---|
92 | ;"Only allow users with programmer access to use joe
|
---|
93 | if (Editor="joe") do if result=1 goto EditAbort
|
---|
94 | . new AccessCode
|
---|
95 | . set AccessCode=$piece(^VA(200,DUZ,0),"^",4)
|
---|
96 | . if AccessCode'="@" do
|
---|
97 | . . write !!,"*** Sorry. Insufficient security clearance to use insecure 'joe' editor. ***",!
|
---|
98 | . . write "Please enter 'User's Toolbox', then 'Edit User Characteristics' at a menu",!
|
---|
99 | . . write " option to change PREFERRED EDITOR to something other than JOE.",!!
|
---|
100 | . . set result=1
|
---|
101 |
|
---|
102 | ;"new EditErrFile set EditErrFile="/tmp/trashjoeoutput.txt"
|
---|
103 |
|
---|
104 | new Filename set Filename=FullPathName
|
---|
105 |
|
---|
106 | new HookCmd
|
---|
107 | ;"set HookCmd=Editor_" "_Filename_" 2>"_EditErrFile ;"use NULL instead??
|
---|
108 | set HookCmd=Editor_" "_Filename
|
---|
109 | zsystem HookCmd
|
---|
110 | set result=$ZSYSTEM&255 ;"get result of execution. (low byte only). 0=success
|
---|
111 | if result>0 goto LEditDone
|
---|
112 |
|
---|
113 |
|
---|
114 | LEditDone
|
---|
115 | ;"set temp=$$DelFile^TMGIOUTL(Filename_"~") ;"joe editor copies output to filename~ as a backup
|
---|
116 | ;"set temp=$$DelFile^TMGIOUTL(EditErrFile)
|
---|
117 | LEditAbort
|
---|
118 | quit
|
---|
119 |
|
---|
120 |
|
---|