diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 39e44de6..75f82ea4 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -506,6 +506,88 @@ pub struct TypeCounts { pub snapshots: u64, } +#[api( + properties: { + "upid": { + optional: true, + type: UPID, + }, + }, +)] +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +/// Garbage collection status. +pub struct GarbageCollectionStatus { + pub upid: Option, + /// Number of processed index files. + pub index_file_count: usize, + /// Sum of bytes referred by index files. + pub index_data_bytes: u64, + /// Bytes used on disk. + pub disk_bytes: u64, + /// Chunks used on disk. + pub disk_chunks: usize, + /// Sum of removed bytes. + pub removed_bytes: u64, + /// Number of removed chunks. + pub removed_chunks: usize, + /// Sum of pending bytes (pending removal - kept for safety). + pub pending_bytes: u64, + /// Number of pending chunks (pending removal - kept for safety). + pub pending_chunks: usize, + /// Number of chunks marked as .bad by verify that have been removed by GC. + pub removed_bad: usize, + /// Number of chunks still marked as .bad after garbage collection. + pub still_bad: usize, +} + +impl Default for GarbageCollectionStatus { + fn default() -> Self { + GarbageCollectionStatus { + upid: None, + index_file_count: 0, + index_data_bytes: 0, + disk_bytes: 0, + disk_chunks: 0, + removed_bytes: 0, + removed_chunks: 0, + pending_bytes: 0, + pending_chunks: 0, + removed_bad: 0, + still_bad: 0, + } + } +} + +#[api( + properties: { + "gc-status": { + type: GarbageCollectionStatus, + optional: true, + }, + counts: { + type: Counts, + optional: true, + }, + }, +)] +#[derive(Serialize, Deserialize)] +#[serde(rename_all="kebab-case")] +/// Overall Datastore status and useful information. +pub struct DataStoreStatus { + /// Total space (bytes). + pub total: u64, + /// Used space (bytes). + pub used: u64, + /// Available space (bytes). + pub avail: u64, + /// Status of last GC + #[serde(skip_serializing_if="Option::is_none")] + pub gc_status: Option, + /// Group/Snapshot counts + #[serde(skip_serializing_if="Option::is_none")] + pub counts: Option, +} pub const ADMIN_DATASTORE_LIST_SNAPSHOTS_RETURN_TYPE: ReturnType = ReturnType { optional: false, diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index a96fcc10..1526dbc4 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -17,10 +17,6 @@ const_regex!{ 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 const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task ID.") - .max_length(256) - .schema(); - pub const JOB_ID_SCHEMA: Schema = StringSchema::new("Job ID.") .format(&PROXMOX_SAFE_ID_FORMAT) .min_length(3) diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 388bf0f7..6b0246f5 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -4,9 +4,7 @@ use serde::{Deserialize, Serialize}; use anyhow::bail; use proxmox::api::api; -use proxmox::api::schema::{ - ApiStringFormat, ApiType, ArraySchema, ReturnType, Schema, StringSchema, -}; +use proxmox::api::schema::{ApiStringFormat, ArraySchema, Schema, StringSchema}; use proxmox::const_regex; use proxmox::{IPRE, IPRE_BRACKET, IPV4OCTET, IPV4RE, IPV6H16, IPV6LS32, IPV6RE}; @@ -63,7 +61,7 @@ mod user; pub use user::*; pub mod upid; -pub use upid::UPID; +pub use upid::*; mod crypto; pub use crypto::{CryptMode, Fingerprint}; @@ -276,58 +274,6 @@ pub const PROXMOX_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new( /// API schema format definition for repository URLs pub const BACKUP_REPO_URL: ApiStringFormat = ApiStringFormat::Pattern(&BACKUP_REPO_URL_REGEX); -#[api( - properties: { - "upid": { - optional: true, - type: UPID, - }, - }, -)] -#[derive(Clone, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -/// Garbage collection status. -pub struct GarbageCollectionStatus { - pub upid: Option, - /// Number of processed index files. - pub index_file_count: usize, - /// Sum of bytes referred by index files. - pub index_data_bytes: u64, - /// Bytes used on disk. - pub disk_bytes: u64, - /// Chunks used on disk. - pub disk_chunks: usize, - /// Sum of removed bytes. - pub removed_bytes: u64, - /// Number of removed chunks. - pub removed_chunks: usize, - /// Sum of pending bytes (pending removal - kept for safety). - pub pending_bytes: u64, - /// Number of pending chunks (pending removal - kept for safety). - pub pending_chunks: usize, - /// Number of chunks marked as .bad by verify that have been removed by GC. - pub removed_bad: usize, - /// Number of chunks still marked as .bad after garbage collection. - pub still_bad: usize, -} - -impl Default for GarbageCollectionStatus { - fn default() -> Self { - GarbageCollectionStatus { - upid: None, - index_file_count: 0, - index_data_bytes: 0, - disk_bytes: 0, - disk_chunks: 0, - removed_bytes: 0, - removed_chunks: 0, - pending_bytes: 0, - pending_chunks: 0, - removed_bad: 0, - still_bad: 0, - } - } -} // Complex type definitions @@ -383,46 +329,6 @@ impl std::convert::TryFrom> for RsaPubK } } -#[api( - properties: { - upid: { schema: UPID::API_SCHEMA }, - }, -)] -#[derive(Serialize, Deserialize)] -/// Task properties. -pub struct TaskListItem { - pub upid: String, - /// The node name where the task is running on. - pub node: String, - /// The Unix PID - pub pid: i64, - /// The task start time (Epoch) - pub pstart: u64, - /// The task start time (Epoch) - pub starttime: i64, - /// Worker type (arbitrary ASCII string) - pub worker_type: String, - /// Worker ID (arbitrary ASCII string) - pub worker_id: Option, - /// The authenticated entity who started the task - pub user: Authid, - /// The task end time (Epoch) - #[serde(skip_serializing_if="Option::is_none")] - pub endtime: Option, - /// Task end status - #[serde(skip_serializing_if="Option::is_none")] - pub status: Option, -} - - -pub const NODE_TASKS_LIST_TASKS_RETURN_TYPE: ReturnType = ReturnType { - optional: false, - schema: &ArraySchema::new( - "A list of tasks.", - &TaskListItem::API_SCHEMA, - ).schema(), -}; - #[api()] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] diff --git a/pbs-api-types/src/upid.rs b/pbs-api-types/src/upid.rs index 9447b8a0..50d70b67 100644 --- a/pbs-api-types/src/upid.rs +++ b/pbs-api-types/src/upid.rs @@ -1,8 +1,10 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use anyhow::{bail, Error}; +use serde::{Deserialize, Serialize}; -use proxmox::api::schema::{ApiStringFormat, ApiType, Schema, StringSchema}; +use proxmox::api::api; +use proxmox::api::schema::{ApiStringFormat, ApiType, Schema, StringSchema, ArraySchema, ReturnType}; use proxmox::const_regex; use proxmox::sys::linux::procfs; @@ -54,12 +56,14 @@ const_regex! { pub const PROXMOX_UPID_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PROXMOX_UPID_REGEX); +pub const UPID_SCHEMA: Schema = StringSchema::new("Unique Process/Task Identifier") + .min_length("UPID:N:12345678:12345678:12345678:::".len()) + .max_length(128) // arbitrary + .format(&PROXMOX_UPID_FORMAT) + .schema(); + impl ApiType for UPID { - const API_SCHEMA: Schema = StringSchema::new("Unique Process/Task Identifier") - .min_length("UPID:N:12345678:12345678:12345678:::".len()) - .max_length(128) // arbitrary - .format(&PROXMOX_UPID_FORMAT) - .schema(); + const API_SCHEMA: Schema = UPID_SCHEMA; } impl UPID { @@ -143,3 +147,57 @@ impl std::fmt::Display for UPID { self.node, self.pid, self.pstart, self.task_id, self.starttime, self.worker_type, wid, self.auth_id) } } + +#[api()] +#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum TaskStateType { + /// Ok + OK, + /// Warning + Warning, + /// Error + Error, + /// Unknown + Unknown, +} + +#[api( + properties: { + upid: { schema: UPID::API_SCHEMA }, + }, +)] +#[derive(Serialize, Deserialize)] +/// Task properties. +pub struct TaskListItem { + pub upid: String, + /// The node name where the task is running on. + pub node: String, + /// The Unix PID + pub pid: i64, + /// The task start time (Epoch) + pub pstart: u64, + /// The task start time (Epoch) + pub starttime: i64, + /// Worker type (arbitrary ASCII string) + pub worker_type: String, + /// Worker ID (arbitrary ASCII string) + pub worker_id: Option, + /// The authenticated entity who started the task + pub user: Authid, + /// The task end time (Epoch) + #[serde(skip_serializing_if="Option::is_none")] + pub endtime: Option, + /// Task end status + #[serde(skip_serializing_if="Option::is_none")] + pub status: Option, +} + +pub const NODE_TASKS_LIST_TASKS_RETURN_TYPE: ReturnType = ReturnType { + optional: false, + schema: &ArraySchema::new( + "A list of tasks.", + &TaskListItem::API_SCHEMA, + ).schema(), +}; + diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 45d5ba7d..33700a90 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -29,6 +29,7 @@ use pxar::EntryKind; use pbs_api_types::{ Authid, BackupContent, Counts, CryptMode, DataStoreListItem, GarbageCollectionStatus, GroupListItem, SnapshotListItem, SnapshotVerifyState, PruneOptions, + DataStoreStatus, RRDMode, RRDTimeFrameResolution, BACKUP_ARCHIVE_NAME_SCHEMA, BACKUP_ID_SCHEMA, BACKUP_TIME_SCHEMA, BACKUP_TYPE_SCHEMA, DATASTORE_SCHEMA, IGNORE_VERIFIED_BACKUPS_SCHEMA, UPID_SCHEMA, @@ -54,7 +55,6 @@ use pbs_tools::stream::{AsyncReaderStream, AsyncChannelWriter}; use pbs_tools::json::{required_integer_param, required_string_param}; use pbs_config::CachedUserInfo; -use crate::api2::types::{DataStoreStatus, RRDMode, RRDTimeFrameResolution}; use crate::api2::node::rrd::create_value_from_rrd; use crate::backup::{ check_backup_owner, verify_all_backups, verify_backup_group, verify_backup_dir, verify_filter, diff --git a/src/api2/admin/verify.rs b/src/api2/admin/verify.rs index 72050c04..a5e5c83f 100644 --- a/src/api2/admin/verify.rs +++ b/src/api2/admin/verify.rs @@ -9,15 +9,12 @@ use proxmox::api::{api, ApiMethod, Permission, Router, RpcEnvironment}; use pbs_api_types::{ VerificationJobConfig, VerificationJobStatus, JOB_ID_SCHEMA, Authid, - PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_VERIFY, + PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_VERIFY, DATASTORE_SCHEMA, }; use pbs_config::verify; use pbs_config::CachedUserInfo; use crate::{ - api2::types::{ - DATASTORE_SCHEMA, - }, server::{ do_verification_job, jobstate::{ diff --git a/src/api2/backup/environment.rs b/src/api2/backup/environment.rs index 9a6adf68..1766639e 100644 --- a/src/api2/backup/environment.rs +++ b/src/api2/backup/environment.rs @@ -14,8 +14,8 @@ use pbs_datastore::DataBlob; use pbs_datastore::backup_info::{BackupDir, BackupInfo}; use pbs_datastore::dynamic_index::DynamicIndexWriter; use pbs_datastore::fixed_index::FixedIndexWriter; +use pbs_api_types::Authid; -use crate::api2::types::Authid; use crate::backup::{verify_backup_dir_with_lock, DataStore}; use crate::server::WorkerTask; use crate::server::formatter::*; diff --git a/src/api2/backup/mod.rs b/src/api2/backup/mod.rs index cb9a859f..8f51f314 100644 --- a/src/api2/backup/mod.rs +++ b/src/api2/backup/mod.rs @@ -15,7 +15,7 @@ use proxmox::api::schema::*; use pbs_api_types::{ Authid, VerifyState, SnapshotVerifyState, BACKUP_ID_SCHEMA, BACKUP_TIME_SCHEMA, BACKUP_TYPE_SCHEMA, DATASTORE_SCHEMA, - CHUNK_DIGEST_SCHEMA, PRIV_DATASTORE_BACKUP, + CHUNK_DIGEST_SCHEMA, PRIV_DATASTORE_BACKUP, BACKUP_ARCHIVE_NAME_SCHEMA, }; use pbs_tools::fs::lock_dir_noblock_shared; use pbs_tools::json::{required_array_param, required_integer_param, required_string_param}; @@ -340,7 +340,7 @@ pub const API_METHOD_CREATE_DYNAMIC_INDEX: ApiMethod = ApiMethod::new( &ObjectSchema::new( "Create dynamic chunk index file.", &sorted!([ - ("archive-name", false, &crate::api2::types::BACKUP_ARCHIVE_NAME_SCHEMA), + ("archive-name", false, &BACKUP_ARCHIVE_NAME_SCHEMA), ]), ) ); @@ -377,7 +377,7 @@ pub const API_METHOD_CREATE_FIXED_INDEX: ApiMethod = ApiMethod::new( &ObjectSchema::new( "Create fixed chunk index file.", &sorted!([ - ("archive-name", false, &crate::api2::types::BACKUP_ARCHIVE_NAME_SCHEMA), + ("archive-name", false, &BACKUP_ARCHIVE_NAME_SCHEMA), ("size", false, &IntegerSchema::new("File size.") .minimum(1) .schema() @@ -735,7 +735,7 @@ pub const API_METHOD_DOWNLOAD_PREVIOUS: ApiMethod = ApiMethod::new( &ObjectSchema::new( "Download archive from previous backup.", &sorted!([ - ("archive-name", false, &crate::api2::types::BACKUP_ARCHIVE_NAME_SCHEMA) + ("archive-name", false, &BACKUP_ARCHIVE_NAME_SCHEMA) ]), ) ); diff --git a/src/api2/backup/upload_chunk.rs b/src/api2/backup/upload_chunk.rs index 3fa52d79..4a20b867 100644 --- a/src/api2/backup/upload_chunk.rs +++ b/src/api2/backup/upload_chunk.rs @@ -15,8 +15,8 @@ use proxmox::api::schema::*; use pbs_datastore::DataBlob; use pbs_datastore::file_formats::{DataBlobHeader, EncryptedDataBlobHeader}; use pbs_tools::json::{required_integer_param, required_string_param}; +use pbs_api_types::{CHUNK_DIGEST_SCHEMA, BACKUP_ARCHIVE_NAME_SCHEMA}; -use crate::api2::types::*; use crate::backup::DataStore; use super::environment::*; @@ -247,7 +247,7 @@ pub const API_METHOD_UPLOAD_BLOB: ApiMethod = ApiMethod::new( &ObjectSchema::new( "Upload binary blob file.", &sorted!([ - ("file-name", false, &crate::api2::types::BACKUP_ARCHIVE_NAME_SCHEMA), + ("file-name", false, &BACKUP_ARCHIVE_NAME_SCHEMA), ("encoded-size", false, &IntegerSchema::new("Encoded blob size.") .minimum(std::mem::size_of::() as isize) .maximum(1024*1024*16+(std::mem::size_of::() as isize)) diff --git a/src/api2/config/access/tfa.rs b/src/api2/config/access/tfa.rs index baa6f403..a7234638 100644 --- a/src/api2/config/access/tfa.rs +++ b/src/api2/config/access/tfa.rs @@ -3,10 +3,11 @@ use anyhow::Error; -use crate::api2::types::PROXMOX_CONFIG_DIGEST_SCHEMA; use proxmox::api::{api, Permission, Router, RpcEnvironment, SubdirMap}; use proxmox::list_subdirs_api_method; +use pbs_api_types::PROXMOX_CONFIG_DIGEST_SCHEMA; + use crate::config::tfa::{self, WebauthnConfig, WebauthnConfigUpdater}; pub const ROUTER: Router = Router::new() diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index e11a89be..9aaf6f1a 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -9,15 +9,14 @@ use proxmox::api::router::SubdirMap; use proxmox::{identity, list_subdirs_api_method, sortable}; use pbs_api_types::{ - Userid, Authid, Tokenname, TaskListItem, + Userid, Authid, Tokenname, TaskListItem, TaskStateType, UPID, NODE_SCHEMA, UPID_SCHEMA, VERIFICATION_JOB_WORKER_ID_REGEX, SYNC_JOB_WORKER_ID_REGEX, DATASTORE_SCHEMA, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_VERIFY, PRIV_SYS_AUDIT, PRIV_SYS_MODIFY, }; -use crate::api2::types::TaskStateType; use crate::api2::pull::check_pull_privs; -use crate::server::{self, UPID, UPIDExt, TaskState, TaskListInfoIterator}; +use crate::server::{self, UPIDExt, TaskState, TaskListInfoIterator}; use pbs_config::CachedUserInfo; // matches respective job execution privileges diff --git a/src/api2/reader/environment.rs b/src/api2/reader/environment.rs index cb2eedb0..64a01c4d 100644 --- a/src/api2/reader/environment.rs +++ b/src/api2/reader/environment.rs @@ -6,8 +6,8 @@ use serde_json::{json, Value}; use proxmox::api::{RpcEnvironment, RpcEnvironmentType}; use pbs_datastore::backup_info::BackupDir; +use pbs_api_types::Authid; -use crate::api2::types::Authid; use crate::backup::DataStore; use crate::server::formatter::*; use crate::server::WorkerTask; diff --git a/src/api2/reader/mod.rs b/src/api2/reader/mod.rs index a655b6d7..821e83c4 100644 --- a/src/api2/reader/mod.rs +++ b/src/api2/reader/mod.rs @@ -30,6 +30,7 @@ use proxmox::{ use pbs_api_types::{ Authid, DATASTORE_SCHEMA, BACKUP_TYPE_SCHEMA, BACKUP_TIME_SCHEMA, BACKUP_ID_SCHEMA, CHUNK_DIGEST_SCHEMA, PRIV_DATASTORE_READ, PRIV_DATASTORE_BACKUP, + BACKUP_ARCHIVE_NAME_SCHEMA, }; use pbs_tools::fs::lock_dir_noblock_shared; use pbs_tools::json::{required_integer_param, required_string_param}; @@ -223,7 +224,7 @@ pub const API_METHOD_DOWNLOAD_FILE: ApiMethod = ApiMethod::new( &ObjectSchema::new( "Download specified file.", &sorted!([ - ("file-name", false, &crate::api2::types::BACKUP_ARCHIVE_NAME_SCHEMA), + ("file-name", false, &BACKUP_ARCHIVE_NAME_SCHEMA), ]), ) ); diff --git a/src/api2/tape/mod.rs b/src/api2/tape/mod.rs index 219a721b..1e7731a9 100644 --- a/src/api2/tape/mod.rs +++ b/src/api2/tape/mod.rs @@ -12,8 +12,9 @@ use proxmox::{ list_subdirs_api_method, }; +use pbs_api_types::TapeDeviceInfo; + use crate::{ - api2::types::TapeDeviceInfo, tape::{ lto_tape_device_list, linux_tape_changer_list, diff --git a/src/api2/types/acme.rs b/src/api2/types/acme.rs index 4370d6a6..78c80949 100644 --- a/src/api2/types/acme.rs +++ b/src/api2/types/acme.rs @@ -3,7 +3,7 @@ use serde_json::Value; use proxmox::api::{api, schema::{ApiType, Schema, StringSchema, ApiStringFormat}}; -use crate::api2::types::{ +use pbs_api_types::{ DNS_ALIAS_FORMAT, DNS_NAME_FORMAT, PROXMOX_SAFE_ID_FORMAT, }; diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs index 21f1816f..c9f3dd5e 100644 --- a/src/api2/types/mod.rs +++ b/src/api2/types/mod.rs @@ -5,11 +5,11 @@ use serde::{Deserialize, Serialize}; use proxmox::api::{api, schema::*}; +use pbs_api_types::StorageStatus; + mod acme; pub use acme::*; -pub use pbs_api_types::*; - // File names: may not contain slashes, may not start with "." pub const FILENAME_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|name| { if name.starts_with('.') { @@ -24,49 +24,6 @@ pub const FILENAME_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|name| { // Complex type definitions -#[api( - properties: { - "gc-status": { - type: GarbageCollectionStatus, - optional: true, - }, - counts: { - type: Counts, - optional: true, - }, - }, -)] -#[derive(Serialize, Deserialize)] -#[serde(rename_all="kebab-case")] -/// Overall Datastore status and useful information. -pub struct DataStoreStatus { - /// Total space (bytes). - pub total: u64, - /// Used space (bytes). - pub used: u64, - /// Available space (bytes). - pub avail: u64, - /// Status of last GC - #[serde(skip_serializing_if="Option::is_none")] - pub gc_status: Option, - /// Group/Snapshot counts - #[serde(skip_serializing_if="Option::is_none")] - pub counts: Option, -} - -#[api()] -#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum TaskStateType { - /// Ok - OK, - /// Warning - Warning, - /// Error - Error, - /// Unknown - Unknown, -} // Regression tests diff --git a/src/auth.rs b/src/auth.rs index 33ec0286..215cd9aa 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -9,8 +9,7 @@ use anyhow::{bail, format_err, Error}; use serde_json::json; use pbs_buildcfg::configdir; - -use crate::api2::types::{Userid, UsernameRef, RealmRef}; +use pbs_api_types::{Userid, UsernameRef, RealmRef}; pub trait ProxmoxAuthenticator { fn authenticate_user(&self, username: &UsernameRef, password: &str) -> Result<(), Error>; diff --git a/src/backup/verify.rs b/src/backup/verify.rs index 2191ca73..6e188c5f 100644 --- a/src/backup/verify.rs +++ b/src/backup/verify.rs @@ -6,7 +6,7 @@ use std::time::Instant; use anyhow::{bail, format_err, Error}; -use pbs_api_types::CryptMode; +use pbs_api_types::{Authid, CryptMode, VerifyState, UPID, SnapshotVerifyState}; use pbs_datastore::{task_log, DataBlob, StoreProgress}; use pbs_datastore::backup_info::{BackupGroup, BackupDir, BackupInfo}; use pbs_datastore::index::IndexFile; @@ -15,9 +15,7 @@ use pbs_datastore::task::TaskState; use pbs_tools::fs::lock_dir_noblock_shared; use crate::{ - api2::types::*, backup::DataStore, - server::UPID, tools::ParallelHandler, }; diff --git a/src/bin/pmtx.rs b/src/bin/pmtx.rs index ef7feddc..606144c5 100644 --- a/src/bin/pmtx.rs +++ b/src/bin/pmtx.rs @@ -26,17 +26,12 @@ use proxmox::{ }; use pbs_config::drive::complete_changer_name; +use pbs_api_types::{ + SCSI_CHANGER_PATH_SCHEMA, CHANGER_NAME_SCHEMA, ScsiTapeChanger, LtoTapeDrive, +}; use proxmox_backup::{ - tools::sgutils2::{ - scsi_inquiry, - }, - api2::types::{ - SCSI_CHANGER_PATH_SCHEMA, - CHANGER_NAME_SCHEMA, - ScsiTapeChanger, - LtoTapeDrive, - }, + tools::sgutils2::scsi_inquiry, tape::{ linux_tape_changer_list, complete_changer_path, diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 7268d232..689f44db 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -9,9 +9,13 @@ use proxmox::api::{api, cli::*, RpcEnvironment}; use pbs_client::{connect_to_localhost, display_task_log, view_task_result}; use pbs_tools::percent_encoding::percent_encode_component; use pbs_tools::json::required_string_param; +use pbs_api_types::{ + DATASTORE_SCHEMA, UPID_SCHEMA, REMOTE_ID_SCHEMA, REMOVE_VANISHED_BACKUPS_SCHEMA, + IGNORE_VERIFIED_BACKUPS_SCHEMA, VERIFICATION_OUTDATED_AFTER_SCHEMA, +}; use proxmox_backup::config; -use proxmox_backup::api2::{self, types::* }; +use proxmox_backup::api2; use proxmox_backup::server::wait_for_local_worker; mod proxmox_backup_manager; diff --git a/src/bin/proxmox-daily-update.rs b/src/bin/proxmox-daily-update.rs index b962b67f..c1580b97 100644 --- a/src/bin/proxmox-daily-update.rs +++ b/src/bin/proxmox-daily-update.rs @@ -7,7 +7,7 @@ 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 upid: pbs_api_types::UPID = upid_str.parse()?; let sleep_duration = core::time::Duration::new(0, 100_000_000); loop { diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index 80332274..276ec1e2 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -25,20 +25,14 @@ use pbs_config::drive::complete_drive_name; use pbs_config::media_pool::complete_pool_name; use pbs_config::datastore::complete_datastore_name; +use pbs_api_types::{ + Userid, Authid, DATASTORE_SCHEMA, DATASTORE_MAP_LIST_SCHEMA, + DRIVE_NAME_SCHEMA, MEDIA_LABEL_SCHEMA, MEDIA_POOL_NAME_SCHEMA, + TAPE_RESTORE_SNAPSHOT_SCHEMA, +}; + use proxmox_backup::{ - api2::{ - self, - types::{ - Authid, - DATASTORE_SCHEMA, - DATASTORE_MAP_LIST_SCHEMA, - DRIVE_NAME_SCHEMA, - MEDIA_LABEL_SCHEMA, - MEDIA_POOL_NAME_SCHEMA, - Userid, - TAPE_RESTORE_SNAPSHOT_SCHEMA, - }, - }, + api2, tape::{ BlockReadError, drive::{ diff --git a/src/bin/proxmox_tape/changer.rs b/src/bin/proxmox_tape/changer.rs index 129e81de..12d0952c 100644 --- a/src/bin/proxmox_tape/changer.rs +++ b/src/bin/proxmox_tape/changer.rs @@ -16,13 +16,10 @@ use pbs_config::drive::{ complete_changer_name, }; +use pbs_api_types::CHANGER_NAME_SCHEMA; + use proxmox_backup::{ - api2::{ - self, - types::{ - CHANGER_NAME_SCHEMA, - }, - }, + api2, tape::{ complete_changer_path, drive::media_changer, diff --git a/src/config/acme/mod.rs b/src/config/acme/mod.rs index 2c5af756..3e1d51a8 100644 --- a/src/config/acme/mod.rs +++ b/src/config/acme/mod.rs @@ -7,8 +7,9 @@ use serde_json::Value; use proxmox::sys::error::SysError; use proxmox::tools::fs::{CreateOptions, file_read_string}; +use pbs_api_types::PROXMOX_SAFE_ID_REGEX; + use crate::api2::types::{ - PROXMOX_SAFE_ID_REGEX, AcmeChallengeSchema, KnownAcmeDirectory, AcmeAccountName, diff --git a/src/rrd/cache.rs b/src/rrd/cache.rs index d593ffb5..d6b79ac0 100644 --- a/src/rrd/cache.rs +++ b/src/rrd/cache.rs @@ -7,7 +7,7 @@ use lazy_static::lazy_static; use proxmox::tools::fs::{create_path, CreateOptions}; -use crate::api2::types::{RRDMode, RRDTimeFrameResolution}; +use pbs_api_types::{RRDMode, RRDTimeFrameResolution}; use super::*; diff --git a/src/rrd/rrd.rs b/src/rrd/rrd.rs index b298f0ad..b1780307 100644 --- a/src/rrd/rrd.rs +++ b/src/rrd/rrd.rs @@ -3,7 +3,7 @@ use std::path::Path; use anyhow::Error; -use crate::api2::types::{RRDMode, RRDTimeFrameResolution}; +use pbs_api_types::{RRDMode, RRDTimeFrameResolution}; pub const RRD_DATA_ENTRIES: usize = 70; diff --git a/src/server/auth.rs b/src/server/auth.rs index c555d517..19933177 100644 --- a/src/server/auth.rs +++ b/src/server/auth.rs @@ -4,11 +4,10 @@ use anyhow::{format_err, Error}; use std::sync::Arc; use pbs_tools::ticket::{self, Ticket}; -use pbs_config::token_shadow; +use pbs_config::{token_shadow, CachedUserInfo}; +use pbs_api_types::{Authid, Userid}; -use crate::api2::types::{Authid, Userid}; use crate::auth_helpers::*; -use pbs_config::CachedUserInfo; use crate::tools; use hyper::header; diff --git a/src/server/gc_job.rs b/src/server/gc_job.rs index 6f3d9538..665b9631 100644 --- a/src/server/gc_job.rs +++ b/src/server/gc_job.rs @@ -1,9 +1,10 @@ use std::sync::Arc; use anyhow::Error; +use pbs_api_types::Authid; + use crate::{ server::WorkerTask, - api2::types::*, server::jobstate::Job, backup::DataStore, }; diff --git a/src/server/jobstate.rs b/src/server/jobstate.rs index 48a0422a..27da94ef 100644 --- a/src/server/jobstate.rs +++ b/src/server/jobstate.rs @@ -48,15 +48,12 @@ use proxmox::tools::fs::{ use pbs_systemd::time::{compute_next_event, parse_calendar_event}; use pbs_config::{open_backup_lockfile, BackupLockGuard}; +use pbs_api_types::{UPID, JobScheduleStatus}; -use crate::{ - api2::types::JobScheduleStatus, - server::{ - UPID, - TaskState, - upid_read_status, - worker_is_active_local, - }, +use crate::server::{ + TaskState, + upid_read_status, + worker_is_active_local, }; #[derive(Serialize, Deserialize)] diff --git a/src/server/rest.rs b/src/server/rest.rs index 48b0f8f2..a648832a 100644 --- a/src/server/rest.rs +++ b/src/server/rest.rs @@ -32,13 +32,13 @@ use proxmox::http_err; use pbs_tools::compression::{DeflateEncoder, Level}; use pbs_tools::stream::AsyncReaderStream; +use pbs_api_types::{Authid, Userid}; use super::auth::AuthError; use super::environment::RestEnvironment; use super::formatter::*; use super::ApiConfig; -use crate::api2::types::{Authid, Userid}; use crate::auth_helpers::*; use pbs_config::CachedUserInfo; use crate::tools; diff --git a/src/server/ticket.rs b/src/server/ticket.rs index 457fb24e..ab6b7040 100644 --- a/src/server/ticket.rs +++ b/src/server/ticket.rs @@ -3,7 +3,8 @@ use std::fmt; use anyhow::{bail, Error}; use serde::{Deserialize, Serialize}; -use crate::api2::types::Userid; +use pbs_api_types::Userid; + use crate::config::tfa; #[derive(Deserialize, Serialize)] diff --git a/src/server/upid.rs b/src/server/upid.rs index d0b0cea2..70a3e3fb 100644 --- a/src/server/upid.rs +++ b/src/server/upid.rs @@ -1,5 +1,3 @@ -pub use pbs_api_types::upid::UPID; - pub trait UPIDExt: private::Sealed { /// Returns the absolute path to the task log file fn log_path(&self) -> std::path::PathBuf; @@ -7,10 +5,10 @@ pub trait UPIDExt: private::Sealed { mod private { pub trait Sealed {} - impl Sealed for super::UPID {} + impl Sealed for pbs_api_types::UPID {} } -impl UPIDExt for UPID { +impl UPIDExt for pbs_api_types::UPID { fn log_path(&self) -> std::path::PathBuf { let mut path = std::path::PathBuf::from(super::PROXMOX_BACKUP_TASK_DIR); path.push(format!("{:02X}", self.pstart % 256)); diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 24e08968..2ef8ba9d 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -18,13 +18,13 @@ use proxmox::tools::fs::{create_path, replace_file, CreateOptions}; use pbs_buildcfg; use pbs_tools::logrotate::{LogRotate, LogRotateFiles}; +use pbs_api_types::{Authid, TaskStateType, UPID}; +use pbs_config::{open_backup_lockfile, BackupLockGuard}; -use super::{UPID, UPIDExt}; +use super::UPIDExt; use crate::server; use crate::tools::{FileLogger, FileLogOptions}; -use crate::api2::types::{Authid, TaskStateType}; -use pbs_config::{open_backup_lockfile, BackupLockGuard}; macro_rules! taskdir { ($subdir:expr) => (concat!(pbs_buildcfg::PROXMOX_BACKUP_LOG_DIR_M!(), "/tasks", $subdir)) diff --git a/src/tape/changer/mod.rs b/src/tape/changer/mod.rs index 2fa23d6f..4e6d6bb6 100644 --- a/src/tape/changer/mod.rs +++ b/src/tape/changer/mod.rs @@ -23,11 +23,7 @@ use proxmox::{ }, }; -use crate::api2::types::{ - SLOT_ARRAY_SCHEMA, - ScsiTapeChanger, - LtoTapeDrive, -}; +use pbs_api_types::{SLOT_ARRAY_SCHEMA, ScsiTapeChanger, LtoTapeDrive}; /// Changer element status. /// diff --git a/src/tape/changer/mtx/mtx_wrapper.rs b/src/tape/changer/mtx/mtx_wrapper.rs index f6274064..e3901773 100644 --- a/src/tape/changer/mtx/mtx_wrapper.rs +++ b/src/tape/changer/mtx/mtx_wrapper.rs @@ -1,9 +1,9 @@ use anyhow::Error; use pbs_tools::run_command; +use pbs_api_types::ScsiTapeChanger; use crate::{ - api2::types::ScsiTapeChanger, tape::changer::{ MtxStatus, mtx::parse_mtx_status, diff --git a/src/tape/changer/online_status_map.rs b/src/tape/changer/online_status_map.rs index 7918009b..2a3aaf11 100644 --- a/src/tape/changer/online_status_map.rs +++ b/src/tape/changer/online_status_map.rs @@ -6,11 +6,9 @@ use anyhow::{bail, Error}; use proxmox::tools::Uuid; use proxmox::api::section_config::SectionConfigData; +use pbs_api_types::{VirtualTapeDrive, ScsiTapeChanger}; + use crate::{ - api2::types::{ - VirtualTapeDrive, - ScsiTapeChanger, - }, tape::{ Inventory, changer::{ diff --git a/src/tape/changer/sg_pt_changer.rs b/src/tape/changer/sg_pt_changer.rs index 8451e8e8..0f0c0913 100644 --- a/src/tape/changer/sg_pt_changer.rs +++ b/src/tape/changer/sg_pt_changer.rs @@ -11,6 +11,8 @@ use endian_trait::Endian; use proxmox::tools::io::ReadExt; +use pbs_api_types::ScsiTapeChanger; + use crate::{ tape::{ changer::{ @@ -28,7 +30,6 @@ use crate::{ scsi_ascii_to_string, scsi_inquiry, }, - api2::types::ScsiTapeChanger, }; const SCSI_CHANGER_DEFAULT_TIMEOUT: usize = 60*5; // 5 minutes diff --git a/src/tape/drive/lto/sg_tape.rs b/src/tape/drive/lto/sg_tape.rs index 893ece5d..6b570e69 100644 --- a/src/tape/drive/lto/sg_tape.rs +++ b/src/tape/drive/lto/sg_tape.rs @@ -29,11 +29,9 @@ use proxmox::{ tools::io::{ReadExt, WriteExt}, }; +use pbs_api_types::{MamAttribute, Lp17VolumeStatistics}; + use crate::{ - api2::types::{ - MamAttribute, - Lp17VolumeStatistics, - }, tape::{ BlockRead, BlockReadError, diff --git a/src/tape/drive/lto/sg_tape/mam.rs b/src/tape/drive/lto/sg_tape/mam.rs index 06b81850..69f21184 100644 --- a/src/tape/drive/lto/sg_tape/mam.rs +++ b/src/tape/drive/lto/sg_tape/mam.rs @@ -7,12 +7,11 @@ use endian_trait::Endian; use proxmox::tools::io::ReadExt; +use pbs_api_types::MamAttribute; + use crate::{ - api2::types::MamAttribute, tools::sgutils2::SgRaw, - tape::{ - drive::lto::TapeAlertFlags, - }, + tape::drive::lto::TapeAlertFlags, }; // Read Medium auxiliary memory attributes (MAM) diff --git a/src/tape/drive/lto/sg_tape/volume_statistics.rs b/src/tape/drive/lto/sg_tape/volume_statistics.rs index 1996e466..b3878784 100644 --- a/src/tape/drive/lto/sg_tape/volume_statistics.rs +++ b/src/tape/drive/lto/sg_tape/volume_statistics.rs @@ -6,10 +6,9 @@ use endian_trait::Endian; use proxmox::tools::io::ReadExt; -use crate::{ - api2::types::Lp17VolumeStatistics, - tools::sgutils2::SgRaw, -}; +use pbs_api_types::Lp17VolumeStatistics; + +use crate::tools::sgutils2::SgRaw; /// SCSI command to query volume statistics /// diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index 93d72057..90e72153 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -41,6 +41,7 @@ use proxmox::tools::{ use pbs_systemd::time::compute_next_event; use pbs_config::BackupLockGuard; +use pbs_api_types::{MediaSetPolicy, RetentionPolicy, MediaStatus, MediaLocation}; #[cfg(not(test))] use pbs_config::open_backup_lockfile; @@ -56,12 +57,6 @@ fn open_backup_lockfile>( use crate::{ - api2::types::{ - MediaSetPolicy, - RetentionPolicy, - MediaStatus, - MediaLocation, - }, tape::{ TAPE_STATUS_DIR, MediaSet, diff --git a/src/tape/linux_list_drives.rs b/src/tape/linux_list_drives.rs index a6458b97..29aaae4a 100644 --- a/src/tape/linux_list_drives.rs +++ b/src/tape/linux_list_drives.rs @@ -4,14 +4,7 @@ use std::collections::HashMap; use anyhow::{bail, Error}; use pbs_tools::fs::scan_subdir; - -use crate::{ - api2::types::{ - DeviceKind, - OptionalDeviceIdentification, - TapeDeviceInfo, - }, -}; +use pbs_api_types::{DeviceKind, OptionalDeviceIdentification, TapeDeviceInfo}; lazy_static::lazy_static!{ static ref SCSI_GENERIC_NAME_REGEX: regex::Regex = diff --git a/src/tape/media_pool.rs b/src/tape/media_pool.rs index 405bb14a..f539eeee 100644 --- a/src/tape/media_pool.rs +++ b/src/tape/media_pool.rs @@ -14,31 +14,25 @@ use serde::{Deserialize, Serialize}; use proxmox::tools::Uuid; -use pbs_api_types::Fingerprint; +use pbs_api_types::{ + Fingerprint, MediaStatus, MediaLocation, MediaSetPolicy, RetentionPolicy, + MediaPoolConfig, +}; use pbs_systemd::time::compute_next_event; use pbs_config::BackupLockGuard; -use crate::{ - api2::types::{ - MediaStatus, - MediaLocation, - MediaSetPolicy, - RetentionPolicy, - MediaPoolConfig, +use crate::tape::{ + MediaId, + MediaSet, + Inventory, + MediaCatalog, + lock_media_set, + lock_media_pool, + lock_unassigned_media_pool, + file_formats::{ + MediaLabel, + MediaSetLabel, }, - tape::{ - MediaId, - MediaSet, - Inventory, - MediaCatalog, - lock_media_set, - lock_media_pool, - lock_unassigned_media_pool, - file_formats::{ - MediaLabel, - MediaSetLabel, - }, - } }; /// Media Pool diff --git a/src/tools/apt.rs b/src/tools/apt.rs index 8481e19d..754b325f 100644 --- a/src/tools/apt.rs +++ b/src/tools/apt.rs @@ -7,7 +7,7 @@ use apt_pkg_native::Cache; use proxmox::const_regex; use proxmox::tools::fs::{file_read_optional_string, replace_file, CreateOptions}; -use crate::api2::types::APTUpdateInfo; +use pbs_api_types::APTUpdateInfo; const APT_PKG_STATE_FN: &str = "/var/lib/proxmox-backup/pkg-state.json"; diff --git a/src/tools/systemd/types.rs b/src/tools/systemd/types.rs index eec6348f..368b25dd 100644 --- a/src/tools/systemd/types.rs +++ b/src/tools/systemd/types.rs @@ -1,7 +1,7 @@ use serde::{Serialize, Deserialize}; use proxmox::api::{ api, schema::* }; -use crate::api2::types::SINGLE_LINE_COMMENT_FORMAT; +use pbs_api_types::SINGLE_LINE_COMMENT_FORMAT; pub const SYSTEMD_SECTION_NAME_SCHEMA: Schema = StringSchema::new( "Section name")