]>
Commit | Line | Data |
---|---|---|
bc00289b | 1 | use anyhow::Error; |
b0e20a71 | 2 | use serde_json::json; |
bc00289b | 3 | |
25877d05 | 4 | use proxmox_sys::fs::CreateOptions; |
6ef1b649 | 5 | use proxmox_router::{cli::*, RpcEnvironment, ApiHandler}; |
bc00289b TL |
6 | |
7 | use proxmox_backup::api2; | |
8 | use proxmox_backup::tools::subscription; | |
9 | ||
10 | async 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 | |
24 | async 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 |
66 | async 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 |
89 | async 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 |
101 | fn 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 | } |