use std::fs::File;
use std::io;
use std::path::Path;
use argh::FromArgs;
use pavao::{SmbClient, SmbCredentials, SmbOpenOptions, SmbOptions};
#[derive(FromArgs)]
#[argh(description = "
where positional can be: [smb://address[:port]]
Please, report issues to <https://github.com/veeso/pavao>
Please, consider supporting the author <https://ko-fi.com/veeso>")]
struct Args {
#[argh(option, short = 'P', description = "specify password")]
password: Option<String>,
#[argh(option, short = 'u', description = "specify username")]
username: String,
#[argh(option, short = 'i', description = "specify input path")]
input: String,
#[argh(option, short = 'w', description = "specify workgroup")]
workgroup: String,
#[argh(option, short = 's', description = "specify share")]
share: String,
#[argh(option, short = 'o', description = "specify destination output")]
output: String,
#[argh(positional, description = "smb://address[:port]")]
server: String,
}
fn main() {
assert!(env_logger::builder().try_init().is_ok());
let args: Args = argh::from_env();
let password = match args.password {
Some(p) => p,
None => read_secret_from_tty("Password: ").ok().unwrap(),
};
let client = SmbClient::new(
SmbCredentials::default()
.server(args.server)
.share(args.share)
.password(password)
.username(args.username)
.workgroup(args.workgroup),
SmbOptions::default().one_share_per_server(true),
)
.unwrap();
let mut reader = File::open(Path::new(args.input.as_str())).unwrap();
let mut writer = client
.open_with(
args.output,
SmbOpenOptions::default().create(true).write(true),
)
.unwrap();
assert!(io::copy(&mut reader, &mut writer).is_ok());
}
fn read_secret_from_tty(prompt: &str) -> std::io::Result<String> {
rpassword::prompt_password(prompt)
}