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:
parent
3d68536fc2
commit
e693818afc
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
14
src/tools.rs
14
src/tools.rs
|
@ -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())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue