#![allow(unused_imports)]
#![allow(unused_variables)]
extern crate aws_sdk_rust;
#[macro_use]
extern crate lsio;
extern crate url;
extern crate rustc_serialize;
extern crate term;
extern crate md5;
use std::io;
use std::io::{Read, Seek, SeekFrom, BufReader};
use std::path::Path;
use std::fs::File;
use std::str;
use std::str::FromStr;
use std::iter;
use rustc_serialize::json;
use rustc_serialize::base64::{ToBase64, STANDARD};
use lsio::commands::run_cli;
use aws_sdk_rust::aws::common::credentials::DefaultCredentialsProvider;
use aws_sdk_rust::aws::s3::bucket::*;
use aws_sdk_rust::aws::s3::object::*;
use aws_sdk_rust::aws::s3::acl::*;
use aws_sdk_rust::aws::common::region::Region;
use aws_sdk_rust::aws::s3::endpoint::{Endpoint, Signature};
use aws_sdk_rust::aws::s3::s3client::S3Client;
fn main() {
let provider = DefaultCredentialsProvider::new(None).unwrap();
let endpoint = Endpoint::new(Region::UsEast1, Signature::V2, None, None, None, None);
let client = S3Client::new(provider, endpoint);
let bucket_name: &str = "cm2test6";
let width: usize = 120;
repeat_color!(term::color::GREEN, "=", "Start", width);
repeat_color_with_ends!(term::color::WHITE, "-", "create_bucket", "", "", width);
let mut bucket = CreateBucketRequest::default();
bucket.bucket = bucket_name.to_string();
match client.create_bucket(&bucket) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_bucket_notification_configuration", width);
let mut bucket_notify = GetBucketNotificationConfigurationRequest::default();
bucket_notify.bucket = bucket_name.to_string();
match client.get_bucket_notification_configuration(&bucket_notify) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_bucket_logging", width);
let mut bucket_logging = GetBucketLoggingRequest::default();
bucket_logging.bucket = bucket_name.to_string();
match client.get_bucket_logging(&bucket_logging) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "put_bucket_acl", width);
let mut put_bucket_acl = PutBucketAclRequest::default();
put_bucket_acl.bucket = bucket_name.to_string();
put_bucket_acl.acl = Some(CannedAcl::PublicRead);
match client.put_bucket_acl(&put_bucket_acl) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_bucket_acl", width);
let mut get_bucket_acl = GetBucketAclRequest::default();
get_bucket_acl.bucket = bucket_name.to_string();
match client.get_bucket_acl(&get_bucket_acl) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "put_object", width);
let mut put_object = PutObjectRequest::default();
put_object.bucket = bucket_name.to_string();
put_object.key = "mytest.txt".to_string();
put_object.body = Some(b"this is a test.");
match client.put_object(&put_object, None) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_object", width);
let mut get_object = GetObjectRequest::default();
get_object.bucket = bucket_name.to_string();
get_object.key = "mytest.txt".to_string();
match client.get_object(&get_object, None) {
Ok(output) => println_color!(term::color::GREEN, "\n\n{:#?}\n\n", str::from_utf8(&output.body).unwrap()),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "head_object", width);
let mut head_object = HeadObjectRequest::default();
head_object.bucket = bucket_name.to_string();
head_object.key = "mytest.txt".to_string();
match client.head_object(&head_object) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "create_multipart_upload", width);
let test_abort: bool = false;
let file_size: u16 = 8;
let file_name: &str = "test.multipart.upload.file";
let file_remove: bool = true;
let file_create: bool = true;
let mut create_multipart_upload_output: Option<MultipartUploadCreateOutput> = None;
let mut create_multipart_upload = MultipartUploadCreateRequest::default();
create_multipart_upload.bucket = bucket_name.to_string();
create_multipart_upload.key = file_name.to_string();
match client.multipart_upload_create(&create_multipart_upload) {
Ok(output) => {
println_color!(term::color::GREEN, "{:#?}", output);
create_multipart_upload_output = Some(output);
if file_create {
let result = run_cli(format!("dd if=/dev/zero ibs={}m count=1 of={}", file_size, file_name.to_string()));
}
},
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "upload_part", width);
if create_multipart_upload_output.is_some() {
let create_multipart_upload = create_multipart_upload_output.unwrap();
let upload_id: &str = &create_multipart_upload.upload_id;
let mut parts_list: Vec<String> = Vec::new();
repeat_color!(term::color::WHITE, "-", "part-1", width);
let f1 = File::open(file_name).unwrap();
let mut f2 = File::open(file_name).unwrap();
let metadata = f1.metadata().unwrap();
let min_size: u64 = 5242880;
let len: usize = (metadata.len() - min_size) as usize;
let mut part1_buffer: Vec<u8> = Vec::with_capacity(min_size as usize); let mut part2_buffer: Vec<u8> = Vec::with_capacity(if len > min_size as usize {min_size as usize} else {len});
let mut upload_part = MultipartUploadPartRequest::default();
upload_part.bucket = bucket_name.to_string();
upload_part.upload_id = upload_id.to_string();
upload_part.key = file_name.to_string();
match f1.take(min_size).read_to_end(&mut part1_buffer) {
Ok(_) => println_color!(term::color::YELLOW, "Read in buffer 1 - {}", part1_buffer.len()),
Err(e) => println_color!(term::color::RED, "Error reading file {}", e),
}
upload_part.body = Some(&part1_buffer);
upload_part.part_number = 1;
match client.multipart_upload_part(&upload_part) {
Ok(output) => {
let new_out = output.clone();
parts_list.push(output);
println_color!(term::color::GREEN, "Part 1 - {:#?}", new_out);
},
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "list_multipart_uploads", width);
let mut list_multipart_uploads = MultipartUploadListRequest::default();
list_multipart_uploads.bucket = bucket_name.to_string();
match client.multipart_upload_list(&list_multipart_uploads) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "list_parts (#1)", width);
let mut list_parts = MultipartUploadListPartsRequest::default();
list_parts.bucket = bucket_name.to_string();
list_parts.upload_id = upload_id.to_string();
list_parts.key = file_name.to_string();
match client.multipart_upload_list_parts(&list_parts) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
if !test_abort {
repeat_color!(term::color::WHITE, "-", "part-2", width);
let seek_result = f2.seek(SeekFrom::Start(min_size + 1)).unwrap();
match f2.take(part2_buffer.capacity() as u64).read_to_end(&mut part2_buffer) {
Ok(_) => println_color!(term::color::YELLOW, "Read in buffer 2"),
Err(e) => println_color!(term::color::RED, "Error reading file {}", e),
}
upload_part.body = Some(&part2_buffer);
upload_part.part_number = 2;
match client.multipart_upload_part(&upload_part) {
Ok(output) => {
let new_out = output.clone();
parts_list.push(output);
println_color!(term::color::GREEN, "Part 2 - {:#?}", new_out);
},
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "list_parts (#2)", width);
let mut list_parts = MultipartUploadListPartsRequest::default();
list_parts.bucket = bucket_name.to_string();
list_parts.upload_id = upload_id.to_string();
list_parts.key = file_name.to_string();
match client.multipart_upload_list_parts(&list_parts) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
}
if test_abort {
repeat_color!(term::color::WHITE, "-", "abort_upload", width);
let mut abort_multipart_upload = MultipartUploadAbortRequest::default();
abort_multipart_upload.bucket = bucket_name.to_string();
abort_multipart_upload.upload_id = upload_id.to_string();
abort_multipart_upload.key = file_name.to_string();
match client.multipart_upload_abort(&abort_multipart_upload) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
} else {
repeat_color!(term::color::WHITE, "-", "complete_multipart_upload", width);
let item_list : Vec<u8>;
let mut complete_multipart_upload = MultipartUploadCompleteRequest::default();
complete_multipart_upload.bucket = bucket_name.to_string();
complete_multipart_upload.upload_id = upload_id.to_string();
complete_multipart_upload.key = file_name.to_string();
match multipart_upload_finish_xml(&parts_list) {
Ok(parts_in_xml) => item_list = parts_in_xml,
Err(e) => {
item_list = Vec::new(); println_color!(term::color::RED, "{:#?}", e);
},
}
complete_multipart_upload.multipart_upload = Some(&item_list);
match client.multipart_upload_complete(&complete_multipart_upload) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
}
if file_remove {
let result = run_cli(format!("rm -f {}", file_name.to_string()));
}
}
repeat_color!(term::color::WHITE, "-", "put_object_acl", width);
let mut put_object_acl = PutObjectAclRequest::default();
put_object_acl.bucket = bucket_name.to_string();
put_object_acl.key = "mytest.txt".to_string();
put_object_acl.acl = Some(CannedAcl::Private);
match client.put_object_acl(&put_object_acl) {
Ok(acl) => println_color!(term::color::GREEN, "{:#?}", acl),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_object_acl", width);
let mut get_object_acl = GetObjectAclRequest::default();
get_object_acl.bucket = bucket_name.to_string();
get_object_acl.key = "mytest.txt".to_string();
match client.get_object_acl(&get_object_acl) {
Ok(acl) => {
println_color!(term::color::GREEN, "{:#?}", acl);
println!("----------JSON-----------");
println_color!(term::color::GREEN, "{}", json::as_pretty_json(&acl));
},
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "head_bucket", width);
let bucket_head = HeadBucketRequest { bucket: bucket_name.to_string() };
match client.head_bucket(&bucket_head) {
Ok(head) => println_color!(term::color::GREEN, "{:#?}", head),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "put_bucket_versioning", width);
let bucket_versioning = PutBucketVersioningRequest {
bucket: bucket_name.to_string(),
versioning_configuration: VersioningConfiguration {
status: "Enabled".to_string(),
mfa_delete: "".to_string(),
},
mfa: None,
content_md5: None,
};
match client.put_bucket_versioning(&bucket_versioning) {
Ok(version) => println_color!(term::color::GREEN, "{:#?}", version),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "get_bucket_versioning", width);
let bucket_versioning = GetBucketVersioningRequest { bucket: bucket_name.to_string() };
match client.get_bucket_versioning(&bucket_versioning) {
Ok(version) => println_color!(term::color::GREEN, "{:#?}", version),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "delete_object", width);
let mut del_object = DeleteObjectRequest::default();
del_object.bucket = bucket_name.to_string();
del_object.key = "mytest.txt".to_string();
match client.delete_object(&del_object, None) {
Ok(output) => println_color!(term::color::GREEN, "{:#?}", output),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "list_object_versions", width);
let mut bucket_versioning = ListObjectVersionsRequest::default();
bucket_versioning.bucket = bucket_name.to_string();
match client.list_object_versions(&bucket_versioning) {
Ok(version) => println_color!(term::color::GREEN, "{:#?}", version),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "list_objects (again)", width);
let mut list_objects = ListObjectsRequest::default();
list_objects.bucket = bucket_name.to_string();
list_objects.version = Some(2);
match client.list_objects(&list_objects) {
Ok(objects) => {
println_color!(term::color::GREEN, "{:#?}", objects);
println!("----------JSON (serial)--");
let encoded = json::encode(&objects).unwrap();
println_color!(term::color::GREEN, "{:#?}", encoded);
println!("----------JSON-----------");
println_color!(term::color::GREEN, "{}", json::as_pretty_json(&objects));
},
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
repeat_color!(term::color::WHITE, "-", "delete_bucket", width);
let bucket = DeleteBucketRequest { bucket: bucket_name.to_string() };
match client.delete_bucket(&bucket) {
Ok(bucket) => println_color!(term::color::GREEN, "{:#?}", bucket),
Err(e) => {
println_color!(term::color::RED, "{:#?}", e);
repeat_color!(term::color::WHITE, "-", "list_object_versions", width);
let mut bucket_versioning = ListObjectVersionsRequest::default();
bucket_versioning.bucket = bucket_name.to_string();
match client.list_object_versions(&bucket_versioning) {
Ok(version) => println_color!(term::color::GREEN, "{:#?}", version),
Err(e) => println_color!(term::color::RED, "{:#?}", e),
}
},
}
repeat_color!(term::color::WHITE, "-", "list_buckets", width);
match client.list_buckets() {
Ok(output) => {
println_color!(term::color::GREEN, "{:#?}", output);
},
Err(error) => {
println_color!(term::color::RED, "Error: {:#?}", error);
},
}
repeat_color!(term::color::GREEN, "=", "Finished", width);
}