cpee 2.1.11 → 2.1.12

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: efeba53ef2a09db39df28177cc7238d5df7c14277815e0a3f79ada2f7860222d
4
- data.tar.gz: 8dd7c732a2067bc8e98ca9c71282baeb76d1e429f66b232cf6f24eccddf188ea
3
+ metadata.gz: 18b365831308d00c63c51738bb800255bb0fe6813f4cf368e7ec60b32609a2b8
4
+ data.tar.gz: a777bc87bcea1990238ff50950a0179c8b9076774496a53ed7bb1eedc2cb875c
5
5
  SHA512:
6
- metadata.gz: e04e0dc7f1c15874fafb119045594a564c5f956a3609800d7c18717a9e8da5365d86db978c72404c231b2a32421da5f1f8d03a6ae5a516aea7fcb8ba06ee619c
7
- data.tar.gz: 5d629666c2a58c1f1545b8222b243ab5f05ca9cc30629979daaa1a286188270d3699ea195176e943fc2cb45ca2a9fd28f350b9ca663fbdfa924f335a539a59f1
6
+ metadata.gz: 6b4c1476fffb5bfa7b7bbadebc9af1cdf2a8b8703ff15f4378946661613e95be0b3fbf54416637d63e4410f5563a723ca0e91a3fddaaeeb5e60a49e63e82eecd
7
+ data.tar.gz: 1f274d19467c64173562ba9d01dd97c192dd1b2a5ce15556d866c00fa0908e13666361b59bda02f5222b04c68a131940ac942b633c4cefcc4bb7e1e240c52873
@@ -12,15 +12,15 @@
12
12
  <description xmlns="http://cpee.org/ns/description/1.0">
13
13
  <call id="a1" endpoint="worklist">
14
14
  <parameters>
15
- <label>"OK OR NOT OK"</label>
15
+ <label>OK OR NOT OK</label>
16
16
  <method>:post</method>
17
17
  <arguments>
18
- <orgmodel>"organisation1"</orgmodel>
19
- <domain>"Virtual Business 1"</domain>
20
- <form>"http://cpee.org/~demo/form/form-f.html"</form>
21
- <role>"Regular"</role>
22
- <schaden>"55546"</schaden>
23
- <text>"fetzen hin"</text>
18
+ <orgmodel>organisation1</orgmodel>
19
+ <domain>Virtual Business 1</domain>
20
+ <form>http://cpee.org/~demo/form/form-f.html</form>
21
+ <role>Regular</role>
22
+ <schaden>55546</schaden>
23
+ <text>fetzen hin</text>
24
24
  </arguments>
25
25
  </parameters>
26
26
  <code>
@@ -44,4 +44,4 @@
44
44
  <design_stage>development</design_stage>
45
45
  <design_dir>Templates.dir</design_dir>
46
46
  </attributes>
47
- </testset>
47
+ </testset>
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.11"
3
+ s.version = "2.1.12"
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."
@@ -27,4 +27,5 @@ Gem::Specification.new do |s|
27
27
  s.add_runtime_dependency 'json', '~>2.1'
28
28
  s.add_runtime_dependency 'redis', '~> 4.1'
29
29
  s.add_runtime_dependency 'rubyzip', '~>2'
30
+ s.add_runtime_dependency 'charlock_holmes', '~>0'
30
31
  end
@@ -252,7 +252,7 @@ module CPEE
252
252
  end
253
253
 
254
254
  @headers << Riddl::Header.new("CPEE-INSTANCE", id.to_s)
255
- @headers << Riddl::Header.new("CPEE-INSTANCE-URL", File.join(opts[:url].to_s,id.to_s))
255
+ @headers << Riddl::Header.new("CPEE-INSTANCE-URL", File.join(opts[:url].to_s,id.to_s,'/'))
256
256
  @headers << Riddl::Header.new("CPEE-INSTANCE-UUID", uuid)
257
257
 
258
258
  Riddl::Parameter::Simple.new("id", id.to_s)
@@ -12,6 +12,8 @@
12
12
  # CPEE (file COPYING in the main directory). If not, see
13
13
  # <http://www.gnu.org/licenses/>.
14
14
 
15
+ require 'charlock_holmes'
16
+
15
17
  class ConnectionWrapper < WEEL::ConnectionWrapperBase
16
18
  def self::loop_guard(arguments,id,count) # {{{
17
19
  controller = arguments[0]
@@ -101,7 +103,7 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
101
103
  params << Riddl::Header.new("CPEE-INSTANCE",@controller.instance_id)
102
104
  params << Riddl::Header.new("CPEE-INSTANCE-URL",@controller.instance_url)
103
105
  params << Riddl::Header.new("CPEE-INSTANCE-UUID",@controller.uuid)
104
- params << Riddl::Header.new("CPEE-CALLBACK",@controller.instance_url + '/callbacks/' + callback)
106
+ params << Riddl::Header.new("CPEE-CALLBACK",File.join(@controller.instance_url,'callbacks',callback,'/'))
105
107
  params << Riddl::Header.new("CPEE-CALLBACK-ID",callback)
106
108
  params << Riddl::Header.new("CPEE-ACTIVITY",@handler_position)
107
109
  params << Riddl::Header.new("CPEE-LABEL",@label||'')
@@ -239,6 +241,14 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
239
241
  result
240
242
  end
241
243
 
244
+ def detected_encoding(text)
245
+ CharlockHolmes::EncodingDetector.detect(text)[:encoding] || 'ISO-8859-1'
246
+ end
247
+
248
+ def convert_to_utf8(text)
249
+ CharlockHolmes::Converter.convert(text, detected_encoding(text), "UTF-8")
250
+ end
251
+
242
252
  def structurize_result(result)
243
253
  result.map do |r|
244
254
  if r.is_a? Riddl::Parameter::Simple
@@ -96,10 +96,10 @@ class Controller
96
96
  @opts[:host]
97
97
  end
98
98
  def base_url
99
- @opts[:url]
99
+ File.join(@opts[:url],'/')
100
100
  end
101
101
  def instance_url
102
- File.join(@opts[:url].to_s,@id.to_s)
102
+ File.join(@opts[:url].to_s,@id.to_s,'/')
103
103
  end
104
104
  def instance_id
105
105
  @id
@@ -84,11 +84,11 @@ Daemonite.new do |opts|
84
84
  opts[:redis].publish("forward:#{instance}/#{subscription_key}",mess)
85
85
  else
86
86
  client = Riddl::Client.new(url)
87
- callback = m['instance-url'] + '/callbacks/' + subscription_key
87
+ callback = File.join(m['instance-url'],'/callbacks/',subscription_key,'/')
88
88
  status, result, headers = (client.post [
89
- Riddl::Header.new("CPEE-BASE",m['cpee']),
89
+ Riddl::Header.new("CPEE-BASE",File.join(m['cpee'],'/')),
90
90
  Riddl::Header.new("CPEE-INSTANCE",m['instance']),
91
- Riddl::Header.new("CPEE-INSTANCE-URL",m['instance-url']),
91
+ Riddl::Header.new("CPEE-INSTANCE-URL",File.join(m['instance-url'],'/')),
92
92
  Riddl::Header.new("CPEE-INSTANCE-UUID",m['instance-uuid']),
93
93
  Riddl::Header.new("CPEE-CALLBACK",callback),
94
94
  Riddl::Header.new("CPEE-CALLBACK-ID",subscription_key),
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.11
4
+ version: 2.1.12
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-29 00:00:00.000000000 Z
13
+ date: 2021-08-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: riddl
@@ -102,6 +102,20 @@ dependencies:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
104
  version: '2'
105
+ - !ruby/object:Gem::Dependency
106
+ name: charlock_holmes
107
+ requirement: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ type: :runtime
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
105
119
  description: see http://cpee.org
106
120
  email: juergen.mangler@gmail.com
107
121
  executables:
@@ -632,18 +646,13 @@ files:
632
646
  - server/resources/states.xml
633
647
  - server/resources/topics.xml
634
648
  - server/resources/transformation.xml
635
- - server/routing/end.pid
636
649
  - server/routing/end.rb
637
- - server/routing/forward-events.pid
638
650
  - server/routing/forward-events.rb
639
- - server/routing/forward-votes.pid
640
651
  - server/routing/forward-votes.rb
641
- - server/routing/persist.pid
642
652
  - server/routing/persist.rb
643
653
  - server/server.conf
644
654
  - server/server.rb
645
655
  - tools/cpee
646
- - tools/cpee.sic
647
656
  - tools/server/cpee
648
657
  - tools/server/resources/notifications/logging/subscription.xml
649
658
  - tools/server/resources/properties.init
@@ -1 +0,0 @@
1
- 42643
@@ -1 +0,0 @@
1
- 42631
@@ -1 +0,0 @@
1
- 42635
@@ -1 +0,0 @@
1
- 42639
data/tools/cpee.sic DELETED
@@ -1,306 +0,0 @@
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