4 use proxmox_sys
::fs
::CreateOptions
;
5 use proxmox_router
::{cli::*, RpcEnvironment, ApiHandler}
;
7 use proxmox_backup
::api2
;
8 use proxmox_backup
::tools
::subscription
;
10 async
fn wait_for_local_worker(upid_str
: &str) -> Result
<(), Error
> {
11 let upid
: pbs_api_types
::UPID
= upid_str
.parse()?
;
12 let sleep_duration
= core
::time
::Duration
::new(0, 100_000_000);
15 if !proxmox_rest_server
::worker_is_active_local(&upid
) {
18 tokio
::time
::sleep(sleep_duration
).await
;
25 rpcenv
: &mut dyn RpcEnvironment
,
26 ) -> Result
<(), Error
> {
27 let param
= json
!({}
);
29 let method
= &api2
::node
::subscription
::API_METHOD_CHECK_SUBSCRIPTION
;
30 let _res
= match method
.handler
{
31 ApiHandler
::Sync(handler
) => (handler
)(param
, method
, rpcenv
)?
,
35 let notify
= match subscription
::read_subscription() {
36 Ok(Some(subscription
)) => subscription
.status
== subscription
::SubscriptionStatus
::ACTIVE
,
39 eprintln
!("Error reading subscription - {}", err
);
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
)?
,
52 wait_for_local_worker(upid
.as_str().unwrap()).await?
;
54 match check_acme_certificates(rpcenv
).await
{
57 eprintln
!("error checking certificates: {}", err
);
61 // TODO: cleanup tasks like in PVE?
66 async
fn check_acme_certificates(rpcenv
: &mut dyn RpcEnvironment
) -> Result
<(), Error
> {
67 let (config
, _
) = proxmox_backup
::config
::node
::config()?
;
69 // do we even have any acme domains configures?
70 if config
.acme_domains().next().is_none() {
74 if !api2
::node
::certificates
::cert_expires_soon()?
{
75 println
!("Certificate does not expire within the next 30 days, not renewing.");
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
)?
,
84 wait_for_local_worker(result
.as_str().unwrap()).await?
;
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())?
;
94 let mut commando_sock
= proxmox_rest_server
::CommandSocket
::new(proxmox_rest_server
::our_ctrl_sock(), backup_user
.gid
);
95 proxmox_rest_server
::register_task_control_commands(&mut commando_sock
)?
;
96 commando_sock
.spawn()?
;
98 do_update(rpcenv
).await
102 proxmox_backup
::tools
::setup_safe_path_env();
104 let mut rpcenv
= CliEnvironment
::new();
105 rpcenv
.set_auth_id(Some(String
::from("root@pam")));
107 if let Err(err
) = proxmox_async
::runtime
::main(run(&mut rpcenv
)) {
108 eprintln
!("error during update: {}", err
);
109 std
::process
::exit(1);