sambal 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/sambal/client.rb +62 -33
- data/lib/sambal/version.rb +1 -1
- data/spec/sambal/client_spec.rb +17 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec4f0b1b79fd466d3545c06238d4685e02d690cd
|
4
|
+
data.tar.gz: 8036f666109f31542df162291523a7742af88d81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73f4147a17833f4d2c308c60a0b66a1687d2e98eb5ab384d60bfb1442d9e92f922515fd8c1f62a4514aa54153342a12edaa1c8906da0e64e3d36127b6d6bba6d
|
7
|
+
data.tar.gz: a5407cf3408aa99a2b8887b8863c62713b35f602b637303160e740033711c86e0d2542d5395897e6b7ca066f463b3c712e023e3cdb9bae4c077ac19da0e02c5b
|
data/README.md
CHANGED
@@ -24,13 +24,13 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
A working installation of samba, specifically the "smbclient" command line utility. See http://www.samba.org for more information.
|
26
26
|
On a mac this can be installed through homebrew https://github.com/mxcl/homebrew, like this:
|
27
|
-
|
27
|
+
|
28
28
|
brew install samba
|
29
29
|
|
30
30
|
On the Mac it can probably also be installed both through Fink and MacPorts.
|
31
31
|
|
32
32
|
On Linux (Ubuntu) it's as easy as:
|
33
|
-
|
33
|
+
|
34
34
|
apt-get install smbclient
|
35
35
|
|
36
36
|
It should be available in a similar way on all major Linux distributions.
|
@@ -40,9 +40,11 @@ It should be available in a similar way on all major Linux distributions.
|
|
40
40
|
client = Sambal::Client.new(domain: 'WORKGROUP', host: '127.0.0.1', share: '', user: 'guest', password: '--no-pass', port: 445)
|
41
41
|
client.ls # returns hash of files
|
42
42
|
client.put("local_file.txt","remote_file.txt") # uploads file to server
|
43
|
+
client.exists?("remote_file.txt") # checks if file is on server
|
43
44
|
client.put_content("My content here", "remote_file") # uploads content to a file on server
|
44
45
|
client.get("remote_file.txt", "local_file.txt") # downloads file from server
|
45
46
|
client.del("remote_file.txt") # deletes files from server
|
47
|
+
client.exists?("some_directory") # checks if directory is on server
|
46
48
|
client.cd("some_directory") # changes directory on server
|
47
49
|
client.close # closes connection
|
48
50
|
|
data/lib/sambal/client.rb
CHANGED
@@ -9,12 +9,34 @@ module Sambal
|
|
9
9
|
|
10
10
|
attr_reader :connected
|
11
11
|
|
12
|
-
def
|
12
|
+
def parsed_options(user_options)
|
13
|
+
default_options = {
|
14
|
+
domain: 'WORKGROUP',
|
15
|
+
host: '127.0.0.1',
|
16
|
+
share: '',
|
17
|
+
user: 'guest',
|
18
|
+
password: '--no-pass',
|
19
|
+
port: 445,
|
20
|
+
timeout: 10,
|
21
|
+
columns: 80
|
22
|
+
}
|
23
|
+
|
24
|
+
options = default_options.merge(user_options)
|
25
|
+
options[:ip_address] ||= options[:host] if options[:host] == default_options[:host]
|
26
|
+
options
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(user_options={})
|
13
30
|
begin
|
14
|
-
options =
|
31
|
+
options = parsed_options(user_options)
|
15
32
|
@timeout = options[:timeout].to_i
|
16
|
-
|
17
|
-
|
33
|
+
|
34
|
+
option_flags = "-W \"#{options[:domain]}\" -U \"#{options[:user]}\" -I #{options[:ip_address]} -p #{options[:port]}"
|
35
|
+
command = "COLUMNS=#{options[:columns]} smbclient \"//#{options[:host]}/#{options[:share]}\" '#{options[:password]}'"
|
36
|
+
|
37
|
+
@output, @input, @pid = PTY.spawn(command + ' ' + option_flags)
|
38
|
+
|
39
|
+
res = @output.expect(/(.*\n)?smb:.*\\>/, @timeout)[0] rescue nil
|
18
40
|
@connected = case res
|
19
41
|
when nil
|
20
42
|
$stderr.puts "Failed to connect"
|
@@ -70,6 +92,10 @@ module Sambal
|
|
70
92
|
parse_files(ask_wrapped('ls', qualifier))
|
71
93
|
end
|
72
94
|
|
95
|
+
def exists?(path)
|
96
|
+
ls(path).key? File.basename(path)
|
97
|
+
end
|
98
|
+
|
73
99
|
def cd(dir)
|
74
100
|
response = ask("cd \"#{dir}\"")
|
75
101
|
if response.split("\r\n").join('') =~ /NT_STATUS_OBJECT_NAME_NOT_FOUND/
|
@@ -79,9 +105,9 @@ module Sambal
|
|
79
105
|
end
|
80
106
|
end
|
81
107
|
|
82
|
-
def get(
|
108
|
+
def get(filename, output)
|
83
109
|
begin
|
84
|
-
file_context(
|
110
|
+
file_context(filename) do |file|
|
85
111
|
response = ask_wrapped 'get', [file, output]
|
86
112
|
if response =~ /^getting\sfile.*$/
|
87
113
|
Response.new(response, true)
|
@@ -157,9 +183,9 @@ module Sambal
|
|
157
183
|
end
|
158
184
|
end
|
159
185
|
|
160
|
-
def del(
|
186
|
+
def del(filename)
|
161
187
|
begin
|
162
|
-
file_context(
|
188
|
+
file_context(filename) do |file|
|
163
189
|
response = ask_wrapped 'del', file
|
164
190
|
next_line = response.split("\n")[1]
|
165
191
|
if next_line =~ /^smb:.*\\>/
|
@@ -202,15 +228,15 @@ module Sambal
|
|
202
228
|
end
|
203
229
|
|
204
230
|
def close
|
205
|
-
@
|
206
|
-
@
|
231
|
+
@input.close
|
232
|
+
@output.close
|
207
233
|
Process.wait(@pid)
|
208
234
|
@connected = false
|
209
235
|
end
|
210
236
|
|
211
237
|
def ask(cmd)
|
212
|
-
@
|
213
|
-
response = @
|
238
|
+
@input.printf("#{cmd}\n")
|
239
|
+
response = @output.expect(/^smb:.*\\>/,@timeout)[0] rescue nil
|
214
240
|
if response.nil?
|
215
241
|
$stderr.puts "Failed to do #{cmd}"
|
216
242
|
raise Exception.new, "Failed to do #{cmd}"
|
@@ -229,30 +255,33 @@ module Sambal
|
|
229
255
|
[cmd,filenames].flatten.join(' ')
|
230
256
|
end
|
231
257
|
|
258
|
+
# Parse output from Client#ls
|
259
|
+
# Returns Hash of file names with meta information
|
232
260
|
def parse_files(str)
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
name
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
files[name] =
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
261
|
+
listing = str.each_line.inject({}) do |files, line|
|
262
|
+
line.strip!
|
263
|
+
name = line[/.*(?=\b\s+[ABDHNRS]+\s+\d+)/]
|
264
|
+
name ||= line[/^\.\.|^\./]
|
265
|
+
|
266
|
+
if name
|
267
|
+
line.sub!(name, '')
|
268
|
+
line.strip!
|
269
|
+
|
270
|
+
type = line[0] == "D" ? :directory : :file
|
271
|
+
size = line[/\d+/]
|
272
|
+
|
273
|
+
date = line[/(?<=\d )\D.*$/]
|
274
|
+
modified = (Time.parse(date) rescue "!!#{date}")
|
275
|
+
|
276
|
+
files[name] = {
|
277
|
+
type: type,
|
278
|
+
size: size,
|
279
|
+
modified: modified
|
280
|
+
}
|
253
281
|
end
|
282
|
+
files
|
254
283
|
end
|
255
|
-
|
284
|
+
Hash[listing.sort]
|
256
285
|
end
|
257
286
|
end
|
258
287
|
end
|
data/lib/sambal/version.rb
CHANGED
data/spec/sambal/client_spec.rb
CHANGED
@@ -6,6 +6,7 @@ require 'tempfile'
|
|
6
6
|
describe Sambal::Client do
|
7
7
|
|
8
8
|
TEST_DIRECTORY_WITH_SPACE_IN_NAME = 'my dir with spaces in name'
|
9
|
+
TEST_DIRECTORY_WITH_CONSECUTIVE_SPACES_IN_NAME = 'my dir with consecutive spaces in name'
|
9
10
|
TEST_FILE_IN_DIRECTORY_WITH_SPACE_IN_NAME = 'a_file_in_a_dir_with_spaces_in_name'
|
10
11
|
TEST_SPACES_IN_NAME_PATH = "#{TEST_DIRECTORY_WITH_SPACE_IN_NAME}/#{TEST_FILE_IN_DIRECTORY_WITH_SPACE_IN_NAME}"
|
11
12
|
TEST_DIRECTORY = 'testdir'
|
@@ -26,6 +27,7 @@ describe Sambal::Client do
|
|
26
27
|
f << "Hello"
|
27
28
|
end
|
28
29
|
FileUtils.mkdir_p "#{test_server.share_path}/#{TEST_DIRECTORY_WITH_SPACE_IN_NAME}"
|
30
|
+
FileUtils.mkdir_p "#{test_server.share_path}/#{TEST_DIRECTORY_WITH_CONSECUTIVE_SPACES_IN_NAME}"
|
29
31
|
File.open("#{test_server.share_path}/#{TEST_DIRECTORY_WITH_SPACE_IN_NAME}/#{TEST_FILE_IN_DIRECTORY_WITH_SPACE_IN_NAME}", 'w') do |f|
|
30
32
|
f << "Hello there"
|
31
33
|
end
|
@@ -67,6 +69,7 @@ describe Sambal::Client do
|
|
67
69
|
it "should list files with spaces in their names" do
|
68
70
|
result = @sambal_client.ls
|
69
71
|
expect(result).to have_key(TEST_DIRECTORY_WITH_SPACE_IN_NAME)
|
72
|
+
expect(result).to have_key(TEST_DIRECTORY_WITH_CONSECUTIVE_SPACES_IN_NAME)
|
70
73
|
end
|
71
74
|
|
72
75
|
it "should list files on an smb server" do
|
@@ -84,6 +87,20 @@ describe Sambal::Client do
|
|
84
87
|
end
|
85
88
|
end
|
86
89
|
|
90
|
+
describe 'exists?' do
|
91
|
+
it "returns true if a file or directory exists at a given path" do
|
92
|
+
expect(@sambal_client.exists?(TESTFILE)).to eq(true)
|
93
|
+
expect(@sambal_client.exists?(TESTFILE_SUB_PATH)).to eq(true)
|
94
|
+
expect(@sambal_client.exists?(TEST_DIRECTORY)).to eq(true)
|
95
|
+
expect(@sambal_client.exists?(SUB_DIRECTORY_PATH)).to eq(true)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "returns false if nothing exists at a given path" do
|
99
|
+
expect(@sambal_client.exists?('non_existing_file.txt')).to eq(false)
|
100
|
+
expect(@sambal_client.exists?('non_existing_directory')).to eq(false)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
87
104
|
describe 'mkdir' do
|
88
105
|
before(:all) do
|
89
106
|
@sambal_client.cd('/')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sambal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Axel Eriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -66,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
66
|
version: '0'
|
67
67
|
requirements: []
|
68
68
|
rubyforge_project:
|
69
|
-
rubygems_version: 2.2
|
69
|
+
rubygems_version: 2.5.2
|
70
70
|
signing_key:
|
71
71
|
specification_version: 4
|
72
72
|
summary: Ruby Samba Client
|