tunnelbroker 0.1.0
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 +7 -0
- data/.gitignore +36 -0
- data/.rspec +2 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +124 -0
- data/Rakefile +13 -0
- data/lib/tunnelbroker.rb +28 -0
- data/lib/tunnelbroker/api_response.rb +68 -0
- data/lib/tunnelbroker/client.rb +46 -0
- data/lib/tunnelbroker/configuration.rb +24 -0
- data/lib/tunnelbroker/messenger.rb +34 -0
- data/lib/tunnelbroker/version.rb +28 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/unit/tunnelbroker/api_response_spec.rb +414 -0
- data/spec/unit/tunnelbroker/client_spec.rb +318 -0
- data/spec/unit/tunnelbroker/configuration_spec.rb +84 -0
- data/spec/unit/tunnelbroker/messenger_spec.rb +194 -0
- data/spec/unit/tunnelbroker/version_spec.rb +11 -0
- data/tunnelbroker.gemspec +32 -0
- metadata +199 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d6b32e7145250ea944c77ae905064d8ac32191ce
|
4
|
+
data.tar.gz: fc3e5e2ea04d423a63febddc8d92314ce6ce7635
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 578e56159628fec166c5b0f0fba69d40ef8a7b95bf75c1e7e93230e99627b30e01b6d765d91bc818a57127ab71cee332238e7f0912830d3fb0b7b455af937b68
|
7
|
+
data.tar.gz: 4ba2792de994d30fdf09d9119707dd6d85f07e09c01f2d15344a98e0de69b903f8bf9a4935aca41560f27f7cf79dfec7385299b17845c7afbb5bc296fb784d7d
|
data/.gitignore
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
Gemfile.lock
|
12
|
+
test.rb
|
13
|
+
|
14
|
+
## Specific to RubyMotion:
|
15
|
+
.dat*
|
16
|
+
.repl_history
|
17
|
+
build/
|
18
|
+
|
19
|
+
## Documentation cache and generated files:
|
20
|
+
/.yardoc/
|
21
|
+
/_yardoc/
|
22
|
+
/doc/
|
23
|
+
/rdoc/
|
24
|
+
|
25
|
+
## Environment normalisation:
|
26
|
+
/.bundle/
|
27
|
+
/lib/bundler/man/
|
28
|
+
|
29
|
+
# for a library or gem, you might want to ignore these files since the code is
|
30
|
+
# intended to run in multiple environments; otherwise, check them in:
|
31
|
+
# Gemfile.lock
|
32
|
+
# .ruby-version
|
33
|
+
# .ruby-gemset
|
34
|
+
|
35
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
36
|
+
.rvmrc
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Tim Heckman
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
tunnelbroker
|
2
|
+
============
|
3
|
+
[](https://travis-ci.org/theckman/tunnelbroker)
|
4
|
+
[](https://tldrlegal.com/license/mit-license)
|
5
|
+
[](https://coveralls.io/r/theckman/tunnelbroker)
|
6
|
+
[](https://codeclimate.com/github/theckman/tunnelbroker)
|
7
|
+
[](https://gemnasium.com/theckman/tunnelbroker)
|
8
|
+
|
9
|
+
Ruby TunnelBroker API client
|
10
|
+
|
11
|
+
LICENSE
|
12
|
+
-------
|
13
|
+
[tunnelbroker](https://github.com/theckman/tunnelbroker) is released under
|
14
|
+
the [MIT](http://opensource.org/licenses/MIT) license. The full license has
|
15
|
+
been provided in the
|
16
|
+
[LICENSE](https://github.com/theckman/tunnelbroker/blob/master/LICENSE) file.
|
17
|
+
|
18
|
+
CONTRIBUTING
|
19
|
+
------------
|
20
|
+
See [CONTRIBUTION.md](https://github.com/theckman/tunnelbroker/blob/master/CONTRIBUTING.md)
|
21
|
+
for information on contributing back to this project.
|
22
|
+
|
23
|
+
INSTALLATION
|
24
|
+
------------
|
25
|
+
To install on the commandline using `gem`:
|
26
|
+
|
27
|
+
```Bash
|
28
|
+
gem install tunnelbroker
|
29
|
+
```
|
30
|
+
|
31
|
+
If you are including this in your project's `Gemfile`:
|
32
|
+
|
33
|
+
```Ruby
|
34
|
+
gem 'tunnelbroker'
|
35
|
+
```
|
36
|
+
|
37
|
+
USAGE
|
38
|
+
-----
|
39
|
+
### Nitty-gritty overview
|
40
|
+
```Ruby
|
41
|
+
# require the gem
|
42
|
+
require 'tunnelbroker'
|
43
|
+
=> true
|
44
|
+
|
45
|
+
# instantiate a new client
|
46
|
+
client = TunnelBroker::Client.new
|
47
|
+
=> #<TunnelBroker::Client:0x007fa2fbaac5d0>
|
48
|
+
|
49
|
+
# configure the client
|
50
|
+
client.configure do |c|
|
51
|
+
c.tunnelid = 42
|
52
|
+
c.username = 'theckman'
|
53
|
+
c.update_key = 'YourUpdateKey'
|
54
|
+
end
|
55
|
+
|
56
|
+
# check your config options
|
57
|
+
client.config.username
|
58
|
+
=> "theckman"
|
59
|
+
|
60
|
+
# update the API, assign the response object
|
61
|
+
response = client.submit_update
|
62
|
+
=> #<TunnelBroker::APIResponse:0x007fa2fba20e40 @success=true, @changed=false, @response={:msg=>"nochg", :data=>{:ip=>"50.161.84.35"}}>
|
63
|
+
|
64
|
+
# was it successful?
|
65
|
+
response.success?
|
66
|
+
=> true
|
67
|
+
|
68
|
+
# did the IP address change?
|
69
|
+
response.changed?
|
70
|
+
=> false
|
71
|
+
|
72
|
+
# configure the client, specifying an ip4addr this time
|
73
|
+
client.configure do |c|
|
74
|
+
c.ip4addr = '127.0.0.1'
|
75
|
+
end
|
76
|
+
|
77
|
+
# update the API, assign the response object
|
78
|
+
response = client.submit_update
|
79
|
+
=> #<TunnelBroker::APIResponse:0x007fa2fb9d9c98 @success=true, @changed=true, @response={:msg=>"good", :data=>{:ip=>"127.0.0.1"}}>
|
80
|
+
|
81
|
+
# was it successful?
|
82
|
+
response.success?
|
83
|
+
=> true
|
84
|
+
|
85
|
+
# did the IP address change?
|
86
|
+
response.changed?
|
87
|
+
=> true
|
88
|
+
```
|
89
|
+
|
90
|
+
### Configuration
|
91
|
+
The configuration of the client is done by sending a Ruby block to the client's
|
92
|
+
`configure` method:
|
93
|
+
|
94
|
+
```Ruby
|
95
|
+
# henceforth, any refences to client will be this:
|
96
|
+
client = TunnelBroker::Client.new
|
97
|
+
|
98
|
+
client.configure do |cfg|
|
99
|
+
cfg.username = 'theckman'
|
100
|
+
end
|
101
|
+
```
|
102
|
+
|
103
|
+
Here are the available configuration items:
|
104
|
+
|
105
|
+
| Option | Explanation |
|
106
|
+
| ------------ | ----------- |
|
107
|
+
| `ip4addr` | Specify the ipv4 address that will connect to the tunnel. If not specified, the IP address of which the request came from is specified. |
|
108
|
+
| `username` | This is your [tunnelbroker.net](https://www.tunnelbroker.net/) username |
|
109
|
+
| `update_key` | This is the update_key for your tunnel, you can set this on the 'Advanced' tab for your tunnel. |
|
110
|
+
| `tunnelid` | The tunnelid from the 'IPv6 Tunnel' tab of your tunnel. |
|
111
|
+
| `url` | If you want to use a custom endpoint URL, you can specify it here. Defaults to the TunnelBroker API endpoint. |
|
112
|
+
|
113
|
+
### Updating the API
|
114
|
+
There is a simple method to update the API. It returns a `TunnelBroker::APIResponse` object.
|
115
|
+
```Ruby
|
116
|
+
client.submit_update
|
117
|
+
```
|
118
|
+
|
119
|
+
### Checking the response object
|
120
|
+
The response object has two primary methods for telling what happened:
|
121
|
+
|
122
|
+
* `.success?` - returns true/false as to whether this was successful or not
|
123
|
+
* `.changed?` - returns true/false as to whether IP had changed.
|
124
|
+
* `.response` - Hash containing the response from the server split in to sections.
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- coding: UTF-8 -*_
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
Rubocop::RakeTask.new(:rubocop) do |t|
|
8
|
+
t.patterns =
|
9
|
+
%w( Rakefile Gemfile tunnelbroker.gemspec lib/**/*.rb spec/*_spec.rb )
|
10
|
+
t.fail_on_error = true
|
11
|
+
end
|
12
|
+
|
13
|
+
task default: [:rubocop, :spec]
|
data/lib/tunnelbroker.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
# The MIT License (MIT)
|
3
|
+
|
4
|
+
# Copyright (c) 2014 Tim Heckman
|
5
|
+
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files (the "Software"), to deal
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
# SOFTWARE.
|
23
|
+
|
24
|
+
require 'tunnelbroker/version'
|
25
|
+
require 'tunnelbroker/api_response'
|
26
|
+
require 'tunnelbroker/configuration'
|
27
|
+
require 'tunnelbroker/messenger'
|
28
|
+
require 'tunnelbroker/client'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
require 'English'
|
3
|
+
|
4
|
+
module TunnelBroker
|
5
|
+
# class to give some helpful handling of the TunnelBroker API response
|
6
|
+
#
|
7
|
+
class APIResponse
|
8
|
+
attr_reader :response
|
9
|
+
|
10
|
+
BADAUTH = /^(badauth)$/
|
11
|
+
CHANGE = /^(good)\s(\d+\.\d+\.\d+\.\d+)$/
|
12
|
+
NO_CHANGE = /^(nochg)\s(\d+\.\d+\.\d+\.\d+)$/
|
13
|
+
|
14
|
+
def initialize(response)
|
15
|
+
parse_response(response.lines.first)
|
16
|
+
end
|
17
|
+
|
18
|
+
def success?
|
19
|
+
if @success.nil?
|
20
|
+
false
|
21
|
+
else
|
22
|
+
@success
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def changed?
|
27
|
+
if @changed.nil?
|
28
|
+
false
|
29
|
+
else
|
30
|
+
@changed
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def parse_response(firstline)
|
37
|
+
if BADAUTH.match(firstline)
|
38
|
+
bad_auth($LAST_MATCH_INFO)
|
39
|
+
elsif CHANGE.match(firstline)
|
40
|
+
change($LAST_MATCH_INFO)
|
41
|
+
elsif NO_CHANGE.match(firstline)
|
42
|
+
no_change($LAST_MATCH_INFO)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def bad_auth(match)
|
47
|
+
@success = false
|
48
|
+
@changed = false
|
49
|
+
@response = { msg: match[1], data: {} }
|
50
|
+
end
|
51
|
+
|
52
|
+
def change(match)
|
53
|
+
@success = true
|
54
|
+
@changed = true
|
55
|
+
matched_response(match)
|
56
|
+
end
|
57
|
+
|
58
|
+
def no_change(match)
|
59
|
+
@success = true
|
60
|
+
@changed = false
|
61
|
+
matched_response(match)
|
62
|
+
end
|
63
|
+
|
64
|
+
def matched_response(match)
|
65
|
+
@response = { msg: match[1], data: { ip: match[2] } }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
require 'tunnelbroker/configuration'
|
3
|
+
require 'tunnelbroker/messenger'
|
4
|
+
|
5
|
+
module TunnelBroker
|
6
|
+
# TunnelBroker client for communication with the API
|
7
|
+
#
|
8
|
+
class Client
|
9
|
+
ENDPOINT ||= 'https://ipv4.tunnelbroker.net/nic/update'
|
10
|
+
|
11
|
+
def configure
|
12
|
+
yield(config) if Kernel.block_given?
|
13
|
+
end
|
14
|
+
|
15
|
+
def submit_update
|
16
|
+
c = build_messenger_config
|
17
|
+
tb = TunnelBroker::Messenger.new(c)
|
18
|
+
tb.call_api
|
19
|
+
end
|
20
|
+
|
21
|
+
def config
|
22
|
+
@config ||= TunnelBroker::Configuration.new
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def build_messenger_config
|
28
|
+
conf = {}
|
29
|
+
TunnelBroker::Configuration::FIELDS.each do |k|
|
30
|
+
conf.merge!(config_hash_item(k))
|
31
|
+
end
|
32
|
+
conf
|
33
|
+
end
|
34
|
+
|
35
|
+
def config_hash_item(key)
|
36
|
+
c = config.send(key)
|
37
|
+
if c.nil? && key == :url
|
38
|
+
{ key => ENDPOINT }
|
39
|
+
elsif c.nil?
|
40
|
+
{}
|
41
|
+
else
|
42
|
+
{ key => c }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
module TunnelBroker
|
4
|
+
# Configuration class for the TunnelBroker client
|
5
|
+
#
|
6
|
+
class Configuration
|
7
|
+
FIELDS = [:url, :ip4addr, :username, :update_key, :tunnelid]
|
8
|
+
attr_accessor(*FIELDS)
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
set_default_values
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def set_default_values
|
17
|
+
@ip4addr = nil
|
18
|
+
@username = nil
|
19
|
+
@update_key = nil
|
20
|
+
@tunnelid = nil
|
21
|
+
@url = nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
require 'tunnelbroker/api_response'
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
module TunnelBroker
|
6
|
+
# The class for communicating with the API
|
7
|
+
#
|
8
|
+
class Messenger
|
9
|
+
include HTTParty
|
10
|
+
|
11
|
+
def initialize(opts)
|
12
|
+
opts_to_inst(opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
def call_api
|
16
|
+
TunnelBroker::APIResponse.new(call_endpoint)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def opts_to_inst(opts)
|
22
|
+
opts.each do |k, v|
|
23
|
+
instance_variable_set(:"@#{k}", v)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def call_endpoint
|
28
|
+
auth = { username: @username, password: @update_key }
|
29
|
+
query = { hostname: @tunnelid }
|
30
|
+
query.merge!(myip: @ip4addr) unless @ip4addr.nil?
|
31
|
+
self.class.get(@url, basic_auth: auth, query: query)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
# The MIT License (MIT)
|
3
|
+
|
4
|
+
# Copyright (c) 2014 Tim Heckman
|
5
|
+
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
# of this software and associated documentation files (the "Software"), to deal
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
11
|
+
# furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
14
|
+
# all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
# SOFTWARE.
|
23
|
+
|
24
|
+
# The TunnelBroker API client namespace.
|
25
|
+
#
|
26
|
+
module TunnelBroker
|
27
|
+
VERSION ||= '0.1.0'
|
28
|
+
end
|