Skip to content

Instantly share code, notes, and snippets.

@rawburt
Last active January 15, 2016 03:49
Show Gist options
  • Save rawburt/0eed1b4f371914a3f01e to your computer and use it in GitHub Desktop.
Save rawburt/0eed1b4f371914a3f01e to your computer and use it in GitHub Desktop.
formatting comments
#!/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