Creates missing files for NextCloud in an S3 storage, so it understands the directory structure.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.5 KiB

use std::env;
use std::collections::HashSet;
use std::path::Path;
use rusoto_core::Region;
use rusoto_credential::StaticProvider;
use rusoto_core::request::HttpClient;
use rusoto_s3::ListObjectsRequest;
use rusoto_s3::S3;
use rusoto_s3::S3Client;
fn main() {
let region_name = env::var("NC_REGION").expect("export NC_REGION with the endpoint region");
let endpoint = env::var("NC_ENDPOINT").expect("export NC_ENDPOINT with the endpot URL");
let bucket = env::var("NC_BUCKET").expect("export NC_BUCKET with the bucket to be accessed");
let access_key = env::var("NC_ACCESS_KEY").expect("export NC_ACCESS_KEY with the access key to the bucket");
let secret_key = env::var("NC_SECRET_KEY").expect("export NC_SECRET_KEY with the secret key to the bucket");
println!("Accessing {}::{}",
region_name,
endpoint);
let region = Region::Custom {
name: region_name.to_owned(),
endpoint: endpoint.to_owned()
};
let client = S3Client::new_with(
HttpClient::new().expect("Failed to create http client"),
StaticProvider::new_minimal(access_key, secret_key),
region
);
let mut truncated = Some(true);
let mut start_at = None;
let mut files_dirs: HashSet<String> = HashSet::new();
let mut directory_files: HashSet<String> = HashSet::new();
while truncated.unwrap_or(false) {
let list_objects_request = ListObjectsRequest {
bucket: bucket.to_owned(),
marker: start_at,
..Default::default()
};
println!("Request: {:?}", list_objects_request);
let result = client
.list_objects(list_objects_request)
.sync()
.expect("Can't list contents of buckets");
truncated = result.is_truncated;
start_at = result.next_marker;
result.contents
.expect("Didn't get any objects")
.iter()
.for_each(|item| {
let filename = item.key.as_ref().unwrap();
if filename.ends_with("/") {
files_dirs.insert(filename.clone());
} else {
directory_files.insert(Path::new(filename).parent().unwrap().to_str().unwrap().to_string() + "/");
}
});
}
println!("Directories with files:\n{:#?}", directory_files);
println!("Directories with controllers:\n{:#?}", files_dirs);
println!("Difference:\n{:#?}", directory_files.difference(&files_dirs));
}