/
session.rb
70 lines (59 loc) · 1.79 KB
/
session.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module EventMachine
module FtpClient
# Main class for interacting with a server
class Session
attr_accessor :username, :password, :port
attr_reader :control_connection
def initialize(url, options={}, &cb)
self.username = options[:username] || "anonymous"
self.password = options[:password] || "anonymous"
self.port = options[:port] || 21
@control_connection = EM.connect(url, port, ControlConnection)
@control_connection.username = username
@control_connection.password = password
@control_connection.callback do
cb.call(self)
end
end
def pwd(&cb)
control_connection.callback(&cb)
control_connection.pwd
end
def cwd(dir, &cb)
control_connection.callback(&cb)
control_connection.cwd(dir)
end
def list(&cb)
control_connection.callback do
control_connection.callback(&cb)
control_connection.list
end
control_connection.pasv
end
def stream(&cb); @stream = cb; end
def get(file, &cb)
control_connection.callback do |data_connection|
data_connection.stream(&@stream) if @stream
control_connection.callback(&cb)
control_connection.retr file
end
control_connection.pasv
end
def put(file, &cb)
filename = File.basename(file)
control_connection.callback do |data_connection|
data_connection.send_file(file)
control_connection.callback(&cb)
control_connection.stor filename
end
control_connection.pasv
end
def close
@control_connection.callback do
yield if block_given?
end
@control_connection.close
end
end
end
end