-
-
Save rawburt/0eed1b4f371914a3f01e to your computer and use it in GitHub Desktop.
formatting comments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# Using AWS S3 to make sharing files with your friends as simple as can be... | |
# ... or something. | |
# | |
# Only tested on OS X. | |
# | |
# usage: n3 [put|get|list|delete|open|help] | |
[ | |
"AWS_N3_BUCKET", | |
"AWS_ACCESS_KEY_ID", | |
"AWS_SECRET_ACCESS_KEY", | |
"AWS_REGION" | |
].each do |expected_var| | |
unless ENV[expected_var] | |
puts "!!! WARNING !!!" | |
puts "Missing enviroment variable #{expected_var}" | |
puts "The following variables are expected to be set: #{expected_env_vars.join(", ")}" | |
puts "Exiting." | |
exit | |
end | |
end | |
USAGE_TEXT = "usage: n3 [put|get|list|delete|open|help]" | |
if ARGV.size < 1 | |
puts USAGE_TEXT | |
else | |
begin | |
require "aws-sdk" | |
require "ruby-progressbar" | |
rescue LoadError | |
puts "Missing gems. To install all the required gems try:" | |
puts | |
puts " gem install aws-sdk ruby-progressbar" | |
puts | |
puts "Exiting." | |
exit | |
end | |
BUCKET = ENV["AWS_N3_BUCKET"] | |
$n3_aws_client = Aws::S3::Client.new | |
$n3_aws_client.create_bucket(bucket: BUCKET) | |
command, *arguments = ARGV | |
case command | |
when "get" | |
if file = arguments.first | |
new_file = Dir.pwd + "/" + file | |
puts "Creating #{new_file}" | |
$n3_aws_client.get_object(bucket: BUCKET, key: file, response_target: new_file) | |
puts "Done" | |
else | |
puts "usage: n3 get [filename]" | |
end | |
when "put" | |
if filename = arguments.first | |
object_key = File.basename(filename) | |
upload_response = $n3_aws_client.create_multipart_upload(bucket: BUCKET, key: object_key, acl: "public-read") | |
multipart_upload = { parts: [] } | |
File.open(filename) do |file| | |
part_number = 1 | |
buffer_size = file.size > 5242880 ? 5242880 : file.size | |
puts "File: #{File.basename(filename)}" | |
puts "Size: #{file.size} bytes" | |
puts "Buffer size: #{buffer_size} bytes" | |
progress = ProgressBar.create(format: "%e %p% %b", starting_at: 0, total: file.size / buffer_size) | |
until file.eof? | |
buffer = file.read(buffer_size) | |
resp = $n3_aws_client.upload_part({ | |
body: buffer, | |
bucket: BUCKET, | |
key: object_key, | |
part_number: part_number, | |
upload_id: upload_response.upload_id | |
}) | |
multipart_upload[:parts] << { | |
part_number: part_number, | |
etag: resp.etag | |
} | |
part_number += 1 | |
progress.increment unless progress.finished? | |
end | |
puts "Done" | |
progress.finish | |
end | |
$n3_aws_client.complete_multipart_upload({ | |
bucket: BUCKET, | |
key: object_key, | |
multipart_upload: multipart_upload, | |
upload_id: upload_response.upload_id, | |
}) | |
puts "Saved as: #{object_key}" | |
else | |
puts "usage: n3 put [filename]" | |
end | |
when "list" | |
objs = $n3_aws_client.list_objects(bucket: BUCKET).contents.map(&:key) | |
if objs.empty? | |
puts "There is no stuff." | |
else | |
objs.each do |obj| | |
puts obj | |
end | |
end | |
when "delete" | |
if file = arguments.first | |
puts "Deleting #{file}" | |
$n3_aws_client.delete_object(bucket: BUCKET, key: file) | |
puts "Done" | |
else | |
puts "usage: n3 delete [filename]" | |
end | |
when "open" | |
if file = arguments.first | |
url = "http://#{BUCKET}.s3.amazonaws.com/#{file}" | |
system("open #{url}") | |
else | |
puts "usage: n3 open [filename]" | |
end | |
when "help" | |
puts USAGE_TEXT | |
else | |
puts USAGE_TEXT | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment