From c3c782b8547e90dd0ddd773673e434a4a83c206c Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Thu, 17 Aug 2017 18:16:16 +0300 Subject: [PATCH] odissey: implement show servers --- sources/console.c | 111 ++++++++++++++++++++++++++++++++++++++++++++- sources/frontend.c | 2 +- sources/pooler.c | 2 +- 3 files changed, 112 insertions(+), 3 deletions(-) diff --git a/sources/console.c b/sources/console.c index b8fa9205..efdad63d 100644 --- a/sources/console.c +++ b/sources/console.c @@ -176,6 +176,108 @@ od_console_show_stats(od_client_t *client) return 0; } +static inline int +od_console_show_servers_callback(od_server_t *server, void *arg) +{ + od_client_t *client = arg; + shapito_stream_t *stream = &client->stream; + od_route_t *route = server->route; + + int offset; + offset = shapito_be_write_data_row(stream); + + char data[64]; + int data_len; + + /* type */ + data_len = snprintf(data, sizeof(data), "S"); + int rc; + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* user */ + rc = shapito_be_write_data_row_add(stream, offset, + route->id.user, + route->id.user_len); + if (rc == -1) + return -1; + /* database */ + rc = shapito_be_write_data_row_add(stream, offset, + route->id.database, + route->id.database_len); + if (rc == -1) + return -1; + /* state */ + char *state = ""; + if (server->state == OD_SIDLE) + state = "idle"; + else + if (server->state == OD_SACTIVE) + state = "active"; + rc = shapito_be_write_data_row_add(stream, offset, + state, + strlen(state)); + if (rc == -1) + return -1; + /* addr */ + od_getpeername(server->io, data, sizeof(data), 1, 0); + data_len = strlen(data); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* port */ + od_getpeername(server->io, data, sizeof(data), 0, 1); + data_len = strlen(data); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* local_addr */ + od_getsockname(server->io, data, sizeof(data), 1, 0); + data_len = strlen(data); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* local_port */ + od_getsockname(server->io, data, sizeof(data), 0, 1); + data_len = strlen(data); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* connect_time */ + data_len = snprintf(data, sizeof(data), "%s", ""); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* request_time */ + data_len = snprintf(data, sizeof(data), "%s", ""); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* ptr */ + data_len = snprintf(data, sizeof(data), "%s%.*s", + server->id.id_prefix, + (signed)sizeof(server->id.id), server->id.id); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* link */ + data_len = snprintf(data, sizeof(data), "%s", ""); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* remote_pid */ + data_len = snprintf(data, sizeof(data), "0"); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + /* tls */ + data_len = snprintf(data, sizeof(data), "%s", ""); + rc = shapito_be_write_data_row_add(stream, offset, data, data_len); + if (rc == -1) + return -1; + return 0; +} + static inline int od_console_show_servers(od_client_t *client) { @@ -200,7 +302,14 @@ od_console_show_servers(od_client_t *client) "tls"); if (rc == -1) return -1; - (void)router; + + od_routepool_foreach(&router->route_pool, OD_SIDLE, + od_console_show_servers_callback, + client); + + od_routepool_foreach(&router->route_pool, OD_SACTIVE, + od_console_show_servers_callback, + client); rc = shapito_be_write_complete(stream, "SHOW", 5); if (rc == -1) diff --git a/sources/frontend.c b/sources/frontend.c index 269b18d9..0704112a 100644 --- a/sources/frontend.c +++ b/sources/frontend.c @@ -521,7 +521,7 @@ void od_frontend(void *arg) /* log client connection */ if (instance->scheme.log_session) { char peer[128]; - od_getpeername(client->io, peer, sizeof(peer)); + od_getpeername(client->io, peer, sizeof(peer), 1, 1); od_log_client(&instance->logger, &client->id, NULL, "new client connection %s", peer); diff --git a/sources/pooler.c b/sources/pooler.c index 363b8ce5..deb49272 100644 --- a/sources/pooler.c +++ b/sources/pooler.c @@ -75,7 +75,7 @@ od_pooler_server(void *arg) } char addr_name[128]; - od_getaddrname(server->addr, addr_name, sizeof(addr_name)); + od_getaddrname(server->addr, addr_name, sizeof(addr_name), 1, 1); /* bind to listen address and port */ int rc;