freeswitcher 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +13 -0
- data/CHANGELOG +1140 -0
- data/MANIFEST +101 -0
- data/README +66 -70
- data/Rakefile +31 -77
- data/examples/{ies_demo.rb → inbound_event_socket.rb} +0 -1
- data/examples/{ies_demo_with_hook.rb → inbound_socket_events.rb} +1 -1
- data/examples/outbound_event_socket.rb +28 -0
- data/freeswitcher.gemspec +155 -0
- data/lib/fsr.rb +14 -4
- data/lib/fsr/listener/outbound.rb +21 -16
- data/lib/fsr/version.rb +3 -0
- data/spec/helper.rb +11 -6
- data/tasks/authors.rake +30 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +19 -0
- data/tasks/copyright.rake +21 -0
- data/tasks/gem.rake +23 -0
- data/tasks/gem_installer.rake +76 -0
- data/tasks/install_dependencies.rake +6 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/rcov.rake +23 -0
- data/tasks/release.rake +52 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/setup.rake +16 -0
- data/tasks/spec.rake +0 -59
- data/tasks/yard.rake +4 -0
- metadata +124 -112
- data/examples/dtmf_test.rb +0 -35
- data/examples/oes_demo.rb +0 -21
- data/examples/play_and_get_test.rb +0 -35
- data/tasks/package.rake +0 -29
- data/tasks/ride.rake +0 -6
- data/tasks/rspec.rake +0 -21
data/MANIFEST
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
.gitignore
|
2
|
+
AUTHORS
|
3
|
+
CHANGELOG
|
4
|
+
License.txt
|
5
|
+
MANIFEST
|
6
|
+
NEWS
|
7
|
+
README
|
8
|
+
Rakefile
|
9
|
+
examples/bin/cmd_demo.rb
|
10
|
+
examples/bin/dtmf_test.rb
|
11
|
+
examples/bin/ies_demo.rb
|
12
|
+
examples/bin/ies_demo_with_hook.rb
|
13
|
+
examples/bin/oes_demo.rb
|
14
|
+
examples/dtmf_test.rb
|
15
|
+
examples/ies_demo.rb
|
16
|
+
examples/ies_demo_with_hook.rb
|
17
|
+
examples/inbound_event_socket.rb
|
18
|
+
examples/inbound_socket_events.rb
|
19
|
+
examples/outbound_event_socket.rb
|
20
|
+
freeswitcher.gemspec
|
21
|
+
lib/fsr.rb
|
22
|
+
lib/fsr/app.rb
|
23
|
+
lib/fsr/app/answer.rb
|
24
|
+
lib/fsr/app/bridge.rb
|
25
|
+
lib/fsr/app/conference.rb
|
26
|
+
lib/fsr/app/fifo.rb
|
27
|
+
lib/fsr/app/fs_break.rb
|
28
|
+
lib/fsr/app/fs_sleep.rb
|
29
|
+
lib/fsr/app/hangup.rb
|
30
|
+
lib/fsr/app/limit.rb
|
31
|
+
lib/fsr/app/log.rb
|
32
|
+
lib/fsr/app/play_and_get_digits.rb
|
33
|
+
lib/fsr/app/playback.rb
|
34
|
+
lib/fsr/app/read.rb
|
35
|
+
lib/fsr/app/set.rb
|
36
|
+
lib/fsr/app/speak.rb
|
37
|
+
lib/fsr/app/transfer.rb
|
38
|
+
lib/fsr/app/uuid_dump.rb
|
39
|
+
lib/fsr/app/uuid_getvar.rb
|
40
|
+
lib/fsr/app/uuid_setvar.rb
|
41
|
+
lib/fsr/cmd.rb
|
42
|
+
lib/fsr/cmd/calls.rb
|
43
|
+
lib/fsr/cmd/fsctl.rb
|
44
|
+
lib/fsr/cmd/originate.rb
|
45
|
+
lib/fsr/cmd/sofia.rb
|
46
|
+
lib/fsr/cmd/sofia/profile.rb
|
47
|
+
lib/fsr/cmd/sofia/status.rb
|
48
|
+
lib/fsr/cmd/sofia_contact.rb
|
49
|
+
lib/fsr/cmd/status.rb
|
50
|
+
lib/fsr/command_socket.rb
|
51
|
+
lib/fsr/database.rb
|
52
|
+
lib/fsr/database/call_limit.rb
|
53
|
+
lib/fsr/database/core.rb
|
54
|
+
lib/fsr/database/sofia_reg_external.rb
|
55
|
+
lib/fsr/database/sofia_reg_internal.rb
|
56
|
+
lib/fsr/database/voicemail_default.rb
|
57
|
+
lib/fsr/event_socket.rb
|
58
|
+
lib/fsr/fake_socket.rb
|
59
|
+
lib/fsr/listener.rb
|
60
|
+
lib/fsr/listener/header_and_content_response.rb
|
61
|
+
lib/fsr/listener/inbound.rb
|
62
|
+
lib/fsr/listener/inbound/event.rb
|
63
|
+
lib/fsr/listener/outbound.rb
|
64
|
+
lib/fsr/listener/outbound.rb.orig
|
65
|
+
lib/fsr/model/call.rb
|
66
|
+
lib/fsr/version.rb
|
67
|
+
tasks/authors.rake
|
68
|
+
tasks/bacon.rake
|
69
|
+
tasks/changelog.rake
|
70
|
+
tasks/copyright.rake
|
71
|
+
tasks/gem.rake
|
72
|
+
tasks/gem_installer.rake
|
73
|
+
tasks/install_dependencies.rake
|
74
|
+
tasks/manifest.rake
|
75
|
+
tasks/rcov.rake
|
76
|
+
tasks/release.rake
|
77
|
+
tasks/reversion.rake
|
78
|
+
tasks/setup.rake
|
79
|
+
tasks/spec.rake
|
80
|
+
tasks/yard.rake
|
81
|
+
spec/helper.rb
|
82
|
+
spec/fsr/app.rb
|
83
|
+
spec/fsr/app/bridge.rb
|
84
|
+
spec/fsr/app/conference.rb
|
85
|
+
spec/fsr/app/fifo.rb
|
86
|
+
spec/fsr/app/hangup.rb
|
87
|
+
spec/fsr/app/limit.rb
|
88
|
+
spec/fsr/app/log.rb
|
89
|
+
spec/fsr/app/play_and_get_digits.rb
|
90
|
+
spec/fsr/app/playback.rb
|
91
|
+
spec/fsr/app/set.rb
|
92
|
+
spec/fsr/app/transfer.rb
|
93
|
+
spec/fsr/cmd.rb
|
94
|
+
spec/fsr/cmd/calls.rb
|
95
|
+
spec/fsr/cmd/originate.rb
|
96
|
+
spec/fsr/cmd/sofia.rb
|
97
|
+
spec/fsr/cmd/sofia/profile.rb
|
98
|
+
spec/fsr/listener.rb
|
99
|
+
spec/fsr/listener/inbound.rb
|
100
|
+
spec/fsr/listener/outbound.rb
|
101
|
+
spec/fsr/loading.rb
|
data/README
CHANGED
@@ -4,108 +4,88 @@ Copyright (c) 2009 The Rubyists (Jayson Vaughn, Tj Vanderpoel, Michael Fellinger
|
|
4
4
|
Distributed under the terms of the MIT License.
|
5
5
|
==========================================================
|
6
6
|
|
7
|
-
|
7
|
+
ABOUT
|
8
8
|
-----
|
9
|
-
*** STILL UNDER HEAVY DEVELOPMENT ***
|
10
|
-
|
11
9
|
A ruby library for interacting with the "FreeSWITCH" (http://www.freeswitch.org) opensource telephony platform
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
Requirements
|
11
|
+
REQUIREMENTS
|
16
12
|
------------
|
17
13
|
- ruby (>= 1.8)
|
18
14
|
- eventmachine (If you wish to use Outbound and Inbound listener)
|
19
15
|
|
20
|
-
|
16
|
+
USAGE
|
21
17
|
-----
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
irb(main):001:0> require 'fsr'
|
26
|
-
=> true
|
27
|
-
|
28
|
-
irb(main):002:0> FSR.load_all_commands
|
29
|
-
=> [:sofia, :originate]
|
30
|
-
|
31
|
-
irb(main):003:0> sock = FSR::CommandSocket.new
|
32
|
-
=> #<FSR::CommandSocket:0xb7a89104 @server="127.0.0.1", @socket=#<TCPSocket:0xb7a8908c>, @port="8021", @auth="ClueCon">
|
19
|
+
An Outbound Event Listener Example that reads and returns DTMF input:
|
20
|
+
--------------------------------------------------------------------
|
33
21
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
#!/usr/bin/env ruby
|
22
|
+
Simply just create a subclass of FSR::Listner::Outbound and all
|
23
|
+
new calls/sessions will invoke the "session_initiated" callback method.
|
24
|
+
|
25
|
+
* NOTE: FSR uses blocks within the 'session_inititated' method to ensure
|
26
|
+
that the next "freeswich command" is not executed until the previous
|
27
|
+
"Freeswitch command" has finished. This is kicked off by "answer do"
|
41
28
|
|
42
29
|
require 'fsr'
|
43
|
-
require
|
30
|
+
require 'fsr/listener/outbound'
|
44
31
|
|
45
|
-
class
|
32
|
+
class OutboundDemo < FSR::Listener::Outbound
|
46
33
|
|
47
34
|
def session_initiated
|
48
|
-
|
49
|
-
FSR::Log.info "*** Answering incoming call from #{
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
35
|
+
exten = @session.headers[:caller_caller_id_number]
|
36
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
37
|
+
|
38
|
+
answer do
|
39
|
+
FSR::Log.info "***Reading DTMF from #{exten}"
|
40
|
+
read("/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav", 4, 10, "input", 7000) do
|
41
|
+
FSR::Log.info "*** Updating session for #{exten}"
|
42
|
+
update_session do
|
43
|
+
FSR::Log.info "***Success, grabbed #{@session.headers[:variable_input].strip} from #{exten}"
|
44
|
+
hangup #Hangup the call
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
54
49
|
end
|
55
50
|
|
56
51
|
end
|
57
52
|
|
58
|
-
FSR.start_oes!
|
53
|
+
FSR.start_oes! OutboundDemo, :port => 8084, :host => "127.0.0.1"
|
59
54
|
|
60
55
|
|
56
|
+
An Inbound Event Socket Listener example using FreeSWITCHeR's hook system:
|
57
|
+
--------------------------------------------------------------------------
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
#!/usr/bin/env ruby
|
65
|
-
|
59
|
+
require 'pp'
|
66
60
|
require 'fsr'
|
67
|
-
require
|
68
|
-
|
69
|
-
FSR.load_all_applications
|
70
|
-
FSR.load_all_commands
|
61
|
+
require "fsr/listener/inbound"
|
71
62
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
exten = @session.headers[:caller_caller_id_number]
|
76
|
-
FSR::Log.info "*** Answering incoming call from #{exten}"
|
77
|
-
answer # Answer the call
|
78
|
-
end
|
79
|
-
|
80
|
-
def receive_reply(reply)
|
81
|
-
exten = @session.headers[:caller_caller_id_number]
|
82
|
-
case @step
|
83
|
-
when 1
|
84
|
-
FSR::Log.info "*** Reading dtmf for #{exten}"
|
85
|
-
read "/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav",4,10,"test",15000 # read test
|
86
|
-
when 2
|
87
|
-
FSR::Log.info "*** updating session for #{exten}"
|
88
|
-
update_session
|
89
|
-
when 3
|
90
|
-
FSR::Log.info "** Success, grabbed #{@session.headers[:variable_test].strip} from #{exten}"
|
91
|
-
FSR::Log.info "*** Hanging up call"
|
92
|
-
hangup # Hangup the call
|
93
|
-
end
|
94
|
-
end
|
63
|
+
# EXAMPLE 1
|
64
|
+
# This adds a hook on CHANNEL_CREATE events. You can also create a method to handle the event you're after. See the next example
|
65
|
+
FSL::Inbound.add_event_hook(:CHANNEL_CREATE) {|event| FSR::Log.info "*** [#{event.content[:unique_id]}] Channel created - greetings from the hook!" }
|
95
66
|
|
67
|
+
# EXAMPLE 2
|
68
|
+
# Define a method to handle CHANNEL_HANGUP events.
|
69
|
+
def custom_channel_hangup_handler(event)
|
70
|
+
FSR::Log.info "*** [#{event.content[:unique_id]}] Channel hangup. The event:"
|
71
|
+
pp event
|
96
72
|
end
|
97
73
|
|
98
|
-
|
74
|
+
# This adds a hook for EXAMPLE 2
|
75
|
+
FSL::Inbound.add_event_hook(:CHANNEL_HANGUP) {|event| custom_channel_hangup_handler(event) }
|
99
76
|
|
100
77
|
|
78
|
+
# Start FSR Inbound Listener
|
79
|
+
FSR.start_ies!(FSL::Inbound, :host => "localhost", :port => 8021)
|
101
80
|
|
102
|
-
Example of creating an Inbound Eventsocket listener:
|
103
81
|
|
104
|
-
|
82
|
+
An Inbound Event Socket Listener example using the on_event callback method instead of hooks:
|
83
|
+
---------------------------------------------------------------------------------------------
|
105
84
|
|
106
|
-
require 'fsr'
|
107
|
-
require 'fsr/listener/inbound'
|
108
85
|
require 'pp'
|
86
|
+
require 'fsr'
|
87
|
+
require "fsr/listener/inbound"
|
88
|
+
|
109
89
|
|
110
90
|
class IesDemo < FSR::Listener::Inbound
|
111
91
|
|
@@ -119,8 +99,24 @@ Example of creating an Inbound Eventsocket listener:
|
|
119
99
|
FSR.start_ies!(IesDemo, :host => "localhost", :port => 8021)
|
120
100
|
|
121
101
|
|
102
|
+
An example of using FSR::CommandSocket to originate a new call in irb:
|
103
|
+
----------------------------------------------------------------------
|
104
|
+
|
105
|
+
irb(main):001:0> require 'fsr'
|
106
|
+
=> true
|
107
|
+
|
108
|
+
irb(main):002:0> FSR.load_all_commands
|
109
|
+
=> [:sofia, :originate]
|
110
|
+
|
111
|
+
irb(main):003:0> sock = FSR::CommandSocket.new
|
112
|
+
=> #<FSR::CommandSocket:0xb7a89104 @server="127.0.0.1", @socket=#<TCPSocket:0xb7a8908c>, @port="8021", @auth="ClueCon">
|
113
|
+
|
114
|
+
irb(main):007:0> sock.originate(:target => 'sofia/gateway/carlos/8179395222', :endpoint => FSR::App::Bridge.new("user/bougyman")).run
|
115
|
+
=> {"Job-UUID"=>"732075a4-7dd5-4258-b124-6284a82a5ae7", "body"=>"", "Content-Type"=>"command/reply", "Reply-Text"=>"+OK Job-UUID: 732075a4-7dd5-4258-b124-6284a82a5ae7"}
|
116
|
+
|
117
|
+
|
122
118
|
|
123
|
-
|
119
|
+
SUPPORT
|
124
120
|
-------
|
125
121
|
Home page at http://code.rubyists.com/projects/fs
|
126
122
|
#rubyists on FreeNode
|
data/Rakefile
CHANGED
@@ -1,82 +1,36 @@
|
|
1
1
|
require 'rake/clean'
|
2
2
|
require "rubygems"
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
require "lib/fsr"
|
4
|
+
require "pathname"
|
5
|
+
|
6
|
+
PROJECT_COPYRIGHT = File.read(Pathname.new(__FILE__).dirname.join("License.txt"))
|
7
|
+
PROJECT_README = Pathname.new(__FILE__).dirname.join("README").expand_path.to_s
|
8
|
+
PROJECT_FILES = %x{git ls-files}.split
|
9
|
+
RELEASE_FILES = PROJECT_FILES.reject { |f| f.match(/^(?:contrib)(?:\/|$)/) }
|
10
|
+
GEM_FILES = RELEASE_FILES.reject { |f| f.match(/^(?:spec)(?:\/|$)/) }
|
11
|
+
PROJECT_SPECS = (RELEASE_FILES - GEM_FILES).reject { |d| d.match(/(?:helper.rb)$/) }
|
12
|
+
GEM_FILES << "spec/helper.rb" if Pathname.new("spec/helper.rb").file?
|
13
|
+
|
14
|
+
|
15
|
+
GEMSPEC = Gem::Specification.new do |spec|
|
16
|
+
spec.name = "freeswitcher"
|
17
|
+
spec.version = ENV["FSR_VERSION"] || FSR::VERSION
|
18
|
+
spec.summary = 'A library for interacting with the "FreeSWITCH":http://freeswitch.org telephony platform'
|
19
|
+
spec.authors = ["Jayson Vaughn", "Michael Fellinger", "Kevin Berry", "TJ Vanderpoel"]
|
20
|
+
spec.email = "FreeSWITCHeR@rubyists.com"
|
21
|
+
spec.homepage = "http://code.rubyists.com/projects/fs"
|
22
|
+
spec.add_dependency "eventmachine"
|
23
|
+
|
24
|
+
spec.files = GEM_FILES
|
25
|
+
spec.test_files = PROJECT_SPECS
|
26
|
+
spec.require_path = "lib"
|
27
|
+
|
28
|
+
description = File.read(PROJECT_README)
|
29
|
+
spec.description = description
|
30
|
+
spec.rubyforge_project = "freeswitcher"
|
31
|
+
spec.post_install_message = description
|
17
32
|
end
|
18
33
|
|
19
|
-
|
20
|
-
def initialize(options = {}, &block)
|
21
|
-
@gems = []
|
22
|
-
@options = options
|
23
|
-
|
24
|
-
run(&block)
|
25
|
-
end
|
26
|
-
|
27
|
-
def run(&block)
|
28
|
-
instance_eval(&block) if block_given?
|
29
|
-
end
|
30
|
-
|
31
|
-
def gem(name, version = nil, options = {})
|
32
|
-
if version.respond_to?(:merge!)
|
33
|
-
options = version
|
34
|
-
else
|
35
|
-
options[:version] = version
|
36
|
-
end
|
37
|
-
|
38
|
-
@gems << [name, options]
|
39
|
-
end
|
40
|
-
|
41
|
-
def setup
|
42
|
-
require 'rubygems'
|
43
|
-
require 'rubygems/dependency_installer'
|
44
|
-
|
45
|
-
@gems.each do |name, options|
|
46
|
-
setup_gem(name, options)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def setup_gem(name, options, try_install = true)
|
51
|
-
print "activating #{name} ... "
|
52
|
-
Gem.activate(name, *[options[:version]].compact)
|
53
|
-
require(options[:lib] || name)
|
54
|
-
puts "success."
|
55
|
-
rescue LoadError => error
|
56
|
-
puts error
|
57
|
-
install_gem(name, options) if try_install
|
58
|
-
setup_gem(name, options, try_install = false)
|
59
|
-
end
|
60
|
-
|
61
|
-
def install_gem(name, options)
|
62
|
-
installer = Gem::DependencyInstaller.new(options)
|
63
|
-
|
64
|
-
temp_argv(options[:extconf]) do
|
65
|
-
print "Installing #{name} ... "
|
66
|
-
installer.install(name, options[:version])
|
67
|
-
puts "done."
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def temp_argv(extconf)
|
72
|
-
if extconf ||= @options[:extconf]
|
73
|
-
old_argv = ARGV.clone
|
74
|
-
ARGV.replace(extconf.split(' '))
|
75
|
-
end
|
76
|
-
|
77
|
-
yield
|
34
|
+
import(*Dir['tasks/*rake'])
|
78
35
|
|
79
|
-
|
80
|
-
ARGV.replace(old_argv) if extconf
|
81
|
-
end
|
82
|
-
end
|
36
|
+
task :default => :bacon
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'pp'
|
4
4
|
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
5
|
-
puts $LOAD_PATH.inspect
|
6
5
|
$stdout.flush
|
7
6
|
require "fsr/listener/inbound"
|
8
7
|
|
@@ -16,6 +15,7 @@ def custom_channel_hangup_handler(event)
|
|
16
15
|
FSR::Log.info "*** [#{event.content[:unique_id]}] Channel hangup. The event:"
|
17
16
|
pp event
|
18
17
|
end
|
18
|
+
|
19
19
|
# This adds a hook for EXAMPLE 2
|
20
20
|
FSL::Inbound.add_event_hook(:CHANNEL_HANGUP) {|event| custom_channel_hangup_handler(event) }
|
21
21
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), "..", 'lib', 'fsr')
|
4
|
+
require "fsr/listener/outbound"
|
5
|
+
$stdout.flush
|
6
|
+
|
7
|
+
class OutboundDemo < FSR::Listener::Outbound
|
8
|
+
|
9
|
+
def session_initiated
|
10
|
+
exten = @session.headers[:caller_caller_id_number]
|
11
|
+
FSR::Log.info "*** Answering incoming call from #{exten}"
|
12
|
+
|
13
|
+
answer do
|
14
|
+
FSR::Log.info "***Reading DTMF from #{exten}"
|
15
|
+
read("/home/freeswitch/freeswitch/sounds/music/8000/sweet.wav", 4, 10, "input", 7000) do
|
16
|
+
FSR::Log.info "*** Updating session for #{exten}"
|
17
|
+
update_session do
|
18
|
+
FSR::Log.info "***Success, grabbed #{@session.headers[:variable_input].strip} from #{exten}"
|
19
|
+
hangup #Hangup the call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
FSR.start_oes! OutboundDemo, :port => 8084, :host => "127.0.0.1"
|