1use std::collections::HashSet;23use anyhow::Result;4use clap::Clap;5use log::info;67use crate::db::{8 keys::KeyDb,9 secret::{list_secrets, SecretDb},10 Db, DbData,11};1213#[derive(Clap)]14pub struct GenerateSecrets {15 16 #[clap(long)]17 cleanup: bool,18}1920impl GenerateSecrets {21 pub fn run(self) -> Result<()> {22 let db = Db::new(".fleet")?;23 let mut secrets = SecretDb::open(&db)?;2425 let defined_secrets = list_secrets()?;26 for (secret, data) in defined_secrets.iter() {27 let keys = KeyDb::open(&db)?;28 secrets.ensure_generated(&keys, &secret, &data)?;29 }30 let key_names = defined_secrets31 .keys()32 .filter(|s| !secrets.has_secret(s))33 .cloned()34 .collect::<HashSet<_>>();35 if !key_names.is_empty() {36 if self.cleanup {37 info!("Removed orphan secrets:");38 } else {39 info!("Orphan secrets found, run with --cleanup to remove them from db:");40 }41 for key in key_names {42 info!("- {}", key);43 if self.cleanup {44 secrets.remove_secret(&key)45 }46 }47 }4849 Ok(())50 }51}