cpee 1.4.29 → 1.4.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cockpit/css/track.css +1 -0
- data/cockpit/index.html +10 -1
- data/cockpit/js/instance.js +13 -6
- data/cockpit/track.html +34 -1
- data/cpee.gemspec +2 -1
- data/server/handlerwrappers/default.rb +91 -38
- data/server/resources/transformation_dslx.xsl +2 -2
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3af489d577c4dea65d15939ddba88e8f1ed6782583aa641ca534a38fe83ef310
|
4
|
+
data.tar.gz: 05ee4ea40caf21bd323f999dfb7b089312f7bf7502be0b4576b91cf838e16658
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a836d6cba5336a23f026fb7a46946f85fa7cace8c3832bdebece0459e683138f7bc6056737eb84cd1231f26d59323500dac1fa8e7aa60b55d17dc65984e1f2d4
|
7
|
+
data.tar.gz: 998e48a4b3d21a7afbde101282ed0b3153fad3741a675a604b309dc1c7d53961348f6255e7bf179c719ec68d88bc0d5b54e422a1395539cfc28f7da906622652
|
data/cockpit/css/track.css
CHANGED
data/cockpit/index.html
CHANGED
@@ -180,7 +180,16 @@
|
|
180
180
|
<tbody class='exe'>
|
181
181
|
<tr>
|
182
182
|
<td>State:</td>
|
183
|
-
<td id='state'
|
183
|
+
<td id='state'>
|
184
|
+
<span id="state_text"></span>
|
185
|
+
<span> ⇒ </span>
|
186
|
+
<button name="state_start" title='start'>Start</button>
|
187
|
+
<button name="state_stop" title='stop'>Stop</button>
|
188
|
+
<span> / </span>
|
189
|
+
<button name="state_sim" title='simulate'>Sim</button>
|
190
|
+
<span> / </span>
|
191
|
+
<button name="state_abandon" title='abandon'>Abandon</button>
|
192
|
+
</td>
|
184
193
|
</tr>
|
185
194
|
<tr>
|
186
195
|
<td>Continue:</td>
|
data/cockpit/js/instance.js
CHANGED
@@ -75,6 +75,10 @@ function cockpit() { //{{{
|
|
75
75
|
$("button[name=loadmodeltype]").click(function(e){new CustomMenu(e).menu($('#modeltypes'),load_modeltype, $("button[name=loadmodeltype]")); });
|
76
76
|
$("button[name=savetestset]").click(function(){ save_testset(); });
|
77
77
|
$("button[name=savesvg]").click(function(){ save_svg(); });
|
78
|
+
$("button[name=state_start]").click(function(){ $(this).attr("disabled","disabled");start_instance(); });
|
79
|
+
$("button[name=state_stop]").click(function(){ $(this).attr("disabled","disabled");stop_instance(); });
|
80
|
+
$("button[name=state_simulate]").click(function(){ $(this).attr("disabled","disabled");sim_instance(); });
|
81
|
+
$("button[name=state_abandon]").click(function(){ aba_instance(); });
|
78
82
|
$("input[name=votecontinue]").click(check_subscription);
|
79
83
|
$("input[name=testsetfile]").change(load_testsetfile_after);
|
80
84
|
$("input[name=modelfile]").change(load_modelfile_after);
|
@@ -543,9 +547,6 @@ function monitor_instance_state_change(notification) { //{{{
|
|
543
547
|
if (notification != save['state']) {
|
544
548
|
save['state'] = notification;
|
545
549
|
|
546
|
-
var ctv = $("#state");
|
547
|
-
ctv.empty();
|
548
|
-
|
549
550
|
if (notification == "stopped") {
|
550
551
|
monitor_instance_pos();
|
551
552
|
}
|
@@ -555,9 +556,15 @@ function monitor_instance_state_change(notification) { //{{{
|
|
555
556
|
|
556
557
|
var but = "";
|
557
558
|
if (notification == "ready" || notification == "stopped") {
|
558
|
-
|
559
|
+
$("button[name=state_start]").show();
|
560
|
+
$("button[name=state_stop]").hide();
|
561
|
+
$("button[name=state_sim]").show();
|
562
|
+
$("button[name=state_abandon]").show();
|
559
563
|
} else if (notification == "running") {
|
560
|
-
|
564
|
+
$("button[name=state_start]").hide();
|
565
|
+
$("button[name=state_stop]").show();
|
566
|
+
$("button[name=state_sim]").hide();
|
567
|
+
$("button[name=state_abandon]").hide();
|
561
568
|
}
|
562
569
|
|
563
570
|
// disable all input, also check themes
|
@@ -573,7 +580,7 @@ function monitor_instance_state_change(notification) { //{{{
|
|
573
580
|
$('#parameters .tabbehind button').show();
|
574
581
|
}
|
575
582
|
|
576
|
-
|
583
|
+
$("#state_text").text(notification);
|
577
584
|
}
|
578
585
|
} //}}}
|
579
586
|
function monitor_instance_pos_change(notification) {// {{{
|
data/cockpit/track.html
CHANGED
@@ -62,7 +62,40 @@
|
|
62
62
|
<div id="trackfull">
|
63
63
|
<div id='graphcolumn'>
|
64
64
|
<div id="usage">
|
65
|
-
<span id="title"></span> | <span id='state'
|
65
|
+
<span id="title"></span> | <span id='state'>
|
66
|
+
<span id="state_text"></span>
|
67
|
+
<span> ⇒ </span>
|
68
|
+
<button name="state_start" title='start'>
|
69
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
70
|
+
<path
|
71
|
+
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
72
|
+
d="M 1.1000001e-6,1.0403124e-6 5.0000006e-7,10.583335 6.6145841,5.2916677 Z"/>
|
73
|
+
</svg>
|
74
|
+
</button>
|
75
|
+
<button name="state_stop" title='stop'>
|
76
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
77
|
+
<path
|
78
|
+
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
79
|
+
d="m 3.9687505,1.3375769 1e-6,7.9374995 2.645832,1e-6 V 1.3375772 Z m -3.96875,0 v 7.9375005 h 2.645833 V 1.3375769 Z"/>
|
80
|
+
</svg>
|
81
|
+
</button>
|
82
|
+
<span> / </span>
|
83
|
+
<button name="state_sim" title='simulate'>
|
84
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
85
|
+
<path
|
86
|
+
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
87
|
+
d="M 0,7.0741552 1.598154,6.8788136 q 0.144277,1.0115903 0.58266,1.4859901 0.443932,0.474402 1.193067,0.474402 0.793528,0 1.193066,-0.418589 0.405089,-0.4255654 0.405089,-0.990661 0,-0.362777 -0.172025,-0.6139303 Q 4.633538,6.5578953 4.211802,6.3695302 3.923247,6.2439536 2.896654,5.9230353 1.575957,5.5114228 1.04324,4.911445 0.294105,4.0672905 0.294105,2.8533821 q 0,-0.7813662 0.349596,-1.4580852 Q 0.998846,0.7116014 1.659195,0.3558006 2.325092,0 3.262898,0 4.794462,0 5.565794,0.8441546 6.342674,1.6883092 6.381518,3.0975591 L 4.73897,3.1882531 Q 4.633538,2.3999106 4.283941,2.0580629 3.939894,1.7092386 3.246251,1.7092386 q -0.71584,0 -1.120927,0.3697537 -0.260811,0.2372006 -0.260811,0.6348602 0,0.3627771 0.244164,0.6209071 0.31075,0.3278947 1.509366,0.6836954 1.198616,0.3558008 1.770178,0.7395073 0.577111,0.3767302 0.898962,1.0394962 0.327399,0.6557896 0.327399,1.6255215 0,0.8790367 -0.388439,1.6464517 -0.388442,0.767412 -1.098732,1.1441413 -0.710291,0.369755 -1.770178,0.369755 -1.542663,0 -2.369485,-0.8929903 Q 0.160924,8.7903717 0,7.0741552 Z"/>
|
88
|
+
</svg>
|
89
|
+
</button>
|
90
|
+
<span> / </span>
|
91
|
+
<button name="state_abandon" title='abandon'>
|
92
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
93
|
+
<path
|
94
|
+
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
95
|
+
d="m 5e-7,1.3229172 h 2.645833 V 5.0000007e-7 h 1.322917 V 1.3229172 h 2.645833 V 2.6458339 H 5e-7 Z m 2.645833,2.6458332 v 3.96875 l 1.322917,10e-8 v -3.96875 z M 5e-7,10.583333 l 6.614584,1e-6 -1e-6,-6.6145835 h -1.322916 v 5.2916667 h -3.96875 V 3.9687505 H 5e-7 Z"/>
|
96
|
+
</svg>
|
97
|
+
</button>
|
98
|
+
</span>
|
66
99
|
</div>
|
67
100
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:x="http://www.w3.org/1999/xlink" id='graphcanvas' width='1' height='1'></svg>
|
68
101
|
</div>
|
data/cpee.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cpee"
|
3
|
-
s.version = "1.4.
|
3
|
+
s.version = "1.4.30"
|
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). If you just need workflow execution, without a rest/xmpp service exposing it, then use WEEL"
|
@@ -26,5 +26,6 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_runtime_dependency 'savon', '~> 2'
|
27
27
|
s.add_runtime_dependency 'highline', '~> 1.6'
|
28
28
|
s.add_runtime_dependency 'json', '~>2.1'
|
29
|
+
s.add_runtime_dependency 'opca', '~>0', '>= 0.13'
|
29
30
|
s.add_runtime_dependency 'rubyzip', '~>1.2'
|
30
31
|
end
|
@@ -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 'opcua/client'
|
16
|
+
|
15
17
|
class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
|
16
18
|
def self::inform_state_change(arguments,newstate) # {{{
|
17
19
|
controller = arguments[0]
|
@@ -51,54 +53,105 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
|
|
51
53
|
@sensors = parameters[:sensors]
|
52
54
|
@controller.notify("activity/calling", :instance => @controller.instance, :instance_uuid => @controller.uuid, :label => @label, :instance_name => @controller.info, :activity => @handler_position, :passthrough => passthrough, :endpoint => @handler_endpoint, :parameters => parameters, :timestamp => Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L%:z"), :attributes => @controller.attributes_translated)
|
53
55
|
if passthrough.to_s.empty?
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
if
|
61
|
-
|
56
|
+
if @handler_endpoint.start_with?('opc.tcp')
|
57
|
+
if @handler_endpoint =~ /^opc.tcp.read:\/\/([^\/]+)\/(\d+)\/(.+)/
|
58
|
+
nid = $3 == $3.to_i.to_s ? $3.to_i : $3
|
59
|
+
ns = $2
|
60
|
+
url = 'opc.tcp://' + $1
|
61
|
+
client = OPCUA::Client.new(url)
|
62
|
+
if (node = client.get ns.to_i, nid)
|
63
|
+
result = node.value
|
62
64
|
else
|
63
|
-
|
65
|
+
raise 'invalid nodeid'
|
66
|
+
end
|
67
|
+
client.disconnect
|
68
|
+
callback [Riddl::Parameter::Simple.new('value',result)], {}
|
69
|
+
elsif @handler_endpoint =~ /^opc.tcp.write:\/\/([^\/]+)\/(\d+)\/([^\?]+)(\?value=(.*))?/
|
70
|
+
nid = $3 == $3.to_i.to_s ? $3.to_i : $3
|
71
|
+
ns = $2
|
72
|
+
par = $5
|
73
|
+
url = 'opc.tcp://' + $1
|
74
|
+
client = OPCUA::Client.new(url)
|
75
|
+
if (node = client.get ns.to_i, nid)
|
76
|
+
(parameters[:arguments] || [→(:name => 'value', :value => par)] || []).each do |ele|
|
77
|
+
what = CPEE::ValueHelper::parse(ele.value)
|
78
|
+
node.value = what
|
79
|
+
result = what
|
80
|
+
end
|
81
|
+
else
|
82
|
+
raise 'invalid nodeid'
|
83
|
+
end
|
84
|
+
client.disconnect
|
85
|
+
callback [Riddl::Parameter::Simple.new('value',result)], {}
|
86
|
+
elsif @handler_endpoint =~ /^opc.tcp.execute:\/\/([^\/]+)\/(\d+)\/([^\?]+)(\?value=(.*))?/
|
87
|
+
nid = $3 == $3.to_i.to_s ? $3.to_i : $3
|
88
|
+
ns = $2
|
89
|
+
par = $5
|
90
|
+
url = 'opc.tcp://' + $1
|
91
|
+
client = OPCUA::Client.new(url)
|
92
|
+
if (node = client.get ns.to_i, nid)
|
93
|
+
params = []
|
94
|
+
(parameters[:arguments] || []).each do |ele|
|
95
|
+
what = CPEE::ValueHelper::parse(ele.value)
|
96
|
+
params << what
|
97
|
+
end
|
98
|
+
result = node.call *params
|
99
|
+
else
|
100
|
+
raise 'invalid nodeid'
|
101
|
+
end
|
102
|
+
client.disconnect
|
103
|
+
callback [Riddl::Parameter::Simple.new('value',result)], {}
|
104
|
+
end
|
105
|
+
else
|
106
|
+
params = []
|
107
|
+
callback = Digest::MD5.hexdigest(Kernel::rand().to_s)
|
108
|
+
(parameters[:arguments] || []).each do |s|
|
109
|
+
if s.respond_to?(:mimetype)
|
110
|
+
params << Riddl::Parameter::Complex.new(s.name.to_s,v.mimetype,v.value)
|
111
|
+
else
|
112
|
+
if s.name.to_s =~ /__$/
|
113
|
+
params << Riddl::Parameter::Simple.new(s.name.to_s.chop.chop,CPEE::ValueHelper::generate(s.value),:query)
|
114
|
+
else
|
115
|
+
params << Riddl::Parameter::Simple.new(s.name.to_s,CPEE::ValueHelper::generate(s.value))
|
116
|
+
end
|
64
117
|
end
|
65
118
|
end
|
66
|
-
end
|
67
119
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
120
|
+
params << Riddl::Header.new("CPEE-BASE",@controller.base_url)
|
121
|
+
params << Riddl::Header.new("CPEE-INSTANCE",@controller.instance)
|
122
|
+
params << Riddl::Header.new("CPEE-INSTANCE-URL",@controller.instance_url)
|
123
|
+
params << Riddl::Header.new("CPEE-INSTANCE-UUID",@controller.uuid)
|
124
|
+
params << Riddl::Header.new("CPEE-CALLBACK",@controller.instance_url + '/callbacks/' + callback)
|
125
|
+
params << Riddl::Header.new("CPEE-CALLBACK-ID",callback)
|
126
|
+
params << Riddl::Header.new("CPEE-ACTIVITY",@handler_position)
|
127
|
+
params << Riddl::Header.new("CPEE-LABEL",parameters[:label]||'')
|
128
|
+
@controller.attributes.each do |key,value|
|
129
|
+
params << Riddl::Header.new("CPEE-ATTR-#{key.to_s.gsub(/_/,'-')}",value)
|
130
|
+
end
|
79
131
|
|
80
|
-
|
81
|
-
|
132
|
+
tendpoint = @handler_endpoint.sub(/^http(s)?-(get|put|post|delete):/,'http\\1:')
|
133
|
+
type = $2 || parameters[:method] || 'post'
|
82
134
|
|
83
|
-
|
135
|
+
client = Riddl::Client.new(tendpoint)
|
84
136
|
|
85
|
-
|
86
|
-
|
137
|
+
@controller.callbacks[callback] = CPEE::Callback.new("callback activity: #{@handler_position}",self,:callback,nil,nil,:http)
|
138
|
+
@handler_passthrough = callback
|
87
139
|
|
88
|
-
|
140
|
+
status, result, headers = client.request type => params
|
89
141
|
|
90
|
-
|
142
|
+
raise "Could not #{type || 'post'} #{tendpoint} - status: #{status}: #{result&.dig(0)&.value&.read}" if status < 200 || status >= 300
|
91
143
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
144
|
+
if headers['CPEE_INSTANTIATION']
|
145
|
+
@controller.notify("task/instantiation", :instance => @controller.instance, :label => @label, :instance_name => @controller.info, :instance_uuid => @controller.uuid, :activity => @handler_position, :endpoint => @handler_endpoint, :received => CPEE::ValueHelper.parse(headers['CPEE_INSTANTIATION']), :timestamp => Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L%:z"), :attributes => @controller.attributes_translated)
|
146
|
+
end
|
147
|
+
if headers['CPEE_CALLBACK'] && headers['CPEE_CALLBACK'] == 'true' && result.any?
|
148
|
+
headers['CPEE_UPDATE'] = true
|
149
|
+
callback result, headers
|
150
|
+
elsif headers['CPEE_CALLBACK'] && headers['CPEE_CALLBACK'] == 'true' && result.empty?
|
151
|
+
# do nothing, later on things will happend
|
152
|
+
else
|
153
|
+
callback result
|
154
|
+
end
|
102
155
|
end
|
103
156
|
else
|
104
157
|
@controller.callbacks[passthrough] = CPEE::Callback.new("callback activity: #{@handler_position}",self,:callback,nil,nil,:http)
|
@@ -445,7 +445,7 @@
|
|
445
445
|
<xsl:param name="myspace"/>
|
446
446
|
<xsl:if test="text()">
|
447
447
|
<xsl:for-each select="str:tokenize(text(), '
')">
|
448
|
-
<xsl:value-of select="concat('
',concat(str:padding($myspace+$myspacemultiplier+$myspacemultiplier),str:replace(str:replace(string(.),'\','\\'),'"','\"')))" />
|
448
|
+
<xsl:value-of select="concat('
',concat(str:padding($myspace+$myspacemultiplier+$myspacemultiplier),str:replace(str:replace(str:replace(string(.),'\','\\'),'"','\"'),'#','\#')))" />
|
449
449
|
</xsl:for-each>
|
450
450
|
<xsl:call-template name="print-newline"/>
|
451
451
|
<xsl:call-template name="print-space">
|
@@ -474,7 +474,7 @@
|
|
474
474
|
</xsl:otherwise>
|
475
475
|
</xsl:choose>
|
476
476
|
<xsl:for-each select="str:tokenize(text(), '
')">
|
477
|
-
<xsl:value-of select="concat('
',concat(str:padding($myspace+$myspacemultiplier+$myspacemultiplier),str:replace(str:replace(string(.),'\','\\'),'"','\"')))" />
|
477
|
+
<xsl:value-of select="concat('
',concat(str:padding($myspace+$myspacemultiplier+$myspacemultiplier),str:replace(str:replace(str:replace(string(.),'\','\\'),'"','\"'),'#','\#')))" />
|
478
478
|
</xsl:for-each>
|
479
479
|
<xsl:call-template name="print-newline"/>
|
480
480
|
<xsl:call-template name="print-space">
|
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: 1.4.
|
4
|
+
version: 1.4.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: tools
|
13
13
|
cert_chain: []
|
14
|
-
date: 2019-
|
14
|
+
date: 2019-07-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: riddl
|
@@ -83,6 +83,26 @@ dependencies:
|
|
83
83
|
- - "~>"
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: '2.1'
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: opca
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - "~>"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0.13'
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0.13'
|
86
106
|
- !ruby/object:Gem::Dependency
|
87
107
|
name: rubyzip
|
88
108
|
requirement: !ruby/object:Gem::Requirement
|