backup/datastore.rs: implement list_backups
This commit is contained in:
parent
cce1676a9e
commit
e25736b4c3
|
@ -1,10 +1,15 @@
|
|||
use failure::*;
|
||||
|
||||
use chrono::prelude::*;
|
||||
|
||||
use std::path::{PathBuf, Path};
|
||||
use std::collections::HashMap;
|
||||
use lazy_static::lazy_static;
|
||||
use std::sync::{Mutex, Arc};
|
||||
|
||||
use std::os::unix::io::AsRawFd;
|
||||
|
||||
use crate::tools;
|
||||
use crate::config::datastore;
|
||||
use super::chunk_store::*;
|
||||
use super::image_index::*;
|
||||
|
@ -17,6 +22,13 @@ pub struct DataStore {
|
|||
gc_mutex: Mutex<bool>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BackupInfo {
|
||||
pub backup_type: String,
|
||||
pub backup_id: String,
|
||||
pub backup_time: i64,
|
||||
}
|
||||
|
||||
lazy_static!{
|
||||
static ref datastore_map: Mutex<HashMap<String, Arc<DataStore>>> = Mutex::new(HashMap::new());
|
||||
}
|
||||
|
@ -150,6 +162,45 @@ impl DataStore {
|
|||
Ok(relative_path)
|
||||
}
|
||||
|
||||
pub fn list_backups(&self) -> Result<Vec<BackupInfo>, Error> {
|
||||
let path = self.base_path();
|
||||
|
||||
let mut list = vec![];
|
||||
|
||||
lazy_static! {
|
||||
static ref BACKUP_TYPE_REGEX: regex::Regex = regex::Regex::new("^(host|vm|ct)$").unwrap();
|
||||
}
|
||||
lazy_static! {
|
||||
static ref BACKUP_ID_REGEX: regex::Regex = regex::Regex::new("^[A-Za-z][A-Za-z0-9_-]+$").unwrap();
|
||||
}
|
||||
lazy_static! {
|
||||
static ref BACKUP_DATE_REGEX: regex::Regex = regex::Regex::new(
|
||||
"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$").unwrap();
|
||||
}
|
||||
|
||||
tools::scandir(libc::AT_FDCWD, &path, &BACKUP_TYPE_REGEX, |l0_fd, backup_type, file_type| {
|
||||
if file_type != nix::dir::Type::Directory { return Ok(()); }
|
||||
tools::scandir(l0_fd, backup_type, &BACKUP_ID_REGEX, |l1_fd, backup_id, file_type| {
|
||||
if file_type != nix::dir::Type::Directory { return Ok(()); }
|
||||
tools::scandir(l1_fd, backup_id, &BACKUP_DATE_REGEX, |_, backup_time, file_type| {
|
||||
if file_type != nix::dir::Type::Directory { return Ok(()); }
|
||||
|
||||
let dt = Utc.datetime_from_str(backup_time, "%Y-%m-%dT%H:%M:%S")?;
|
||||
|
||||
list.push(BackupInfo {
|
||||
backup_type: backup_type.to_owned(),
|
||||
backup_id: backup_id.to_owned(),
|
||||
backup_time: dt.timestamp(),
|
||||
});
|
||||
|
||||
Ok(())
|
||||
})
|
||||
})
|
||||
})?;
|
||||
|
||||
Ok(list)
|
||||
}
|
||||
|
||||
pub fn list_images(&self) -> Result<Vec<PathBuf>, Error> {
|
||||
let base = self.base_path();
|
||||
|
||||
|
|
Loading…
Reference in New Issue