hagridctl: working "regenerate" command
This commit is contained in:
parent
a6c646c3df
commit
9f966de69a
|
@ -11,6 +11,7 @@ extern crate hagrid_database as database;
|
|||
extern crate serde_derive;
|
||||
extern crate toml;
|
||||
extern crate indicatif;
|
||||
extern crate walkdir;
|
||||
|
||||
use std::fs;
|
||||
use std::path::PathBuf;
|
||||
|
@ -21,6 +22,7 @@ use failure::Fallible as Result;
|
|||
use clap::{Arg, App, SubCommand};
|
||||
|
||||
mod import;
|
||||
mod regenerate;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct HagridConfigs {
|
||||
|
@ -60,6 +62,8 @@ fn main() -> Result<()> {
|
|||
.takes_value(true)
|
||||
.default_value("prod")
|
||||
.possible_values(&["dev","stage","prod"]))
|
||||
.subcommand(SubCommand::with_name("regenerate")
|
||||
.about("Regenerate symlink directory"))
|
||||
.subcommand(SubCommand::with_name("import")
|
||||
.about("Import keys into Hagrid")
|
||||
.arg(Arg::with_name("dry run")
|
||||
|
@ -91,6 +95,8 @@ fn main() -> Result<()> {
|
|||
.map(|arg| PathBuf::from_str(arg).unwrap())
|
||||
.collect();
|
||||
import::do_import(&config, dry_run, keyrings)?;
|
||||
} else if let Some(_matches) = matches.subcommand_matches("regenerate") {
|
||||
regenerate::do_regenerate(&config)?;
|
||||
} else {
|
||||
println!("{}", matches.usage());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
use failure::Fallible as Result;
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
use walkdir::WalkDir;
|
||||
use indicatif::{ProgressBar,ProgressStyle};
|
||||
|
||||
use HagridConfig;
|
||||
use database::{Database,KeyDatabase};
|
||||
use database::types::Fingerprint;
|
||||
|
||||
pub fn do_regenerate(config: &HagridConfig) -> Result<()> {
|
||||
let db = KeyDatabase::new_internal(
|
||||
config.keys_internal_dir.as_ref().unwrap(),
|
||||
config.keys_external_dir.as_ref().unwrap(),
|
||||
config.tmp_dir.as_ref().unwrap(),
|
||||
false,
|
||||
)?;
|
||||
|
||||
let published_dir = config.keys_external_dir.as_ref().unwrap().join("published");
|
||||
let dirs: Vec<_> = WalkDir::new(published_dir)
|
||||
.min_depth(1)
|
||||
.max_depth(1)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|entry| entry.into_path())
|
||||
.collect();
|
||||
|
||||
let progress_bar = ProgressBar::new(dirs.len() as u64);
|
||||
progress_bar
|
||||
.set_style(ProgressStyle::default_bar()
|
||||
.template("[{elapsed_precise}] {bar:40.cyan/blue} {msg}")
|
||||
.progress_chars("##-"));
|
||||
|
||||
for dir in dirs {
|
||||
progress_bar.inc(1);
|
||||
for dir2 in WalkDir::new(dir)
|
||||
.min_depth(1)
|
||||
.max_depth(1)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|entry| entry.into_path()) {
|
||||
|
||||
let prefix2 = dir2.file_name().unwrap().to_string_lossy();
|
||||
let prefix1 = dir2.parent().unwrap().file_name().unwrap().to_string_lossy();
|
||||
progress_bar.set_message(&format!("Regenerating keys with prefix {}{}",
|
||||
prefix1, prefix2));
|
||||
regenerate_dir(&db, &dir2)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn regenerate_dir(db: &KeyDatabase, dir: &Path) -> Result<()> {
|
||||
for path in WalkDir::new(dir)
|
||||
.min_depth(1)
|
||||
.max_depth(1)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.map(|entry| entry.into_path()) {
|
||||
|
||||
let suffix = path.file_name().unwrap().to_string_lossy();
|
||||
let prefix2 = path.parent().unwrap().file_name().unwrap().to_string_lossy();
|
||||
let prefix1 = path.parent().unwrap().parent().unwrap().file_name().unwrap().to_string_lossy();
|
||||
let fpr_str = format!("{}{}{}", prefix1, prefix2, suffix);
|
||||
|
||||
let fpr = fpr_str.parse::<Fingerprint>()?;
|
||||
db.regenerate_links(&fpr)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue