From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 131261FF0B6 for ; Wed, 30 Sep 2026 17:22:26 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id D9F1A2164A; Wed, 30 Sep 2026 17:22:25 +0200 (CEST) From: Jonas Theisen To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup 08/14] fix #7904: Implement "Enable" checkbox for Tape backup jobs Date: Wed, 30 Sep 2026 17:18:06 +0200 Message-ID: <20260930152131.317493-9-j.theisen@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260930152131.317493-1-j.theisen@proxmox.com> References: <20260930152131.317493-1-j.theisen@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1790781739836 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.222 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 6FNUIBCLWF27NGPHIT34SOE7GDAQSWTR X-Message-ID-Hash: 6FNUIBCLWF27NGPHIT34SOE7GDAQSWTR X-MailFrom: j.theisen@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: To allow users to disable a tape backup job without having to remove the schedule this patch introduces an "Enable" checkbox. The value is inserted into the job config and honored by the scheduler by skipping it if enabled is set to false. If the value is not present it is assumed the job should run for backwards compatibility. If the checkbox is unchecked the schedule input box in the UI is also disabled and such is configured to not allow empty inputs anymore. Signed-off-by: Jonas Theisen --- src/api2/tape/backup.rs | 11 ++++++++++- src/bin/proxmox-backup-proxy.rs | 8 ++++++++ www/tape/window/TapeBackupJob.js | 30 ++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index c0a4ca65b..3bf6c8bb0 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -83,7 +83,16 @@ pub fn list_tape_backup_jobs( let status = compute_schedule_status("tape-backup-job", &job.id, job.schedule.as_deref())?; - let next_run = status.next_run.unwrap_or(current_time); + let next_run: i64; + let enabled = match job.enable { + Some(c) => c, + None => true, + }; + if !enabled { + next_run = 0; + } else { + next_run = status.next_run.unwrap_or(current_time); + } let mut next_media_label = None; diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index c974da4bd..f0fe21b90 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -780,6 +780,14 @@ async fn schedule_tape_backup_jobs() { None => continue, }; + let job_enabled = match job_config.enable { + Some(c) => c, + None => true, //if not defined assume enabled for backwards compatibility + }; + if !job_enabled { + continue; + } + let worker_type = "tape-backup-job"; let auth_id = Authid::root_auth_id().clone(); if check_schedule(worker_type, &event_str, &job_id) { diff --git a/www/tape/window/TapeBackupJob.js b/www/tape/window/TapeBackupJob.js index ad03b6076..2c50470e5 100644 --- a/www/tape/window/TapeBackupJob.js +++ b/www/tape/window/TapeBackupJob.js @@ -46,6 +46,14 @@ Ext.define('PBS.TapeManagement.BackupJobEdit', { }, }, + setValues: function (values) { + let me = this; + if (!values.schedule || values.schedule === '') { + values.enable = false; + } + me.callParent([values]); + }, + items: { xtype: 'tabpanel', bodyPadding: 10, @@ -112,13 +120,31 @@ Ext.define('PBS.TapeManagement.BackupJobEdit', { ], column2: [ + { + xtype: 'proxmoxcheckbox', + fieldLabel: gettext('Enable'), + name: 'enable', + autoEl: { + tag: 'div', + 'data-qtip': gettext('Enable scheduled execution of this task.'), + }, + listeners: { + change: function (field, enabled) { + let me = this; + let view = me.up('pbsTapeBackupJobEdit'); + let schedule = view.down('field[name=schedule]'); + schedule.setDisabled(!enabled); + }, + }, + uncheckedValue: false, + value: true, + }, { fieldLabel: gettext('Schedule'), xtype: 'pbsCalendarEvent', name: 'schedule', - emptyText: gettext('none (disabled)'), + allowBlank: false, cbind: { - deleteEmpty: '{!isCreate}', value: '{scheduleValue}', }, }, -- 2.47.3