Fix tunnel uptime and rate calculations

- Fix wssshc tunnel uptime display by correcting start_time initialization
- Standardize tunnel uptime formatting in wssshd2 to match wssshc (days-hours:minutes:seconds)
- Fix wssshd2 last rate calculation to use data transferred since last status print instead of accumulated period
parent f62815dd
...@@ -1492,10 +1492,14 @@ static void *client_handler_thread(void *arg) { ...@@ -1492,10 +1492,14 @@ static void *client_handler_thread(void *arg) {
// Status printing thread // Status printing thread
void *status_thread(void *arg) { void *status_thread(void *arg) {
wssshd_state_t *state = (wssshd_state_t *)arg; wssshd_state_t *state = (wssshd_state_t *)arg;
static time_t last_status_time = 0;
static unsigned long long last_total_data[100] = {0}; // Track last total data for rate calculation
while (server_running) { while (server_running) {
sleep(15); sleep(15);
if (!state->debug) { if (!state->debug) {
time_t current_time = time(NULL); time_t current_time = time(NULL);
time_t time_since_last = last_status_time == 0 ? 15 : current_time - last_status_time;
time_t uptime = current_time - state->start_time; time_t uptime = current_time - state->start_time;
int days = uptime / 86400; int days = uptime / 86400;
int hours = (uptime % 86400) / 3600; int hours = (uptime % 86400) / 3600;
...@@ -1513,13 +1517,20 @@ void *status_thread(void *arg) { ...@@ -1513,13 +1517,20 @@ void *status_thread(void *arg) {
} }
// List active tunnels with details // List active tunnels with details
for (size_t i = 0; i < state->tunnels_count; i++) { for (size_t i = 0; i < state->tunnels_count && i < 100; i++) {
tunnel_t *tunnel = state->tunnels[i]; tunnel_t *tunnel = state->tunnels[i];
if (tunnel && tunnel->status == TUNNEL_STATUS_ACTIVE) { if (tunnel && tunnel->status == TUNNEL_STATUS_ACTIVE) {
time_t tunnel_uptime = current_time - tunnel->created_at; time_t tunnel_uptime = current_time - tunnel->created_at;
unsigned long long total_data = tunnel->total_bytes_sent + tunnel->total_bytes_received; unsigned long long total_data = tunnel->total_bytes_sent + tunnel->total_bytes_received;
double avg_rate = tunnel_uptime > 0 ? (double)total_data / tunnel_uptime : 0.0; double avg_rate = tunnel_uptime > 0 ? (double)total_data / tunnel_uptime : 0.0;
double last_rate = tunnel->bytes_last_period / 30.0; unsigned long long data_since_last = total_data - last_total_data[i];
double last_rate = time_since_last > 0 ? (double)data_since_last / time_since_last : 0.0;
last_total_data[i] = total_data;
int days = tunnel_uptime / 86400;
int hours = (tunnel_uptime % 86400) / 3600;
int minutes = (tunnel_uptime % 3600) / 60;
int seconds = tunnel_uptime % 60;
char total_data_str[32], sent_data_str[32], recv_data_str[32], avg_rate_str[32], last_rate_str[32]; char total_data_str[32], sent_data_str[32], recv_data_str[32], avg_rate_str[32], last_rate_str[32];
format_bytes(total_data, total_data_str, sizeof(total_data_str)); format_bytes(total_data, total_data_str, sizeof(total_data_str));
...@@ -1528,19 +1539,33 @@ void *status_thread(void *arg) { ...@@ -1528,19 +1539,33 @@ void *status_thread(void *arg) {
format_bytes((unsigned long long)avg_rate, avg_rate_str, sizeof(avg_rate_str)); format_bytes((unsigned long long)avg_rate, avg_rate_str, sizeof(avg_rate_str));
format_bytes((unsigned long long)last_rate, last_rate_str, sizeof(last_rate_str)); format_bytes((unsigned long long)last_rate, last_rate_str, sizeof(last_rate_str));
log_message("STATUS", " Tunnel ID: %s | Client: %s | Service: %s | Uptime: %ld s | Data: %s (%s sent, %s recv) | Rate: %s/s avg, %s/s last\n", if (days > 0) {
tunnel->request_id, log_message("STATUS", " Tunnel ID: %s | Client: %s | Service: %s | Uptime: %d-%02d:%02d:%02d | Data: %s (%s sent, %s recv) | Rate: %s/s avg, %s/s last\n",
strlen(tunnel->client_id) > 0 ? tunnel->client_id : "unknown", tunnel->request_id,
strlen(tunnel->service) > 0 ? tunnel->service : "ssh", strlen(tunnel->client_id) > 0 ? tunnel->client_id : "unknown",
tunnel_uptime, strlen(tunnel->service) > 0 ? tunnel->service : "ssh",
total_data_str, days, hours, minutes, seconds,
sent_data_str, total_data_str,
recv_data_str, sent_data_str,
avg_rate_str, recv_data_str,
last_rate_str); avg_rate_str,
last_rate_str);
} else {
log_message("STATUS", " Tunnel ID: %s | Client: %s | Service: %s | Uptime: %02d:%02d:%02d | Data: %s (%s sent, %s recv) | Rate: %s/s avg, %s/s last\n",
tunnel->request_id,
strlen(tunnel->client_id) > 0 ? tunnel->client_id : "unknown",
strlen(tunnel->service) > 0 ? tunnel->service : "ssh",
hours, minutes, seconds,
total_data_str,
sent_data_str,
recv_data_str,
avg_rate_str,
last_rate_str);
}
} }
} }
last_status_time = current_time;
pthread_mutex_unlock(&state->tunnel_mutex); pthread_mutex_unlock(&state->tunnel_mutex);
} }
} }
......
...@@ -124,6 +124,7 @@ void print_status() { ...@@ -124,6 +124,7 @@ void print_status() {
for (int i = 0; i < active_tunnels_count; i++) { for (int i = 0; i < active_tunnels_count; i++) {
tunnel_t *tunnel = active_tunnels[i]; tunnel_t *tunnel = active_tunnels[i];
if (tunnel && tunnel->active) { if (tunnel && tunnel->active) {
if (tunnel->start_time == 0) tunnel->start_time = current_time;
time_t tunnel_uptime = current_time - tunnel->start_time; time_t tunnel_uptime = current_time - tunnel->start_time;
unsigned long long total_data = tunnel->total_bytes_sent + tunnel->total_bytes_received; unsigned long long total_data = tunnel->total_bytes_sent + tunnel->total_bytes_received;
double avg_rate = tunnel_uptime > 0 ? (double)total_data / tunnel_uptime : 0.0; double avg_rate = tunnel_uptime > 0 ? (double)total_data / tunnel_uptime : 0.0;
...@@ -134,6 +135,11 @@ void print_status() { ...@@ -134,6 +135,11 @@ void print_status() {
double last_rate = time_since_last_status > 0 ? (double)data_since_last / time_since_last_status : 0.0; double last_rate = time_since_last_status > 0 ? (double)data_since_last / time_since_last_status : 0.0;
last_total_data[i] = total_data; last_total_data[i] = total_data;
int tunnel_days = tunnel_uptime / 86400;
int tunnel_hours = (tunnel_uptime % 86400) / 3600;
int tunnel_minutes = (tunnel_uptime % 3600) / 60;
int tunnel_seconds = tunnel_uptime % 60;
char total_data_str[32], sent_data_str[32], recv_data_str[32], avg_rate_str[32], last_rate_str[32]; char total_data_str[32], sent_data_str[32], recv_data_str[32], avg_rate_str[32], last_rate_str[32];
format_bytes(total_data, total_data_str, sizeof(total_data_str)); format_bytes(total_data, total_data_str, sizeof(total_data_str));
format_bytes(tunnel->total_bytes_sent, sent_data_str, sizeof(sent_data_str)); format_bytes(tunnel->total_bytes_sent, sent_data_str, sizeof(sent_data_str));
...@@ -141,12 +147,12 @@ void print_status() { ...@@ -141,12 +147,12 @@ void print_status() {
format_bytes((unsigned long long)avg_rate, avg_rate_str, sizeof(avg_rate_str)); format_bytes((unsigned long long)avg_rate, avg_rate_str, sizeof(avg_rate_str));
format_bytes((unsigned long long)last_rate, last_rate_str, sizeof(last_rate_str)); format_bytes((unsigned long long)last_rate, last_rate_str, sizeof(last_rate_str));
if (days > 0) { if (tunnel_days > 0) {
log_message("STATUS", " Tunnel ID: %s | Client: %s | Service: %s | Uptime: %d-%02d:%02d:%02d | Data: %s (%s sent, %s recv) | Rate: %s/s avg, %s/s last\n", log_message("STATUS", " Tunnel ID: %s | Client: %s | Service: %s | Uptime: %d-%02d:%02d:%02d | Data: %s (%s sent, %s recv) | Rate: %s/s avg, %s/s last\n",
tunnel->request_id, tunnel->request_id,
strlen(tunnel->client_id) > 0 ? tunnel->client_id : "local", strlen(tunnel->client_id) > 0 ? tunnel->client_id : "local",
strlen(tunnel->service) > 0 ? tunnel->service : "ssh", strlen(tunnel->service) > 0 ? tunnel->service : "ssh",
days, hours, minutes, seconds, tunnel_days, tunnel_hours, tunnel_minutes, tunnel_seconds,
total_data_str, total_data_str,
sent_data_str, sent_data_str,
recv_data_str, recv_data_str,
...@@ -157,7 +163,7 @@ void print_status() { ...@@ -157,7 +163,7 @@ void print_status() {
tunnel->request_id, tunnel->request_id,
strlen(tunnel->client_id) > 0 ? tunnel->client_id : "local", strlen(tunnel->client_id) > 0 ? tunnel->client_id : "local",
strlen(tunnel->service) > 0 ? tunnel->service : "ssh", strlen(tunnel->service) > 0 ? tunnel->service : "ssh",
hours, minutes, seconds, tunnel_hours, tunnel_minutes, tunnel_seconds,
total_data_str, total_data_str,
sent_data_str, sent_data_str,
recv_data_str, recv_data_str,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment