diff --git a/Makefile b/Makefile index 949bd111..a1af9d51 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,8 @@ USR_SBIN := \ SERVICE_BIN := \ proxmox-backup-api \ proxmox-backup-banner \ - proxmox-backup-proxy + proxmox-backup-proxy \ + proxmox-daily-update \ ifeq ($(BUILD_MODE), release) CARGO_BUILD_ARGS += --release diff --git a/debian/prerm b/debian/prerm index 77f9eaff..28cf6046 100644 --- a/debian/prerm +++ b/debian/prerm @@ -6,5 +6,6 @@ set -e # modeled after dh_systemd_start output if [ -d /run/systemd/system ] && [ "$1" = remove ]; then - deb-systemd-invoke stop 'proxmox-backup-banner.service' 'proxmox-backup-proxy.service' 'proxmox-backup.service' >/dev/null || true + deb-systemd-invoke stop 'proxmox-backup-banner.service' 'proxmox-backup-proxy.service' \ + 'proxmox-backup.service' 'proxmox-backup-daily-update.timer' >/dev/null || true fi diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install index 281564ee..602a96b2 100644 --- a/debian/proxmox-backup-server.install +++ b/debian/proxmox-backup-server.install @@ -1,10 +1,13 @@ etc/proxmox-backup-proxy.service /lib/systemd/system/ etc/proxmox-backup.service /lib/systemd/system/ etc/proxmox-backup-banner.service /lib/systemd/system/ +etc/proxmox-backup-daily-update.service /lib/systemd/system/ +etc/proxmox-backup-daily-update.timer /lib/systemd/system/ etc/pbstest-beta.list /etc/apt/sources.list.d/ usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner +usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-daily-update usr/sbin/proxmox-backup-manager usr/share/javascript/proxmox-backup/index.hbs usr/share/javascript/proxmox-backup/css/ext6-pbs.css diff --git a/debian/rules b/debian/rules index a2952692..2bc0f694 100755 --- a/debian/rules +++ b/debian/rules @@ -38,6 +38,7 @@ override_dh_auto_install: LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH) override_dh_installsystemd: + dh_installsystemd -pproxmox-backup-server proxmox-backup-daily-update.timer # note: we start/try-reload-restart services manually in postinst dh_installsystemd --no-start --no-restart-after-upgrade diff --git a/etc/Makefile b/etc/Makefile index 8ebd2f43..665892b7 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -1,9 +1,11 @@ include ../defines.mk -UNITS := +UNITS := \ + proxmox-backup-daily-update.timer \ DYNAMIC_UNITS := \ proxmox-backup-banner.service \ + proxmox-backup-daily-update.service \ proxmox-backup.service \ proxmox-backup-proxy.service diff --git a/etc/proxmox-backup-daily-update.service.in b/etc/proxmox-backup-daily-update.service.in new file mode 100644 index 00000000..08c224b8 --- /dev/null +++ b/etc/proxmox-backup-daily-update.service.in @@ -0,0 +1,8 @@ +[Unit] +Description=Daily Proxmox Backup Server update and maintenance activities +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +ExecStart=%LIBEXECDIR%/proxmox-backup/proxmox-daily-update diff --git a/etc/proxmox-backup-daily-update.timer b/etc/proxmox-backup-daily-update.timer new file mode 100644 index 00000000..3e23b562 --- /dev/null +++ b/etc/proxmox-backup-daily-update.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Daily Proxmox Backup Server update and maintenance activities + +[Timer] +OnCalendar=*-*-* 1:00 +RandomizedDelaySec=5h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/src/api2/node.rs b/src/api2/node.rs index 12a2d5c8..30800d05 100644 --- a/src/api2/node.rs +++ b/src/api2/node.rs @@ -24,6 +24,7 @@ use crate::server::WorkerTask; use crate::tools; use crate::tools::ticket::{self, Empty, Ticket}; +pub mod apt; pub mod disks; pub mod dns; pub mod network; @@ -32,7 +33,6 @@ pub mod subscription; pub(crate) mod rrd; -mod apt; mod journal; mod services; mod status; diff --git a/src/bin/proxmox-daily-update.rs b/src/bin/proxmox-daily-update.rs new file mode 100644 index 00000000..b78d1643 --- /dev/null +++ b/src/bin/proxmox-daily-update.rs @@ -0,0 +1,73 @@ +use anyhow::Error; +use serde_json::{json, Value}; + +use proxmox::api::{cli::*, RpcEnvironment, ApiHandler}; + +use proxmox_backup::api2; +use proxmox_backup::tools::subscription; + +async fn wait_for_local_worker(upid_str: &str) -> Result<(), Error> { + let upid: proxmox_backup::server::UPID = upid_str.parse()?; + let sleep_duration = core::time::Duration::new(0, 100_000_000); + + loop { + if !proxmox_backup::server::worker_is_active_local(&upid) { + break; + } + tokio::time::delay_for(sleep_duration).await; + } + Ok(()) +} + +/// Daily update +async fn do_update( + rpcenv: &mut dyn RpcEnvironment, +) -> Result { + let param = json!({}); + + let method = &api2::node::subscription::API_METHOD_CHECK_SUBSCRIPTION; + let _res = match method.handler { + ApiHandler::Sync(handler) => (handler)(param, method, rpcenv)?, + _ => unreachable!(), + }; + + let notify = match subscription::read_subscription() { + Ok(Some(subscription)) => subscription.status == subscription::SubscriptionStatus::ACTIVE, + Ok(None) => false, + Err(err) => { + eprintln!("Error reading subscription - {}", err); + false + }, + }; + + let param = json!({ + "notify": notify, + }); + let method = &api2::node::apt::API_METHOD_APT_UPDATE_DATABASE; + let upid = match method.handler { + ApiHandler::Sync(handler) => (handler)(param, method, rpcenv)?, + _ => unreachable!(), + }; + wait_for_local_worker(upid.as_str().unwrap()).await?; + + // TODO: certificate checks/renewal/... ? + + // TODO: cleanup tasks like in PVE? + + Ok(Value::Null) +} + +fn main() { + proxmox_backup::tools::setup_safe_path_env(); + + let mut rpcenv = CliEnvironment::new(); + rpcenv.set_auth_id(Some(String::from("root@pam"))); + + match proxmox_backup::tools::runtime::main(do_update(&mut rpcenv)) { + Err(err) => { + eprintln!("error during update: {}", err); + std::process::exit(1); + }, + _ => (), + } +}