[pmg-devel] applied-series: [PATCH log-tracker 1/2] add compatibility with API/Tracking Center
Stoiko Ivanov
s.ivanov at proxmox.com
Wed Jun 28 12:06:51 CEST 2023
Thanks for addressing the issue so quickly and far cleaner than my RFC!
Thanks also for the testing!
quickly verified that it looks good on my test-system and applied with
Dominik's R-b, T-b
small nit I just realized after pushing - a mention of rfc3339/new
syslogformat parsing in the commit subject or message would have been good.
On Wed, 28 Jun 2023 10:54:28 +0200
Mira Limbeck <m.limbeck at proxmox.com> wrote:
> The API assumes the timestamps to be in the local timezone rather than
> UTC. It then subtracts the timezone offset leading to wrong values when
> timestamps are in UTC, but timezone is not.
>
> For compatibility, add the local timezone to those timestamps.
>
> Signed-off-by: Mira Limbeck <m.limbeck at proxmox.com>
> ---
> src/main.rs | 43 ++++++++++++++++++++++++++++++++-----------
> 1 file changed, 32 insertions(+), 11 deletions(-)
>
> diff --git a/src/main.rs b/src/main.rs
> index e7bffd8..e55f17b 100644
> --- a/src/main.rs
> +++ b/src/main.rs
> @@ -1737,6 +1737,8 @@ struct Parser {
> string_match: bool,
>
> lines: u64,
> +
> + timezone_offset: time_t,
> }
>
> impl Parser {
> @@ -1762,6 +1764,7 @@ impl Parser {
> ctime: 0,
> string_match: false,
> lines: 0,
> + timezone_offset: ltime.tm_gmtoff,
> })
> }
>
> @@ -1836,7 +1839,12 @@ impl Parser {
> let line = &buffer[0..size - 1];
> let complete_line = line;
>
> - let (time, line) = match parse_time(line, self.current_year, self.current_month) {
> + let (time, line) = match parse_time(
> + line,
> + self.current_year,
> + self.current_month,
> + self.timezone_offset,
> + ) {
> Some(t) => t,
> None => continue,
> };
> @@ -1920,9 +1928,12 @@ impl Parser {
> if size == 0 {
> return count;
> }
> - if let Some((time, _)) =
> - parse_time(&buffer[0..size], self.current_year, self.current_month)
> - {
> + if let Some((time, _)) = parse_time(
> + &buffer[0..size],
> + self.current_year,
> + self.current_month,
> + self.timezone_offset,
> + ) {
> // found the earliest file in the time frame
> if time < self.options.start {
> break;
> @@ -1937,9 +1948,12 @@ impl Parser {
> if size == 0 {
> return count;
> }
> - if let Some((time, _)) =
> - parse_time(&buffer[0..size], self.current_year, self.current_month)
> - {
> + if let Some((time, _)) = parse_time(
> + &buffer[0..size],
> + self.current_year,
> + self.current_month,
> + self.timezone_offset,
> + ) {
> if time < self.options.start {
> break;
> }
> @@ -2235,11 +2249,17 @@ fn parse_number(data: &[u8], max_digits: usize) -> Option<(usize, &[u8])> {
> }
>
> /// Parse time. Returns a tuple of (parsed_time, remaining_text) or None.
> -fn parse_time(data: &'_ [u8], cur_year: i64, cur_month: i64) -> Option<(time_t, &'_ [u8])> {
> - parse_time_with_year(data).or_else(|| parse_time_no_year(data, cur_year, cur_month))
> +fn parse_time(
> + data: &'_ [u8],
> + cur_year: i64,
> + cur_month: i64,
> + timezone_offset: time_t,
> +) -> Option<(time_t, &'_ [u8])> {
> + parse_time_with_year(data, timezone_offset)
> + .or_else(|| parse_time_no_year(data, cur_year, cur_month))
> }
>
> -fn parse_time_with_year(data: &'_ [u8]) -> Option<(time_t, &'_ [u8])> {
> +fn parse_time_with_year(data: &'_ [u8], timezone_offset: time_t) -> Option<(time_t, &'_ [u8])> {
> let mut timestamp_buffer = [0u8; 25];
>
> let count = data.iter().take_while(|b| **b != b' ').count();
> @@ -2266,7 +2286,8 @@ fn parse_time_with_year(data: &'_ [u8]) -> Option<(time_t, &'_ [u8])> {
> match proxmox_time::parse_rfc3339(unsafe {
> std::str::from_utf8_unchecked(×tamp_buffer[0..timestamp_len])
> }) {
> - Ok(ltime) => Some((ltime, data)),
> + // TODO handle timezone offset in old code path instead
> + Ok(ltime) => Some((ltime + timezone_offset, data)),
> Err(_err) => None,
> }
> }
More information about the pmg-devel
mailing list