From e693818afce235fa93ecd3a02425da177163739f Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Wed, 10 Jun 2020 12:02:56 +0200 Subject: [PATCH] refactor time functions to tools Signed-off-by: Dominik Csapak Signed-off-by: Wolfgang Bumiller --- src/auth_helpers.rs | 8 ++++---- src/backup/dynamic_index.rs | 6 ++---- src/backup/fixed_index.rs | 6 ++---- src/bin/proxmox-backup-proxy.rs | 19 ++++++++++--------- src/rrd/cache.rs | 11 +++-------- src/tools.rs | 14 ++++++++++++++ src/tools/ticket.rs | 8 ++++---- 7 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/auth_helpers.rs b/src/auth_helpers.rs index 6243dafd..a1212355 100644 --- a/src/auth_helpers.rs +++ b/src/auth_helpers.rs @@ -10,6 +10,8 @@ use std::path::PathBuf; use proxmox::tools::fs::{file_get_contents, replace_file, CreateOptions}; use proxmox::try_block; +use crate::tools::epoch_now_u64; + fn compute_csrf_secret_digest( timestamp: i64, secret: &[u8], @@ -29,8 +31,7 @@ pub fn assemble_csrf_prevention_token( username: &str, ) -> String { - let epoch = std::time::SystemTime::now().duration_since( - std::time::SystemTime::UNIX_EPOCH).unwrap().as_secs() as i64; + let epoch = epoch_now_u64().unwrap() as i64; let digest = compute_csrf_secret_digest(epoch, secret, username); @@ -67,8 +68,7 @@ pub fn verify_csrf_prevention_token( bail!("invalid signature."); } - let now = std::time::SystemTime::now().duration_since( - std::time::SystemTime::UNIX_EPOCH)?.as_secs() as i64; + let now = epoch_now_u64()? as i64; let age = now - ttime; if age < min_age { diff --git a/src/backup/dynamic_index.rs b/src/backup/dynamic_index.rs index bee4aca2..83500409 100644 --- a/src/backup/dynamic_index.rs +++ b/src/backup/dynamic_index.rs @@ -19,7 +19,7 @@ use super::read_chunk::ReadChunk; use super::Chunker; use super::IndexFile; use super::{DataBlob, DataChunkBuilder}; -use crate::tools; +use crate::tools::{self, epoch_now_u64}; /// Header format definition for dynamic index files (`.dixd`) #[repr(C)] @@ -479,9 +479,7 @@ impl DynamicIndexWriter { panic!("got unexpected header size"); } - let ctime = std::time::SystemTime::now() - .duration_since(std::time::SystemTime::UNIX_EPOCH)? - .as_secs(); + let ctime = epoch_now_u64()?; let uuid = Uuid::generate(); diff --git a/src/backup/fixed_index.rs b/src/backup/fixed_index.rs index 23a7f03d..fdaef35d 100644 --- a/src/backup/fixed_index.rs +++ b/src/backup/fixed_index.rs @@ -5,7 +5,7 @@ use std::io::{Seek, SeekFrom}; use super::chunk_stat::*; use super::chunk_store::*; use super::IndexFile; -use crate::tools; +use crate::tools::{self, epoch_now_u64}; use chrono::{Local, TimeZone}; use std::fs::File; @@ -290,9 +290,7 @@ impl FixedIndexWriter { panic!("got unexpected header size"); } - let ctime = std::time::SystemTime::now() - .duration_since(std::time::SystemTime::UNIX_EPOCH)? - .as_secs(); + let ctime = epoch_now_u64()?; let uuid = Uuid::generate(); diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index a6efe3cc..1e36a8e8 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -12,7 +12,7 @@ use proxmox::api::RpcEnvironmentType; use proxmox_backup::configdir; use proxmox_backup::buildcfg; 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::auth_helpers::*; use proxmox_backup::tools::disks::{ DiskManage, zfs_pool_stats }; @@ -134,10 +134,10 @@ fn start_task_scheduler() { tokio::spawn(task.map(|_| ())); } -use std::time:: {Instant, Duration, SystemTime, UNIX_EPOCH}; +use std::time:: {Instant, Duration}; fn next_minute() -> Result { - 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); Ok(Instant::now() + epoch_next - epoch_now) } @@ -296,8 +296,9 @@ async fn schedule_datastore_garbage_collection() { 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) => { eprintln!("query system time failed - {}", err); continue; @@ -407,8 +408,8 @@ async fn schedule_datastore_prune() { } }; - 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) => { eprintln!("query system time failed - {}", err); continue; @@ -532,8 +533,8 @@ async fn schedule_datastore_sync_jobs() { } }; - 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) => { eprintln!("query system time failed - {}", err); continue; diff --git a/src/rrd/cache.rs b/src/rrd/cache.rs index b2ad09cb..90d2c9d1 100644 --- a/src/rrd/cache.rs +++ b/src/rrd/cache.rs @@ -1,4 +1,3 @@ -use std::time::{SystemTime, UNIX_EPOCH}; use std::path::PathBuf; use std::collections::HashMap; use std::sync::{RwLock}; @@ -10,6 +9,7 @@ use serde_json::{json, Value}; use proxmox::tools::fs::{create_path, CreateOptions}; use crate::api2::types::{RRDMode, RRDTimeFrameResolution}; +use crate::tools::epoch_now_f64; use super::*; @@ -35,11 +35,6 @@ pub fn create_rrdb_dir() -> Result<(), Error> { Ok(()) } -fn now() -> Result { - 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> { 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())?; let mut map = RRD_CACHE.write().unwrap(); - let now = now()?; + let now = epoch_now_f64()?; if let Some(rrd) = map.get_mut(rel_path) { rrd.update(now, value); @@ -115,7 +110,7 @@ pub fn extract_data( mode: RRDMode, ) -> Result { - let now = now()?; + let now = epoch_now_f64()?; let map = RRD_CACHE.read().unwrap(); diff --git a/src/tools.rs b/src/tools.rs index cff171ea..290fa1e6 100644 --- a/src/tools.rs +++ b/src/tools.rs @@ -9,6 +9,7 @@ use std::io::{self, BufRead, ErrorKind, Read}; use std::os::unix::io::{AsRawFd, RawFd}; use std::path::Path; use std::time::Duration; +use std::time::{SystemTime, SystemTimeError, UNIX_EPOCH}; use anyhow::{bail, format_err, Error}; use serde_json::Value; @@ -609,3 +610,16 @@ pub fn file_get_non_comment_lines>( Err(err) => Some(Err(err)), })) } + +pub fn epoch_now() -> Result { + SystemTime::now().duration_since(UNIX_EPOCH) +} + +pub fn epoch_now_f64() -> Result { + Ok(epoch_now()?.as_secs_f64()) +} + +pub fn epoch_now_u64() -> Result { + Ok(epoch_now()?.as_secs()) +} + diff --git a/src/tools/ticket.rs b/src/tools/ticket.rs index 17476e98..4727b1ef 100644 --- a/src/tools/ticket.rs +++ b/src/tools/ticket.rs @@ -7,6 +7,8 @@ use openssl::pkey::{PKey, Public, Private}; use openssl::sign::{Signer, Verifier}; use openssl::hash::MessageDigest; +use crate::tools::epoch_now_u64; + pub const TICKET_LIFETIME: i64 = 3600*2; // 2 hours @@ -17,8 +19,7 @@ pub fn assemble_rsa_ticket( secret_data: Option<&str>, ) -> Result { - let epoch = std::time::SystemTime::now().duration_since( - std::time::SystemTime::UNIX_EPOCH)?.as_secs(); + let epoch = epoch_now_u64()?; 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 now = std::time::SystemTime::now().duration_since( - std::time::SystemTime::UNIX_EPOCH)?.as_secs() as i64; + let now = epoch_now_u64()? as i64; let age = now - timestamp; if age < min_age { -- 2.39.2