rename 'job' to 'sync'
This commit is contained in:
		@ -3,12 +3,12 @@ use proxmox::list_subdirs_api_method;
 | 
			
		||||
 | 
			
		||||
pub mod datastore;
 | 
			
		||||
pub mod remote;
 | 
			
		||||
pub mod job;
 | 
			
		||||
pub mod sync;
 | 
			
		||||
 | 
			
		||||
const SUBDIRS: SubdirMap = &[
 | 
			
		||||
    ("datastore", &datastore::ROUTER),
 | 
			
		||||
    ("job", &job::ROUTER),
 | 
			
		||||
    ("remote", &remote::ROUTER),
 | 
			
		||||
    ("sync", &sync::ROUTER),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
pub const ROUTER: Router = Router::new()
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ use ::serde::{Deserialize, Serialize};
 | 
			
		||||
use proxmox::api::{api, Router, RpcEnvironment};
 | 
			
		||||
 | 
			
		||||
use crate::api2::types::*;
 | 
			
		||||
use crate::config::jobs::{self, PullJobConfig};
 | 
			
		||||
use crate::config::sync::{self, SyncJobConfig};
 | 
			
		||||
 | 
			
		||||
// fixme: add access permissions
 | 
			
		||||
 | 
			
		||||
@ -16,18 +16,18 @@ use crate::config::jobs::{self, PullJobConfig};
 | 
			
		||||
    returns: {
 | 
			
		||||
        description: "List configured jobs.",
 | 
			
		||||
        type: Array,
 | 
			
		||||
        items: { type: jobs::PullJobConfig },
 | 
			
		||||
        items: { type: sync::SyncJobConfig },
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// List all pull jobs
 | 
			
		||||
pub fn list_pull_jobs(
 | 
			
		||||
/// List all sync jobs
 | 
			
		||||
pub fn list_sync_jobs(
 | 
			
		||||
    _param: Value,
 | 
			
		||||
    mut rpcenv: &mut dyn RpcEnvironment,
 | 
			
		||||
) -> Result<Vec<PullJobConfig>, Error> {
 | 
			
		||||
) -> Result<Vec<SyncJobConfig>, Error> {
 | 
			
		||||
 | 
			
		||||
    let (config, digest) = jobs::config()?;
 | 
			
		||||
    let (config, digest) = sync::config()?;
 | 
			
		||||
 | 
			
		||||
    let list = config.convert_to_typed_array("pull")?;
 | 
			
		||||
    let list = config.convert_to_typed_array("sync")?;
 | 
			
		||||
 | 
			
		||||
    rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
 | 
			
		||||
 | 
			
		||||
@ -65,22 +65,22 @@ pub fn list_pull_jobs(
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// Create a new pull job.
 | 
			
		||||
pub fn create_pull_job(param: Value) -> Result<(), Error> {
 | 
			
		||||
/// Create a new sync job.
 | 
			
		||||
pub fn create_sync_job(param: Value) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(jobs::JOB_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(sync::SYNC_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
 | 
			
		||||
    let pull_job: jobs::PullJobConfig = serde_json::from_value(param.clone())?;
 | 
			
		||||
    let sync_job: sync::SyncJobConfig = serde_json::from_value(param.clone())?;
 | 
			
		||||
 | 
			
		||||
    let (mut config, _digest) = jobs::config()?;
 | 
			
		||||
    let (mut config, _digest) = sync::config()?;
 | 
			
		||||
 | 
			
		||||
    if let Some(_) = config.sections.get(&pull_job.id) {
 | 
			
		||||
        bail!("job '{}' already exists.", pull_job.id);
 | 
			
		||||
    if let Some(_) = config.sections.get(&sync_job.id) {
 | 
			
		||||
        bail!("job '{}' already exists.", sync_job.id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    config.set_data(&pull_job.id, "pull", &pull_job)?;
 | 
			
		||||
    config.set_data(&sync_job.id, "sync", &sync_job)?;
 | 
			
		||||
 | 
			
		||||
    jobs::save_config(&config)?;
 | 
			
		||||
    sync::save_config(&config)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
@ -94,21 +94,21 @@ pub fn create_pull_job(param: Value) -> Result<(), Error> {
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    returns: {
 | 
			
		||||
        description: "The pull job configuration.",
 | 
			
		||||
        type: jobs::PullJobConfig,
 | 
			
		||||
        description: "The sync job configuration.",
 | 
			
		||||
        type: sync::SyncJobConfig,
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// Read a pull job configuration.
 | 
			
		||||
pub fn read_pull_job(
 | 
			
		||||
/// Read a sync job configuration.
 | 
			
		||||
pub fn read_sync_job(
 | 
			
		||||
    id: String,
 | 
			
		||||
    mut rpcenv: &mut dyn RpcEnvironment,
 | 
			
		||||
) -> Result<PullJobConfig, Error> {
 | 
			
		||||
    let (config, digest) = jobs::config()?;
 | 
			
		||||
) -> Result<SyncJobConfig, Error> {
 | 
			
		||||
    let (config, digest) = sync::config()?;
 | 
			
		||||
 | 
			
		||||
    let pull_job = config.lookup("pull", &id)?;
 | 
			
		||||
    let sync_job = config.lookup("sync", &id)?;
 | 
			
		||||
    rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into();
 | 
			
		||||
 | 
			
		||||
    Ok(pull_job)
 | 
			
		||||
    Ok(sync_job)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[api()]
 | 
			
		||||
@ -171,8 +171,8 @@ pub enum DeletableProperty {
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// Update pull job config.
 | 
			
		||||
pub fn update_pull_job(
 | 
			
		||||
/// Update sync job config.
 | 
			
		||||
pub fn update_sync_job(
 | 
			
		||||
    id: String,
 | 
			
		||||
    store: Option<String>,
 | 
			
		||||
    remote: Option<String>,
 | 
			
		||||
@ -184,17 +184,17 @@ pub fn update_pull_job(
 | 
			
		||||
    digest: Option<String>,
 | 
			
		||||
) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(jobs::JOB_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(sync::SYNC_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
 | 
			
		||||
    // pass/compare digest
 | 
			
		||||
    let (mut config, expected_digest) = jobs::config()?;
 | 
			
		||||
    let (mut config, expected_digest) = sync::config()?;
 | 
			
		||||
 | 
			
		||||
    if let Some(ref digest) = digest {
 | 
			
		||||
        let digest = proxmox::tools::hex_to_digest(digest)?;
 | 
			
		||||
        crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut data: jobs::PullJobConfig = config.lookup("pull", &id)?;
 | 
			
		||||
    let mut data: sync::SyncJobConfig = config.lookup("sync", &id)?;
 | 
			
		||||
 | 
			
		||||
     if let Some(delete) = delete {
 | 
			
		||||
        for delete_prop in delete {
 | 
			
		||||
@ -223,9 +223,9 @@ pub fn update_pull_job(
 | 
			
		||||
    if schedule.is_some() { data.schedule = schedule; }
 | 
			
		||||
    if remove_vanished.is_some() { data.remove_vanished = remove_vanished; }
 | 
			
		||||
 | 
			
		||||
    config.set_data(&id, "pull", &data)?;
 | 
			
		||||
    config.set_data(&id, "sync", &data)?;
 | 
			
		||||
 | 
			
		||||
    jobs::save_config(&config)?;
 | 
			
		||||
    sync::save_config(&config)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
@ -244,12 +244,12 @@ pub fn update_pull_job(
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// Remove a job configuration
 | 
			
		||||
pub fn delete_job(id: String, digest: Option<String>) -> Result<(), Error> {
 | 
			
		||||
/// Remove a sync job configuration
 | 
			
		||||
pub fn delete_sync_job(id: String, digest: Option<String>) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(jobs::JOB_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
    let _lock = crate::tools::open_file_locked(sync::SYNC_CFG_LOCKFILE, std::time::Duration::new(10, 0))?;
 | 
			
		||||
 | 
			
		||||
    let (mut config, expected_digest) = jobs::config()?;
 | 
			
		||||
    let (mut config, expected_digest) = sync::config()?;
 | 
			
		||||
 | 
			
		||||
    if let Some(ref digest) = digest {
 | 
			
		||||
        let digest = proxmox::tools::hex_to_digest(digest)?;
 | 
			
		||||
@ -261,17 +261,17 @@ pub fn delete_job(id: String, digest: Option<String>) -> Result<(), Error> {
 | 
			
		||||
        None => bail!("job '{}' does not exist.", id),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    jobs::save_config(&config)?;
 | 
			
		||||
    sync::save_config(&config)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const ITEM_ROUTER: Router = Router::new()
 | 
			
		||||
    .get(&API_METHOD_READ_PULL_JOB)
 | 
			
		||||
    .put(&API_METHOD_UPDATE_PULL_JOB)
 | 
			
		||||
    .delete(&API_METHOD_DELETE_JOB);
 | 
			
		||||
    .get(&API_METHOD_READ_SYNC_JOB)
 | 
			
		||||
    .put(&API_METHOD_UPDATE_SYNC_JOB)
 | 
			
		||||
    .delete(&API_METHOD_DELETE_SYNC_JOB);
 | 
			
		||||
 | 
			
		||||
pub const ROUTER: Router = Router::new()
 | 
			
		||||
    .get(&API_METHOD_LIST_PULL_JOBS)
 | 
			
		||||
    .post(&API_METHOD_CREATE_PULL_JOB)
 | 
			
		||||
    .get(&API_METHOD_LIST_SYNC_JOBS)
 | 
			
		||||
    .post(&API_METHOD_CREATE_SYNC_JOB)
 | 
			
		||||
    .match_all("name", &ITEM_ROUTER);
 | 
			
		||||
@ -21,7 +21,7 @@ pub mod user;
 | 
			
		||||
pub mod acl;
 | 
			
		||||
pub mod cached_user_info;
 | 
			
		||||
pub mod network;
 | 
			
		||||
pub mod jobs;
 | 
			
		||||
pub mod sync;
 | 
			
		||||
 | 
			
		||||
/// Check configuration directory permissions
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
@ -52,8 +52,8 @@ lazy_static! {
 | 
			
		||||
)]
 | 
			
		||||
#[serde(rename_all="kebab-case")]
 | 
			
		||||
#[derive(Serialize,Deserialize)]
 | 
			
		||||
/// Pull Job
 | 
			
		||||
pub struct PullJobConfig {
 | 
			
		||||
/// Sync Job
 | 
			
		||||
pub struct SyncJobConfig {
 | 
			
		||||
    pub id: String,
 | 
			
		||||
    pub store: String,
 | 
			
		||||
    pub remote: String,
 | 
			
		||||
@ -67,40 +67,40 @@ pub struct PullJobConfig {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn init() -> SectionConfig {
 | 
			
		||||
    let obj_schema = match PullJobConfig::API_SCHEMA {
 | 
			
		||||
    let obj_schema = match SyncJobConfig::API_SCHEMA {
 | 
			
		||||
        Schema::Object(ref obj_schema) => obj_schema,
 | 
			
		||||
        _ => unreachable!(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let plugin = SectionConfigPlugin::new("pull".to_string(), Some(String::from("id")), obj_schema);
 | 
			
		||||
    let plugin = SectionConfigPlugin::new("sync".to_string(), Some(String::from("id")), obj_schema);
 | 
			
		||||
    let mut config = SectionConfig::new(&JOB_ID_SCHEMA);
 | 
			
		||||
    config.register_plugin(plugin);
 | 
			
		||||
 | 
			
		||||
    config
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub const JOB_CFG_FILENAME: &str = "/etc/proxmox-backup/job.cfg";
 | 
			
		||||
pub const JOB_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.job.lck";
 | 
			
		||||
pub const SYNC_CFG_FILENAME: &str = "/etc/proxmox-backup/sync.cfg";
 | 
			
		||||
pub const SYNC_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.sync.lck";
 | 
			
		||||
 | 
			
		||||
pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
 | 
			
		||||
    let content = match std::fs::read_to_string(JOB_CFG_FILENAME) {
 | 
			
		||||
    let content = match std::fs::read_to_string(SYNC_CFG_FILENAME) {
 | 
			
		||||
        Ok(c) => c,
 | 
			
		||||
        Err(err) => {
 | 
			
		||||
            if err.kind() == std::io::ErrorKind::NotFound {
 | 
			
		||||
                String::from("")
 | 
			
		||||
            } else {
 | 
			
		||||
                bail!("unable to read '{}' - {}", JOB_CFG_FILENAME, err);
 | 
			
		||||
                bail!("unable to read '{}' - {}", SYNC_CFG_FILENAME, err);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let digest = openssl::sha::sha256(content.as_bytes());
 | 
			
		||||
    let data = CONFIG.parse(JOB_CFG_FILENAME, &content)?;
 | 
			
		||||
    let data = CONFIG.parse(SYNC_CFG_FILENAME, &content)?;
 | 
			
		||||
    Ok((data, digest))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
 | 
			
		||||
    let raw = CONFIG.write(JOB_CFG_FILENAME, &config)?;
 | 
			
		||||
    let raw = CONFIG.write(SYNC_CFG_FILENAME, &config)?;
 | 
			
		||||
 | 
			
		||||
    let backup_user = crate::backup::backup_user()?;
 | 
			
		||||
    let mode = nix::sys::stat::Mode::from_bits_truncate(0o0640);
 | 
			
		||||
@ -111,13 +111,13 @@ pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
 | 
			
		||||
        .owner(nix::unistd::ROOT)
 | 
			
		||||
        .group(backup_user.gid);
 | 
			
		||||
 | 
			
		||||
    replace_file(JOB_CFG_FILENAME, raw.as_bytes(), options)?;
 | 
			
		||||
    replace_file(SYNC_CFG_FILENAME, raw.as_bytes(), options)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// shell completion helper
 | 
			
		||||
pub fn complete_job_id(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
 | 
			
		||||
pub fn complete_sync_job_id(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
 | 
			
		||||
    match config() {
 | 
			
		||||
        Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
 | 
			
		||||
        Err(_) => return vec![],
 | 
			
		||||
		Reference in New Issue
	
	Block a user