ruote 0.9.18
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.
- data/README.txt +24 -0
- data/bin/validate-workflow.rb +89 -0
- data/examples/about_state.rb +81 -0
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +247 -0
- data/examples/flowtracing.rb +24 -0
- data/examples/homeworkreview.rb +68 -0
- data/examples/kotoba.rb +22 -0
- data/examples/mano_tracker.rb +172 -0
- data/examples/openwferu.rb +58 -0
- data/examples/quotereporter.rb +157 -0
- data/examples/scheduler_cron_usage.rb +48 -0
- data/examples/scheduler_usage.rb +56 -0
- data/lib/openwfe.rb +41 -0
- data/lib/openwfe/contextual.rb +111 -0
- data/lib/openwfe/def.rb +46 -0
- data/lib/openwfe/engine.rb +37 -0
- data/lib/openwfe/engine/engine.rb +756 -0
- data/lib/openwfe/engine/expool_methods.rb +172 -0
- data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
- data/lib/openwfe/engine/participant_methods.rb +133 -0
- data/lib/openwfe/engine/status_methods.rb +353 -0
- data/lib/openwfe/engine/update_exp_methods.rb +112 -0
- data/lib/openwfe/exceptions.rb +51 -0
- data/lib/openwfe/expool/errorjournal.rb +476 -0
- data/lib/openwfe/expool/expressionpool.rb +1144 -0
- data/lib/openwfe/expool/expstorage.rb +403 -0
- data/lib/openwfe/expool/history.rb +174 -0
- data/lib/openwfe/expool/journal.rb +224 -0
- data/lib/openwfe/expool/journal_replay.rb +321 -0
- data/lib/openwfe/expool/parser.rb +242 -0
- data/lib/openwfe/expool/representation.rb +121 -0
- data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
- data/lib/openwfe/expool/wfidgen.rb +388 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
- data/lib/openwfe/expressions/condition.rb +244 -0
- data/lib/openwfe/expressions/environment.rb +246 -0
- data/lib/openwfe/expressions/expressionmap.rb +258 -0
- data/lib/openwfe/expressions/fe_cancel.rb +109 -0
- data/lib/openwfe/expressions/fe_command.rb +241 -0
- data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
- data/lib/openwfe/expressions/fe_cron.rb +259 -0
- data/lib/openwfe/expressions/fe_cursor.rb +259 -0
- data/lib/openwfe/expressions/fe_define.rb +192 -0
- data/lib/openwfe/expressions/fe_do.rb +168 -0
- data/lib/openwfe/expressions/fe_equals.rb +291 -0
- data/lib/openwfe/expressions/fe_filter.rb +129 -0
- data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
- data/lib/openwfe/expressions/fe_fqv.rb +250 -0
- data/lib/openwfe/expressions/fe_if.rb +303 -0
- data/lib/openwfe/expressions/fe_iterator.rb +145 -0
- data/lib/openwfe/expressions/fe_listen.rb +371 -0
- data/lib/openwfe/expressions/fe_losfor.rb +111 -0
- data/lib/openwfe/expressions/fe_misc.rb +421 -0
- data/lib/openwfe/expressions/fe_participant.rb +269 -0
- data/lib/openwfe/expressions/fe_reserve.rb +212 -0
- data/lib/openwfe/expressions/fe_save.rb +274 -0
- data/lib/openwfe/expressions/fe_sequence.rb +117 -0
- data/lib/openwfe/expressions/fe_set.rb +139 -0
- data/lib/openwfe/expressions/fe_sleep.rb +166 -0
- data/lib/openwfe/expressions/fe_step.rb +159 -0
- data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
- data/lib/openwfe/expressions/fe_timeout.rb +127 -0
- data/lib/openwfe/expressions/fe_wait.rb +78 -0
- data/lib/openwfe/expressions/fe_when.rb +142 -0
- data/lib/openwfe/expressions/filter.rb +104 -0
- data/lib/openwfe/expressions/flowexpression.rb +847 -0
- data/lib/openwfe/expressions/iterator.rb +221 -0
- data/lib/openwfe/expressions/merge.rb +84 -0
- data/lib/openwfe/expressions/raw.rb +547 -0
- data/lib/openwfe/expressions/rprocdef.rb +375 -0
- data/lib/openwfe/expressions/time.rb +333 -0
- data/lib/openwfe/expressions/timeout.rb +178 -0
- data/lib/openwfe/expressions/value.rb +126 -0
- data/lib/openwfe/filterdef.rb +259 -0
- data/lib/openwfe/flowexpressionid.rb +357 -0
- data/lib/openwfe/listeners/listener.rb +97 -0
- data/lib/openwfe/listeners/listeners.rb +139 -0
- data/lib/openwfe/listeners/socketlisteners.rb +272 -0
- data/lib/openwfe/logging.rb +122 -0
- data/lib/openwfe/omixins.rb +95 -0
- data/lib/openwfe/orest/controlclient.rb +119 -0
- data/lib/openwfe/orest/definitions.rb +113 -0
- data/lib/openwfe/orest/exception.rb +60 -0
- data/lib/openwfe/orest/oldrestservlet.rb +279 -0
- data/lib/openwfe/orest/osocket.rb +148 -0
- data/lib/openwfe/orest/restclient.rb +176 -0
- data/lib/openwfe/orest/workitem.rb +206 -0
- data/lib/openwfe/orest/worklistclient.rb +272 -0
- data/lib/openwfe/orest/xmlcodec.rb +670 -0
- data/lib/openwfe/participants.rb +38 -0
- data/lib/openwfe/participants/enoparticipants.rb +230 -0
- data/lib/openwfe/participants/participant.rb +141 -0
- data/lib/openwfe/participants/participantmap.rb +249 -0
- data/lib/openwfe/participants/participants.rb +407 -0
- data/lib/openwfe/participants/soapparticipants.rb +135 -0
- data/lib/openwfe/participants/socketparticipants.rb +202 -0
- data/lib/openwfe/participants/storeparticipants.rb +254 -0
- data/lib/openwfe/rudefinitions.rb +130 -0
- data/lib/openwfe/service.rb +103 -0
- data/lib/openwfe/storage/yamlcustom.rb +106 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
- data/lib/openwfe/tools/flowtracer.rb +81 -0
- data/lib/openwfe/util/dollar.rb +217 -0
- data/lib/openwfe/util/irb.rb +86 -0
- data/lib/openwfe/util/observable.rb +144 -0
- data/lib/openwfe/util/ometa.rb +62 -0
- data/lib/openwfe/util/workqueue.rb +124 -0
- data/lib/openwfe/util/xml.rb +418 -0
- data/lib/openwfe/utils.rb +554 -0
- data/lib/openwfe/version.rb +37 -0
- data/lib/openwfe/workitem.rb +499 -0
- data/lib/openwfe/worklist/oldrest.rb +244 -0
- data/lib/openwfe/worklist/storelocks.rb +293 -0
- data/lib/openwfe/worklist/storeparticipant.rb +44 -0
- data/lib/openwfe/worklist/worklist.rb +297 -0
- data/test/README.txt +27 -0
- data/test/back_0916_test.rb +111 -0
- data/test/bm/bm_1_xml_vs_prog.rb +56 -0
- data/test/bm/bm_2_step.rb +109 -0
- data/test/bm/ft_0f_5ms.rb +35 -0
- data/test/bm/ft_26_load.rb +210 -0
- data/test/bm/ft_26b_load.rb +86 -0
- data/test/bm/ft_26c_load.rb +97 -0
- data/test/bm/ft_26d_load.rb +97 -0
- data/test/bm/ft_recu.rb +71 -0
- data/test/clone_test.rb +122 -0
- data/test/concurrence_test.rb +77 -0
- data/test/condition_test.rb +155 -0
- data/test/console_test.rb +12 -0
- data/test/cron_ltest.rb +15 -0
- data/test/description_test.rb +87 -0
- data/test/eno_test.rb +76 -0
- data/test/expmap_test.rb +54 -0
- data/test/expool_20031219_0916.tgz +0 -0
- data/test/fe_lookup_att_test.rb +62 -0
- data/test/fei_test.rb +181 -0
- data/test/file_persisted_engine_test.rb +64 -0
- data/test/file_persistence_test.rb +134 -0
- data/test/filep_cancel_test.rb +123 -0
- data/test/filter_test.rb +109 -0
- data/test/flowtestbase.rb +351 -0
- data/test/ft_0.rb +68 -0
- data/test/ft_0b_sequence.rb +36 -0
- data/test/ft_0c_testname.rb +33 -0
- data/test/ft_0d_participant.rb +30 -0
- data/test/ft_0e_multibody.rb +34 -0
- data/test/ft_10_loop.rb +134 -0
- data/test/ft_11_ppd.rb +415 -0
- data/test/ft_11b_ppd.rb +54 -0
- data/test/ft_12_blockparticipant.rb +97 -0
- data/test/ft_13_eno.rb +52 -0
- data/test/ft_14_subprocess.rb +88 -0
- data/test/ft_14b_subprocess.rb +192 -0
- data/test/ft_14c_subprocess.rb +68 -0
- data/test/ft_15_iterator.rb +216 -0
- data/test/ft_15b_iterator.rb +74 -0
- data/test/ft_16_fqv.rb +73 -0
- data/test/ft_17_condition.rb +84 -0
- data/test/ft_18_pname.rb +56 -0
- data/test/ft_1_unset.rb +175 -0
- data/test/ft_1b_unset.rb +39 -0
- data/test/ft_20_cron.rb +53 -0
- data/test/ft_21_cron.rb +87 -0
- data/test/ft_21b_cron_pause.rb +82 -0
- data/test/ft_22_history.rb +74 -0
- data/test/ft_23_when.rb +77 -0
- data/test/ft_23b_when.rb +70 -0
- data/test/ft_23c_wait.rb +80 -0
- data/test/ft_23d_cww.rb +58 -0
- data/test/ft_24_def.rb +44 -0
- data/test/ft_25_cancel.rb +89 -0
- data/test/ft_27_getflowpos.rb +147 -0
- data/test/ft_28_fileparticipant.rb +63 -0
- data/test/ft_29_httprb.rb +106 -0
- data/test/ft_2_concurrence.rb +135 -0
- data/test/ft_2b_concurrence.rb +188 -0
- data/test/ft_2c_concurrence.rb +64 -0
- data/test/ft_30_socketlistener.rb +203 -0
- data/test/ft_31_flowname.rb +40 -0
- data/test/ft_32_journal.rb +91 -0
- data/test/ft_32c_journal.rb +102 -0
- data/test/ft_32d_journal.rb +84 -0
- data/test/ft_33_description.rb +107 -0
- data/test/ft_34_cancelwfid.rb +80 -0
- data/test/ft_35_localdefs.rb +75 -0
- data/test/ft_36_subprocids.rb +97 -0
- data/test/ft_37_pnames.rb +70 -0
- data/test/ft_38_tag.rb +127 -0
- data/test/ft_38b_tag.rb +161 -0
- data/test/ft_38c_tag.rb +100 -0
- data/test/ft_39_reserve.rb +63 -0
- data/test/ft_39b_reserve.rb +84 -0
- data/test/ft_3_equals.rb +170 -0
- data/test/ft_3b_lookup_vf.rb +83 -0
- data/test/ft_40_defined.rb +61 -0
- data/test/ft_41_case.rb +110 -0
- data/test/ft_42_environments.rb +75 -0
- data/test/ft_43_pat10.rb +85 -0
- data/test/ft_44_save.rb +70 -0
- data/test/ft_44b_restore.rb +212 -0
- data/test/ft_45_citerator.rb +214 -0
- data/test/ft_46_pparams.rb +62 -0
- data/test/ft_47_filter.rb +160 -0
- data/test/ft_48_fe_filter.rb +88 -0
- data/test/ft_49_condition.rb +126 -0
- data/test/ft_4_misc.rb +237 -0
- data/test/ft_50_xml_attribute.rb +155 -0
- data/test/ft_51_stack.rb +55 -0
- data/test/ft_52_obs_participant.rb +123 -0
- data/test/ft_53_null_noop_participant.rb +62 -0
- data/test/ft_54_listen.rb +288 -0
- data/test/ft_54b_listen.rb +66 -0
- data/test/ft_54c_listen.rb +99 -0
- data/test/ft_55_ptimeout.rb +59 -0
- data/test/ft_56_timeout.rb +59 -0
- data/test/ft_57_a.rb +145 -0
- data/test/ft_58_ejournal.rb +151 -0
- data/test/ft_59_ps.rb +150 -0
- data/test/ft_59b_ps_for_pat.rb +58 -0
- data/test/ft_5_time.rb +118 -0
- data/test/ft_60_ecancel.rb +161 -0
- data/test/ft_61_elsub.rb +51 -0
- data/test/ft_62_procparticipant.rb +71 -0
- data/test/ft_63_pause.rb +124 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +59 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +116 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +51 -0
- data/test/ft_6_lambda.rb +64 -0
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_71_log.rb +60 -0
- data/test/ft_72_lookup_processes.rb +76 -0
- data/test/ft_73_cancel_sub.rb +139 -0
- data/test/ft_74_block_and_workitem_dup.rb +63 -0
- data/test/ft_75_ruby_attributes.rb +87 -0
- data/test/ft_76_merge_isolate.rb +88 -0
- data/test/ft_77_segments.rb +35 -0
- data/test/ft_78_eval.rb +150 -0
- data/test/ft_79_tticket.rb +187 -0
- data/test/ft_79b_tticket.rb +172 -0
- data/test/ft_79c_outcome.rb +56 -0
- data/test/ft_7_lose.rb +104 -0
- data/test/ft_7b_lose.rb +78 -0
- data/test/ft_80_spname.rb +91 -0
- data/test/ft_81_exp.rb +60 -0
- data/test/ft_82_trecu.rb +46 -0
- data/test/ft_83_badpause.rb +58 -0
- data/test/ft_84_updateexp.rb +198 -0
- data/test/ft_85_dolhash.rb +43 -0
- data/test/ft_86_dollar_fv.rb +68 -0
- data/test/ft_87_define.rb +74 -0
- data/test/ft_8_forget.rb +44 -0
- data/test/ft_9_cursor.rb +145 -0
- data/test/ft_9b_cursor.rb +105 -0
- data/test/ft_tests.rb +124 -0
- data/test/hash_test.rb +75 -0
- data/test/hparticipant_test.rb +164 -0
- data/test/lookup_att_test.rb +90 -0
- data/test/lookup_vf_test.rb +94 -0
- data/test/misc_test.rb +90 -0
- data/test/nut_0_irb.rb +20 -0
- data/test/obs_test.rb +142 -0
- data/test/orest_test.rb +251 -0
- data/test/param_test.rb +290 -0
- data/test/participant_test.rb +101 -0
- data/test/pending.rb +23 -0
- data/test/ps_representation.rb +133 -0
- data/test/rake_ltest.rb +38 -0
- data/test/rake_qtest.rb +68 -0
- data/test/raw_prog_test.rb +412 -0
- data/test/restart_cron_test.rb +136 -0
- data/test/restart_paused_test.rb +98 -0
- data/test/restart_sleep_test.rb +140 -0
- data/test/restart_tests.rb +18 -0
- data/test/restart_when_test.rb +112 -0
- data/test/ruby_procdef_test.rb +132 -0
- data/test/rutest_utils.rb +63 -0
- data/test/sec_test.rb +205 -0
- data/test/slock_test.rb +80 -0
- data/test/storage_test.rb +44 -0
- data/test/test.rb +3 -0
- data/test/timeout_test.rb +105 -0
- data/test/util_xml_test.rb +112 -0
- data/test/wfid_test.rb +175 -0
- data/test/wi_test.rb +75 -0
- metadata +433 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'find'
|
|
41
|
+
require 'yaml'
|
|
42
|
+
require 'fileutils'
|
|
43
|
+
|
|
44
|
+
require 'rufus/scheduler'
|
|
45
|
+
|
|
46
|
+
require 'openwfe/service'
|
|
47
|
+
require 'openwfe/rudefinitions'
|
|
48
|
+
require 'openwfe/listeners/listener'
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
# some base listener implementations
|
|
53
|
+
#
|
|
54
|
+
module OpenWFE
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Polls a directory for incoming workitems (as files).
|
|
58
|
+
#
|
|
59
|
+
# Workitems can be instances of InFlowWorkItem or LaunchItem.
|
|
60
|
+
#
|
|
61
|
+
# require 'openwfe/listeners/listeners'
|
|
62
|
+
#
|
|
63
|
+
# engine.add_workitem_listener(OpenWFE::FileListener, "500")
|
|
64
|
+
#
|
|
65
|
+
# In this example, the directory ./work/in/ will be polled every 500
|
|
66
|
+
# milliseconds for incoming workitems (or launchitems).
|
|
67
|
+
#
|
|
68
|
+
# You can override the load_object(path) method to manage other formats
|
|
69
|
+
# then YAML.
|
|
70
|
+
#
|
|
71
|
+
class FileListener < Service
|
|
72
|
+
include WorkItemListener
|
|
73
|
+
include Rufus::Schedulable
|
|
74
|
+
|
|
75
|
+
attr_reader :workdir
|
|
76
|
+
|
|
77
|
+
def initialize (service_name, application_context)
|
|
78
|
+
|
|
79
|
+
super
|
|
80
|
+
|
|
81
|
+
@workdir = get_work_directory + "/in/"
|
|
82
|
+
|
|
83
|
+
linfo { "new() workdir is '#{@workdir}'" }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Will 'find' files in the work directory (by default ./work/in/),
|
|
88
|
+
# extract the workitem in them and feed it back to the engine.
|
|
89
|
+
#
|
|
90
|
+
def trigger (params)
|
|
91
|
+
# no synchronization for now
|
|
92
|
+
|
|
93
|
+
ldebug { "trigger()" }
|
|
94
|
+
|
|
95
|
+
FileUtils.makedirs(@workdir) unless File.exist?(@workdir)
|
|
96
|
+
|
|
97
|
+
Find.find(@workdir) do |path|
|
|
98
|
+
|
|
99
|
+
next if File.stat(path).directory?
|
|
100
|
+
|
|
101
|
+
ldebug { "trigger() considering file '#{path}'" }
|
|
102
|
+
|
|
103
|
+
begin
|
|
104
|
+
|
|
105
|
+
object = load_object(path)
|
|
106
|
+
|
|
107
|
+
handle_item(object) if object
|
|
108
|
+
|
|
109
|
+
rescue Exception => e
|
|
110
|
+
|
|
111
|
+
linfo do
|
|
112
|
+
"trigger() failure while loading from '#{path}'. " +
|
|
113
|
+
"Resuming... \n" +
|
|
114
|
+
OpenWFE::exception_to_s(e)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
protected
|
|
121
|
+
|
|
122
|
+
#
|
|
123
|
+
# Turns a file into a Ruby instance.
|
|
124
|
+
# This base implementation does it via YAML.
|
|
125
|
+
#
|
|
126
|
+
def load_object (path)
|
|
127
|
+
|
|
128
|
+
return nil unless path.match ".*\.yaml$"
|
|
129
|
+
|
|
130
|
+
object = YAML.load_file path
|
|
131
|
+
|
|
132
|
+
File.delete path
|
|
133
|
+
|
|
134
|
+
object
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'yaml'
|
|
41
|
+
require 'socket'
|
|
42
|
+
|
|
43
|
+
require 'openwfe/utils'
|
|
44
|
+
require 'openwfe/service'
|
|
45
|
+
require 'openwfe/workitem'
|
|
46
|
+
require 'openwfe/rudefinitions'
|
|
47
|
+
require 'openwfe/orest/xmlcodec'
|
|
48
|
+
require 'openwfe/listeners/listener'
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
# some base listener implementations
|
|
53
|
+
#
|
|
54
|
+
module OpenWFE
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Listens for workitems on a socket.
|
|
58
|
+
#
|
|
59
|
+
# Workitems can be instances of InFlowWorkItem or LaunchItem.
|
|
60
|
+
#
|
|
61
|
+
# By default, listens on port 7007.
|
|
62
|
+
#
|
|
63
|
+
# require 'openwfe/listeners/socketlisteners'
|
|
64
|
+
#
|
|
65
|
+
# engine.add_workitem_listener(OpenWFE::SocketListener)
|
|
66
|
+
#
|
|
67
|
+
# But you can be more specific :
|
|
68
|
+
#
|
|
69
|
+
# engine.add_workitem_listener(
|
|
70
|
+
# OpenWFE::SocketListener.new(
|
|
71
|
+
# "sl_whatever_name",
|
|
72
|
+
# engine.application_context,
|
|
73
|
+
# "target.host.xx",
|
|
74
|
+
# 7707)
|
|
75
|
+
#
|
|
76
|
+
class SocketListener < Service
|
|
77
|
+
include WorkItemListener
|
|
78
|
+
|
|
79
|
+
attr_reader :server, :thread
|
|
80
|
+
|
|
81
|
+
def initialize (service_name, application_context, port=nil, iface=nil)
|
|
82
|
+
|
|
83
|
+
super(service_name, application_context)
|
|
84
|
+
|
|
85
|
+
#iface ||= "127.0.0.1"
|
|
86
|
+
# not necessary
|
|
87
|
+
|
|
88
|
+
port ||= 7007
|
|
89
|
+
|
|
90
|
+
@server = TCPServer.new(iface, port)
|
|
91
|
+
|
|
92
|
+
@thread = OpenWFE.call_in_thread(@service_name, self) do
|
|
93
|
+
listen
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# Stops this socket listener (shuts down its socket)
|
|
99
|
+
#
|
|
100
|
+
def stop
|
|
101
|
+
|
|
102
|
+
@thread.raise "shutdown"
|
|
103
|
+
|
|
104
|
+
begin
|
|
105
|
+
@server.close
|
|
106
|
+
rescue Exception => e
|
|
107
|
+
ldebug { "stop() exc : #{e.to_s}" }
|
|
108
|
+
end
|
|
109
|
+
#begin
|
|
110
|
+
# @server.shutdown
|
|
111
|
+
#rescue Exception => e
|
|
112
|
+
# ldebug { "stop() exc : #{e.to_s}" }
|
|
113
|
+
#end
|
|
114
|
+
|
|
115
|
+
linfo { "stop() shut socket down" }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# This base implementation is capable of decoding XML workitems
|
|
120
|
+
# and YAML workitems.
|
|
121
|
+
#
|
|
122
|
+
def decode_workitem (data)
|
|
123
|
+
|
|
124
|
+
return nil if not data or data.length < 4
|
|
125
|
+
|
|
126
|
+
if data[0, 1] == "<"
|
|
127
|
+
#
|
|
128
|
+
# seems like XML
|
|
129
|
+
|
|
130
|
+
OpenWFE::XmlCodec::decode(data)
|
|
131
|
+
|
|
132
|
+
elsif data[0, 3] == "---"
|
|
133
|
+
#
|
|
134
|
+
# must be YAML
|
|
135
|
+
|
|
136
|
+
YAML.load(data)
|
|
137
|
+
|
|
138
|
+
else
|
|
139
|
+
#
|
|
140
|
+
# perhaps OpenWFEja style header + workitem
|
|
141
|
+
|
|
142
|
+
data = pop_line(data)
|
|
143
|
+
data = pop_line(data)
|
|
144
|
+
|
|
145
|
+
decode_workitem(data)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# Simply pipes back the result of get_engine.reply(wi) on the
|
|
151
|
+
# socket.
|
|
152
|
+
#
|
|
153
|
+
def reply_to_socket (socket, result)
|
|
154
|
+
|
|
155
|
+
socket.puts result.to_s
|
|
156
|
+
socket.puts
|
|
157
|
+
socket.close_write
|
|
158
|
+
|
|
159
|
+
#ldebug { "reply_to_socket() result is >#{result}<" }
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# The base implementation allows returns true.
|
|
164
|
+
#
|
|
165
|
+
# An override of this method might check the origin of the socket
|
|
166
|
+
# and maybe only allow a certain range of hosts...
|
|
167
|
+
#
|
|
168
|
+
def is_allowed? (socket)
|
|
169
|
+
|
|
170
|
+
true
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
protected
|
|
174
|
+
|
|
175
|
+
#
|
|
176
|
+
# Where the socket waiting loop is...
|
|
177
|
+
#
|
|
178
|
+
def listen
|
|
179
|
+
|
|
180
|
+
linfo { "listen() listening on #{@server.addr.join(' ')}" }
|
|
181
|
+
|
|
182
|
+
loop do
|
|
183
|
+
|
|
184
|
+
socket = nil
|
|
185
|
+
|
|
186
|
+
begin
|
|
187
|
+
socket = @server.accept
|
|
188
|
+
rescue Exception => e
|
|
189
|
+
linfo { "listen() shut down '#{e}'" }
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
return unless socket
|
|
193
|
+
|
|
194
|
+
OpenWFE.call_in_thread(@service_name, self) do
|
|
195
|
+
handle_socket(socket) if socket and is_allowed?(socket)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
#
|
|
201
|
+
# The bulk work of handling a connection is done here. The
|
|
202
|
+
# incoming workitem is piped to the engine, then the result
|
|
203
|
+
# it written back a string on the socket which then gets closed.
|
|
204
|
+
#
|
|
205
|
+
def handle_socket (socket)
|
|
206
|
+
|
|
207
|
+
ldebug do
|
|
208
|
+
"handle_socket() "+
|
|
209
|
+
"connection from #{socket.peeraddr.join(' ')}"
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
data = ""
|
|
213
|
+
loop do
|
|
214
|
+
s = socket.gets
|
|
215
|
+
break unless s
|
|
216
|
+
data += s
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
wi = decode_workitem(data)
|
|
220
|
+
|
|
221
|
+
if not wi
|
|
222
|
+
|
|
223
|
+
ldebug do
|
|
224
|
+
"handle_socket() "+
|
|
225
|
+
">>>#{data}<<< doesn't contain a workitem"
|
|
226
|
+
end
|
|
227
|
+
socket.close
|
|
228
|
+
return
|
|
229
|
+
|
|
230
|
+
else
|
|
231
|
+
|
|
232
|
+
ldebug do
|
|
233
|
+
"handle_socket() "+
|
|
234
|
+
"received something of class #{wi.class}"
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
result = nil
|
|
239
|
+
|
|
240
|
+
begin
|
|
241
|
+
|
|
242
|
+
#result = get_engine.reply(wi)
|
|
243
|
+
#result = handle_item(wi)
|
|
244
|
+
handle_item wi
|
|
245
|
+
|
|
246
|
+
result = "<ok-reply/>"
|
|
247
|
+
|
|
248
|
+
ldebug { "handle_socket() result is >>#{result}<<" }
|
|
249
|
+
|
|
250
|
+
rescue Exception => e
|
|
251
|
+
|
|
252
|
+
result = "ERROR\n\n"
|
|
253
|
+
result << OpenWFE::exception_to_s(e)
|
|
254
|
+
|
|
255
|
+
ldebug { "handle_socket() error reply :\n" + result }
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
reply_to_socket(socket, result)
|
|
259
|
+
|
|
260
|
+
socket.close
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def pop_line (s)
|
|
264
|
+
|
|
265
|
+
i = s.index("\n")
|
|
266
|
+
return s unless i
|
|
267
|
+
s[i+1..-1]
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
end
|
|
272
|
+
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'logger'
|
|
41
|
+
require 'openwfe/utils'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# A Mixin for adding logging method to any class
|
|
48
|
+
#
|
|
49
|
+
module Logging
|
|
50
|
+
|
|
51
|
+
def ldebug (message=nil, &block)
|
|
52
|
+
do_log(:debug, message, &block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def linfo (message=nil, &block)
|
|
56
|
+
do_log(:info, message, &block)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def lwarn (message=nil, &block)
|
|
60
|
+
do_log(:warn, message, &block)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def lerror (message=nil, &block)
|
|
64
|
+
do_log(:error, message, &block)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def lfatal (message=nil, &block)
|
|
68
|
+
do_log(:fatal, message, &block)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def lunknown (message=nil, &block)
|
|
72
|
+
do_log(:unknown, message, &block)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def llog (level, message=nil, &block)
|
|
76
|
+
do_log(level, message, &block)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# A simplification of caller_to_s for direct usage when debugging
|
|
81
|
+
#
|
|
82
|
+
def ldebug_callstack (msg, max_lines=nil)
|
|
83
|
+
|
|
84
|
+
ldebug { "#{msg}\n" + OpenWFE::caller_to_s(9, max_lines) }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def do_log (level, message, &block)
|
|
90
|
+
|
|
91
|
+
return unless $OWFE_LOG
|
|
92
|
+
|
|
93
|
+
logblock = lambda do
|
|
94
|
+
if block
|
|
95
|
+
"#{log_prepare(message)} - #{block.call}"
|
|
96
|
+
else
|
|
97
|
+
"#{log_prepare(message)}"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
$OWFE_LOG.send level, &logblock
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def log_prepare (message)
|
|
105
|
+
|
|
106
|
+
return log_author() unless message
|
|
107
|
+
"#{log_author} - #{message}"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def log_author
|
|
111
|
+
|
|
112
|
+
if respond_to?(:service_name)
|
|
113
|
+
"#{self.class} '#{self.service_name}'"
|
|
114
|
+
else
|
|
115
|
+
"#{self.class}"
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
|