From be5094d1a022736ef0c24bcd677240692d1b2c7c Mon Sep 17 00:00:00 2001 From: Stephane de Labrusse Date: Fri, 8 Nov 2024 11:27:57 +0100 Subject: [PATCH 1/2] fix(ovpnrw): improve timezone handling in connection history CSV export --- packages/ns-api/files/ns.ovpnrw | 36 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/ns-api/files/ns.ovpnrw b/packages/ns-api/files/ns.ovpnrw index d1a5c469f..02678bae0 100755 --- a/packages/ns-api/files/ns.ovpnrw +++ b/packages/ns-api/files/ns.ovpnrw @@ -24,6 +24,8 @@ import sqlite3 import time import datetime import csv +from zoneinfo import ZoneInfo +from datetime import datetime ## Utils @@ -894,6 +896,12 @@ def connection_history_csv(ovpninstance, timezone): except: return utils.generic_error("database_not_found") + try: + # Attempt to create a ZoneInfo object + ZoneInfo(timezone) + except: + timezone = "UTC" # Default to UTC if the timezone is not found + try: c = conn.cursor() @@ -907,7 +915,7 @@ def connection_history_csv(ovpninstance, timezone): with open(csv_file_path, 'w', newline='') as csv_file: csv_writer = csv.writer(csv_file) # Write the CSV header - csv_writer.writerow(["Started", "Ended", "Duration (seconds)", "User", "Virtual IP", "Remote IP", "Received (bytes)", "Sent (bytes)"]) + csv_writer.writerow(["Started ("+timezone+")", "Ended ("+timezone+")", "Duration (seconds)", "User", "Virtual IP", "Remote IP", "Received (bytes)", "Sent (bytes)"]) rows = c.execute('''SELECT virtual_ip_addr, remote_ip_addr, start_time, duration, bytes_received, bytes_sent, common_name @@ -924,14 +932,22 @@ def connection_history_csv(ovpninstance, timezone): username = row[6] end_time = start_time + duration if duration else None - # Convert start_time to local time (based on the provided timezone) - start_time_local = datetime.datetime.fromtimestamp(start_time).astimezone(datetime.timezone(datetime.timedelta(hours=int(timezone)))).strftime("%Y-%m-%d %H:%M:%S") - - if end_time: - # Convert end_time to local time (based on the provided timezone) - end_time_local = datetime.datetime.fromtimestamp(end_time).astimezone(datetime.timezone(datetime.timedelta(hours=int(timezone)))).strftime("%Y-%m-%d %H:%M:%S") - else: - end_time_local = "" + try: + # Convert and format start_time to local time (e.g., Europe/Rome) + start_formatted = datetime.fromtimestamp(start_time, tz=ZoneInfo("UTC")) + localized_start_datetime = start_formatted.astimezone(ZoneInfo(timezone)) + start_time_local = localized_start_datetime.strftime('%Y-%m-%d %H:%M:%S') + + if end_time: + # Convert and format end_time to local time (e.g., Europe/Rome) + end_formatted = datetime.fromtimestamp(end_time, tz=ZoneInfo("UTC")) + localized_end_datetime = end_formatted.astimezone(ZoneInfo(timezone)) + end_time_local = localized_end_datetime.strftime('%Y-%m-%d %H:%M:%S') + else: + end_time_local = "" + except: + conn.close() + return utils.generic_error("date_conversion_error") # Write the row to the CSV csv_writer.writerow([start_time_local, end_time_local, duration, username, virtual_ip_addr, remote_ip_addr, bytes_received, bytes_sent]) @@ -1032,7 +1048,7 @@ if cmd == 'list': "download-user-configuration": {"instance": "roadwarrior1", "username": "myuser"}, "download-user-2fa": {"instance": "roadwarrior1", "username": "myuser"}, "download_all_user_configurations": {"instance": "roadwarrior1"}, - "connection-history-csv": {"instance": "roadwarrior1", "timezone": 2}, + "connection-history-csv": {"instance": "roadwarrior1", "timezone": "Europe/Rome"}, "connection-history": {"instance": "roadwarrior1"} })) else: From abf0ba230d9e62a353c8a6fe0540cb2f2b7359c9 Mon Sep 17 00:00:00 2001 From: Stephane de Labrusse Date: Fri, 8 Nov 2024 11:49:52 +0100 Subject: [PATCH 2/2] fix(ns-api): use conventional timezone in connection history CSV export --- packages/ns-api/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ns-api/README.md b/packages/ns-api/README.md index d1aab972f..c4f234c25 100644 --- a/packages/ns-api/README.md +++ b/packages/ns-api/README.md @@ -1737,10 +1737,10 @@ Throws a generic error: Download the users connection history in a csv file: ``` -api-cli ns.ovpnrw connection-history-csv --data '{"instance": "ns_roadwarrior1", "timezone":0}' +api-cli ns.ovpnrw connection-history-csv --data '{"instance": "ns_roadwarrior1", "timezone":"Europe/Rome"}' ``` -- `timezone`: it is the offset between your timezone and the universal time (UTC) that is 0 +- `timezone`: user timezone, e.g. "Europe/Rome" Response example: ```json