use failure::*;
//use std::os::unix::io::AsRawFd;
use chrono::{DateTime, Local, Utc, TimeZone};
+use std::path::Path;
use proxmox_backup::tools;
+use proxmox_backup::flog;
use proxmox_backup::cli::*;
use proxmox_backup::api_schema::*;
use proxmox_backup::api_schema::router::*;
static ref BACKUPSPEC_REGEX: Regex = Regex::new(r"^([a-zA-Z0-9_-]+):(.+)$").unwrap();
}
-fn backup_directory(
+fn backup_directory<P: AsRef<Path>>(
client: &mut HttpClient,
repo: &BackupRepository,
- body: Body,
+ dir_path: P,
archive_name: &str,
backup_time: DateTime<Utc>,
chunk_size: Option<u64>,
let path = format!("api2/json/admin/datastore/{}/catar?{}", repo.store, query);
+ let stream = CaTarBackupStream::open(dir_path.as_ref())?;
+
+ let body = Body::wrap_stream(stream);
+
client.upload("application/x-proxmox-backup-catar", body, &path)?;
Ok(())
client.login()?; // login before starting backup
- for (filename, target) in upload_list {
- println!("Upload '{}' to '{:?}'", filename, repo);
+ let log_file_name = format!("backup-log-{}.log", backup_time.format("%Y-%m-%dT%H:%M:%S"));
- let stream = CaTarBackupStream::open(&filename)?;
+ let mut log = tools::FileLogger::new(&log_file_name, true)?;
- let body = Body::wrap_stream(stream);
+ flog!(log, "Starting backup");
+ flog!(log, "Client name: {}", tools::nodename());
+ flog!(log, "UTC Start Time: {}", Utc::now().format("%c"));
- backup_directory(&mut client, &repo, body, &target, backup_time, chunk_size_opt)?;
+ for (filename, target) in upload_list {
+ flog!(log, "Upload '{}' to '{:?}' as {}", filename, repo, target);
+ backup_directory(&mut client, &repo, &filename, &target, backup_time, chunk_size_opt)?;
}
+ flog!(log, "Upload backup log");
+ // fixme: impl upload log
+
+ flog!(log, "UTC End Time: {}", Utc::now().format("%c"));
+
//datastore.garbage_collection()?;
Ok(Value::Null)
use std::thread;
use std::os::unix::io::FromRawFd;
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
use futures::{Async, Poll};
use futures::stream::Stream;
Ok(Self { pipe: Some(pipe), buffer, child: Some(child) })
}
- pub fn open(dirname: &str) -> Result<Self, Error> {
+ pub fn open(dirname: &Path) -> Result<Self, Error> {
let dir = nix::dir::Dir::open(dirname, OFlag::O_DIRECTORY, Mode::empty())?;
let path = std::path::PathBuf::from(dirname);