moved tape_job.rs to pbs_config workspace
This commit is contained in:
@ -7,13 +7,10 @@ use proxmox::api::{api, ApiMethod, Permission, Router, RpcEnvironment};
|
||||
use proxmox::api::router::SubdirMap;
|
||||
use proxmox::{list_subdirs_api_method, sortable};
|
||||
|
||||
use pbs_api_types::{DATASTORE_SCHEMA, JOB_ID_SCHEMA, Authid, SyncJobConfig, SyncJobStatus};
|
||||
|
||||
use crate::{
|
||||
api2::{
|
||||
types::{
|
||||
DATASTORE_SCHEMA,
|
||||
JOB_ID_SCHEMA,
|
||||
Authid,
|
||||
},
|
||||
pull::do_sync_job,
|
||||
config::sync::{
|
||||
check_sync_job_modify_access,
|
||||
@ -22,11 +19,7 @@ use crate::{
|
||||
},
|
||||
config::{
|
||||
cached_user_info::CachedUserInfo,
|
||||
sync::{
|
||||
self,
|
||||
SyncJobStatus,
|
||||
SyncJobConfig,
|
||||
},
|
||||
sync,
|
||||
},
|
||||
server::{
|
||||
jobstate::{
|
||||
|
@ -7,11 +7,11 @@ use proxmox::api::router::SubdirMap;
|
||||
use proxmox::{list_subdirs_api_method, sortable};
|
||||
use proxmox::api::{api, ApiMethod, Permission, Router, RpcEnvironment};
|
||||
|
||||
use pbs_api_types::{VerificationJobConfig, VerificationJobStatus, JOB_ID_SCHEMA, Authid};
|
||||
|
||||
use crate::{
|
||||
api2::types::{
|
||||
DATASTORE_SCHEMA,
|
||||
JOB_ID_SCHEMA,
|
||||
Authid,
|
||||
},
|
||||
server::{
|
||||
do_verification_job,
|
||||
@ -22,16 +22,12 @@ use crate::{
|
||||
},
|
||||
},
|
||||
config::{
|
||||
verify,
|
||||
acl::{
|
||||
PRIV_DATASTORE_AUDIT,
|
||||
PRIV_DATASTORE_VERIFY,
|
||||
},
|
||||
cached_user_info::CachedUserInfo,
|
||||
verify::{
|
||||
self,
|
||||
VerificationJobConfig,
|
||||
VerificationJobStatus,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@ -48,7 +44,7 @@ use crate::{
|
||||
returns: {
|
||||
description: "List configured jobs and their status (filtered by access)",
|
||||
type: Array,
|
||||
items: { type: verify::VerificationJobStatus },
|
||||
items: { type: VerificationJobStatus },
|
||||
},
|
||||
access: {
|
||||
permission: &Permission::Anybody,
|
||||
|
@ -8,11 +8,12 @@ use proxmox::http_err;
|
||||
use pbs_client::{HttpClient, HttpClientOptions};
|
||||
use pbs_api_types::{
|
||||
REMOTE_ID_SCHEMA, REMOTE_PASSWORD_SCHEMA, Remote, RemoteConfig, RemoteConfigUpdater,
|
||||
Authid, PROXMOX_CONFIG_DIGEST_SCHEMA, DataStoreListItem,
|
||||
Authid, PROXMOX_CONFIG_DIGEST_SCHEMA, DataStoreListItem, SyncJobConfig,
|
||||
};
|
||||
|
||||
use crate::config::cached_user_info::CachedUserInfo;
|
||||
use crate::config::acl::{PRIV_REMOTE_AUDIT, PRIV_REMOTE_MODIFY};
|
||||
use crate::config::sync;
|
||||
|
||||
#[api(
|
||||
input: {
|
||||
@ -247,8 +248,6 @@ pub fn update_remote(
|
||||
/// Remove a remote from the configuration file.
|
||||
pub fn delete_remote(name: String, digest: Option<String>) -> Result<(), Error> {
|
||||
|
||||
use crate::config::sync::{self, SyncJobConfig};
|
||||
|
||||
let (sync_jobs, _) = sync::config()?;
|
||||
|
||||
let job_list: Vec<SyncJobConfig> = sync_jobs.convert_to_typed_array("sync")?;
|
||||
|
@ -4,7 +4,11 @@ use ::serde::{Deserialize, Serialize};
|
||||
|
||||
use proxmox::api::{api, Permission, Router, RpcEnvironment};
|
||||
|
||||
use crate::api2::types::*;
|
||||
use pbs_api_types::{
|
||||
Authid, SyncJobConfig,
|
||||
SINGLE_LINE_COMMENT_SCHEMA, JOB_ID_SCHEMA, REMOTE_ID_SCHEMA, DATASTORE_SCHEMA,
|
||||
REMOVE_VANISHED_BACKUPS_SCHEMA, SYNC_SCHEDULE_SCHEMA, PROXMOX_CONFIG_DIGEST_SCHEMA,
|
||||
};
|
||||
|
||||
use crate::config::acl::{
|
||||
PRIV_DATASTORE_AUDIT,
|
||||
@ -15,8 +19,7 @@ use crate::config::acl::{
|
||||
PRIV_REMOTE_READ,
|
||||
};
|
||||
|
||||
use crate::config::cached_user_info::CachedUserInfo;
|
||||
use crate::config::sync::{self, SyncJobConfig};
|
||||
use crate::config::{sync, cached_user_info::CachedUserInfo};
|
||||
use pbs_config::open_backup_lockfile;
|
||||
|
||||
pub fn check_sync_job_read_access(
|
||||
@ -77,7 +80,7 @@ pub fn check_sync_job_modify_access(
|
||||
returns: {
|
||||
description: "List configured jobs.",
|
||||
type: Array,
|
||||
items: { type: sync::SyncJobConfig },
|
||||
items: { type: SyncJobConfig },
|
||||
},
|
||||
access: {
|
||||
description: "Limited to sync job entries where user has Datastore.Audit on target datastore, and Remote.Audit on source remote.",
|
||||
@ -154,7 +157,7 @@ pub fn create_sync_job(
|
||||
|
||||
let _lock = open_backup_lockfile(sync::SYNC_CFG_LOCKFILE, None, true)?;
|
||||
|
||||
let sync_job: sync::SyncJobConfig = serde_json::from_value(param)?;
|
||||
let sync_job: SyncJobConfig = serde_json::from_value(param)?;
|
||||
if !check_sync_job_modify_access(&user_info, &auth_id, &sync_job) {
|
||||
bail!("permission check failed");
|
||||
}
|
||||
@ -182,7 +185,7 @@ pub fn create_sync_job(
|
||||
},
|
||||
},
|
||||
},
|
||||
returns: { type: sync::SyncJobConfig },
|
||||
returns: { type: SyncJobConfig },
|
||||
access: {
|
||||
description: "Limited to sync job entries where user has Datastore.Audit on target datastore, and Remote.Audit on source remote.",
|
||||
permission: &Permission::Anybody,
|
||||
@ -306,7 +309,7 @@ pub fn update_sync_job(
|
||||
crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
|
||||
}
|
||||
|
||||
let mut data: sync::SyncJobConfig = config.lookup("sync", &id)?;
|
||||
let mut data: SyncJobConfig = config.lookup("sync", &id)?;
|
||||
|
||||
if let Some(delete) = delete {
|
||||
for delete_prop in delete {
|
||||
|
@ -3,31 +3,27 @@ use serde_json::Value;
|
||||
use ::serde::{Deserialize, Serialize};
|
||||
|
||||
use proxmox::api::{api, Router, RpcEnvironment, Permission};
|
||||
use pbs_config::open_backup_lockfile;
|
||||
|
||||
use pbs_api_types::{
|
||||
Authid,
|
||||
Userid,
|
||||
TapeBackupJobConfig,
|
||||
JOB_ID_SCHEMA,
|
||||
DATASTORE_SCHEMA,
|
||||
DRIVE_NAME_SCHEMA,
|
||||
PROXMOX_CONFIG_DIGEST_SCHEMA,
|
||||
SINGLE_LINE_COMMENT_SCHEMA,
|
||||
MEDIA_POOL_NAME_SCHEMA,
|
||||
SYNC_SCHEDULE_SCHEMA,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
api2::types::{
|
||||
Authid,
|
||||
Userid,
|
||||
JOB_ID_SCHEMA,
|
||||
DATASTORE_SCHEMA,
|
||||
DRIVE_NAME_SCHEMA,
|
||||
PROXMOX_CONFIG_DIGEST_SCHEMA,
|
||||
SINGLE_LINE_COMMENT_SCHEMA,
|
||||
MEDIA_POOL_NAME_SCHEMA,
|
||||
SYNC_SCHEDULE_SCHEMA,
|
||||
},
|
||||
config::{
|
||||
self,
|
||||
cached_user_info::CachedUserInfo,
|
||||
acl::{
|
||||
PRIV_TAPE_AUDIT,
|
||||
PRIV_TAPE_MODIFY,
|
||||
},
|
||||
tape_job::{
|
||||
TAPE_JOB_CFG_LOCKFILE,
|
||||
TapeBackupJobConfig,
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@ -53,7 +49,7 @@ pub fn list_tape_backup_jobs(
|
||||
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
||||
let user_info = CachedUserInfo::new()?;
|
||||
|
||||
let (config, digest) = config::tape_job::config()?;
|
||||
let (config, digest) = pbs_config::tape_job::config()?;
|
||||
|
||||
let list = config.convert_to_typed_array::<TapeBackupJobConfig>("backup")?;
|
||||
|
||||
@ -89,9 +85,9 @@ pub fn create_tape_backup_job(
|
||||
job: TapeBackupJobConfig,
|
||||
_rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<(), Error> {
|
||||
let _lock = open_backup_lockfile(TAPE_JOB_CFG_LOCKFILE, None, true)?;
|
||||
let _lock = pbs_config::tape_job::lock()?;
|
||||
|
||||
let (mut config, _digest) = config::tape_job::config()?;
|
||||
let (mut config, _digest) = pbs_config::tape_job::config()?;
|
||||
|
||||
if config.sections.get(&job.id).is_some() {
|
||||
bail!("job '{}' already exists.", job.id);
|
||||
@ -99,7 +95,7 @@ pub fn create_tape_backup_job(
|
||||
|
||||
config.set_data(&job.id, "backup", &job)?;
|
||||
|
||||
config::tape_job::save_config(&config)?;
|
||||
pbs_config::tape_job::save_config(&config)?;
|
||||
|
||||
crate::server::jobstate::create_state_file("tape-backup-job", &job.id)?;
|
||||
|
||||
@ -125,7 +121,7 @@ pub fn read_tape_backup_job(
|
||||
mut rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<TapeBackupJobConfig, Error> {
|
||||
|
||||
let (config, digest) = config::tape_job::config()?;
|
||||
let (config, digest) = pbs_config::tape_job::config()?;
|
||||
|
||||
let job = config.lookup("backup", &id)?;
|
||||
|
||||
@ -232,9 +228,9 @@ pub fn update_tape_backup_job(
|
||||
delete: Option<Vec<DeletableProperty>>,
|
||||
digest: Option<String>,
|
||||
) -> Result<(), Error> {
|
||||
let _lock = open_backup_lockfile(TAPE_JOB_CFG_LOCKFILE, None, true)?;
|
||||
let _lock = pbs_config::tape_job::lock()?;
|
||||
|
||||
let (mut config, expected_digest) = config::tape_job::config()?;
|
||||
let (mut config, expected_digest) = pbs_config::tape_job::config()?;
|
||||
|
||||
let mut data: TapeBackupJobConfig = config.lookup("backup", &id)?;
|
||||
|
||||
@ -279,7 +275,7 @@ pub fn update_tape_backup_job(
|
||||
|
||||
config.set_data(&id, "backup", &data)?;
|
||||
|
||||
config::tape_job::save_config(&config)?;
|
||||
pbs_config::tape_job::save_config(&config)?;
|
||||
|
||||
if schedule_changed {
|
||||
crate::server::jobstate::update_job_last_run_time("tape-backup-job", &id)?;
|
||||
@ -311,9 +307,9 @@ pub fn delete_tape_backup_job(
|
||||
digest: Option<String>,
|
||||
_rpcenv: &mut dyn RpcEnvironment,
|
||||
) -> Result<(), Error> {
|
||||
let _lock = open_backup_lockfile(TAPE_JOB_CFG_LOCKFILE, None, true)?;
|
||||
let _lock = pbs_config::tape_job::lock()?;
|
||||
|
||||
let (mut config, expected_digest) = config::tape_job::config()?;
|
||||
let (mut config, expected_digest) = pbs_config::tape_job::config()?;
|
||||
|
||||
if let Some(ref digest) = digest {
|
||||
let digest = proxmox::tools::hex_to_digest(digest)?;
|
||||
@ -327,7 +323,7 @@ pub fn delete_tape_backup_job(
|
||||
Err(_) => { bail!("job '{}' does not exist.", id) },
|
||||
};
|
||||
|
||||
config::tape_job::save_config(&config)?;
|
||||
pbs_config::tape_job::save_config(&config)?;
|
||||
|
||||
crate::server::jobstate::remove_state_file("tape-backup-job", &id)?;
|
||||
|
||||
|
@ -4,7 +4,12 @@ use ::serde::{Deserialize, Serialize};
|
||||
|
||||
use proxmox::api::{api, Permission, Router, RpcEnvironment};
|
||||
|
||||
use crate::api2::types::*;
|
||||
use pbs_api_types::{
|
||||
Authid, VerificationJobConfig,
|
||||
SINGLE_LINE_COMMENT_SCHEMA, JOB_ID_SCHEMA, IGNORE_VERIFIED_BACKUPS_SCHEMA,
|
||||
VERIFICATION_OUTDATED_AFTER_SCHEMA, VERIFICATION_SCHEDULE_SCHEMA,
|
||||
DATASTORE_SCHEMA, PROXMOX_CONFIG_DIGEST_SCHEMA,
|
||||
};
|
||||
|
||||
use crate::config::acl::{
|
||||
PRIV_DATASTORE_AUDIT,
|
||||
@ -12,7 +17,7 @@ use crate::config::acl::{
|
||||
};
|
||||
|
||||
use crate::config::cached_user_info::CachedUserInfo;
|
||||
use crate::config::verify::{self, VerificationJobConfig};
|
||||
use crate::config::verify;
|
||||
use pbs_config::open_backup_lockfile;
|
||||
|
||||
#[api(
|
||||
@ -22,7 +27,7 @@ use pbs_config::open_backup_lockfile;
|
||||
returns: {
|
||||
description: "List configured jobs.",
|
||||
type: Array,
|
||||
items: { type: verify::VerificationJobConfig },
|
||||
items: { type: VerificationJobConfig },
|
||||
},
|
||||
access: {
|
||||
permission: &Permission::Anybody,
|
||||
@ -97,7 +102,7 @@ pub fn create_verification_job(
|
||||
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
||||
let user_info = CachedUserInfo::new()?;
|
||||
|
||||
let verification_job: verify::VerificationJobConfig = serde_json::from_value(param)?;
|
||||
let verification_job: VerificationJobConfig = serde_json::from_value(param)?;
|
||||
|
||||
user_info.check_privs(&auth_id, &["datastore", &verification_job.store], PRIV_DATASTORE_VERIFY, false)?;
|
||||
|
||||
@ -126,7 +131,7 @@ pub fn create_verification_job(
|
||||
},
|
||||
},
|
||||
},
|
||||
returns: { type: verify::VerificationJobConfig },
|
||||
returns: { type: VerificationJobConfig },
|
||||
access: {
|
||||
permission: &Permission::Anybody,
|
||||
description: "Requires Datastore.Audit or Datastore.Verify on job's datastore.",
|
||||
@ -142,7 +147,7 @@ pub fn read_verification_job(
|
||||
|
||||
let (config, digest) = verify::config()?;
|
||||
|
||||
let verification_job: verify::VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
let verification_job: VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
|
||||
let required_privs = PRIV_DATASTORE_AUDIT | PRIV_DATASTORE_VERIFY;
|
||||
user_info.check_privs(&auth_id, &["datastore", &verification_job.store], required_privs, true)?;
|
||||
@ -239,7 +244,7 @@ pub fn update_verification_job(
|
||||
crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
|
||||
}
|
||||
|
||||
let mut data: verify::VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
let mut data: VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
|
||||
// check existing store
|
||||
user_info.check_privs(&auth_id, &["datastore", &data.store], PRIV_DATASTORE_VERIFY, true)?;
|
||||
@ -318,7 +323,7 @@ pub fn delete_verification_job(
|
||||
|
||||
let (mut config, expected_digest) = verify::config()?;
|
||||
|
||||
let job: verify::VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
let job: VerificationJobConfig = config.lookup("verification", &id)?;
|
||||
user_info.check_privs(&auth_id, &["datastore", &job.store], PRIV_DATASTORE_VERIFY, true)?;
|
||||
|
||||
if let Some(ref digest) = digest {
|
||||
|
@ -14,10 +14,10 @@ use pbs_api_types::{
|
||||
|
||||
use crate::server::{WorkerTask, jobstate::Job, pull::pull_store};
|
||||
use crate::backup::DataStore;
|
||||
use crate::api2::types::REMOVE_VANISHED_BACKUPS_SCHEMA;
|
||||
|
||||
use pbs_api_types::{SyncJobConfig, REMOVE_VANISHED_BACKUPS_SCHEMA};
|
||||
|
||||
use crate::config::{
|
||||
sync::SyncJobConfig,
|
||||
acl::{PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_PRUNE, PRIV_REMOTE_READ},
|
||||
cached_user_info::CachedUserInfo,
|
||||
};
|
||||
|
@ -15,25 +15,23 @@ use proxmox::{
|
||||
},
|
||||
};
|
||||
|
||||
use pbs_api_types::{Authid, Userid};
|
||||
use pbs_api_types::{
|
||||
Authid, Userid, TapeBackupJobConfig, TapeBackupJobSetup, TapeBackupJobStatus, MediaPoolConfig,
|
||||
UPID_SCHEMA, JOB_ID_SCHEMA,
|
||||
};
|
||||
|
||||
use pbs_datastore::{task_log, task_warn, StoreProgress};
|
||||
use pbs_datastore::backup_info::{BackupDir, BackupInfo};
|
||||
use pbs_datastore::task::TaskState;
|
||||
|
||||
use crate::{
|
||||
config::{
|
||||
self,
|
||||
cached_user_info::CachedUserInfo,
|
||||
acl::{
|
||||
PRIV_DATASTORE_READ,
|
||||
PRIV_TAPE_AUDIT,
|
||||
PRIV_TAPE_WRITE,
|
||||
},
|
||||
tape_job::{
|
||||
TapeBackupJobConfig,
|
||||
TapeBackupJobSetup,
|
||||
TapeBackupJobStatus,
|
||||
},
|
||||
},
|
||||
server::{
|
||||
lookup_user_email,
|
||||
@ -45,11 +43,6 @@ use crate::{
|
||||
},
|
||||
},
|
||||
backup::DataStore,
|
||||
api2::types::{
|
||||
UPID_SCHEMA,
|
||||
JOB_ID_SCHEMA,
|
||||
MediaPoolConfig,
|
||||
},
|
||||
server::WorkerTask,
|
||||
tape::{
|
||||
TAPE_STATUS_DIR,
|
||||
@ -121,7 +114,7 @@ pub fn list_tape_backup_jobs(
|
||||
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
||||
let user_info = CachedUserInfo::new()?;
|
||||
|
||||
let (job_config, digest) = config::tape_job::config()?;
|
||||
let (job_config, digest) = pbs_config::tape_job::config()?;
|
||||
let (pool_config, _pool_digest) = pbs_config::media_pool::config()?;
|
||||
let (drive_config, _digest) = pbs_config::drive::config()?;
|
||||
|
||||
@ -310,7 +303,7 @@ pub fn run_tape_backup_job(
|
||||
) -> Result<String, Error> {
|
||||
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
||||
|
||||
let (config, _digest) = config::tape_job::config()?;
|
||||
let (config, _digest) = pbs_config::tape_job::config()?;
|
||||
let backup_job: TapeBackupJobConfig = config.lookup("backup", &id)?;
|
||||
|
||||
check_backup_permission(
|
||||
|
@ -27,11 +27,6 @@ pub const FILENAME_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|name| {
|
||||
const_regex!{
|
||||
pub SYSTEMD_DATETIME_REGEX = r"^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}(:\d{2})?)?$"; // fixme: define in common_regex ?
|
||||
|
||||
/// Regex for verification jobs 'DATASTORE:ACTUAL_JOB_ID'
|
||||
pub VERIFICATION_JOB_WORKER_ID_REGEX = concat!(r"^(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):");
|
||||
/// Regex for sync jobs 'REMOTE:REMOTE_DATASTORE:LOCAL_DATASTORE:ACTUAL_JOB_ID'
|
||||
pub SYNC_JOB_WORKER_ID_REGEX = concat!(r"^(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):");
|
||||
|
||||
pub ACL_PATH_REGEX = concat!(r"^(?:/|", r"(?:/", PROXMOX_SAFE_ID_REGEX_STR!(), ")+", r")$");
|
||||
|
||||
pub SUBSCRIPTION_KEY_REGEX = concat!(r"^pbs(?:[cbsp])-[0-9a-f]{10}$");
|
||||
@ -202,10 +197,6 @@ pub struct AclListItem {
|
||||
pub roleid: String,
|
||||
}
|
||||
|
||||
pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.")
|
||||
.max_length(256)
|
||||
.schema();
|
||||
|
||||
pub const DATASTORE_MAP_SCHEMA: Schema = StringSchema::new("Datastore mapping.")
|
||||
.format(&DATASTORE_MAP_FORMAT)
|
||||
.min_length(3)
|
||||
@ -225,50 +216,6 @@ pub const DATASTORE_MAP_LIST_SCHEMA: Schema = StringSchema::new(
|
||||
.format(&ApiStringFormat::PropertyString(&DATASTORE_MAP_ARRAY_SCHEMA))
|
||||
.schema();
|
||||
|
||||
pub const SYNC_SCHEDULE_SCHEMA: Schema = StringSchema::new(
|
||||
"Run sync job at specified schedule.")
|
||||
.format(&ApiStringFormat::VerifyFn(pbs_systemd::time::verify_calendar_event))
|
||||
.type_text("<calendar-event>")
|
||||
.schema();
|
||||
|
||||
pub const GC_SCHEDULE_SCHEMA: Schema = StringSchema::new(
|
||||
"Run garbage collection job at specified schedule.")
|
||||
.format(&ApiStringFormat::VerifyFn(pbs_systemd::time::verify_calendar_event))
|
||||
.type_text("<calendar-event>")
|
||||
.schema();
|
||||
|
||||
pub const PRUNE_SCHEDULE_SCHEMA: Schema = StringSchema::new(
|
||||
"Run prune job at specified schedule.")
|
||||
.format(&ApiStringFormat::VerifyFn(pbs_systemd::time::verify_calendar_event))
|
||||
.type_text("<calendar-event>")
|
||||
.schema();
|
||||
|
||||
pub const VERIFICATION_SCHEDULE_SCHEMA: Schema = StringSchema::new(
|
||||
"Run verify job at specified schedule.")
|
||||
.format(&ApiStringFormat::VerifyFn(pbs_systemd::time::verify_calendar_event))
|
||||
.type_text("<calendar-event>")
|
||||
.schema();
|
||||
|
||||
pub const JOB_ID_SCHEMA: Schema = StringSchema::new("Job ID.")
|
||||
.format(&PROXMOX_SAFE_ID_FORMAT)
|
||||
.min_length(3)
|
||||
.max_length(32)
|
||||
.schema();
|
||||
|
||||
pub const REMOVE_VANISHED_BACKUPS_SCHEMA: Schema = BooleanSchema::new(
|
||||
"Delete vanished backups. This remove the local copy if the remote backup was deleted.")
|
||||
.default(true)
|
||||
.schema();
|
||||
|
||||
pub const IGNORE_VERIFIED_BACKUPS_SCHEMA: Schema = BooleanSchema::new(
|
||||
"Do not verify backups that are already verified if their verification is not outdated.")
|
||||
.default(true)
|
||||
.schema();
|
||||
|
||||
pub const VERIFICATION_OUTDATED_AFTER_SCHEMA: Schema = IntegerSchema::new(
|
||||
"Days after that a verification becomes outdated")
|
||||
.minimum(1)
|
||||
.schema();
|
||||
|
||||
pub const HOSTNAME_SCHEMA: Schema = StringSchema::new("Hostname (as defined in RFC1123).")
|
||||
.format(&HOSTNAME_FORMAT)
|
||||
@ -690,120 +637,6 @@ pub enum RRDTimeFrameResolution {
|
||||
Year = 60*10080,
|
||||
}
|
||||
|
||||
#[api()]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "PascalCase")]
|
||||
/// Describes a package for which an update is available.
|
||||
pub struct APTUpdateInfo {
|
||||
/// Package name
|
||||
pub package: String,
|
||||
/// Package title
|
||||
pub title: String,
|
||||
/// Package architecture
|
||||
pub arch: String,
|
||||
/// Human readable package description
|
||||
pub description: String,
|
||||
/// New version to be updated to
|
||||
pub version: String,
|
||||
/// Old version currently installed
|
||||
pub old_version: String,
|
||||
/// Package origin
|
||||
pub origin: String,
|
||||
/// Package priority in human-readable form
|
||||
pub priority: String,
|
||||
/// Package section
|
||||
pub section: String,
|
||||
/// URL under which the package's changelog can be retrieved
|
||||
pub change_log_url: String,
|
||||
/// Custom extra field for additional package information
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
pub extra_info: Option<String>,
|
||||
}
|
||||
|
||||
#[api()]
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
/// When do we send notifications
|
||||
pub enum Notify {
|
||||
/// Never send notification
|
||||
Never,
|
||||
/// Send notifications for failed and successful jobs
|
||||
Always,
|
||||
/// Send notifications for failed jobs only
|
||||
Error,
|
||||
}
|
||||
|
||||
#[api(
|
||||
properties: {
|
||||
gc: {
|
||||
type: Notify,
|
||||
optional: true,
|
||||
},
|
||||
verify: {
|
||||
type: Notify,
|
||||
optional: true,
|
||||
},
|
||||
sync: {
|
||||
type: Notify,
|
||||
optional: true,
|
||||
},
|
||||
},
|
||||
)]
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
/// Datastore notify settings
|
||||
pub struct DatastoreNotify {
|
||||
/// Garbage collection settings
|
||||
pub gc: Option<Notify>,
|
||||
/// Verify job setting
|
||||
pub verify: Option<Notify>,
|
||||
/// Sync job setting
|
||||
pub sync: Option<Notify>,
|
||||
}
|
||||
|
||||
pub const DATASTORE_NOTIFY_STRING_SCHEMA: Schema = StringSchema::new(
|
||||
"Datastore notification setting")
|
||||
.format(&ApiStringFormat::PropertyString(&DatastoreNotify::API_SCHEMA))
|
||||
.schema();
|
||||
|
||||
|
||||
#[api(
|
||||
properties: {
|
||||
"next-run": {
|
||||
description: "Estimated time of the next run (UNIX epoch).",
|
||||
optional: true,
|
||||
type: Integer,
|
||||
},
|
||||
"last-run-state": {
|
||||
description: "Result of the last run.",
|
||||
optional: true,
|
||||
type: String,
|
||||
},
|
||||
"last-run-upid": {
|
||||
description: "Task UPID of the last run.",
|
||||
optional: true,
|
||||
type: String,
|
||||
},
|
||||
"last-run-endtime": {
|
||||
description: "Endtime of the last run.",
|
||||
optional: true,
|
||||
type: Integer,
|
||||
},
|
||||
}
|
||||
)]
|
||||
#[derive(Serialize,Deserialize,Default)]
|
||||
#[serde(rename_all="kebab-case")]
|
||||
/// Job Scheduling Status
|
||||
pub struct JobScheduleStatus {
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
pub next_run: Option<i64>,
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
pub last_run_state: Option<String>,
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
pub last_run_upid: Option<String>,
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
pub last_run_endtime: Option<i64>,
|
||||
}
|
||||
|
||||
#[api]
|
||||
#[derive(Serialize, Deserialize, Default)]
|
||||
#[serde(rename_all = "kebab-case")]
|
||||
|
Reference in New Issue
Block a user