]> git.proxmox.com Git - proxmox-backup.git/blame - src/bin/proxmox-daily-update.rs
update to proxmox-sys 0.2 crate
[proxmox-backup.git] / src / bin / proxmox-daily-update.rs
CommitLineData
bc00289b 1use anyhow::Error;
b0e20a71 2use serde_json::json;
bc00289b 3
25877d05 4use proxmox_sys::fs::CreateOptions;
6ef1b649 5use proxmox_router::{cli::*, RpcEnvironment, ApiHandler};
bc00289b
TL
6
7use proxmox_backup::api2;
8use proxmox_backup::tools::subscription;
9
10async fn wait_for_local_worker(upid_str: &str) -> Result<(), Error> {
6227654a 11 let upid: pbs_api_types::UPID = upid_str.parse()?;
bc00289b
TL
12 let sleep_duration = core::time::Duration::new(0, 100_000_000);
13
14 loop {
b9700a9f 15 if !proxmox_rest_server::worker_is_active_local(&upid) {
bc00289b
TL
16 break;
17 }
0a8d773a 18 tokio::time::sleep(sleep_duration).await;
bc00289b
TL
19 }
20 Ok(())
21}
22
23/// Daily update
24async fn do_update(
25 rpcenv: &mut dyn RpcEnvironment,
b0e20a71 26) -> Result<(), Error> {
bc00289b
TL
27 let param = json!({});
28
29 let method = &api2::node::subscription::API_METHOD_CHECK_SUBSCRIPTION;
30 let _res = match method.handler {
31 ApiHandler::Sync(handler) => (handler)(param, method, rpcenv)?,
32 _ => unreachable!(),
33 };
34
35 let notify = match subscription::read_subscription() {
36 Ok(Some(subscription)) => subscription.status == subscription::SubscriptionStatus::ACTIVE,
37 Ok(None) => false,
38 Err(err) => {
39 eprintln!("Error reading subscription - {}", err);
40 false
41 },
42 };
43
44 let param = json!({
45 "notify": notify,
46 });
47 let method = &api2::node::apt::API_METHOD_APT_UPDATE_DATABASE;
48 let upid = match method.handler {
49 ApiHandler::Sync(handler) => (handler)(param, method, rpcenv)?,
50 _ => unreachable!(),
51 };
52 wait_for_local_worker(upid.as_str().unwrap()).await?;
53
8fb24a2c
WB
54 match check_acme_certificates(rpcenv).await {
55 Ok(()) => (),
56 Err(err) => {
57 eprintln!("error checking certificates: {}", err);
58 }
59 }
bc00289b
TL
60
61 // TODO: cleanup tasks like in PVE?
62
b0e20a71 63 Ok(())
bc00289b
TL
64}
65
8fb24a2c
WB
66async fn check_acme_certificates(rpcenv: &mut dyn RpcEnvironment) -> Result<(), Error> {
67 let (config, _) = proxmox_backup::config::node::config()?;
68
69 // do we even have any acme domains configures?
70 if config.acme_domains().next().is_none() {
71 return Ok(());
72 }
73
74 if !api2::node::certificates::cert_expires_soon()? {
75 println!("Certificate does not expire within the next 30 days, not renewing.");
76 return Ok(());
77 }
78
79 let info = &api2::node::certificates::API_METHOD_RENEW_ACME_CERT;
80 let result = match info.handler {
81 ApiHandler::Sync(handler) => (handler)(json!({}), info, rpcenv)?,
82 _ => unreachable!(),
83 };
84 wait_for_local_worker(result.as_str().unwrap()).await?;
85
86 Ok(())
87}
88
b0e20a71
DM
89async fn run(rpcenv: &mut dyn RpcEnvironment) -> Result<(), Error> {
90 let backup_user = pbs_config::backup_user()?;
91 let file_opts = CreateOptions::new().owner(backup_user.uid).group(backup_user.gid);
92 proxmox_rest_server::init_worker_tasks(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR_M!().into(), file_opts.clone())?;
93
49e25688 94 let mut commando_sock = proxmox_rest_server::CommandSocket::new(proxmox_rest_server::our_ctrl_sock(), backup_user.gid);
b0e20a71
DM
95 proxmox_rest_server::register_task_control_commands(&mut commando_sock)?;
96 commando_sock.spawn()?;
97
98 do_update(rpcenv).await
99}
100
bc00289b
TL
101fn main() {
102 proxmox_backup::tools::setup_safe_path_env();
103
104 let mut rpcenv = CliEnvironment::new();
105 rpcenv.set_auth_id(Some(String::from("root@pam")));
106
9a1b24b6 107 if let Err(err) = proxmox_async::runtime::main(run(&mut rpcenv)) {
4d104cd4
FG
108 eprintln!("error during update: {}", err);
109 std::process::exit(1);
bc00289b
TL
110 }
111}