1use crate::db::{2 keys::{list_hosts, KeyDb},3 Db, DbData,4};5use anyhow::Result;6use clap::Clap;7use log::info;89#[derive(Clap)]10pub struct FetchKeys {11 12 #[clap(short = 'f', long)]13 force_hosts: Vec<String>,14 15 #[clap(long)]16 cleanup: bool,17}1819impl FetchKeys {20 pub fn run(self) -> Result<()> {21 let db = Db::new(".fleet")?;22 let hosts = list_hosts()?;23 let mut keys = KeyDb::open(&db)?;24 for host in hosts.iter() {25 let force = self.force_hosts.contains(&host);26 keys.ensure_key_loaded(host, force)?;27 }28 let orphans: Vec<_> = hosts.iter().filter(|h| !keys.has_key(h)).cloned().collect();29 if !orphans.is_empty() {30 if self.cleanup {31 info!("Removed orphan host keys:");32 } else {33 info!("Orphan host keys found, run with --cleanup to remove them from db:");34 }35 for key in orphans {36 info!("- {}", key);37 if self.cleanup {38 keys.remove_key(&key)39 }40 }41 }42 Ok(())43 }44}