freebox_api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ freebox_api-*.gem
2
+ *.swp
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ Freebox OS API bindings for Ruby
2
+ ================================
3
+
4
+ WARNING: Work In Progress.
5
+
6
+ Overview
7
+ --------
8
+
9
+ This gem contains Freebox OS API bindings for the Ruby language.
10
+ I started working on that to use it with https://github.com/mcanevet/puppet-freebox
11
+
12
+ Obtaining an app\_token
13
+ -----------------------
14
+
15
+ ```ruby
16
+ require 'freebox_api'
17
+
18
+ puts FreeboxApi::Freebox.app_token('fr.freebox.testapp', 'Test App', '0.0.7', 'Pc de Xavier')
19
+ ```
20
+
21
+ Initialize application
22
+ ----------------------
23
+
24
+ ```ruby
25
+ require 'freebox_api'
26
+
27
+ mafreebox = FreeboxApi::Freebox.new('dyNYgfK0Ya6FWGqq83sBHa7TwzWo+pg4fDFUJHShcjVYzTfaRrZzm93p7OTAfH/0', 'fr.freebox.testapp', 'Test App', '0.0.7', 'Pc de Xavier', 'http://mafreebox.example.com:4242')
28
+ ```
29
+
30
+ Get the current challenge
31
+ -------------------------
32
+
33
+ ```ruby
34
+ puts mafreebox.challenge
35
+ ```
36
+
37
+ Get the current password
38
+ ------------------------
39
+
40
+ ```ruby
41
+ puts mafreebox.password
42
+ ```
43
+
44
+ Get the current session\_token
45
+ -----------------------------
46
+
47
+ ```ruby
48
+ puts mafreebox.session_token
49
+ ```
50
+
51
+ Get the list of browsable LAN interfaces
52
+ ----------------------------------------
53
+
54
+ ```ruby
55
+ puts mafreebox.interfaces
56
+ ```
57
+
58
+ Get the list of LAN hosts
59
+ -------------------------
60
+
61
+ ```ruby
62
+ puts mafreebox.lan_hosts
63
+ ```
64
+
65
+ Get the list of DHCP static leases
66
+ ----------------------------------
67
+
68
+ ```ruby
69
+ puts mafreebox.static_leases
70
+ ```
71
+
72
+ Get the list of Port Forwardings
73
+ --------------------------------
74
+
75
+ ```ruby
76
+ puts mafreebox.redirs
77
+ ```
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../lib/freebox_api/version', __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.authors = ["Mickaël Canévet"]
5
+ gem.email = 'mickael.canevet@gmail.com'
6
+ gem.description = %q{Helps you to use Freebox OS's API calls from your app}
7
+ gem.summary = %q{Ruby bindings for Freebox OS's rest API}
8
+ gem.homepage = 'http://github.com/mcanevet/freebox_api'
9
+
10
+ gem.files = `git ls-files`.split($\)
11
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
12
+ gem.name = 'freebox_api'
13
+ gem.require_paths = ["lib"]
14
+ gem.version = FreeboxApi::VERSION
15
+
16
+ gem.add_dependency 'json'
17
+ gem.add_dependency 'rest-client', '>= 1.6.1'
18
+ end
@@ -0,0 +1,45 @@
1
+ module FreeboxApi
2
+
3
+ module Resources
4
+
5
+ class Interface
6
+
7
+ attr_reader :name, :host_count
8
+
9
+ def initialize(name, host_count, freebox)
10
+ @name = name
11
+ @host_count = host_count
12
+ @freebox = freebox
13
+ end
14
+
15
+ def lan_hosts
16
+ JSON.parse(
17
+ RestClient.get(
18
+ "#{@freebox.base_url}/api/v1/lan/browser/#{@name}",
19
+ :'X_Fbx_App_Auth' => @freebox.session_token
20
+ )
21
+ )['result'].collect { |lan_host|
22
+ FreeboxApi::Resources::LanHost.new(
23
+ lan_host['id'],
24
+ lan_host['primary_name'],
25
+ lan_host['host_type'],
26
+ lan_host['primary_name_manual'],
27
+ lan_host['l2ident'],
28
+ lan_host['vendor_name '],
29
+ lan_host['persistent'],
30
+ lan_host['reachable'],
31
+ lan_host['last_time_reachable'],
32
+ lan_host['active'],
33
+ lan_host['last_activity'],
34
+ lan_host['names'],
35
+ lan_host['l3connectivities'],
36
+ self,
37
+ @freebox)
38
+ }
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,38 @@
1
+ module FreeboxApi
2
+
3
+ module Resources
4
+
5
+ class LanHost
6
+
7
+ attr_reader :id, :primary_name, :host_type, :primary_name_manual, :l2ident, :vendor_name, :persistent, :reachable, :last_time_reachable, :active, :last_activity, :names, :l3connectivities, :interface
8
+
9
+ def initialize(id, primary_name, host_type, primary_name_manual, l2ident, vendor_name, persistent, reachable, last_time_reachable, active, last_activity, names, l3connectivities, interface, freebox)
10
+ @id = id
11
+ @primary_name = primary_name
12
+ @host_type = host_type
13
+ @primary_name_manual = primary_name_manual
14
+ @l2ident = l2ident
15
+ @vendor_name = vendor_name
16
+ @persistent = persistent
17
+ @reachable = reachable
18
+ @last_time_reachable = last_time_reachable
19
+ @active = active
20
+ @last_activity = last_activity
21
+ @names = names
22
+ @l3connectivities = l3connectivities
23
+ @interface = interface
24
+ @freebox = freebox
25
+ end
26
+
27
+ def static_leases
28
+ @freebox.static_leases.select { |static_lease|
29
+ static_lease.host == self
30
+ }
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,27 @@
1
+ module FreeboxApi
2
+
3
+ module Resources
4
+
5
+ class Redir
6
+
7
+ attr_reader :id, :enabled, :ip_proto, :wan_port_start, :wan_port_end, :lan_ip, :lan_port, :hostname, :host, :comment
8
+
9
+ def initialize(id, enabled, ip_proto, wan_port_start, wan_port_end, lan_ip, lan_port, hostname, host, comment, freebox)
10
+ @id = id
11
+ @enabled = enabled
12
+ @ip_proto = ip_proto
13
+ @wan_port_start = wan_port_start
14
+ @wan_port_end = wan_port_end
15
+ @lan_ip = lan_ip
16
+ @lan_port = lan_port
17
+ @hostname = hostname
18
+ @host = host
19
+ @comment = comment
20
+ @freebox = freebox
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,22 @@
1
+ module FreeboxApi
2
+
3
+ module Resources
4
+
5
+ class StaticLease
6
+
7
+ attr_reader :id, :mac, :comment, :hostname, :ip, :host
8
+
9
+ def initialize(id, mac, comment, hostname, ip, host, freebox)
10
+ @id = id
11
+ @mac = mac
12
+ @hostname = hostname
13
+ @ip = ip
14
+ @host = host
15
+ @freebox = freebox
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,3 @@
1
+ module FreeboxApi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,120 @@
1
+ require 'rest_client'
2
+ require 'json'
3
+
4
+ module FreeboxApi
5
+
6
+ class Freebox
7
+
8
+ attr_reader :app_token, :app_id, :app_name, :app_version, :device_name, :base_url
9
+
10
+ def initialize(app_token, app_id, app_name, app_version, device_name, base_url = 'http://mafreebox.free.fr')
11
+ @app_id = app_id
12
+ @app_name = app_name
13
+ @app_version = app_version
14
+ @device_name = device_name
15
+ @app_token = app_token
16
+ @base_url = base_url
17
+ end
18
+
19
+ def self.app_token(app_id, app_name, app_version, device_name)
20
+ JSON.parse(RestClient.post(
21
+ "#{@base_url}/api/v1/login/authorize",
22
+ {
23
+ :app_id => app_id,
24
+ :app_name => app_name,
25
+ :app_version => app_version,
26
+ :device_name => device_name,
27
+ }.to_json,
28
+ :content_type => :json,
29
+ :accept => :json
30
+ ))['result']['app_token']
31
+ end
32
+
33
+ def challenge
34
+ JSON.parse(RestClient.get("#{@base_url}/api/v1/login/"))['result']['challenge']
35
+ end
36
+
37
+ def password
38
+ Digest::HMAC.hexdigest(challenge, @app_token, Digest::SHA1)
39
+ end
40
+
41
+ def session_token
42
+ JSON.parse(
43
+ RestClient.post(
44
+ "#{@base_url}/api/v1/login/session/",
45
+ {
46
+ :app_id => @app_id,
47
+ :password => password,
48
+ }.to_json,
49
+ :content_type => :json,
50
+ :accept => :json
51
+ )
52
+ )['result']['session_token']
53
+ end
54
+
55
+ def interfaces
56
+ JSON.parse(
57
+ RestClient.get(
58
+ "#{@base_url}/api/v1/lan/browser/interfaces",
59
+ :'X_Fbx_App_Auth' => session_token
60
+ )
61
+ )['result'].collect { |interface|
62
+ FreeboxApi::Resources::Interface.new(interface['name'], interface['host_count'], self)
63
+ }
64
+ end
65
+
66
+ def lan_hosts
67
+ interfaces.collect { |interface|
68
+ interface.lan_hosts
69
+ }.flatten
70
+ end
71
+
72
+ def static_leases
73
+ JSON.parse(
74
+ RestClient.get(
75
+ "#{@base_url}/api/v1/dhcp/static_lease/",
76
+ :'X_Fbx_App_Auth' => session_token
77
+ )
78
+ )['result'].collect { |static_lease|
79
+ FreeboxApi::Resources::StaticLease.new(
80
+ static_lease['id'],
81
+ static_lease['mac'],
82
+ static_lease['comment'],
83
+ static_lease['hostname'],
84
+ static_lease['ip'],
85
+ lan_hosts.select { |lan_host| lan_host.id == static_lease['host']['id'] },
86
+ self
87
+ )
88
+ }
89
+ end
90
+
91
+ def redirs
92
+ JSON.parse(
93
+ RestClient.get(
94
+ "#{@base_url}/api/v1/fw/redir/",
95
+ :'X_Fbx_App_Auth' => session_token
96
+ )
97
+ )['result'].collect { |redir|
98
+ FreeboxApi::Resources::Redir.new(
99
+ redir['id'],
100
+ redir['enabled'],
101
+ redir['ip_proto'],
102
+ redir['wan_port_start'],
103
+ redir['wan_port_end'],
104
+ redir['lan_ip'],
105
+ redir['lan_port'],
106
+ redir['hostname'],
107
+ lan_hosts.select { |lan_host| lan_host.id == redir['host']['id'] },
108
+ redir['comment'],
109
+ self
110
+ )
111
+ }
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
118
+ require 'freebox_api/version'
119
+ resource_files = Dir[File.expand_path("#{File.dirname(__FILE__)}/freebox_api/resources/*.rb", __FILE__)]
120
+ resource_files.each { |f| require f }
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: freebox_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mickaël Canévet
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-09-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rest-client
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.6.1
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.1
46
+ description: Helps you to use Freebox OS's API calls from your app
47
+ email: mickael.canevet@gmail.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - .gitignore
53
+ - README.md
54
+ - freebox_api.gemspec
55
+ - lib/freebox_api.rb
56
+ - lib/freebox_api/resources/interface.rb
57
+ - lib/freebox_api/resources/lan_host.rb
58
+ - lib/freebox_api/resources/redir.rb
59
+ - lib/freebox_api/resources/static_lease.rb
60
+ - lib/freebox_api/version.rb
61
+ homepage: http://github.com/mcanevet/freebox_api
62
+ licenses: []
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 1.8.23
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: Ruby bindings for Freebox OS's rest API
85
+ test_files: []