cpee 2.1.7 → 2.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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