cpee 1.4.29 → 1.4.30
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 +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
|