BtSync 0.2.1 → 0.3.1
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 +8 -8
- data/lib/btsync.rb +115 -118
- data/lib/btsync/communicator.rb +36 -0
- data/lib/btsync/version.rb +1 -1
- data/spec/BtSync/bt_sync_spec.rb +3 -3
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjkwYWYyMzIyODEwNjViYmE3MDNhZTBkM2JkNjU5Zjk1YWMzMzdmMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTBlZDBlMDk4N2EyZjc3N2E2MzdmNDJlYTRlODBmMGZlNDc1ZGMzNw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDNjNDUzYmYyNjBhZTczYWY5NTQ4YWVhM2UxYzBhNmRkNmEyNTVkY2UzYmMx
|
10
|
+
ZDMyMzk2ZGNkOTYxYTRkYzNjODQ4ODc3NTU5NzIyMmRkMzZmZWZhYTY5MGQ3
|
11
|
+
OGFhMjZmODQzZGQzMWVjM2Q1MmYzNTg0MWZiMTBhYTVhMmQ5OTQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YWEyZDNjNjIzYWFkZWQxNTE1NTU5NTEyMDFmYTgzMjIwNzVmYjYxODM4Yzgz
|
14
|
+
M2RlZGVkYjM4YzA4ZWQ0OTdmYzEyZjNhNzYwMWYzOWFlMDY1YmIxZWNkMDk3
|
15
|
+
MjU0YTNjNjNiMmU4NTQzMjkzZDQwODA5Y2Q1ZjZiMzAxOTI2YzA=
|
data/lib/btsync.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
lib = File.expand_path('../btsync', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
require 'communicator'
|
2
6
|
|
3
7
|
class BtSync
|
8
|
+
include BtCommunicator
|
4
9
|
include HTTParty
|
5
10
|
default_params :output => 'json'
|
6
|
-
|
11
|
+
|
7
12
|
def initialize uri=nil, port=nil
|
8
13
|
@uri = uri
|
9
14
|
@port = port
|
@@ -16,7 +21,12 @@ class BtSync
|
|
16
21
|
errors
|
17
22
|
end
|
18
23
|
def get_folders
|
19
|
-
get_folder_list["folders"]
|
24
|
+
f = get_folder_list["folders"]
|
25
|
+
folders = []
|
26
|
+
f.each do |folder|
|
27
|
+
folders << Directory.new(folder["name"], folder["secret"])
|
28
|
+
end
|
29
|
+
folders
|
20
30
|
end
|
21
31
|
def get_speed
|
22
32
|
s = get_folder_list["speed"].split(", ")
|
@@ -27,7 +37,6 @@ class BtSync
|
|
27
37
|
def remove_folder folder_name, my_secret = nil
|
28
38
|
my_secret ||= secret(folder_name)
|
29
39
|
res = self.class.get(path('removefolder'), :query => { :name => folder_name, :secret => my_secret}, :headers => {"Cookie" => cookies})
|
30
|
-
token(true)
|
31
40
|
true
|
32
41
|
end
|
33
42
|
def add_folder folder_name, my_secret = nil
|
@@ -37,64 +46,9 @@ class BtSync
|
|
37
46
|
@errors << res["message"]
|
38
47
|
return false
|
39
48
|
end
|
40
|
-
token(true)
|
41
|
-
true
|
42
|
-
end
|
43
|
-
def update_secret with_dir, new_secret = nil, my_secret = nil
|
44
|
-
my_secret ||= secret(with_dir)
|
45
|
-
new_secret ||= generate_secret
|
46
|
-
self.class.get(path('updatesecret'), :query => { :name => with_dir, :secret => my_secret, :newsecret => new_secret}, :headers => {"Cookie" => cookies})
|
47
|
-
true
|
48
|
-
end
|
49
|
-
def use_tracker with_dir, opt = true
|
50
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'usetracker', opt), :headers => {"Cookie" => cookies })
|
51
|
-
true
|
52
|
-
end
|
53
|
-
def use_tracker? with_dir
|
54
|
-
bool(get_folder_preferences(with_dir)["usetracker"])
|
55
|
-
end
|
56
|
-
def use_hosts with_dir, opt = false
|
57
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'usehosts', opt), :headers => {"Cookie" => cookies })
|
58
|
-
true
|
59
|
-
end
|
60
|
-
def use_hosts? with_dir
|
61
|
-
bool(get_folder_preferences(with_dir)["usehosts"])
|
62
|
-
end
|
63
|
-
def search_lan with_dir, opt = true
|
64
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'searchlan', opt), :headers => {"Cookie" => cookies })
|
65
|
-
true
|
66
|
-
end
|
67
|
-
def search_lan? with_dir
|
68
|
-
bool(get_folder_preferences(with_dir)["searchlan"])
|
69
|
-
end
|
70
|
-
def search_dht with_dir, opt = false
|
71
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'searchdht', opt), :headers => {"Cookie" => cookies })
|
72
|
-
true
|
73
|
-
end
|
74
|
-
def search_dht? with_dir
|
75
|
-
bool(get_folder_preferences(with_dir)["searchdht"])
|
76
|
-
end
|
77
|
-
def use_relay with_dir, opt = true
|
78
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'relay', opt), :headers => {"Cookie" => cookies })
|
79
|
-
true
|
80
|
-
end
|
81
|
-
def use_relay? with_dir
|
82
|
-
bool(get_folder_preferences(with_dir)["relay"])
|
83
|
-
end
|
84
|
-
def delete_to_trash with_dir, opt = true
|
85
|
-
res = self.class.get(path('setfolderpref'), query: make_opts(with_dir, 'deletetotrash', opt), :headers => {"Cookie" => cookies })
|
86
49
|
true
|
87
50
|
end
|
88
|
-
|
89
|
-
bool(get_folder_preferences(with_dir)["deletetotrash"])
|
90
|
-
end
|
91
|
-
def is_writable? with_dir
|
92
|
-
bool(get_folder_preferences(with_dir)["iswritable"])
|
93
|
-
end
|
94
|
-
def generate_secret
|
95
|
-
res = self.class.get(path('generatesecret'), :headers => {"Cookie" => cookies })
|
96
|
-
res.parsed_response["secret"]
|
97
|
-
end
|
51
|
+
|
98
52
|
def get_settings
|
99
53
|
res = self.class.get(path('getsettings'), :headers => {"Cookie" => cookies })
|
100
54
|
res.parsed_response["settings"]
|
@@ -111,11 +65,7 @@ class BtSync
|
|
111
65
|
res = self.class.get(path('checknewversion'), :headers => {"Cookie" => cookies })
|
112
66
|
res.parsed_response["version"]
|
113
67
|
end
|
114
|
-
|
115
|
-
my_secret ||= secret(folder_name)
|
116
|
-
res = self.class.get(path('getfolderpref'), :query => { :name => folder_name, :secret => my_secret}, :headers => {"Cookie" => cookies})
|
117
|
-
res.parsed_response["folderpref"]
|
118
|
-
end
|
68
|
+
|
119
69
|
def get_dir with_dir
|
120
70
|
res = self.class.get(path('getdir'), :query => {:dir => with_dir}, :headers => {"Cookie" => cookies })
|
121
71
|
res.parsed_response["folders"]
|
@@ -126,67 +76,114 @@ class BtSync
|
|
126
76
|
res["hosts"]
|
127
77
|
end
|
128
78
|
def secret with_dir
|
129
|
-
f = get_folders.select{|folder| folder
|
130
|
-
f
|
131
|
-
end
|
132
|
-
def get_read_only_secret with_dir, my_secret = nil
|
133
|
-
my_secret ||= secret(with_dir)
|
134
|
-
get_folder_preferences(with_dir, my_secret)["readonlysecret"]
|
79
|
+
f = get_folders.select{|folder| folder.name == with_dir}.first
|
80
|
+
f.secret
|
135
81
|
end
|
136
82
|
private
|
137
|
-
|
138
|
-
opts = get_folder_preferences(with_dir)
|
139
|
-
opts[name] = bool_to_i(opt)
|
140
|
-
opts.delete('readonlysecret')
|
141
|
-
opts.merge!({:name => with_dir, :secret => secret(with_dir)})
|
142
|
-
end
|
143
|
-
def bool i
|
144
|
-
if i == 0
|
145
|
-
false
|
146
|
-
elsif i == 1
|
147
|
-
true
|
148
|
-
else
|
149
|
-
i
|
150
|
-
end
|
151
|
-
end
|
152
|
-
def bool_to_i bool
|
153
|
-
if bool
|
154
|
-
1
|
155
|
-
else
|
156
|
-
0
|
157
|
-
end
|
158
|
-
end
|
83
|
+
|
159
84
|
def get_folder_list
|
160
85
|
res = self.class.get(path('getsyncfolders'), :headers => {"Cookie" => cookies })
|
161
86
|
@folder_list = res.parsed_response
|
162
87
|
end
|
163
88
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
@
|
174
|
-
@
|
175
|
-
end
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
89
|
+
class Directory
|
90
|
+
include HTTParty
|
91
|
+
include BtCommunicator
|
92
|
+
default_params :output => 'json'
|
93
|
+
|
94
|
+
attr_reader :secret, :name
|
95
|
+
|
96
|
+
def initialize name, secret
|
97
|
+
@name = name
|
98
|
+
@secret = secret
|
99
|
+
@errors = []
|
100
|
+
end
|
101
|
+
|
102
|
+
def update_secret new_secret = nil
|
103
|
+
new_secret ||= generate_secret
|
104
|
+
res = self.class.get(path('updatesecret'), :query => { :name => @name, :secret => @secret, :newsecret => new_secret}, :headers => {"Cookie" => cookies})
|
105
|
+
if res.parsed_response != "{}" && res.parsed_response != '\r\ninvalid request'
|
106
|
+
@secret = new_secret
|
107
|
+
true
|
108
|
+
else
|
109
|
+
@errors << res.parsed_response
|
110
|
+
false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
def use_tracker=(opt)
|
114
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('usetracker', opt), :headers => {"Cookie" => cookies })
|
115
|
+
true
|
116
|
+
end
|
117
|
+
def use_tracker?
|
118
|
+
bool(preferences["usetracker"])
|
119
|
+
end
|
120
|
+
def use_hosts=(opt)
|
121
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('usehosts', opt), :headers => {"Cookie" => cookies })
|
122
|
+
true
|
123
|
+
end
|
124
|
+
def use_hosts?
|
125
|
+
bool(preferences["usehosts"])
|
126
|
+
end
|
127
|
+
def search_lan=(opt)
|
128
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('searchlan', opt), :headers => {"Cookie" => cookies })
|
129
|
+
true
|
130
|
+
end
|
131
|
+
def search_lan?
|
132
|
+
bool(preferences["searchlan"])
|
133
|
+
end
|
134
|
+
def search_dht=(opt)
|
135
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('searchdht', opt), :headers => {"Cookie" => cookies })
|
136
|
+
true
|
137
|
+
end
|
138
|
+
def search_dht?
|
139
|
+
bool(preferences["searchdht"])
|
140
|
+
end
|
141
|
+
def use_relay=(opt)
|
142
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('relay', opt), :headers => {"Cookie" => cookies })
|
143
|
+
true
|
144
|
+
end
|
145
|
+
def use_relay?
|
146
|
+
bool(preferences["relay"])
|
147
|
+
end
|
148
|
+
def delete_to_trash=(opt)
|
149
|
+
res = self.class.get(path('setfolderpref'), query: make_opts('deletetotrash', opt), :headers => {"Cookie" => cookies })
|
150
|
+
true
|
151
|
+
end
|
152
|
+
def delete_to_trash?
|
153
|
+
bool(preferences["deletetotrash"])
|
154
|
+
end
|
155
|
+
def is_writable? with_dir
|
156
|
+
bool(preferences["iswritable"])
|
157
|
+
end
|
158
|
+
def preferences
|
159
|
+
res = self.class.get(path('getfolderpref'), :query => { :name => @name, :secret => @secret}, :headers => {"Cookie" => cookies})
|
160
|
+
res.parsed_response["folderpref"]
|
161
|
+
end
|
162
|
+
def read_only_secret
|
163
|
+
preferences["readonlysecret"]
|
164
|
+
end
|
165
|
+
private
|
166
|
+
def make_opts name, opt
|
167
|
+
opts = preferences
|
168
|
+
opts[name] = bool_to_i(opt)
|
169
|
+
opts.delete('readonlysecret')
|
170
|
+
opts.merge!({:name => @name, :secret => @secret})
|
171
|
+
end
|
172
|
+
def bool i
|
173
|
+
if i == 0
|
174
|
+
false
|
175
|
+
elsif i == 1
|
176
|
+
true
|
177
|
+
else
|
178
|
+
i
|
179
|
+
end
|
180
|
+
end
|
181
|
+
def bool_to_i bool
|
182
|
+
if bool
|
183
|
+
1
|
184
|
+
else
|
185
|
+
0
|
186
|
+
end
|
187
187
|
end
|
188
|
-
end
|
189
|
-
def path action_name
|
190
|
-
"#{uri}:#{port}/gui/?token=#{token}&action=#{action_name}"
|
191
188
|
end
|
192
189
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module BtCommunicator
|
2
|
+
include HTTParty
|
3
|
+
def generate_secret
|
4
|
+
res = self.class.get(path('generatesecret'), :headers => {"Cookie" => cookies })
|
5
|
+
res.parsed_response["secret"]
|
6
|
+
end
|
7
|
+
def port
|
8
|
+
@port ||= '8888'
|
9
|
+
end
|
10
|
+
def uri
|
11
|
+
@uri ||= "http://localhost"
|
12
|
+
end
|
13
|
+
def token force = false
|
14
|
+
@token_cache ||= 0
|
15
|
+
time = DateTime.now.strftime("%s").to_i
|
16
|
+
if time > @token_cache + 600 || force
|
17
|
+
@token = request_token(force).gsub('</div></html>', '').gsub("<html><div id='token' style='display:none;'>", '')
|
18
|
+
@token_cache = time
|
19
|
+
end
|
20
|
+
@cookies = nil if force
|
21
|
+
@token
|
22
|
+
end
|
23
|
+
def cookies
|
24
|
+
@cookies ||= request_token.headers["set-cookie"].split("; ")[0]
|
25
|
+
end
|
26
|
+
def request_token force = false
|
27
|
+
if @request_token.nil? || force
|
28
|
+
@request_token = self.class.get("#{uri}:#{port}/gui/token.html", :query => {:output => :text})
|
29
|
+
else
|
30
|
+
@request_token
|
31
|
+
end
|
32
|
+
end
|
33
|
+
def path action_name
|
34
|
+
"#{uri}:#{port}/gui/?token=#{token}&action=#{action_name}"
|
35
|
+
end
|
36
|
+
end
|
data/lib/btsync/version.rb
CHANGED
data/spec/BtSync/bt_sync_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe 'BtSync' do
|
|
11
11
|
VCR.use_cassette("get-folders") do
|
12
12
|
@folder = @bt.get_folders.first
|
13
13
|
end
|
14
|
-
@folder
|
14
|
+
@folder.name.should == "/home/chris/Documents"
|
15
15
|
end
|
16
16
|
it "can view settings" do
|
17
17
|
VCR.use_cassette("get-settings") do
|
@@ -40,7 +40,7 @@ describe 'BtSync' do
|
|
40
40
|
folders = @bt.get_folders
|
41
41
|
folders.count.should == 2
|
42
42
|
folder = folders.last
|
43
|
-
folder
|
43
|
+
folder.name.should == "/home/chris/bt_test"
|
44
44
|
end
|
45
45
|
VCR.use_cassette("remove-folder") do
|
46
46
|
@bt.remove_folder '/home/chris/bt_test'
|
@@ -49,7 +49,7 @@ describe 'BtSync' do
|
|
49
49
|
folders = @bt.get_folders
|
50
50
|
folders.count.should == 1
|
51
51
|
folder = folders.last
|
52
|
-
folder
|
52
|
+
folder.name.should == "/home/chris/Documents"
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: BtSync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris MacNaughton
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- Rakefile
|
112
112
|
- btsync.gemspec
|
113
113
|
- lib/btsync.rb
|
114
|
+
- lib/btsync/communicator.rb
|
114
115
|
- lib/btsync/version.rb
|
115
116
|
- spec/BtSync/bt_sync_spec.rb
|
116
117
|
- spec/fixtures/cassettes/add-folder-list.yml
|