mirror of
https://git.proxmox.com/git/proxmox-offline-mirror
synced 2025-08-15 15:59:00 +00:00
cli: add mirror snapshot create-all
command
that creates a new snapshot for each configured mirror, collecting the results and printing a summary at the end. this should be suitable for usage in a cron job or timer-triggered unit, with no output on stderr for 100% OK execution runs. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
047248215e
commit
ffc3ed4e06
@ -1,8 +1,9 @@
|
|||||||
use anyhow::{format_err, Error};
|
use anyhow::{bail, format_err, Error};
|
||||||
|
|
||||||
use proxmox_section_config::SectionConfigData;
|
use proxmox_section_config::SectionConfigData;
|
||||||
use proxmox_subscription::SubscriptionStatus;
|
use proxmox_subscription::SubscriptionStatus;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use proxmox_router::cli::{
|
use proxmox_router::cli::{
|
||||||
format_and_print_result, get_output_format, CliCommand, CliCommandMap, CommandLineInterface,
|
format_and_print_result, get_output_format, CliCommand, CliCommandMap, CommandLineInterface,
|
||||||
@ -89,6 +90,80 @@ async fn create_snapshot(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[api(
|
||||||
|
input: {
|
||||||
|
properties: {
|
||||||
|
config: {
|
||||||
|
type: String,
|
||||||
|
optional: true,
|
||||||
|
description: "Path to mirroring config file.",
|
||||||
|
},
|
||||||
|
"dry-run": {
|
||||||
|
type: bool,
|
||||||
|
optional: true,
|
||||||
|
default: false,
|
||||||
|
description: "Only fetch indices and print summary of missing package files, don't store anything.",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)]
|
||||||
|
/// Create a new repository snapshot for each configured mirror, fetching required/missing files
|
||||||
|
/// from original repository.
|
||||||
|
async fn create_snapshots(
|
||||||
|
config: Option<String>,
|
||||||
|
dry_run: bool,
|
||||||
|
_param: Value,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let config = config.unwrap_or_else(get_config_path);
|
||||||
|
|
||||||
|
let (section_config, _digest) = proxmox_offline_mirror::config::config(&config)?;
|
||||||
|
let mirrors: Vec<MirrorConfig> = section_config.convert_to_typed_array("mirror")?;
|
||||||
|
|
||||||
|
let mut results = HashMap::new();
|
||||||
|
|
||||||
|
for mirror in mirrors {
|
||||||
|
let mirror_id = mirror.id.clone();
|
||||||
|
println!("\nCREATING SNAPSHOT FOR '{mirror_id}'..");
|
||||||
|
let subscription = match get_subscription_key(§ion_config, &mirror) {
|
||||||
|
Ok(opt_key) => opt_key,
|
||||||
|
Err(err) => {
|
||||||
|
eprintln!("Skipping mirror '{mirror_id}' - {err})");
|
||||||
|
results.insert(mirror_id, Err(err));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let res = proxmox_offline_mirror::mirror::create_snapshot(
|
||||||
|
mirror,
|
||||||
|
&Snapshot::now(),
|
||||||
|
subscription,
|
||||||
|
dry_run,
|
||||||
|
);
|
||||||
|
if let Err(err) = &res {
|
||||||
|
eprintln!("Failed to create snapshot for '{mirror_id}' - {err}");
|
||||||
|
}
|
||||||
|
|
||||||
|
results.insert(mirror_id, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("\nSUMMARY:");
|
||||||
|
for (mirror_id, _res) in results.iter().filter(|(_, res)| res.is_ok()) {
|
||||||
|
println!("{mirror_id}: OK"); // TODO update once we have a proper return value
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut fail = false;
|
||||||
|
|
||||||
|
for (mirror_id, res) in results.into_iter().filter(|(_, res)| res.is_err()) {
|
||||||
|
fail = true;
|
||||||
|
eprintln!("{mirror_id}: ERR - {}", res.unwrap_err());
|
||||||
|
}
|
||||||
|
|
||||||
|
if fail {
|
||||||
|
bail!("Failed to create snapshots for all configured mirrors.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[api(
|
#[api(
|
||||||
input: {
|
input: {
|
||||||
properties: {
|
properties: {
|
||||||
@ -204,6 +279,7 @@ pub fn mirror_commands() -> CommandLineInterface {
|
|||||||
"create",
|
"create",
|
||||||
CliCommand::new(&API_METHOD_CREATE_SNAPSHOT).arg_param(&["id"]),
|
CliCommand::new(&API_METHOD_CREATE_SNAPSHOT).arg_param(&["id"]),
|
||||||
)
|
)
|
||||||
|
.insert("create-all", CliCommand::new(&API_METHOD_CREATE_SNAPSHOTS))
|
||||||
.insert(
|
.insert(
|
||||||
"list",
|
"list",
|
||||||
CliCommand::new(&API_METHOD_LIST_SNAPSHOTS).arg_param(&["id"]),
|
CliCommand::new(&API_METHOD_LIST_SNAPSHOTS).arg_param(&["id"]),
|
||||||
|
Loading…
Reference in New Issue
Block a user