2019-05-20 17:19:37 -04:00
|
|
|
#![feature(proc_macro_hygiene, plugin, decl_macro)]
|
|
|
|
#![recursion_limit = "1024"]
|
|
|
|
|
2020-11-05 09:26:57 -05:00
|
|
|
extern crate anyhow;
|
2019-05-20 17:19:37 -04:00
|
|
|
extern crate clap;
|
|
|
|
extern crate tempfile;
|
|
|
|
extern crate sequoia_openpgp as openpgp;
|
|
|
|
extern crate hagrid_database as database;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate serde_derive;
|
|
|
|
extern crate toml;
|
|
|
|
extern crate indicatif;
|
2019-06-05 15:04:11 -04:00
|
|
|
extern crate walkdir;
|
2019-05-20 17:19:37 -04:00
|
|
|
|
|
|
|
use std::fs;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use std::str::FromStr;
|
|
|
|
|
2020-11-05 09:26:57 -05:00
|
|
|
use anyhow::Result;
|
2019-05-20 17:19:37 -04:00
|
|
|
|
|
|
|
use clap::{Arg, App, SubCommand};
|
|
|
|
|
|
|
|
mod import;
|
2019-06-05 15:04:11 -04:00
|
|
|
mod regenerate;
|
2019-05-20 17:19:37 -04:00
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
pub struct HagridConfigs {
|
|
|
|
development: HagridConfig,
|
|
|
|
staging: HagridConfig,
|
|
|
|
production: HagridConfig,
|
|
|
|
}
|
|
|
|
|
|
|
|
// this is not an exact match - Rocket config has more complicated semantics
|
|
|
|
// than a plain toml file.
|
|
|
|
// see also https://github.com/SergioBenitez/Rocket/issues/228
|
2019-06-04 14:04:15 -04:00
|
|
|
#[derive(Deserialize,Clone)]
|
2019-05-20 17:19:37 -04:00
|
|
|
pub struct HagridConfig {
|
|
|
|
_template_dir: Option<PathBuf>,
|
|
|
|
keys_internal_dir: Option<PathBuf>,
|
|
|
|
keys_external_dir: Option<PathBuf>,
|
|
|
|
_assets_dir: Option<PathBuf>,
|
|
|
|
_token_dir: Option<PathBuf>,
|
|
|
|
tmp_dir: Option<PathBuf>,
|
|
|
|
_maintenance_file: Option<PathBuf>,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() -> Result<()> {
|
|
|
|
let matches = App::new("Hagrid Control")
|
|
|
|
.version("0.1")
|
|
|
|
.about("Control hagrid database externally")
|
|
|
|
.arg(Arg::with_name("config")
|
|
|
|
.short("c")
|
|
|
|
.long("config")
|
|
|
|
.value_name("FILE")
|
|
|
|
.help("Sets a custom config file")
|
|
|
|
.takes_value(true))
|
|
|
|
.arg(Arg::with_name("env")
|
|
|
|
.short("e")
|
|
|
|
.long("env")
|
|
|
|
.value_name("ENVIRONMENT")
|
|
|
|
.takes_value(true)
|
|
|
|
.default_value("prod")
|
|
|
|
.possible_values(&["dev","stage","prod"]))
|
2019-06-05 15:04:11 -04:00
|
|
|
.subcommand(SubCommand::with_name("regenerate")
|
|
|
|
.about("Regenerate symlink directory"))
|
2019-05-20 17:19:37 -04:00
|
|
|
.subcommand(SubCommand::with_name("import")
|
|
|
|
.about("Import keys into Hagrid")
|
2019-05-28 11:39:30 -04:00
|
|
|
.arg(Arg::with_name("dry run")
|
|
|
|
.short("n")
|
|
|
|
.long("dry-run")
|
|
|
|
.help("don't actually keep imported keys")
|
|
|
|
)
|
2019-05-20 17:19:37 -04:00
|
|
|
.arg(Arg::with_name("keyring files")
|
|
|
|
.required(true)
|
|
|
|
.multiple(true)))
|
|
|
|
.get_matches();
|
|
|
|
|
|
|
|
let config_file = matches.value_of("config").unwrap_or("Rocket.toml");
|
|
|
|
let config_data = fs::read_to_string(config_file).unwrap();
|
|
|
|
let configs: HagridConfigs = toml::from_str(&config_data).unwrap();
|
|
|
|
let config = match matches.value_of("env").unwrap() {
|
|
|
|
"dev" => configs.development,
|
|
|
|
"stage" => configs.staging,
|
|
|
|
"prod" => configs.production,
|
|
|
|
_ => configs.development,
|
|
|
|
};
|
|
|
|
|
|
|
|
if let Some(matches) = matches.subcommand_matches("import") {
|
2019-05-28 11:39:30 -04:00
|
|
|
let dry_run = matches.occurrences_of("dry run") > 0;
|
2019-05-20 17:19:37 -04:00
|
|
|
let keyrings: Vec<PathBuf> = matches
|
|
|
|
.values_of_lossy("keyring files")
|
|
|
|
.unwrap()
|
|
|
|
.iter()
|
|
|
|
.map(|arg| PathBuf::from_str(arg).unwrap())
|
|
|
|
.collect();
|
2019-05-28 11:39:30 -04:00
|
|
|
import::do_import(&config, dry_run, keyrings)?;
|
2019-06-05 15:04:11 -04:00
|
|
|
} else if let Some(_matches) = matches.subcommand_matches("regenerate") {
|
|
|
|
regenerate::do_regenerate(&config)?;
|
2019-05-20 17:19:37 -04:00
|
|
|
} else {
|
|
|
|
println!("{}", matches.usage());
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|