@@ -45,14 +45,31 @@ class ServerConfig
4545 # # but it can be called without an environment
4646 # end
4747
48- # Show-casing some useful overrides, as well as fixing some module doc permissions
48+ # Show-casing some useful overrides, as well as adjusting some module doc permissions
4949 alias_method :original_deploy_modules , :deploy_modules
5050 alias_method :original_deploy_rest , :deploy_rest
51+ alias_method :original_deploy , :deploy
5152 alias_method :original_clean , :clean
5253
54+ # Integrate deploy_packages into the Roxy deploy command
55+ def deploy
56+ what = ARGV . shift
57+
58+ case what
59+ when 'packages'
60+ deploy_packages
61+ else
62+ ARGV . unshift what
63+ original_deploy
64+ end
65+ end
66+
5367 def deploy_modules
54- # Uncomment deploy_packages if you would like to use MLPM to deploy MLPM packages.
55- # You can also move mlpm.json into src/ext/ and deploy plain modules (not REST extensions) that way.
68+ # Uncomment deploy_packages if you would like to use MLPM to deploy MLPM packages, and
69+ # include MLPM deploy in deploy modules to make sure MLPM depencencies are loaded first.
70+
71+ # Note: you can also move mlpm.json into src/ext/ and deploy plain modules (not REST extensions) that way.
72+
5673 #deploy_packages
5774 original_deploy_modules
5875 end
@@ -63,59 +80,68 @@ def deploy_packages
6380 -p #{ @ml_password } \
6481 -H #{ @properties [ 'ml.server' ] } \
6582 -P #{ @properties [ 'ml.app-port' ] } !
66- fix_permissions ( @properties [ "ml.modules-db" ] )
83+ change_permissions ( @properties [ "ml.modules-db" ] )
6784 end
6885
6986 def deploy_rest
7087 original_deploy_rest
71- fix_permissions ( @properties [ "ml.modules-db" ] )
88+ change_permissions ( @properties [ "ml.modules-db" ] )
7289 end
7390
74- def fix_permissions ( where )
75- logger . info "Fixing permissions in #{ where } for documents:"
76- if where . include? "content"
77- # This is useful to make sure alert configuration is accessible
78- r = execute_query (
79- %Q{
80- xquery version "1.0-ml";
91+ # Permissions need to be changed for executable code that was not deployed via Roxy directly,
92+ # to make sure users with app-role can read and execute it. Typically applies to artifacts
93+ # installed via REST api, which only applies permissions for rest roles. Effectively also includes
94+ # MLPM, which uses REST api for deployment. It often also applies to artifacts installed with
95+ # custom code (via app_specific for instance), like alerts.
96+ def change_permissions ( where )
97+ logger . info "Changing permissions in #{ where } for:"
98+ r = execute_query (
99+ %Q{
100+ xquery version "1.0-ml";
81101
82- for $uri in cts:uri-match("*alert*")
83- return (
84- $uri,
85- xdmp:document-set-permissions($uri, (
86- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "read"),
87- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "update"),
88- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "execute")
89- ))
90- )
91- } ,
92- { :db_name => where }
93- )
94- else
95- r = execute_query (
96- %Q{
97- xquery version "1.0-ml";
98-
99- for $uri in cts:uris()
102+ let $new-permissions := (
103+ xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "read"),
104+ xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "update"),
105+ xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "execute")
106+ )
107+
108+ let $uris :=
109+ if (fn:contains(xdmp:database-name(xdmp:database()), "content")) then
110+
111+ (: This is to make sure all alert files are accessible :)
112+ cts:uri-match("*alert*")
113+
114+ else
115+
116+ (: This is to make sure all triggers, schemas, modules and REST extensions are accessible :)
117+ cts:uris()
118+
119+ let $fixes :=
120+ for $uri in $uris
121+ let $existing-permissions := xdmp:document-get-permissions($uri)
122+
123+ (: Only apply new permissions if really necessary (gives better logging too):)
100124 where not(ends-with($uri, "/"))
125+ and count($existing-permissions[fn:string(.) = $new-permissions/fn:string(.)]) ne 3
126+
101127 return (
102- $uri,
103- xdmp:document-set-permissions($uri, (
104- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "read"),
105- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "update"),
106- xdmp:permission("#{ @properties [ "ml.app-name" ] } -role", "execute")
107- ))
108- )
109- } ,
110- { :db_name => where }
111- )
112- end
113-
128+ " " || $uri,
129+ xdmp:document-set-permissions($uri, $new-permissions)
130+ )
131+ return
132+ if ($fixes) then
133+ $fixes
134+ else
135+ " no changes needed.."
136+ } ,
137+ { :db_name => where }
138+ )
114139 r . body = parse_json r . body
115140 logger . info r . body
116141 logger . info ""
117142 end
118-
143+
144+ # Integrate clean_collections into the Roxy clean command
119145 def clean
120146 what = ARGV . shift
121147
@@ -154,7 +180,7 @@ def clean_collections()
154180# commands included into Roxy help. (ml -h)
155181#
156182
157- # class Help
183+ class Help
158184# def self.app_specific
159185# <<-DOC.strip_heredoc
160186#
@@ -177,4 +203,27 @@ def clean_collections()
177203# --whatever=value
178204# DOC
179205# end
180- #end
206+ class <<self
207+ alias_method :original_deploy , :deploy
208+
209+ def deploy
210+ # Concatenate extra lines of documentation after original deploy
211+ # Help message (with a bit of indent to make it look better)
212+ original_deploy + " " +
213+ <<-DOC . strip_heredoc
214+ packages # deploys MLPM modules and REST extensions using MLPM to the app-port
215+ DOC
216+ end
217+ alias_method :original_clean , :clean
218+
219+ def clean
220+ # Concatenate extra lines of documentation after original clean
221+ # Help message (with a bit of indent to make it look better)
222+ original_clean + "\n " +
223+ <<-DOC . strip_heredoc
224+ collections WHAT
225+ # removes all files from (comma-separated list of) WHAT collection(s) in the content database
226+ DOC
227+ end
228+ end
229+ end
0 commit comments