adhearsion 2.6.4 → 3.0.0.beta1
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/.travis.yml +6 -9
- data/CHANGELOG.md +22 -7
- data/Gemfile +2 -0
- data/README.markdown +4 -5
- data/Rakefile +1 -2
- data/adhearsion.gemspec +19 -8
- data/features/cli_create.feature +19 -3
- data/features/step_definitions/cli_steps.rb +0 -11
- data/features/support/env.rb +3 -4
- data/lib/adhearsion.rb +48 -27
- data/lib/adhearsion/call.rb +34 -50
- data/lib/adhearsion/call_controller.rb +6 -12
- data/lib/adhearsion/call_controller/dial.rb +15 -53
- data/lib/adhearsion/call_controller/input.rb +39 -162
- data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
- data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
- data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
- data/lib/adhearsion/call_controller/input/result.rb +46 -0
- data/lib/adhearsion/call_controller/output.rb +48 -67
- data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/player.rb +1 -1
- data/lib/adhearsion/call_controller/record.rb +23 -8
- data/lib/adhearsion/calls.rb +1 -1
- data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
- data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
- data/lib/adhearsion/configuration.rb +91 -39
- data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
- data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
- data/lib/adhearsion/error.rb +5 -0
- data/lib/adhearsion/event.rb +21 -0
- data/lib/adhearsion/event/active_speaker.rb +11 -0
- data/lib/adhearsion/event/answered.rb +11 -0
- data/lib/adhearsion/event/asterisk.rb +10 -0
- data/lib/adhearsion/event/asterisk/ami.rb +34 -0
- data/lib/adhearsion/event/complete.rb +75 -0
- data/lib/adhearsion/event/dtmf.rb +11 -0
- data/lib/adhearsion/event/end.rb +22 -0
- data/lib/adhearsion/event/input_timers_started.rb +9 -0
- data/lib/adhearsion/event/joined.rb +17 -0
- data/lib/adhearsion/event/offer.rb +14 -0
- data/lib/adhearsion/event/ringing.rb +11 -0
- data/lib/adhearsion/event/started_speaking.rb +13 -0
- data/lib/adhearsion/event/stopped_speaking.rb +13 -0
- data/lib/adhearsion/event/unjoined.rb +17 -0
- data/lib/adhearsion/events.rb +47 -66
- data/lib/adhearsion/foundation.rb +0 -1
- data/lib/adhearsion/foundation/object.rb +0 -5
- data/lib/adhearsion/generators/app/app_generator.rb +4 -1
- data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
- data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
- data/lib/adhearsion/generators/app/templates/config.ru +7 -0
- data/lib/adhearsion/generators/app/templates/en.yml +4 -0
- data/lib/adhearsion/generators/app/templates/events.erb +2 -2
- data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
- data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
- data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
- data/lib/adhearsion/has_headers.rb +34 -0
- data/lib/adhearsion/http_server.rb +37 -0
- data/lib/adhearsion/initializer.rb +19 -153
- data/lib/adhearsion/logging.rb +6 -25
- data/lib/adhearsion/outbound_call.rb +5 -5
- data/lib/adhearsion/plugin.rb +1 -0
- data/lib/adhearsion/protocol_error.rb +26 -0
- data/lib/adhearsion/rayo.rb +30 -0
- data/lib/adhearsion/rayo/client.rb +62 -0
- data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
- data/lib/adhearsion/rayo/command.rb +21 -0
- data/lib/adhearsion/rayo/command/accept.rb +16 -0
- data/lib/adhearsion/rayo/command/answer.rb +16 -0
- data/lib/adhearsion/rayo/command/dial.rb +57 -0
- data/lib/adhearsion/rayo/command/hangup.rb +16 -0
- data/lib/adhearsion/rayo/command/join.rb +43 -0
- data/lib/adhearsion/rayo/command/mute.rb +13 -0
- data/lib/adhearsion/rayo/command/redirect.rb +23 -0
- data/lib/adhearsion/rayo/command/reject.rb +40 -0
- data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
- data/lib/adhearsion/rayo/command/unmute.rb +13 -0
- data/lib/adhearsion/rayo/command_node.rb +47 -0
- data/lib/adhearsion/rayo/component.rb +21 -0
- data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
- data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
- data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
- data/lib/adhearsion/rayo/component/component_node.rb +90 -0
- data/lib/adhearsion/rayo/component/input.rb +186 -0
- data/lib/adhearsion/rayo/component/output.rb +471 -0
- data/lib/adhearsion/rayo/component/prompt.rb +53 -0
- data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
- data/lib/adhearsion/rayo/component/record.rb +165 -0
- data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
- data/lib/adhearsion/rayo/component/stop.rb +11 -0
- data/lib/adhearsion/rayo/connection.rb +12 -0
- data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
- data/lib/adhearsion/rayo/connection/connected.rb +22 -0
- data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
- data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
- data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
- data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
- data/lib/adhearsion/rayo/rayo_node.rb +127 -0
- data/lib/adhearsion/rayo/ref.rb +57 -0
- data/lib/adhearsion/statistics.rb +1 -1
- data/lib/adhearsion/tasks.rb +1 -2
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/tasks/environment.rb +0 -2
- data/lib/adhearsion/tasks/i18n.rb +49 -0
- data/lib/adhearsion/translator.rb +11 -0
- data/lib/adhearsion/translator/asterisk.rb +234 -0
- data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
- data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
- data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
- data/lib/adhearsion/translator/asterisk/call.rb +416 -0
- data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
- data/lib/adhearsion/translator/asterisk/component.rb +88 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
- data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
- data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
- data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
- data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
- data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
- data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
- data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
- data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
- data/lib/adhearsion/uri_list.rb +21 -0
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
- data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
- data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
- data/spec/adhearsion/call_controller/output_spec.rb +162 -215
- data/spec/adhearsion/call_controller/record_spec.rb +15 -16
- data/spec/adhearsion/call_controller_spec.rb +23 -40
- data/spec/adhearsion/call_spec.rb +123 -129
- data/spec/adhearsion/calls_spec.rb +3 -3
- data/spec/adhearsion/configuration_spec.rb +94 -108
- data/spec/adhearsion/event/answered_spec.rb +50 -0
- data/spec/adhearsion/event/asterisk/Find Results +402 -0
- data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
- data/spec/adhearsion/event/complete_spec.rb +176 -0
- data/spec/adhearsion/event/dtmf_spec.rb +35 -0
- data/spec/adhearsion/event/end_spec.rb +85 -0
- data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
- data/spec/adhearsion/event/joined_spec.rb +53 -0
- data/spec/adhearsion/event/offer_spec.rb +106 -0
- data/spec/adhearsion/event/ringing_spec.rb +50 -0
- data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/unjoined_spec.rb +48 -0
- data/spec/adhearsion/event/untitled +0 -0
- data/spec/adhearsion/events_spec.rb +19 -45
- data/spec/adhearsion/initializer_spec.rb +12 -184
- data/spec/adhearsion/logging_spec.rb +5 -20
- data/spec/adhearsion/outbound_call_spec.rb +13 -13
- data/spec/adhearsion/plugin_spec.rb +3 -4
- data/spec/adhearsion/protocol_error_spec.rb +91 -0
- data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
- data/spec/adhearsion/rayo/client_spec.rb +134 -0
- data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
- data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
- data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
- data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
- data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
- data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
- data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
- data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
- data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
- data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
- data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
- data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
- data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
- data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
- data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
- data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
- data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
- data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
- data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
- data/spec/adhearsion/rayo/ref_spec.rb +168 -0
- data/spec/adhearsion/rayo_spec.rb +7 -0
- data/spec/adhearsion/router/route_spec.rb +1 -1
- data/spec/adhearsion/statistics_spec.rb +2 -5
- data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
- data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
- data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
- data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
- data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
- data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
- data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
- data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
- data/spec/adhearsion/uri_list_spec.rb +88 -0
- data/spec/adhearsion_spec.rb +89 -14
- data/spec/fixtures/locale/en.yml +13 -0
- data/spec/fixtures/locale/it.yml +13 -0
- data/spec/spec_helper.rb +18 -5
- data/spec/support/call_controller_test_helpers.rb +3 -2
- data/spec/support/initializer_stubs.rb +3 -1
- data/spec/support/punchblock_examples.rb +65 -0
- data/spec/support/punchblock_mocks.rb +12 -0
- metadata +412 -70
- data/features/cli_daemon.feature +0 -20
- data/features/cli_restart.feature +0 -52
- data/features/cli_stop.feature +0 -50
- data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
- data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
- data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
- data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
- data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
- data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
- data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
- data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
- data/lib/adhearsion/call_controller/utility.rb +0 -77
- data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
- data/lib/adhearsion/punchblock_plugin.rb +0 -63
- data/scripts/cloc-1.64.pl +0 -10483
- data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
- data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
- data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
- data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
- data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
- data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
- data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
- data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
|
@@ -5,7 +5,7 @@ module Adhearsion
|
|
|
5
5
|
class AppGenerator < Generator
|
|
6
6
|
|
|
7
7
|
BASEDIRS = %w( config script spec )
|
|
8
|
-
EMPTYDIRS = %w( app/call_controllers lib spec/support spec/call_controllers )
|
|
8
|
+
EMPTYDIRS = %w( app/assets/audio/en app/call_controllers config/locales lib spec/support spec/call_controllers )
|
|
9
9
|
|
|
10
10
|
class_option :empty, type: :boolean
|
|
11
11
|
|
|
@@ -18,13 +18,16 @@ module Adhearsion
|
|
|
18
18
|
template "adhearsion.erb", "config/adhearsion.rb"
|
|
19
19
|
template "events.erb", "config/events.rb"
|
|
20
20
|
template "routes.erb", "config/routes.rb"
|
|
21
|
+
copy_file "config.ru", "config.ru"
|
|
21
22
|
copy_file "gitignore", ".gitignore"
|
|
22
23
|
copy_file "rspec", ".rspec"
|
|
23
24
|
copy_file "Procfile"
|
|
24
25
|
copy_file "Rakefile"
|
|
25
26
|
copy_file "README.md"
|
|
26
27
|
unless options[:empty]
|
|
28
|
+
copy_file "hello_world.wav", "app/assets/audio/en/hello_world.wav"
|
|
27
29
|
copy_file "simon_game.rb", "app/call_controllers/simon_game.rb"
|
|
30
|
+
copy_file "en.yml", "config/locales/en.yml"
|
|
28
31
|
copy_file "simon_game_spec.rb", "spec/call_controllers/simon_game_spec.rb"
|
|
29
32
|
end
|
|
30
33
|
chmod "script/ahn", 0755
|
|
@@ -2,21 +2,13 @@ source 'https://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
gem 'adhearsion', '~> <%= Adhearsion::VERSION.split('.')[0,2].join('.') %>'
|
|
4
4
|
|
|
5
|
-
# Exercise care when updating the Punchblock major version, since Adhearsion
|
|
6
|
-
# apps sometimes make use of underlying features from the Punchblock API.
|
|
7
|
-
# Occasionally an update of Adhearsion will necessitate an update to
|
|
8
|
-
# Punchblock; in those cases update this line and test your app thoroughly.
|
|
9
|
-
gem 'punchblock', '~> <%= require "punchblock/version"; Punchblock::VERSION.split('.')[0,2].join('.') %>'
|
|
10
|
-
|
|
11
|
-
# This is here by default due to deprecation of #ask and #menu.
|
|
12
|
-
# See http://adhearsion.com/docs/common_problems#toc_3 for details
|
|
13
|
-
gem 'adhearsion-asr'
|
|
14
|
-
|
|
15
5
|
#
|
|
16
6
|
# Check http://ahnhub.com for a list of plugins you can use in your app.
|
|
17
7
|
# To use them, simply add them here and run `bundle install`.
|
|
18
8
|
#
|
|
19
9
|
|
|
10
|
+
gem 'sinatra'
|
|
11
|
+
|
|
20
12
|
group :development, :test do
|
|
21
13
|
gem 'rspec'
|
|
22
14
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Adhearsion.config do |config|
|
|
4
4
|
<% unless options[:empty] %>
|
|
5
|
-
# Centralized way to specify any Adhearsion
|
|
5
|
+
# Centralized way to specify any Adhearsion core or plugin configuration
|
|
6
6
|
# - Execute rake config:show to view the active configuration values
|
|
7
7
|
#
|
|
8
8
|
# To update a plugin configuration you can write either:
|
|
@@ -18,20 +18,20 @@ Adhearsion.config do |config|
|
|
|
18
18
|
# end
|
|
19
19
|
<% end %>
|
|
20
20
|
config.development do |dev|
|
|
21
|
-
dev.
|
|
21
|
+
dev.core.logging.level = :debug
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
##
|
|
25
|
-
# Use with Rayo (eg Voxeo PRISM or FreeSWITCH mod_rayo)
|
|
25
|
+
# Use with Rayo over XMPP (eg Voxeo PRISM or FreeSWITCH mod_rayo)
|
|
26
26
|
#
|
|
27
|
-
# config.
|
|
28
|
-
# config.
|
|
27
|
+
# config.core.username = "usera@freeswitch.local-dev.mojolingo.com" # Your XMPP JID for use with Rayo
|
|
28
|
+
# config.core.password = "1" # Your XMPP password
|
|
29
29
|
|
|
30
30
|
##
|
|
31
31
|
# Use with Asterisk
|
|
32
32
|
#
|
|
33
|
-
# config.
|
|
34
|
-
# config.
|
|
35
|
-
# config.
|
|
36
|
-
# config.
|
|
33
|
+
# config.core.type = :asterisk # Use Asterisk
|
|
34
|
+
# config.core.username = "manager" # Your AMI username
|
|
35
|
+
# config.core.password = "password" # Your AMI password
|
|
36
|
+
# config.core.host = "asterisk.local-dev.mojolingo.com" # Your AMI host
|
|
37
37
|
end
|
|
Binary file
|
|
@@ -7,6 +7,7 @@ class SimonGame < Adhearsion::CallController
|
|
|
7
7
|
def run
|
|
8
8
|
answer
|
|
9
9
|
reset
|
|
10
|
+
say t(:hello)
|
|
10
11
|
loop do
|
|
11
12
|
update_number
|
|
12
13
|
collect_attempt
|
|
@@ -24,7 +25,7 @@ class SimonGame < Adhearsion::CallController
|
|
|
24
25
|
|
|
25
26
|
def collect_attempt
|
|
26
27
|
result = ask @number, :limit => @number.length
|
|
27
|
-
@attempt = result.
|
|
28
|
+
@attempt = result.utterance
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def verify_attempt
|
|
@@ -5,9 +5,9 @@ require 'call_controllers/simon_game'
|
|
|
5
5
|
|
|
6
6
|
describe SimonGame do
|
|
7
7
|
|
|
8
|
-
let(:example_response) { OpenStruct.new(:
|
|
8
|
+
let(:example_response) { OpenStruct.new(:utterance => "5") }
|
|
9
9
|
let(:example_number) { "5" }
|
|
10
|
-
let(:long_response) { OpenStruct.new(:
|
|
10
|
+
let(:long_response) { OpenStruct.new(:utterance => "55555") }
|
|
11
11
|
let(:long_number) { "55555" }
|
|
12
12
|
|
|
13
13
|
let(:mock_call) { double 'Call' }
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module HasHeaders
|
|
5
|
+
def self.included(klass)
|
|
6
|
+
klass.attribute :headers, Hash, default: {}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def headers=(other)
|
|
10
|
+
super(other || {})
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def inherit(xml_node)
|
|
14
|
+
xml_node.xpath('//ns:header', ns: Rayo::RAYO_NAMESPACES[:core]).to_a.each do |header|
|
|
15
|
+
if headers.has_key?(header[:name])
|
|
16
|
+
headers[header[:name]] = [headers[header[:name]]]
|
|
17
|
+
headers[header[:name]] << header[:value]
|
|
18
|
+
else
|
|
19
|
+
headers[header[:name]] = header[:value]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def rayo_children(root)
|
|
26
|
+
super
|
|
27
|
+
headers.each do |name, value|
|
|
28
|
+
Array(value).each do |v|
|
|
29
|
+
root.header name: name, value: v, xmlns: Rayo::RAYO_NAMESPACES[:core]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'reel'
|
|
4
|
+
require 'reel/rack'
|
|
5
|
+
|
|
6
|
+
module Adhearsion
|
|
7
|
+
# @private
|
|
8
|
+
class HTTPServer
|
|
9
|
+
def self.start
|
|
10
|
+
config = Adhearsion.config.core.http
|
|
11
|
+
|
|
12
|
+
return unless config.enable
|
|
13
|
+
|
|
14
|
+
rackup = File.join(Adhearsion.root, config.rackup)
|
|
15
|
+
unless File.exists?(rackup)
|
|
16
|
+
logger.error "Cannot start HTTP server because the Rack configuration does not exist at #{rackup}"
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
app, options = ::Rack::Builder.parse_file rackup
|
|
21
|
+
options = {
|
|
22
|
+
Host: config.host,
|
|
23
|
+
Port: config.port,
|
|
24
|
+
}.merge(options)
|
|
25
|
+
|
|
26
|
+
app = Rack::CommonLogger.new(app, logger)
|
|
27
|
+
|
|
28
|
+
logger.info "Starting HTTP server listening on #{config.host}:#{config.port}"
|
|
29
|
+
|
|
30
|
+
supervisor = ::Reel::Rack::Server.supervise_as(:ahn_http_server, app, options)
|
|
31
|
+
|
|
32
|
+
Adhearsion::Events.register_callback :shutdown do
|
|
33
|
+
supervisor.terminate
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
|
-
require 'adhearsion/punchblock_plugin'
|
|
4
3
|
require 'adhearsion/linux_proc_name'
|
|
4
|
+
require 'adhearsion/rayo/initializer'
|
|
5
|
+
require 'adhearsion/http_server'
|
|
5
6
|
require 'rbconfig'
|
|
6
7
|
|
|
7
8
|
module Adhearsion
|
|
@@ -13,45 +14,23 @@ module Adhearsion
|
|
|
13
14
|
end
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
attr_reader :path
|
|
17
18
|
|
|
18
|
-
attr_reader :path, :daemon, :pid_file
|
|
19
|
-
|
|
20
|
-
# Creation of pid_files
|
|
21
|
-
#
|
|
22
|
-
# - You may want to have Adhearsion create a process identification
|
|
23
|
-
# file when it boots so that a crash monitoring program such as
|
|
24
|
-
# Monit can reboot if necessary or so the init script can kill it
|
|
25
|
-
# for system shutdowns.
|
|
26
|
-
# - To have Adhearsion create a pid file in the default location (i.e.
|
|
27
|
-
# AHN_INSTALL_DIR/adhearsion.pid), supply :pid_file with 'true'. Otherwise
|
|
28
|
-
# one is not created UNLESS it is running in daemon mode, in which
|
|
29
|
-
# case one is created. You can force Adhearsion to not create one
|
|
30
|
-
# even in daemon mode by supplying "false".
|
|
31
19
|
def initialize(options = {})
|
|
32
20
|
@@started = true
|
|
33
21
|
@path = path
|
|
34
|
-
@
|
|
35
|
-
@pid_file = options[:pid_file].nil? ? ENV['PID_FILE'] : options[:pid_file]
|
|
22
|
+
@console = options[:console]
|
|
36
23
|
@loaded_init_files = options[:loaded_init_files]
|
|
37
24
|
Adhearsion.root = '.'
|
|
38
25
|
end
|
|
39
26
|
|
|
40
27
|
def start
|
|
41
28
|
catch :boot_aborted do
|
|
42
|
-
resolve_pid_file_path
|
|
43
29
|
configure_plugins
|
|
44
30
|
load_lib_folder
|
|
45
31
|
load_config_file
|
|
46
32
|
load_events_file
|
|
47
33
|
load_routes_file
|
|
48
|
-
initialize_log_paths
|
|
49
|
-
|
|
50
|
-
if should_daemonize?
|
|
51
|
-
daemonize!
|
|
52
|
-
else
|
|
53
|
-
create_pid_file
|
|
54
|
-
end
|
|
55
34
|
|
|
56
35
|
Adhearsion.statistics
|
|
57
36
|
start_logging
|
|
@@ -60,15 +39,18 @@ module Adhearsion
|
|
|
60
39
|
catch_termination_signal
|
|
61
40
|
set_ahn_proc_name
|
|
62
41
|
initialize_exception_logger
|
|
63
|
-
|
|
42
|
+
setup_i18n_load_path
|
|
43
|
+
Rayo::Initializer.init
|
|
44
|
+
HTTPServer.start
|
|
64
45
|
init_plugins
|
|
65
46
|
|
|
47
|
+
Rayo::Initializer.run
|
|
66
48
|
run_plugins
|
|
67
49
|
trigger_after_initialized_hooks
|
|
68
50
|
|
|
69
51
|
Adhearsion::Process.booted if Adhearsion.status == :booting
|
|
70
52
|
|
|
71
|
-
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized in \"#{Adhearsion.
|
|
53
|
+
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized in \"#{Adhearsion.environment}\"!" if Adhearsion.status == :running
|
|
72
54
|
end
|
|
73
55
|
|
|
74
56
|
# This method will block until all important threads have finished.
|
|
@@ -92,48 +74,13 @@ module Adhearsion
|
|
|
92
74
|
end
|
|
93
75
|
end
|
|
94
76
|
|
|
95
|
-
def
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
logger.info "Copying AHN_ENV (#{env}) to RAILS_ENV"
|
|
100
|
-
ENV['RAILS_ENV'] = env
|
|
101
|
-
end
|
|
102
|
-
else
|
|
103
|
-
unless ENV['RAILS_ENV']
|
|
104
|
-
env = Adhearsion.config.platform.environment.to_s
|
|
105
|
-
ENV['AHN_ENV'] = env
|
|
106
|
-
logger.info "Setting RAILS_ENV to \"#{env}\""
|
|
107
|
-
ENV['RAILS_ENV'] = env
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
logger.warn "AHN_ENV(#{ENV['AHN_ENV']}) does not match RAILS_ENV(#{ENV['RAILS_ENV']})!" unless ENV['RAILS_ENV'] == ENV['AHN_ENV']
|
|
111
|
-
env
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def default_pid_path
|
|
115
|
-
File.join Adhearsion.config.root, DEFAULT_PID_FILE_NAME
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def resolve_pid_file_path
|
|
119
|
-
@pid_file = if pid_file.equal?(true)
|
|
120
|
-
default_pid_path
|
|
121
|
-
elsif pid_file.equal?(false)
|
|
122
|
-
nil
|
|
123
|
-
elsif pid_file
|
|
124
|
-
File.expand_path pid_file
|
|
125
|
-
else
|
|
126
|
-
should_daemonize? ? default_pid_path : nil
|
|
77
|
+
def setup_i18n_load_path
|
|
78
|
+
Adhearsion.config.core.i18n.locale_path.each do |dir|
|
|
79
|
+
logger.debug "Adding #{dir} to the I18n load path"
|
|
80
|
+
I18n.load_path += Dir["#{dir}/**/*.yml"]
|
|
127
81
|
end
|
|
128
82
|
end
|
|
129
83
|
|
|
130
|
-
def resolve_log_file_path
|
|
131
|
-
_log_file = Adhearsion.config.platform.logging.outputters
|
|
132
|
-
_log_file = _log_file[0] if _log_file.is_a?(Array)
|
|
133
|
-
_log_file = File.expand_path(Adhearsion.config.root.dup.concat("/").concat(_log_file)) unless _log_file.start_with?("/")
|
|
134
|
-
_log_file
|
|
135
|
-
end
|
|
136
|
-
|
|
137
84
|
def catch_termination_signal
|
|
138
85
|
self_read, self_write = IO.pipe
|
|
139
86
|
|
|
@@ -162,9 +109,6 @@ module Adhearsion
|
|
|
162
109
|
when 'INT', 'TERM'
|
|
163
110
|
logger.info "Received SIG#{signal}. Shutting down."
|
|
164
111
|
Adhearsion::Process.shutdown
|
|
165
|
-
when 'HUP'
|
|
166
|
-
logger.info "Received SIGHUP. Reopening logfiles."
|
|
167
|
-
Adhearsion::Logging.reopen_logs
|
|
168
112
|
when 'ALRM'
|
|
169
113
|
logger.info "Received SIGALRM. Toggling trace logging."
|
|
170
114
|
Adhearsion::Logging.toggle_trace!
|
|
@@ -178,9 +122,9 @@ module Adhearsion
|
|
|
178
122
|
# Loads files in application lib folder
|
|
179
123
|
# @return [Boolean] if files have been loaded (lib folder is configured to not nil and actually exists)
|
|
180
124
|
def load_lib_folder
|
|
181
|
-
return false if Adhearsion.config.
|
|
125
|
+
return false if Adhearsion.config.core.lib.nil?
|
|
182
126
|
|
|
183
|
-
lib_folder = [Adhearsion.config.
|
|
127
|
+
lib_folder = [Adhearsion.config.core.root, Adhearsion.config.core.lib].join '/'
|
|
184
128
|
return false unless File.directory? lib_folder
|
|
185
129
|
|
|
186
130
|
$LOAD_PATH.unshift lib_folder
|
|
@@ -199,6 +143,7 @@ module Adhearsion
|
|
|
199
143
|
end
|
|
200
144
|
|
|
201
145
|
def load_events_file
|
|
146
|
+
Adhearsion::Events.init
|
|
202
147
|
path = "#{Adhearsion.config.root}/config/events.rb"
|
|
203
148
|
load path if File.exists?(path)
|
|
204
149
|
end
|
|
@@ -208,40 +153,6 @@ module Adhearsion
|
|
|
208
153
|
load path if File.exists?(path)
|
|
209
154
|
end
|
|
210
155
|
|
|
211
|
-
def init_get_logging_appenders
|
|
212
|
-
@file_loggers ||= memoize_logging_appenders
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
def memoize_logging_appenders
|
|
216
|
-
appenders = Array(Adhearsion.config.platform.logging.outputters.dup)
|
|
217
|
-
# Any filename in the outputters array is mapped to a ::Logging::Appenders::File instance
|
|
218
|
-
appenders.map! do |a|
|
|
219
|
-
case a
|
|
220
|
-
when String
|
|
221
|
-
f = if a.start_with?("/")
|
|
222
|
-
a
|
|
223
|
-
else
|
|
224
|
-
File.expand_path(Adhearsion.config.root.dup.concat("/").concat(a))
|
|
225
|
-
end
|
|
226
|
-
::Logging.appenders.file(f,
|
|
227
|
-
:layout => ::Logging.layouts.pattern(
|
|
228
|
-
Adhearsion::Logging.adhearsion_pattern_options
|
|
229
|
-
),
|
|
230
|
-
:auto_flushing => 2,
|
|
231
|
-
:flush_period => 2
|
|
232
|
-
)
|
|
233
|
-
else
|
|
234
|
-
a
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
if should_daemonize?
|
|
239
|
-
appenders
|
|
240
|
-
else
|
|
241
|
-
appenders += Adhearsion::Logging.default_appenders
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
156
|
def configure_plugins
|
|
246
157
|
Plugin.configure_plugins
|
|
247
158
|
end
|
|
@@ -254,19 +165,8 @@ module Adhearsion
|
|
|
254
165
|
Plugin.run_plugins
|
|
255
166
|
end
|
|
256
167
|
|
|
257
|
-
def should_daemonize?
|
|
258
|
-
@mode == :daemon
|
|
259
|
-
end
|
|
260
|
-
|
|
261
168
|
def need_console?
|
|
262
|
-
@
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
def daemonize!
|
|
266
|
-
logger.info "Daemonizing now!"
|
|
267
|
-
Adhearsion::CustomDaemonizer.daemonize resolve_log_file_path do |pid|
|
|
268
|
-
create_pid_file pid
|
|
269
|
-
end
|
|
169
|
+
@console == true
|
|
270
170
|
end
|
|
271
171
|
|
|
272
172
|
def launch_console
|
|
@@ -277,28 +177,8 @@ module Adhearsion
|
|
|
277
177
|
end
|
|
278
178
|
end
|
|
279
179
|
|
|
280
|
-
# Creates the relative paths associated to log files
|
|
281
|
-
# i.e.
|
|
282
|
-
# - log_file = "log/adhearsion.log" => creates 'log' folder
|
|
283
|
-
# - log_file = "log/test/adhearsion.log" => creates 'log' and 'log/test' folders
|
|
284
|
-
def initialize_log_paths
|
|
285
|
-
outputters = Array(Adhearsion.config.platform.logging.outputters)
|
|
286
|
-
outputters.select{|o| o.is_a?(String)}.each do |o|
|
|
287
|
-
o = o.split("/")
|
|
288
|
-
unless o[0].empty? # only if relative path
|
|
289
|
-
o.pop # not consider filename
|
|
290
|
-
o.inject("") do |path, folder|
|
|
291
|
-
path = path.concat(folder).concat("/")
|
|
292
|
-
Dir.mkdir(path) unless File.directory? path
|
|
293
|
-
path
|
|
294
|
-
end
|
|
295
|
-
end
|
|
296
|
-
end
|
|
297
|
-
end
|
|
298
|
-
|
|
299
180
|
def start_logging
|
|
300
|
-
|
|
301
|
-
Adhearsion::Logging.start outputters, Adhearsion.config.platform.logging.level, Adhearsion.config.platform.logging.formatter
|
|
181
|
+
Adhearsion::Logging.start Adhearsion.config.core.logging.level, Adhearsion.config.core.logging.formatter
|
|
302
182
|
end
|
|
303
183
|
|
|
304
184
|
def initialize_exception_logger
|
|
@@ -307,22 +187,8 @@ module Adhearsion
|
|
|
307
187
|
end
|
|
308
188
|
end
|
|
309
189
|
|
|
310
|
-
def create_pid_file(pid = nil)
|
|
311
|
-
return unless pid_file
|
|
312
|
-
|
|
313
|
-
logger.debug "Creating PID file #{pid_file}"
|
|
314
|
-
|
|
315
|
-
File.open pid_file, 'w' do |file|
|
|
316
|
-
file.puts pid || ::Process.pid
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
Events.register_callback :shutdown do
|
|
320
|
-
File.delete(pid_file) if File.exists?(pid_file)
|
|
321
|
-
end
|
|
322
|
-
end
|
|
323
|
-
|
|
324
190
|
def set_ahn_proc_name
|
|
325
|
-
Adhearsion::LinuxProcName.set_proc_name Adhearsion.config.
|
|
191
|
+
Adhearsion::LinuxProcName.set_proc_name Adhearsion.config.core.process_name
|
|
326
192
|
end
|
|
327
193
|
|
|
328
194
|
def trigger_after_initialized_hooks
|