From f81eb328b61f65a09b7233aaa70b2f655c0300bc Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 24 Feb 2016 00:10:41 +0100 Subject: vty: add ctrl section for Control interface bind address This may seem like overkill for a mere const char * config item, but it makes the Control interface VTY commands reusable in any main() scope (inspired by libosmo-abis' VTY config). Add API functions ctrl_vty_init() and ctrl_vty_get_bind_addr(), in new files src/ctrl/control_vty.c and include/osmocom/ctrl/control_vty.h, compiled and/or installed dependent on ENABLE_VTY. Using these functions allows configuring a static const char* with the VTY commands ctrl bind A.B.C.D which callers shall subsequently use to bind the Control interface to a specific local interface address, by passing the return value of ctrl_vty_get_bind_addr() to control_interface_setup(). Add CTRL_NODE to enum node_type, "eating" RESERVED4_NODE to heed that comment on avoiding ABI changes. --- include/Makefile.am | 3 +- include/osmocom/ctrl/control_vty.h | 9 ++++ include/osmocom/vty/command.h | 2 +- src/ctrl/Makefile.am | 4 ++ src/ctrl/control_vty.c | 88 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 include/osmocom/ctrl/control_vty.h create mode 100644 src/ctrl/control_vty.c diff --git a/include/Makefile.am b/include/Makefile.am index a965fb92..ac22ee64 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -117,7 +117,8 @@ nobase_include_HEADERS += \ osmocom/vty/telnet_interface.h \ osmocom/vty/vector.h \ osmocom/vty/vty.h \ - osmocom/vty/ports.h + osmocom/vty/ports.h \ + osmocom/ctrl/control_vty.h endif noinst_HEADERS = \ diff --git a/include/osmocom/ctrl/control_vty.h b/include/osmocom/ctrl/control_vty.h new file mode 100644 index 00000000..d0ef69f4 --- /dev/null +++ b/include/osmocom/ctrl/control_vty.h @@ -0,0 +1,9 @@ +#pragma once + +/* Add the 'ctrl' section to VTY, containing the 'bind' command. */ +int ctrl_vty_init(void *ctx); + +/* Obtain the IP address configured by the 'ctrl'/'bind A.B.C.D' VTY command. + * This should be fed to ctrl_interface_setup() once the configuration has been + * read. */ +const char *ctrl_vty_get_bind_addr(void); diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h index 2078e1bb..9a025752 100644 --- a/include/osmocom/vty/command.h +++ b/include/osmocom/vty/command.h @@ -83,6 +83,7 @@ enum node_type { L_IPA_NODE, /*!< \brief IPA proxying commands in libosmo-abis. */ L_NS_NODE, /*!< \brief NS node in libosmo-gb. */ L_BSSGP_NODE, /*!< \brief BSSGP node in libosmo-gb. */ + L_CTRL_NODE, /*!< \brief Control interface node. */ /* * When adding new nodes to the libosmocore project, these nodes can be @@ -91,7 +92,6 @@ enum node_type { RESERVED1_NODE, /*!< \brief Reserved for later extensions */ RESERVED2_NODE, /*!< \brief Reserved for later extensions */ RESERVED3_NODE, /*!< \brief Reserved for later extensions */ - RESERVED4_NODE, /*!< \brief Reserved for later extensions */ _LAST_OSMOVTY_NODE }; diff --git a/src/ctrl/Makefile.am b/src/ctrl/Makefile.am index e6ccafb0..b4a3da43 100644 --- a/src/ctrl/Makefile.am +++ b/src/ctrl/Makefile.am @@ -13,3 +13,7 @@ libosmoctrl_la_LIBADD = \ $(top_builddir)/src/libosmocore.la \ $(top_builddir)/src/gsm/libosmogsm.la \ $(top_builddir)/src/vty/libosmovty.la + +if ENABLE_VTY +libosmoctrl_la_SOURCES += control_vty.c +endif diff --git a/src/ctrl/control_vty.c b/src/ctrl/control_vty.c new file mode 100644 index 00000000..7acb9732 --- /dev/null +++ b/src/ctrl/control_vty.c @@ -0,0 +1,88 @@ +/* VTY configuration for Control interface + * + * (C) 2016 by sysmocom s.m.f.c. GmbH + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include +#include +#include +#include + +static void *ctrl_vty_ctx = NULL; +static const char *ctrl_vty_bind_addr = NULL; + +DEFUN(cfg_ctrl_bind_addr, + cfg_ctrl_bind_addr_cmd, + "bind A.B.C.D", + "Set bind address to listen for Control connections\n" + "Local IP address (default 127.0.0.1)\n") +{ + talloc_free((char*)ctrl_vty_bind_addr); + ctrl_vty_bind_addr = NULL; + ctrl_vty_bind_addr = talloc_strdup(ctrl_vty_ctx, argv[0]); + return CMD_SUCCESS; +} + +const char *ctrl_vty_get_bind_addr(void) +{ + if (!ctrl_vty_bind_addr) + return "127.0.0.1"; + return ctrl_vty_bind_addr; +} + +static struct cmd_node ctrl_node = { + L_CTRL_NODE, + "%s(config-ctrl)# ", + 1, +}; + +DEFUN(cfg_ctrl, + cfg_ctrl_cmd, + "ctrl", "Configure the Control Interface") +{ + vty->index = NULL; + vty->node = L_CTRL_NODE; + + return CMD_SUCCESS; +} + +static int config_write_ctrl(struct vty *vty) +{ + /* So far there's only one element. Omit the entire section if the bind + * element is omitted. */ + if (!ctrl_vty_bind_addr) + return CMD_SUCCESS; + + vty_out(vty, "ctrl%s", VTY_NEWLINE); + vty_out(vty, " bind %s%s", ctrl_vty_bind_addr, VTY_NEWLINE); + + return CMD_SUCCESS; +} + +int ctrl_vty_init(void *ctx) +{ + ctrl_vty_ctx = ctx; + install_element(CONFIG_NODE, &cfg_ctrl_cmd); + install_node(&ctrl_node, config_write_ctrl); + + install_element(L_CTRL_NODE, &cfg_ctrl_bind_addr_cmd); + return 0; +} + -- cgit v1.2.3