lair_keystore 0.2.3

secret lair private keystore
Documentation
use super::*;
use tokio::io::AsyncWriteExt;

pub(crate) async fn exec(
    lair_root: std::path::PathBuf,
    opt: OptInit,
) -> LairResult<()> {
    tokio::fs::DirBuilder::new()
        .recursive(true)
        .create(&lair_root)
        .await?;

    let mut config_n = lair_root.clone();
    config_n.push(CONFIG_N);

    if tokio::fs::metadata(&config_n).await.is_ok() {
        return Err(format!(
            "{:?} already exists - refusing to overwrite existing store",
            config_n
        )
        .into());
    }

    let passphrase = if opt.piped {
        read_piped_passphrase().await?
    } else {
        read_interactive_passphrase("\n# passphrase> ").await?
    };

    println!("\n# lair-keystore init generating secure config...");

    let config = LairServerConfigInner::new(&lair_root, passphrase).await?;

    let mut config_f = tokio::fs::OpenOptions::new()
        .write(true)
        .create_new(true)
        .open(&config_n)
        .await?;

    config_f.write_all(config.to_string().as_bytes()).await?;
    config_f.shutdown().await?;
    drop(config_f);

    println!("\n# lair-keystore init config:\n{:?}", config_n);
    println!(
        "\n# lair-keystore init connection_url:\n{}",
        config.connection_url
    );

    Ok(())
}