pwning your phone with adhearsion and asterisk

36
Pwning Your Phone with Adhearsion and Asterisk

Upload: jicksta

Post on 25-May-2015

8.234 views

Category:

Economy & Finance


4 download

DESCRIPTION

This presentation was given by Jay Phillips, Adhearsion's creator, at the Gotham Ruby Conference on April 21st, 2007. Adhearsion is a framework for developing collaboration applications with Asterisk (VoIP), Rails, instant messaging, email, and many other technologies.

TRANSCRIPT

Page 1: Pwning Your Phone with Adhearsion and Asterisk

Pwning Your Phone

Pwning Your Phone

with Adhearsion and Asteriskwith Adhearsion and Asterisk

Page 2: Pwning Your Phone with Adhearsion and Asterisk

Past & TodayPast & TodayStarted January of 2005 at an ITSP

I got into Rails. Started rewrite last summer

Launched last Christmas

Spoke at O’Reilly Emerging Telephony 2007

4 page article in Linux Journal last March

Section in next O’Reilly Asterisk book

Page 3: Pwning Your Phone with Adhearsion and Asterisk

Adhearsion in a Nutshell

Adhearsion in a Nutshell

Build very complex phone systems with Ruby

Open source (LGPL) framework

Builds atop Asterisk without losing anything

More of a “collaboration framework” than an “Asterisk development framework”

Adhearsion = “adhesion” you can “hear”

Not Rails. For the VoIP domain specifically!

Page 4: Pwning Your Phone with Adhearsion and Asterisk

Why VoIP RocksWhy VoIP Rocks

(why the lucky stiff???)

VoIP skills are awesome for hackers

VoIP can dramatically cut a business’ expenses

VoIP skills look good on a resume

Builds skills in CS, SE, EE, UX,BA, and all kinds of other acronyms

Plus, now you can use Ruby!

Page 5: Pwning Your Phone with Adhearsion and Asterisk

Fun VoIP ProjectsFun VoIP ProjectsUnlock apartment door with your cell phone

Control your hacked Xbox Media Center

Rarely ever pay for a phone call

Make your own crazy reminder system

Control anything with voice commands

Phone controlled Roomba

Page 6: Pwning Your Phone with Adhearsion and Asterisk

Dave Troy’s Asterisk-Powered Roomba

Dave Troy’s Asterisk-Powered Roomba

Dave’s also writing “Telephony with Ruby”.

Will be published by The Prags in November

Page 7: Pwning Your Phone with Adhearsion and Asterisk

What is ?What is ?

Open source phone call manager (PBX)

Sponsored and developed by Digium, Inc.

Revolutionized the telecom world forever

Makes hackers really happy

Makes cash flow statements really happy

Does everything you could want with a phone

Page 8: Pwning Your Phone with Adhearsion and Asterisk

Existing Control Grammars Suck At...

Existing Control Grammars Suck At...

Conditional looping & branching

Variables

Complex data structures

Database/LDAP integration

Use of third-party libraries

Extending the language

Error handling

Date & time handling

Pattern matching...to name just a few things!

Page 9: Pwning Your Phone with Adhearsion and Asterisk

Old Dialplan Example

Old Dialplan Example

[macro-dial-iax]exten => s,1,SetGlobalVar(FOUNDME=ANSWER) exten => s,2,GotoIf($[${LEN(${ARG1})} = 10]?2:4) exten => s,3,SetVar(NumToDial=1${ARG1}) exten => s,4,Goto(s,6) exten => s,5,SetVar(NumToDial=${ARG1})

...

From extensions.conf

Page 10: Pwning Your Phone with Adhearsion and Asterisk

Why Use Adhearsion?

Why Use Adhearsion?

Asterisk rocks but its barrier to entry sucks

Grammar feels like assembler or Excel

Adds many new features to your PBX

Adhearsion does dramatically improve Asterisk

Database integration with ActiveRecord

Last but not least, integrate VoIP and Rails!

Page 11: Pwning Your Phone with Adhearsion and Asterisk

BeforeAdhearsion.

Page 12: Pwning Your Phone with Adhearsion and Asterisk

BeforeAdhearsion.

AfterAdhearsion.

Page 13: Pwning Your Phone with Adhearsion and Asterisk

Other Aspects of Adhearsion

Other Aspects of Adhearsion

Helper system for extending the framework

One of the first times VoIP code can be traded

Integrates with on-phone micro-browsers

Use other collaboration technologies together

Instant messaging, growl, weather, reverse number lookup, etc...

Page 14: Pwning Your Phone with Adhearsion and Asterisk

Getting StartedGetting Started

Page 15: Pwning Your Phone with Adhearsion and Asterisk

Asterisk?! Isn’t that hard to install?

Asterisk?! Isn’t that hard to install?

No! Use Digium’s AsteriskNOW distro

Available as install or live CD, VMWare & Xen

Asterisk installed and running when booted

Asterisk v1.4 now has a web GUI

Many good resources exist to get you started

Not to mention it now has ADHEARSION

Page 16: Pwning Your Phone with Adhearsion and Asterisk

Installing AdhearsionInstalling Adhearsion

gem install adhearsion

[asterisk-context]exten => _.,1,AGI(agi://127.0.0.1)

Page 17: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal {internal {

}}

Page 18: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal {internal { play ‘hello-world’play ‘hello-world’}}

Page 19: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal {internal { loop { play ‘tt-monkeys’ }loop { play ‘tt-monkeys’ }}}

Page 20: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal {internal { +foo+foo}}

foo {foo { record {record { dial SIP/:out_trunk/1234dial SIP/:out_trunk/1234}}}}

Page 21: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal {internal { play %w”a-connect-charge-ofplay %w”a-connect-charge-of 16 cents-per-minute16 cents-per-minute will-apply”will-apply”}}

Page 22: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

internal { case extension when 10...100 dial SIP/extension when 6000...6020, 7000..7030 join extension when _'21XX' if Time.now.hour.between? 2, 10 dial SIP/"berlin-office"/extension[2..4] else speak "It is not business hours now in Germany." end ...

Page 23: Pwning Your Phone with Adhearsion and Asterisk

Writing Adhearsion Dialplans

Writing Adhearsion Dialplans

... when US_NUMBER dial SIP/'us-trunk-out'/extension when /^\d{11,}$/ dial IAX/'intl-trunk-out'/extension else play %w'sorry invalid extension please-try-again' end}

Page 24: Pwning Your Phone with Adhearsion and Asterisk

Database-DrivenDialplans

Database-DrivenDialplans

service { customer = Account.find_by_phone_number callerid usage = customer.usage_this_month if usage >= 100.hours then +beyond_limit else customer.usage_this_month += time do dial IAX2/'main-trunk'/extension end end}

beyond_limit { play %w"sorry your-limit-of 100 hours has-been-reached"}

Page 25: Pwning Your Phone with Adhearsion and Asterisk

How Does Adhearsion Talk to

Asterisk?

How Does Adhearsion Talk to

Asterisk?Asterisk receives a call normally

Asterisk establishes a socket to Adhearsion, sending all call-related information

Adhearsion evaluates its own dial plan and sends commands over one at a time using AGI

Asterisk evals commands one at a time, sending a result after each

Dialog continues until call ends

Page 26: Pwning Your Phone with Adhearsion and Asterisk

Things you can do from Rails

Things you can do from Rails

Invoke virtually any PBX event with Adhearsion’s sexy syntaxes

Start calls, view live channels, record channel

Share Adhearsion’s ActiveRecord models

Manage users, groups, anything...

Manage a DB-driven dial plan

Use your imagination!

Page 27: Pwning Your Phone with Adhearsion and Asterisk

HelpersHelpers

Page 28: Pwning Your Phone with Adhearsion and Asterisk

What’s a Helper?What’s a Helper?

Code loaded when Adhearsion boots

Introduces a technology to the framework

Can be virtually anything

Can be written in Ruby, C, Java (JRuby)

Page 29: Pwning Your Phone with Adhearsion and Asterisk

HelpersHelpersrequire "hpricot"require "open-uri"

def lookup number hash = {} url = "http://www.whitepages.com/9901/search/ReversePhone?phone=#{number}" doc = Hpricot open(url)

# This div contains all the information we need, unless it's an unlisted number if (results = doc.at "#results_single_listing") then # This div's h3 contains the name of the caller hash[:first_name], hash[:last_name] = results.at('h3').inner_html.split(/,\s*/).reverse

# Now we just need the rest of the information contained in p's. meta = results/'p' meta.pop # Discard the useless p element

hash[:number] = meta.pop.inner_html city_info = meta.pop.inner_html city_info = city_info.match /(.+), ([A-Za-z]{2}) (\d{5})/ hash[:city] = city_info[1] hash[:state] = city_info[2] hash[:zip] = city_info[3]

hash[:address] = meta.map(&:inner_html) * " " elsif (results = doc.at "#results_single_phone_info") then meta = results/'span' hash[:location] = (meta.pop.inner_html.match /Location: (.*)/)[1] end if hash[:first_name] or hash[:last_name] then hash[:composite] = "#{hash[:first_name]} #{hash[:last_name]}" else hash[:composite] = hash[:location] end hashend

Page 30: Pwning Your Phone with Adhearsion and Asterisk

Helpers(in C)

Helpers(in C)

int fast_factorial(int input) { int prod = 1, count = 1; while(count <= input) { prod *= count++; } return sum;}

Page 31: Pwning Your Phone with Adhearsion and Asterisk

MicromenusMicromenus

Page 32: Pwning Your Phone with Adhearsion and Asterisk

MicromenusMicromenus

Many modern IP phones have micro-browsers

Use custom XML schema over HTTP

Uses a Ruby DSL to generate

Mini-web app framework

Also viewable in a web browser!

Page 33: Pwning Your Phone with Adhearsion and Asterisk

MicromenusMicromenusitem 'Adhearsion Server Statistics' do item 'View Registered SIP Users' do PBX.sip_users.each do |u| item "SIP user '#{u.username}' on IP #{u.ip}" end end item 'View System Uptime' do item `uptime` end item 'Network' do heading 'Network Interface Info' `ifconfig eth1`.each_line do |line| item line end endend

Page 34: Pwning Your Phone with Adhearsion and Asterisk

MicromenusMicromenus

item 'Call an Employee' do item 'Select an employee below.' User.find(:all).each do |user| call user.extension, user.name endend

call 'Join main conference' do play 'welcome' join 5555end

Page 35: Pwning Your Phone with Adhearsion and Asterisk

Where Adhearsionis Headed

Where Adhearsionis Headed

Rails GUI to Adhearsion

Built-in TFTP server serving dynamic configs

Adhearsion CLI

High-level Queue and Agent abstractions

ORM for Asterisk configs (ActiveAsterisk)

RSpec testing... for a PBX

Page 36: Pwning Your Phone with Adhearsion and Asterisk

Get Involved!Get Involved!I’m always looking for Adhearsion hackers!

Share your ideas on our mailing list!

Build your own awesome PBX on a weekend

For corporate needs, I offer Adhearsion consulting

Contact me at [email protected]

Adhearsion’s website: http://adhearsion.com