Class: S3FTP::Driver

Inherits:
Object
  • Object
show all
Defined in:
lib/s3ftp/driver.rb

Constant Summary collapse

USER =
0
PASS =
1
ADMIN =
2

Instance Method Summary collapse

Constructor Details

#initialize(key, secret, bucket) ⇒ Driver

Returns a new instance of Driver.



12
13
14
# File 'lib/s3ftp/driver.rb', line 12

def initialize(key, secret, bucket)
  @aws_key, @aws_secret, @aws_bucket = key, secret, bucket
end

Instance Method Details

#authenticate(user, pass, &block) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/s3ftp/driver.rb', line 37

def authenticate(user, pass, &block)
  download_passwd_file do |passwd|
    @users = extract_users(passwd)

    if @users[user] && @users[user][:pass] == pass
      @user = user
      yield true
    else
      yield false
    end
  end
end

#bytes(path, &block) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/s3ftp/driver.rb', line 50

def bytes(path, &block)
  key = scoped_path(path)

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield response.response_header["CONTENT_LENGTH"].to_i }

  item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.head(:retry_count => 0, :on_success => on_success, :on_error => on_error)
end

#change_dir(path, &block) ⇒ Object



16
17
18
19
20
21
22
23
# File 'lib/s3ftp/driver.rb', line 16

def change_dir(path, &block)
  prefix = scoped_path(path)

  item = Happening::S3::Bucket.new(@aws_bucket, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret, :prefix => prefix, :delimiter => "/")
  item.get do |response|
    yield contains_directory?(response.response, prefix)
  end
end

#delete_dir(path, &block) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/s3ftp/driver.rb', line 101

def delete_dir(path, &block)
  prefix = scoped_path(path)

  on_error   = Proc.new {|response| yield false }

  item = Happening::S3::Bucket.new(@aws_bucket, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret, :prefix => prefix)
  item.get(:on_error => on_error) do |response|
    keys = bucket_list_to_full_keys(response.response)
    delete_object = Proc.new { |key, iter|
      item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
      item.delete(:retry_count => 1, :on_error => on_error) do |response|
        iter.next
      end
    }
    on_complete = Proc.new { yield true }

    EM::Iterator.new(keys, 5).each(delete_object, on_complete)
  end
end

#delete_file(path, &block) ⇒ Object



91
92
93
94
95
96
97
98
99
# File 'lib/s3ftp/driver.rb', line 91

def delete_file(path, &block)
  key = scoped_path(path)

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield true  }

  item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.delete(:retry_count => 1, :on_success => on_success, :on_error => on_error)
end

#dir_contents(path, &block) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/s3ftp/driver.rb', line 25

def dir_contents(path, &block)
  prefix = scoped_path_with_trailing_slash(path)

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield response.response_header["CONTENT_LENGTH"].to_i }

  item = Happening::S3::Bucket.new(@aws_bucket, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret, :prefix => prefix, :delimiter => "/")
  item.get do |response|
    yield parse_bucket_list(response.response)
  end
end

#get_file(path, &block) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/s3ftp/driver.rb', line 60

def get_file(path, &block)
  key = scoped_path(path)

  # open a tempfile to store the file as it's downloaded from S3.
  # em-ftpd will close it for us
  tmpfile = Tempfile.new("s3ftp")

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response|
    tmpfile.flush
    tmpfile.seek(0)
    yield tmpfile
  }

  item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.get(:retry_count => 1, :on_success => on_success, :on_error => on_error).stream do |chunk|
    tmpfile.write chunk
  end
end

#make_dir(path, &block) ⇒ Object



136
137
138
139
140
141
142
143
144
# File 'lib/s3ftp/driver.rb', line 136

def make_dir(path, &block)
  key = scoped_path(path) + "/.dir"

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield true  }

  item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.put("", :retry_count => 0, :on_success => on_success, :on_error => on_error)
end

#put_file(path, tmp_path, &block) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/s3ftp/driver.rb', line 80

def put_file(path, tmp_path, &block)
  key = scoped_path(path)

  bytes      = File.size(tmp_path)
  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield bytes  }

  item = Happening::S3::Item.new(@aws_bucket, key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.put(File.binread(tmp_path), :retry_count => 0, :on_success => on_success, :on_error => on_error)
end

#rename(from, to, &block) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/s3ftp/driver.rb', line 121

def rename(from, to, &block)
  source_key = scoped_path(from)
  source_obj = @aws_bucket + "/" + source_key
  dest_key   = scoped_path(to)

  on_error   = Proc.new {|response| yield false }
  on_success = Proc.new {|response| yield true  }

  item = Happening::S3::Item.new(@aws_bucket, dest_key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
  item.put(nil, :retry_count => 1, :on_error => on_error, :headers => {"x-amz-copy-source" => source_obj}) do |response|
    item = Happening::S3::Item.new(@aws_bucket, source_key, :aws_access_key_id => @aws_key, :aws_secret_access_key => @aws_secret)
    item.delete(:retry_count => 1, :on_success => on_success, :on_error => on_error)
  end
end