cpee 2.1.7 → 2.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9723d9a647c3d39f739c125cbc6112254172a59b61c24d498c1ec4d53f9a6998
4
- data.tar.gz: 8945918c7a22d82a7936f1f76a322734f233e7ab701fa670f9a182ccbcd5c80b
3
+ metadata.gz: bdfedecb98660aba343a39fb374f7d54cd535c44e2093fb6c78d2ee7a5767cb6
4
+ data.tar.gz: 3efbefd7f8230e85bbf7cc2dd79b1a62a78c9ac755eab581b5b8f23b7c99bb55
5
5
  SHA512:
6
- metadata.gz: 7d7cb7f744225804de94c56b348c22e61cc2501aba291bddadcef2c1ae725f5280eeb9700065467d3b9289ec2fd15c3200708d557e3b94ffd03b190abd72c492
7
- data.tar.gz: 731e6e16864401821398d2274c230512abca96af46f74ff0c665bc90a4a9db00141972f52084ce4b84c076532507ca4f9e0bee8635a2913bf4533d4f5a2b56fb
6
+ metadata.gz: d23d6b7600162555d0ce52666c31df60534710867143a218d241cfc0cd4d764b82a1f3e10e13000936001bab2ee45cd06135a5bb93c551e88343e53e3fe2471d
7
+ data.tar.gz: 1c01c6bd32cb8697b659bcaf4fc72834d029467c37929906c0a23894e31144533d70de01cc8ab56c7226e89e2a20c6bea0c261400d735ab4450e9b2d9cfa9b8a
data/cpee.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee"
3
- s.version = "2.1.7"
3
+ s.version = "2.1.8"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "Preliminary release of cloud process execution engine (cpee.org). If you just need workflow execution, without a rest service exposing it, then use WEEL."
data/lib/cpee/redis.rb CHANGED
@@ -33,18 +33,25 @@ module CPEE
33
33
  end
34
34
  else # we always assume file socket if redis is startet locally
35
35
  opts[:redis_dyn] = Proc.new { Redis.new(path: File.join(opts[:basepath],opts[:redis_path]), db: opts[:redis_db].to_i) }
36
+ tried = false
36
37
  begin
37
38
  opts[:redis] = opts[:redis_dyn].call
38
39
  opts[:redis].dbsize
39
40
  rescue
40
- rcmd = opts[:redis_cmd]
41
- rcmd.gsub! /#redis_path#/, File.join(opts[:basepath],opts[:redis_path])
42
- rcmd.gsub! /#redis_db_dir#/, opts[:basepath]
43
- rcmd.gsub! /#redis_db_name#/, opts[:redis_db_name]
44
- rcmd.gsub! /#redis_pid#/, File.join(opts[:basepath],opts[:redis_pid])
45
- res = system rcmd
41
+ res = if tried
42
+ rcmd = opts[:redis_cmd]
43
+ rcmd.gsub! /#redis_path#/, File.join(opts[:basepath],opts[:redis_path])
44
+ rcmd.gsub! /#redis_db_dir#/, opts[:basepath]
45
+ rcmd.gsub! /#redis_db_name#/, opts[:redis_db_name]
46
+ rcmd.gsub! /#redis_pid#/, File.join(opts[:basepath],opts[:redis_pid])
47
+ system rcmd
48
+ else
49
+ true
50
+ end
46
51
  if res
52
+ tried = true
47
53
  puts 'starting redis ... it will keep running, just to let you know ...'
54
+ puts 'waiting for successful start ...'
48
55
  sleep 1
49
56
  retry
50
57
  else
data/tools/cpee CHANGED
@@ -162,6 +162,7 @@ elsif command == 'archive'
162
162
  names << File.basename(p2)
163
163
  end
164
164
  names.each do |name|
165
+ print "Working on: " + name.to_s + "\r"
165
166
  res = Typhoeus.get(File.join(base,name.to_s,'/'))
166
167
  if res.success?
167
168
  if res.headers['Content-Type'] =~ /^(text|application)\/xml/
@@ -193,6 +194,7 @@ elsif command == 'archive'
193
194
  end
194
195
  end
195
196
  end
197
+ puts
196
198
  elsif command == 'abandon'
197
199
  p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
198
200
  base = File.dirname(p1)
@@ -215,6 +217,7 @@ elsif command == 'abandon'
215
217
  names << File.basename(p1)
216
218
  end
217
219
  names.each do |name|
220
+ print "Working on: " + name.to_s + "\r"
218
221
  res1 = Typhoeus.get(File.join(base,name.to_s,'properties','state','/'))
219
222
  if res1.success?
220
223
  if res1.response_body == 'ready' || res1.response_body == 'stopped'
@@ -222,6 +225,7 @@ elsif command == 'abandon'
222
225
  end
223
226
  end
224
227
  end
228
+ puts
225
229
  elsif command == 'start'
226
230
  p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
227
231
  base = File.dirname(p1)
@@ -256,7 +260,31 @@ elsif command == 'start'
256
260
  end
257
261
  end
258
262
  elsif command == 'delete!'
259
- Typhoeus.delete(File.join(p1,'/'))
263
+ p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
264
+ base = File.dirname(p1)
265
+ names = []
266
+ if File.basename(p1) =~ /(\d+)-(\d+)/
267
+ names = ($1.to_i..$2.to_i).to_a
268
+ elsif File.basename(p1) == '*'
269
+ res = Typhoeus.get(File.join(base,'/'))
270
+ if res.success?
271
+ XML::Smart.string(res.response_body) do |doc|
272
+ doc.find('//instance/@id').each do |ele|
273
+ names << ele.value
274
+ end
275
+ end
276
+ names.reverse!
277
+ else
278
+ exit
279
+ end
280
+ else
281
+ names << File.basename(p1)
282
+ end
283
+ names.each do |name|
284
+ print "Working on: " + name.to_s + "\r"
285
+ Typhoeus.delete(File.join(base,name.to_s,'/'))
286
+ end
287
+ puts
260
288
  elsif command == 'new'
261
289
  if !File.exists?(p1)
262
290
  FileUtils.cp_r("#{curpath}/server/",p1)
data/tools/cpee.sic ADDED
@@ -0,0 +1,306 @@
1
+ #!/usr/bin/ruby
2
+ curpath = __dir__
3
+ require 'rubygems'
4
+ require 'optparse'
5
+ require 'fileutils'
6
+ require 'webrick'
7
+ require 'typhoeus'
8
+ require 'xml/smart'
9
+ require 'zip'
10
+ require 'pp'
11
+
12
+ def wrap(s, width=78, indent=18)
13
+ lines = []
14
+ line, s = s[0..indent-2], s[indent..-1]
15
+ s.split(/\n/).each do |ss|
16
+ ss.split(/[ \t]+/).each do |word|
17
+ if line.size + word.size >= width
18
+ lines << line
19
+ line = (" " * (indent)) + word
20
+ else
21
+ line << " " << word
22
+ end
23
+ end
24
+ lines << line if line
25
+ line = (" " * (indent-1))
26
+ end
27
+ return lines.join "\n"
28
+ end
29
+
30
+ ARGV.options { |opt|
31
+ opt.summary_indent = ' ' * 2
32
+ opt.summary_width = 15
33
+ opt.banner = "Usage:\n#{opt.summary_indent}#{File.basename($0)} [options] convert | ui | cpui DIR | new DIR | archive DIR URL | start URL | delete! URL | abandon URL\n"
34
+ opt.on("Options:")
35
+ opt.on("--help", "-h", "This text") { puts opt; exit }
36
+ opt.on("")
37
+ opt.on(wrap("[archive DIR URL] save properties from all finished instances listed at URL into DIR. Examples:\ncpee archive ./archive http://localhost:9298/1/\ncpee archive ./archive http://localhost:9298/1-200\ncpee archive ./archive http://localhost:9298/*"))
38
+ opt.on("")
39
+ opt.on(wrap("[abandon URL] running processes are stopped; ready or stopped processes are abandoned. Examples:\ncpee abandon http://localhost:9298/1/\ncpee abandon http://localhost:9298/1-200\ncpee abandon http://localhost:9298/*"))
40
+ opt.on("")
41
+ opt.on(wrap("[start URL] stopped processes are started; all others are not touched. Examples:\ncpee start http://localhost:9298/1\ncpee start http://localhost:9298/1-200\ncpee start http://localhost:9298/*"))
42
+ opt.on("")
43
+ opt.on(wrap("[delete! URL] DANGER ZONE. Vanishes forever. Not in archive. Examples:\ncpee delete! http://localhost:9298/1/"))
44
+ opt.on("")
45
+ opt.on(wrap("[new DIR] scaffolds a sample execution engine. Everything except instances can be removed for default behaviour."))
46
+ opt.on("")
47
+ opt.on(wrap("[cpui DIR] scaffolds a sample html client. New versions might require manual merging if you changed something."))
48
+ opt.on("")
49
+ opt.on(wrap("[ui] starts a simple static web server with the ui on http://localhost:8080. Use [cpui DIR] if you want stuff in apache or nginx."))
50
+ opt.on("")
51
+ opt.on(wrap("[convert] converts all testsets in the current directory to cpee2"))
52
+ opt.parse!
53
+ }
54
+ if (ARGV.length == 0) ||
55
+ (ARGV.length == 1 && !(%w(ui convert).include?(ARGV[0]))) ||
56
+ (ARGV.length == 2 && !(%w(abandon start delete! cpui new).include?(ARGV[0]))) ||
57
+ (ARGV.length == 3 && ARGV[0] != 'archive') ||
58
+ (ARGV.length > 3)
59
+ puts ARGV.options
60
+ exit
61
+ end
62
+ command = ARGV[0]
63
+ p1 = ARGV[1]
64
+ p2 = ARGV[2]
65
+ cockpit = "#{curpath}/../cockpit/"
66
+
67
+ def js_libs(cockpit)
68
+ res = Typhoeus.get('https://cpee.org/js_libs/js_libs.zip')
69
+ if res.success?
70
+ File.write(File.join(cockpit,'js_libs.zip'),res.response_body)
71
+ Zip::File.open(File.join(cockpit,'js_libs.zip')) do |zip_file|
72
+ zip_file.each do |entry|
73
+ case entry.ftype
74
+ when :directory
75
+ Dir.mkdir(File.join(cockpit,entry.name)) rescue nil
76
+ when :file
77
+ File.write(File.join(cockpit,entry.name),entry.get_input_stream.read)
78
+ when :symlink
79
+ FileUtils.ln_s(File.join('.',entry.get_input_stream.read),File.join(cockpit,entry.name), force: true)
80
+ end
81
+ end
82
+ end
83
+ true
84
+ else
85
+ puts 'Internet access required to download javascript libs from "http://cpee.org/js_libs/js_libs.zip".'
86
+ false
87
+ end
88
+ end
89
+
90
+ if command == 'ui'
91
+ if js_libs(cockpit)
92
+ s = WEBrick::HTTPServer.new(:Port => 8080, :DocumentRoot => cockpit)
93
+ trap("INT"){ s.shutdown }
94
+ s.start
95
+ end
96
+ elsif command == 'cpui'
97
+ if !File.exists?(p1)
98
+ FileUtils.cp_r(cockpit,p1)
99
+ else
100
+ FileUtils.cp_r(Dir.glob(File.join(cockpit,'*')),p1,remove_destination: true)
101
+ puts "Directory already exists, updating ..."
102
+ end
103
+ js_libs(p1)
104
+ elsif command == 'convert'
105
+ Dir['*.xml'].each do |f|
106
+ XML::Smart.modify(f) do |doc|
107
+ doc.register_namespace 'd', 'http://cpee.org/ns/description/1.0'
108
+ doc.register_namespace 'p', 'http://riddl.org/ns/common-patterns/properties/1.0'
109
+ doc.register_namespace 'x', 'http://cpee.org/ns/properties/2.0'
110
+ if doc.root.qname.name == 'testset'
111
+ doc.root.namespaces[nil] = 'http://cpee.org/ns/properties/2.0'
112
+ doc.root.namespace = nil
113
+
114
+ doc.find('//x:handlerwrapper').each do |e|
115
+ if e.text == 'DefaultHandlerWrapper'
116
+ doc.root.prepend('x:executionhandler','ruby')
117
+ end
118
+ end rescue nil
119
+ doc.find('//x:handlerwrapper').delete_all!
120
+ doc.find('//x:start_url').each do |e|
121
+ e.text = 'https://cpee.org/flow/start/url/'
122
+ end rescue nil
123
+ doc.find('//x:start_git').each do |e|
124
+ e.text = 'https://cpee.org/flow/start/git/'
125
+ end rescue nil
126
+ doc.find('//d:finalize | //d:update | //d:prepare | //d:rescue').each do |e|
127
+ if e.parent.qname.name != 'code'
128
+ n = e.parent
129
+ if (x = n.find('d:code')).any?
130
+ x.first.add(e)
131
+ else
132
+ n.add('d:code').add(e)
133
+ end
134
+ end
135
+ end rescue nil
136
+
137
+ doc.find('//p:*').each do |e|
138
+ e.namespaces.delete_all!
139
+ end rescue nil
140
+ end
141
+ end
142
+ end
143
+ elsif command == 'archive'
144
+ p2 = File.join(p2,'*') if p2 =~ /([a-zA-Z]|\/)$/
145
+ base = File.dirname(p2)
146
+ names = []
147
+ if File.basename(p2) =~ /(\d+)-(\d+)/
148
+ names = ($1.to_i..$2.to_i).to_a
149
+ elsif File.basename(p2) == '*'
150
+ res = Typhoeus.get(File.join(base,'/'))
151
+ if res.success?
152
+ XML::Smart.string(res.response_body) do |doc|
153
+ doc.find('//instance/@id').each do |ele|
154
+ names << ele.value
155
+ end
156
+ end
157
+ names.reverse!
158
+ else
159
+ exit
160
+ end
161
+ else
162
+ names << File.basename(p2)
163
+ end
164
+ names.each do |name|
165
+ print "Working on: " + name.to_s + "\r"
166
+ res = Typhoeus.get(File.join(base,name.to_s,'/'))
167
+ if res.success?
168
+ if res.headers['Content-Type'] =~ /^(text|application)\/xml/
169
+ XML::Smart.string(res.response_body) do |doc|
170
+ if doc.root.qname.to_s == "instances"
171
+ doc.root.children.each do |i|
172
+ if ["finished","abandoned"].include?(i.attributes['state']) || (["ready"].include?(i.attributes['state']) && Time.parse(i.attributes['changed']).to_i < Time.now-(60*60*24))
173
+ prop = Typhoeus.get(File.join(base,name.to_s,i.attributes['id'],'properties','/'))
174
+ if prop.success?
175
+ File.write(File.join(p1,i.attributes['uuid'] + '.xml'),prop.response_body) if prop.headers['Content-Type'] =~ /^(text|application)\/xml/
176
+ Typhoeus.delete(File.join(base,name.to_s,i.attributes['id'],'/'))
177
+ end
178
+ end
179
+ end
180
+ elsif doc.root.qname.to_s == "info"
181
+ prop = Typhoeus.get(File.join(base,name.to_s,'properties','/'))
182
+ if prop.success?
183
+ xprop = XML::Smart::string(prop.response_body)
184
+ xprop.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
185
+ if ["finished","abandoned"].include?(xprop.find("string(/p:properties/p:state)")) || (["ready"].include?(xprop.find("string(/p:properties/p:state)")) && Time.parse(xprop.find("string(/p:properties/p:state/@changed)")) < Time.now-(60*60*12))
186
+ uuid = xprop.find("string(/p:properties/p:attributes/p:uuid)")
187
+ id = name.to_s
188
+ File.write(File.join(p1,uuid + '.xml'),prop.response_body) if prop.headers['Content-Type'] =~ /^(text|application)\/xml/
189
+ Typhoeus.delete(File.join(base,name.to_s,'/'))
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+ puts
198
+ elsif command == 'abandon'
199
+ p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
200
+ base = File.dirname(p1)
201
+ names = []
202
+ if File.basename(p1) =~ /(\d+)-(\d+)/
203
+ names = ($1.to_i..$2.to_i).to_a
204
+ elsif File.basename(p1) == '*'
205
+ res = Typhoeus.get(File.join(base,'/'))
206
+ if res.success?
207
+ XML::Smart.string(res.response_body) do |doc|
208
+ doc.find('//instance/@id').each do |ele|
209
+ names << ele.value
210
+ end
211
+ end
212
+ names.reverse!
213
+ else
214
+ exit
215
+ end
216
+ else
217
+ names << File.basename(p1)
218
+ end
219
+ names.each do |name|
220
+ print "Working on: " + name.to_s + "\r"
221
+ res1 = Typhoeus.get(File.join(base,name.to_s,'properties','state','/'))
222
+ if res1.success?
223
+ if res1.response_body == 'ready' || res1.response_body == 'stopped'
224
+ Typhoeus.put(File.join(base,name.to_s,'properties','state','/'), headers: {'Content-Type' => 'application/x-www-form-urlencoded'}, body: "value=abandoned")
225
+ end
226
+ end
227
+ end
228
+ puts
229
+ elsif command == 'start'
230
+ p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
231
+ base = File.dirname(p1)
232
+ names = []
233
+ if File.basename(p1) =~ /(\d+)-(\d+)/
234
+ names = ($1.to_i..$2.to_i).to_a
235
+ elsif File.basename(p1) == '*'
236
+ res = Typhoeus.get(File.join(base,'/'))
237
+ if res.success?
238
+ XML::Smart.string(res.response_body) do |doc|
239
+ doc.find('//instance/@id').each do |ele|
240
+ names << ele.value
241
+ end
242
+ end
243
+ names.reverse!
244
+ else
245
+ exit
246
+ end
247
+ else
248
+ names << File.basename(p1)
249
+ end
250
+ names.each do |name|
251
+ res = Typhoeus.get(File.join(base,name.to_s,'properties','state','/'))
252
+ if res.success?
253
+ case res.response_body
254
+ when "stopped" then
255
+ keep_alive = Typhoeus.get(File.join(base,name.to_s,'properties','attributes','keep_alive','/'))
256
+ if keep_alive.success?
257
+ Typhoeus.put(File.join(base,name.to_s,'properties','state','/'), headers: {'Content-Type' => 'application/x-www-form-urlencoded'}, body: "value=running")
258
+ end
259
+ end
260
+ end
261
+ end
262
+ elsif command == 'delete!'
263
+ p1 = File.join(p1,'*') if p1 =~ /([a-zA-Z]|\/)$/
264
+ base = File.dirname(p1)
265
+ names = []
266
+ if File.basename(p1) =~ /(\d+)-(\d+)/
267
+ names = ($1.to_i..$2.to_i).to_a
268
+ elsif File.basename(p1) == '*'
269
+ res = Typhoeus.get(File.join(base,'/'))
270
+ if res.success?
271
+ XML::Smart.string(res.response_body) do |doc|
272
+ doc.find('//instance/@id').each do |ele|
273
+ names << ele.value
274
+ end
275
+ end
276
+ names.reverse!
277
+ else
278
+ exit
279
+ end
280
+ else
281
+ names << File.basename(p1)
282
+ end
283
+ names.each do |name|
284
+ print "Working on: " + name.to_s + "\r"
285
+ Typhoeus.delete(File.join(base,name.to_s,'/'))
286
+ end
287
+ puts
288
+ elsif command == 'new'
289
+ if !File.exists?(p1)
290
+ FileUtils.cp_r("#{curpath}/server/",p1)
291
+ FileUtils.mkdir("#{p1}/archive") rescue nil
292
+ FileUtils.mkdir("#{p1}/instances") rescue nil
293
+ FileUtils.mkdir("#{p1}/resources") rescue nil
294
+ FileUtils.mkdir("#{p1}/executionhandler") rescue nil
295
+ Dir["#{curpath}/../systemd/*.service"].each do |f|
296
+ nam = File.basename f
297
+ cont = File.read(f)
298
+ cont.gsub!(/{CPEEUSER}/,`whoami`.strip)
299
+ cont.gsub!(/{CPEEWORKINGDIR}/,"#{File.realpath(p1)}")
300
+ cont.gsub!(/{CPEESERVER}/,"#{File.realpath(p1)}/server")
301
+ File.write("#{p1}/#{nam}",cont)
302
+ end
303
+ else
304
+ puts 'Directory already exists.'
305
+ end
306
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.7
4
+ version: 2.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: tools
12
12
  cert_chain: []
13
- date: 2021-06-22 00:00:00.000000000 Z
13
+ date: 2021-06-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: riddl
@@ -641,6 +641,7 @@ files:
641
641
  - server/server.conf
642
642
  - server/server.rb
643
643
  - tools/cpee
644
+ - tools/cpee.sic
644
645
  - tools/server/cpee
645
646
  - tools/server/resources/notifications/logging/subscription.xml
646
647
  - tools/server/resources/properties.init