refactor time functions to tools

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Dominik Csapak 2020-06-10 12:02:56 +02:00 committed by Wolfgang Bumiller
parent 3d68536fc2
commit e693818afc
7 changed files with 39 additions and 33 deletions

View File

@ -10,6 +10,8 @@ use std::path::PathBuf;
use proxmox::tools::fs::{file_get_contents, replace_file, CreateOptions}; use proxmox::tools::fs::{file_get_contents, replace_file, CreateOptions};
use proxmox::try_block; use proxmox::try_block;
use crate::tools::epoch_now_u64;
fn compute_csrf_secret_digest( fn compute_csrf_secret_digest(
timestamp: i64, timestamp: i64,
secret: &[u8], secret: &[u8],
@ -29,8 +31,7 @@ pub fn assemble_csrf_prevention_token(
username: &str, username: &str,
) -> String { ) -> String {
let epoch = std::time::SystemTime::now().duration_since( let epoch = epoch_now_u64().unwrap() as i64;
std::time::SystemTime::UNIX_EPOCH).unwrap().as_secs() as i64;
let digest = compute_csrf_secret_digest(epoch, secret, username); let digest = compute_csrf_secret_digest(epoch, secret, username);
@ -67,8 +68,7 @@ pub fn verify_csrf_prevention_token(
bail!("invalid signature."); bail!("invalid signature.");
} }
let now = std::time::SystemTime::now().duration_since( let now = epoch_now_u64()? as i64;
std::time::SystemTime::UNIX_EPOCH)?.as_secs() as i64;
let age = now - ttime; let age = now - ttime;
if age < min_age { if age < min_age {

View File

@ -19,7 +19,7 @@ use super::read_chunk::ReadChunk;
use super::Chunker; use super::Chunker;
use super::IndexFile; use super::IndexFile;
use super::{DataBlob, DataChunkBuilder}; use super::{DataBlob, DataChunkBuilder};
use crate::tools; use crate::tools::{self, epoch_now_u64};
/// Header format definition for dynamic index files (`.dixd`) /// Header format definition for dynamic index files (`.dixd`)
#[repr(C)] #[repr(C)]
@ -479,9 +479,7 @@ impl DynamicIndexWriter {
panic!("got unexpected header size"); panic!("got unexpected header size");
} }
let ctime = std::time::SystemTime::now() let ctime = epoch_now_u64()?;
.duration_since(std::time::SystemTime::UNIX_EPOCH)?
.as_secs();
let uuid = Uuid::generate(); let uuid = Uuid::generate();

View File

@ -5,7 +5,7 @@ use std::io::{Seek, SeekFrom};
use super::chunk_stat::*; use super::chunk_stat::*;
use super::chunk_store::*; use super::chunk_store::*;
use super::IndexFile; use super::IndexFile;
use crate::tools; use crate::tools::{self, epoch_now_u64};
use chrono::{Local, TimeZone}; use chrono::{Local, TimeZone};
use std::fs::File; use std::fs::File;
@ -290,9 +290,7 @@ impl FixedIndexWriter {
panic!("got unexpected header size"); panic!("got unexpected header size");
} }
let ctime = std::time::SystemTime::now() let ctime = epoch_now_u64()?;
.duration_since(std::time::SystemTime::UNIX_EPOCH)?
.as_secs();
let uuid = Uuid::generate(); let uuid = Uuid::generate();

View File

@ -12,7 +12,7 @@ use proxmox::api::RpcEnvironmentType;
use proxmox_backup::configdir; use proxmox_backup::configdir;
use proxmox_backup::buildcfg; use proxmox_backup::buildcfg;
use proxmox_backup::server; use proxmox_backup::server;
use proxmox_backup::tools::daemon; use proxmox_backup::tools::{daemon, epoch_now, epoch_now_u64};
use proxmox_backup::server::{ApiConfig, rest::*}; use proxmox_backup::server::{ApiConfig, rest::*};
use proxmox_backup::auth_helpers::*; use proxmox_backup::auth_helpers::*;
use proxmox_backup::tools::disks::{ DiskManage, zfs_pool_stats }; use proxmox_backup::tools::disks::{ DiskManage, zfs_pool_stats };
@ -134,10 +134,10 @@ fn start_task_scheduler() {
tokio::spawn(task.map(|_| ())); tokio::spawn(task.map(|_| ()));
} }
use std::time:: {Instant, Duration, SystemTime, UNIX_EPOCH}; use std::time:: {Instant, Duration};
fn next_minute() -> Result<Instant, Error> { fn next_minute() -> Result<Instant, Error> {
let epoch_now = SystemTime::now().duration_since(UNIX_EPOCH)?; let epoch_now = epoch_now()?;
let epoch_next = Duration::from_secs((epoch_now.as_secs()/60 + 1)*60); let epoch_next = Duration::from_secs((epoch_now.as_secs()/60 + 1)*60);
Ok(Instant::now() + epoch_next - epoch_now) Ok(Instant::now() + epoch_next - epoch_now)
} }
@ -296,8 +296,9 @@ async fn schedule_datastore_garbage_collection() {
continue; continue;
} }
}; };
let now = match SystemTime::now().duration_since(UNIX_EPOCH) {
Ok(epoch_now) => epoch_now.as_secs() as i64, let now = match epoch_now_u64() {
Ok(epoch_now) => epoch_now as i64,
Err(err) => { Err(err) => {
eprintln!("query system time failed - {}", err); eprintln!("query system time failed - {}", err);
continue; continue;
@ -407,8 +408,8 @@ async fn schedule_datastore_prune() {
} }
}; };
let now = match SystemTime::now().duration_since(UNIX_EPOCH) { let now = match epoch_now_u64() {
Ok(epoch_now) => epoch_now.as_secs() as i64, Ok(epoch_now) => epoch_now as i64,
Err(err) => { Err(err) => {
eprintln!("query system time failed - {}", err); eprintln!("query system time failed - {}", err);
continue; continue;
@ -532,8 +533,8 @@ async fn schedule_datastore_sync_jobs() {
} }
}; };
let now = match SystemTime::now().duration_since(UNIX_EPOCH) { let now = match epoch_now_u64() {
Ok(epoch_now) => epoch_now.as_secs() as i64, Ok(epoch_now) => epoch_now as i64,
Err(err) => { Err(err) => {
eprintln!("query system time failed - {}", err); eprintln!("query system time failed - {}", err);
continue; continue;

View File

@ -1,4 +1,3 @@
use std::time::{SystemTime, UNIX_EPOCH};
use std::path::PathBuf; use std::path::PathBuf;
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::{RwLock}; use std::sync::{RwLock};
@ -10,6 +9,7 @@ use serde_json::{json, Value};
use proxmox::tools::fs::{create_path, CreateOptions}; use proxmox::tools::fs::{create_path, CreateOptions};
use crate::api2::types::{RRDMode, RRDTimeFrameResolution}; use crate::api2::types::{RRDMode, RRDTimeFrameResolution};
use crate::tools::epoch_now_f64;
use super::*; use super::*;
@ -35,11 +35,6 @@ pub fn create_rrdb_dir() -> Result<(), Error> {
Ok(()) Ok(())
} }
fn now() -> Result<f64, Error> {
let time = SystemTime::now().duration_since(UNIX_EPOCH)?;
Ok(time.as_secs_f64())
}
pub fn update_value(rel_path: &str, value: f64, dst: DST, save: bool) -> Result<(), Error> { pub fn update_value(rel_path: &str, value: f64, dst: DST, save: bool) -> Result<(), Error> {
let mut path = PathBuf::from(PBS_RRD_BASEDIR); let mut path = PathBuf::from(PBS_RRD_BASEDIR);
@ -48,7 +43,7 @@ pub fn update_value(rel_path: &str, value: f64, dst: DST, save: bool) -> Result<
std::fs::create_dir_all(path.parent().unwrap())?; std::fs::create_dir_all(path.parent().unwrap())?;
let mut map = RRD_CACHE.write().unwrap(); let mut map = RRD_CACHE.write().unwrap();
let now = now()?; let now = epoch_now_f64()?;
if let Some(rrd) = map.get_mut(rel_path) { if let Some(rrd) = map.get_mut(rel_path) {
rrd.update(now, value); rrd.update(now, value);
@ -115,7 +110,7 @@ pub fn extract_data(
mode: RRDMode, mode: RRDMode,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let now = now()?; let now = epoch_now_f64()?;
let map = RRD_CACHE.read().unwrap(); let map = RRD_CACHE.read().unwrap();

View File

@ -9,6 +9,7 @@ use std::io::{self, BufRead, ErrorKind, Read};
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
use std::path::Path; use std::path::Path;
use std::time::Duration; use std::time::Duration;
use std::time::{SystemTime, SystemTimeError, UNIX_EPOCH};
use anyhow::{bail, format_err, Error}; use anyhow::{bail, format_err, Error};
use serde_json::Value; use serde_json::Value;
@ -609,3 +610,16 @@ pub fn file_get_non_comment_lines<P: AsRef<Path>>(
Err(err) => Some(Err(err)), Err(err) => Some(Err(err)),
})) }))
} }
pub fn epoch_now() -> Result<Duration, SystemTimeError> {
SystemTime::now().duration_since(UNIX_EPOCH)
}
pub fn epoch_now_f64() -> Result<f64, SystemTimeError> {
Ok(epoch_now()?.as_secs_f64())
}
pub fn epoch_now_u64() -> Result<u64, SystemTimeError> {
Ok(epoch_now()?.as_secs())
}

View File

@ -7,6 +7,8 @@ use openssl::pkey::{PKey, Public, Private};
use openssl::sign::{Signer, Verifier}; use openssl::sign::{Signer, Verifier};
use openssl::hash::MessageDigest; use openssl::hash::MessageDigest;
use crate::tools::epoch_now_u64;
pub const TICKET_LIFETIME: i64 = 3600*2; // 2 hours pub const TICKET_LIFETIME: i64 = 3600*2; // 2 hours
@ -17,8 +19,7 @@ pub fn assemble_rsa_ticket(
secret_data: Option<&str>, secret_data: Option<&str>,
) -> Result<String, Error> { ) -> Result<String, Error> {
let epoch = std::time::SystemTime::now().duration_since( let epoch = epoch_now_u64()?;
std::time::SystemTime::UNIX_EPOCH)?.as_secs();
let timestamp = format!("{:08X}", epoch); let timestamp = format!("{:08X}", epoch);
@ -101,8 +102,7 @@ pub fn verify_rsa_ticket(
} }
let timestamp = i64::from_str_radix(parts.pop_back().unwrap(), 16)?; let timestamp = i64::from_str_radix(parts.pop_back().unwrap(), 16)?;
let now = std::time::SystemTime::now().duration_since( let now = epoch_now_u64()? as i64;
std::time::SystemTime::UNIX_EPOCH)?.as_secs() as i64;
let age = now - timestamp; let age = now - timestamp;
if age < min_age { if age < min_age {