From 9f6127f592c979582a4d2d34627e09cfcd439778 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 31 May 2011 22:52:41 +0200 Subject: osmo-pcap-server: Work on the generic VTY interface for the server Work on being able to configure clients that are allowed to connect to the server. --- include/osmo-pcap/osmo_pcap_server.h | 3 + src/osmo_server_main.c | 1 + src/osmo_server_network.c | 32 ++++++++++ src/osmo_server_vty.c | 115 +++++++++++++++++++++++++++++++++++ 4 files changed, 151 insertions(+) diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h index a3f70dc..66ec99e 100644 --- a/include/osmo-pcap/osmo_pcap_server.h +++ b/include/osmo-pcap/osmo_pcap_server.h @@ -52,6 +52,8 @@ struct osmo_pcap_conn { struct osmo_pcap_server { struct llist_head conn; + int port; + char *addr; struct osmo_fd listen_fd; char *base_path; @@ -62,6 +64,7 @@ extern struct osmo_pcap_server *pcap_server; int osmo_pcap_server_listen(struct osmo_pcap_server *server); struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *ser, const char *name); +void osmo_pcap_server_delete(struct osmo_pcap_conn *conn); void vty_server_init(struct osmo_pcap_server *server); #endif diff --git a/src/osmo_server_main.c b/src/osmo_server_main.c index 04c84a0..082ade2 100644 --- a/src/osmo_server_main.c +++ b/src/osmo_server_main.c @@ -184,6 +184,7 @@ int main(int argc, char **argv) LOGP(DSERVER, LOGL_ERROR, "Failed to allocate osmo_pcap_server.\n"); exit(1); } + INIT_LLIST_HEAD(&pcap_server->conn); vty_server_init(pcap_server); if (vty_read_config_file(config_file, NULL) < 0) { diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c index 5523974..6562829 100644 --- a/src/osmo_server_network.c +++ b/src/osmo_server_network.c @@ -21,6 +21,38 @@ */ #include +#include + +#include + +#include + +void osmo_pcap_server_delete(struct osmo_pcap_conn *conn) +{ + llist_del(&conn->entry); + talloc_free(conn); +} + + +struct osmo_pcap_conn *osmo_pcap_server_find(struct osmo_pcap_server *server, + const char *name) +{ + struct osmo_pcap_conn *conn; + llist_for_each_entry(conn, &server->conn, entry) { + if (strcmp(conn->name, name) == 0) + return conn; + } + + conn = talloc_zero(server, struct osmo_pcap_conn); + if (!conn) { + LOGP(DSERVER, LOGL_ERROR, + "Failed to find the connection.\n"); + return NULL; + } + + llist_add_tail(&conn->entry, &server->conn); + return conn; +} int osmo_pcap_server_listen(struct osmo_pcap_server *server) { diff --git a/src/osmo_server_vty.c b/src/osmo_server_vty.c index fcd4b09..5d7d23d 100644 --- a/src/osmo_server_vty.c +++ b/src/osmo_server_vty.c @@ -21,8 +21,123 @@ */ #include +#include +#include + + +#define SERVER_STR "Server settings\n" +#define CLIENT_STR "Client\n" + +static struct cmd_node server_node = { + SERVER_NODE, + "%s(server)#", + 1, +}; + +static int config_write_server(struct vty *vty) +{ + struct osmo_pcap_conn *conn; + + vty_out(vty, "server%s", VTY_NEWLINE); + + if (pcap_server->base_path) + vty_out(vty, " base-path %s%s", pcap_server->base_path, VTY_NEWLINE); + if (pcap_server->addr) + vty_out(vty, " server ip %s%s", pcap_server->addr, VTY_NEWLINE); + if (pcap_server->port > 0) + vty_out(vty, "server port %d%s", pcap_server->port, VTY_NEWLINE); + + llist_for_each_entry(conn, &pcap_server->conn, entry) { + vty_out(vty, " client %s %s%s", + conn->name, conn->remote_host, VTY_NEWLINE); + } + + return CMD_SUCCESS; +} + +DEFUN(cfg_server, + cfg_server_cmd, + "server", + "Enter the server configuration\n") +{ + vty->node = SERVER_NODE; + return CMD_SUCCESS; +} + +DEFUN(cfg_server_base, + cfg_server_base_cmd, + "base-path PATH", + "Base path for log files\n" "Path\n") +{ + talloc_free(pcap_server->base_path); + pcap_server->base_path = talloc_strdup(pcap_server, argv[0]); + return CMD_SUCCESS; +} + +DEFUN(cfg_server_ip, + cfg_server_ip_cmd, + "server ip A.B.C.D", + SERVER_STR "Listen\n" "IP Address\n") +{ + talloc_free(pcap_server->addr); + pcap_server->addr = talloc_strdup(pcap_server, argv[0]); + return CMD_SUCCESS; +} + +DEFUN(cfg_server_port, + cfg_server_port_cmd, + "server port <1-65535>", + SERVER_STR "Port\n" "Port Number\n") +{ + pcap_server->port = atoi(argv[0]); + return CMD_SUCCESS; +} + +DEFUN(cfg_server_client, + cfg_server_client_cmd, + "client NAME A.B.C.D", + CLIENT_STR "Remote name used in filenames\n" "IP of the remote\n") +{ + struct osmo_pcap_conn *conn; + conn = osmo_pcap_server_find(pcap_server, argv[0]); + if (!conn) { + vty_out(vty, "Failed to create a pcap server.\n"); + return CMD_WARNING; + } + + talloc_free(conn->remote_host); + conn->remote_host = talloc_strdup(pcap_server, argv[0]); + + return CMD_SUCCESS; +} + +DEFUN(cfg_server_no_client, + cfg_server_no_client_cmd, + "no client NAME", + NO_STR CLIENT_STR "The name\n") +{ + struct osmo_pcap_conn *conn; + conn = osmo_pcap_server_find(pcap_server, argv[0]); + if (!conn) { + vty_out(vty, "Failed to create a pcap server.\n"); + return CMD_WARNING; + } + + osmo_pcap_server_delete(conn); + return CMD_SUCCESS; +} void vty_server_init(struct osmo_pcap_server *server) { + install_element(CONFIG_NODE, &cfg_server_cmd); + install_node(&server_node, config_write_server); + install_default(SERVER_NODE); + + install_element(SERVER_NODE, &cfg_server_base_cmd); + install_element(SERVER_NODE, &cfg_server_ip_cmd); + install_element(SERVER_NODE, &cfg_server_port_cmd); + + install_element(SERVER_NODE, &cfg_server_client_cmd); + install_element(SERVER_NODE, &cfg_server_no_client_cmd); } -- cgit v1.2.3