aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÁlvaro Neira Ayuso <anayuso@sysmocom.de>2014-05-17 10:56:07 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-05-18 09:42:08 +0200
commitc5fedd24c96a4ef6d7a0c0ed3c70d6ef0abd5c17 (patch)
tree1a77291c5194264253571a920a8c82319bd3016a
parentc6ab90b27006ff2d1fdfb0b1d7fc01e1dd4a696d (diff)
sysmobts-mgr: Add VTY support for configuring it
This patch allows to configure the warning temperature threshold, the severe temperature threshold of the board and the PA and the actions like the relative value power that we want to reduce the transmit power to and the part that we want to switch off or not. Signed-off-by: Alvaro Neira Ayuso <anayuso@sysmocom.de>
-rw-r--r--doc/examples/osmobts-mgr.cfg30
-rw-r--r--src/osmo-bts-sysmo/Makefile.am3
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr.c45
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr.h18
-rw-r--r--src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c279
5 files changed, 372 insertions, 3 deletions
diff --git a/doc/examples/osmobts-mgr.cfg b/doc/examples/osmobts-mgr.cfg
new file mode 100644
index 00000000..35922021
--- /dev/null
+++ b/doc/examples/osmobts-mgr.cfg
@@ -0,0 +1,30 @@
+!
+! SysmoMgr (0.3.0.141-33e5) configuration saved from vty
+!!
+!
+log stderr
+ logging filter all 1
+ logging color 1
+ logging timestamp 0
+ logging level all everything
+ logging level temp info
+ logging level fw info
+ logging level find info
+ logging level lglobal notice
+ logging level llapd notice
+ logging level linp notice
+ logging level lmux notice
+ logging level lmi notice
+ logging level lmib notice
+ logging level lsms notice
+!
+line vty
+ no login
+!
+config-mgr
+ temperature-warning board -30 50
+ temperature-severe board -50 80
+ temperature-warning pa -30 50
+ temperature-severe pa -50 80
+ power-action on on off
+ power-reduce-transmitter 4
diff --git a/src/osmo-bts-sysmo/Makefile.am b/src/osmo-bts-sysmo/Makefile.am
index e9ba949d..de707614 100644
--- a/src/osmo-bts-sysmo/Makefile.am
+++ b/src/osmo-bts-sysmo/Makefile.am
@@ -22,7 +22,8 @@ l1fwd_proxy_LDADD = $(top_builddir)/src/common/libbts.a $(COMMON_LDADD)
sysmobts_mgr_SOURCES = \
misc/sysmobts_mgr.c misc/sysmobts_misc.c \
- misc/sysmobts_par.c misc/sysmobts_nl.c utils.c
+ misc/sysmobts_par.c misc/sysmobts_nl.c utils.c \
+ misc/sysmobts_mgr_vty.c
sysmobts_mgr_LDADD = $(COMMON_LDADD)
sysmobts_util_SOURCES = misc/sysmobts_util.c misc/sysmobts_par.c
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
index 85ebd80d..e45d41f2 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c
@@ -49,6 +49,25 @@
static int no_eeprom_write = 0;
static int daemonize = 0;
void *tall_mgr_ctx;
+static struct sbts2050_config_info confinfo;
+
+static struct sysmobts_mgr_instance sysmobts_mgr_inst = {
+ .config_file = "osmobts-mgr.cfg",
+};
+
+const char *sysmomgr_copyright =
+ "(C) 2012 by Harald Welte <laforge@gnumonks.org>\r\n"
+ "(C) 2014 by Holger Hans Peter Freyther\r\n"
+ "License AGPLv3+: GNU AGPL version 2 or later <http://gnu.org/licenses/agpl-3.0.html>\r\n"
+ "This is free software: you are free to change and redistribute it.\r\n"
+ "There is NO WARRANTY, to the extent permitted by law.\r\n";
+
+static struct vty_app_info vty_info = {
+ .name = "SysmoMgr",
+ .version = PACKAGE_VERSION,
+ .go_parent_cb = mgr_vty_go_parent,
+ .is_config_node = mgr_vty_is_config_node,
+};
/* every 6 hours means 365*4 = 1460 EEprom writes per year (max) */
#define TEMP_TIMER_SECS (6 * 3600)
@@ -63,7 +82,6 @@ void *tall_mgr_ctx;
static int fd_unix = -1;
static int trx_nr = -1;
static int state_connection;
-static struct sbts2050_config_info confinfo;
static struct osmo_timer_list temp_uc_timer;
static struct osmo_timer_list connect_timer;
@@ -222,13 +240,14 @@ static void print_help(void)
printf(" -s Disable color\n");
printf(" -d CAT enable debugging\n");
printf(" -D daemonize\n");
+ printf(" -c Specify the filename of the config file\n");
}
static int parse_options(int argc, char **argv)
{
int opt;
- while ((opt = getopt(argc, argv, "nhsd:")) != -1) {
+ while ((opt = getopt(argc, argv, "nhsd:c:")) != -1) {
switch (opt) {
case 'n':
no_eeprom_write = 1;
@@ -245,6 +264,9 @@ static int parse_options(int argc, char **argv)
case 'D':
daemonize = 1;
break;
+ case 'c':
+ sysmobts_mgr_inst.config_file = optarg;
+ break;
default:
return -1;
}
@@ -447,6 +469,25 @@ int main(int argc, char **argv)
if (rc < 0)
exit(2);
+ vty_info.copyright = sysmomgr_copyright;
+ vty_init(&vty_info);
+ logging_vty_add_cmds(&mgr_log_info);
+
+ sysmobts_mgr_vty_init();
+
+ rc = sysmobts_mgr_parse_config(sysmobts_mgr_inst.config_file,
+ &confinfo);
+ if (rc < 0) {
+ LOGP(DFIND, LOGL_FATAL, "Cannot parse config file\n");
+ exit(1);
+ }
+
+ rc = telnet_init(tall_msgb_ctx, NULL, 4252);
+ if (rc < 0) {
+ fprintf(stderr, "Error initializing telnet\n");
+ exit(1);
+ }
+
/* start temperature check timer */
temp_timer.cb = check_temp_timer_cb;
check_temp_timer_cb(NULL);
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.h b/src/osmo-bts-sysmo/misc/sysmobts_mgr.h
index 21f30a42..5e0d4a7b 100644
--- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.h
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.h
@@ -1,6 +1,9 @@
#ifndef _SYSMOBTS_MGR_H
#define _SYSMOBTS_MGR_H
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/command.h>
+
enum {
DTEMP,
DFW,
@@ -14,4 +17,19 @@ enum {
#define SOCKET_PATH "/var/run/bts_oml"
+struct sbts2050_config_info;
+
+enum mgr_vty_node {
+ MGR_NODE = _LAST_OSMOVTY_NODE + 1,
+};
+
+enum node_type mgr_vty_go_parent(struct vty *vty);
+int mgr_vty_is_config_node(struct vty *vty, int node);
+int sysmobts_mgr_vty_init(void);
+int sysmobts_mgr_parse_config(const char *config_file,
+ struct sbts2050_config_info *cfg);
+
+struct sysmobts_mgr_instance {
+ const char *config_file;
+};
#endif
diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c
new file mode 100644
index 00000000..9a77a95a
--- /dev/null
+++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr_vty.c
@@ -0,0 +1,279 @@
+/* (C) 2014 by sysmocom - s.f.m.c. GmbH
+ *
+ * All Rights Reserved
+ *
+ * Author: Alvaro Neira Ayuso <anayuso@sysmocom.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 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 Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/command.h>
+#include <osmocom/vty/misc.h>
+
+#include <osmo-bts/logging.h>
+
+#include "sysmobts_misc.h"
+#include "sysmobts_mgr.h"
+
+static struct sbts2050_config_info *mgr_cfg;
+
+enum node_type mgr_vty_go_parent(struct vty *vty)
+{
+ switch (vty->node) {
+ case MGR_NODE:
+ vty->node = CONFIG_NODE;
+ break;
+ default:
+ vty->node = CONFIG_NODE;
+ }
+ return vty->node;
+}
+
+int mgr_vty_is_config_node(struct vty *vty, int node)
+{
+ switch (node) {
+ case MGR_NODE:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+#define MGR_STR "Configure sysmobts-mgr\n"
+#define MGR_TEMP_WARN_STR "Configure the temperature warning limits\n"
+#define MGR_TEMP_SEVERE_STR "Configure the temperature severe limits\n"
+
+static struct cmd_node mgr_node = {
+ MGR_NODE,
+ "%s(config-mgr)# ",
+ 1,
+};
+
+DEFUN(cfg_mgr, cfg_mgr_cmd,
+ "config-mgr",
+ MGR_STR)
+{
+ vty->node = MGR_NODE;
+ return CMD_SUCCESS;
+}
+
+DEFUN(show_mgr, show_mgr_cmd, "show mgr",
+ SHOW_STR "Display information about the mgr")
+{
+ vty_out(vty, " temperature-warning board Min:%d Max:%d%s",
+ mgr_cfg->temp_min_board_warn_limit,
+ mgr_cfg->temp_max_board_warn_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-severe board Min:%d Max:%d%s",
+ mgr_cfg->temp_min_board_severe_limit,
+ mgr_cfg->temp_max_board_severe_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-warning pa Min:%d Max:%d%s",
+ mgr_cfg->temp_min_pa_warn_limit,
+ mgr_cfg->temp_max_pa_warn_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-severe pa Min:%d Max:%d%s",
+ mgr_cfg->temp_min_pa_severe_limit,
+ mgr_cfg->temp_max_pa_severe_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " power-action Master:%s Slave:%s PA:%s%s",
+ mgr_cfg->master_power_act ? "on" : "off",
+ mgr_cfg->slave_power_act ? "on" : "off",
+ mgr_cfg->pa_power_act ? "on" : "off",
+ VTY_NEWLINE);
+
+ vty_out(vty, " power-reduce-transmitter %d%s",
+ mgr_cfg->reduce_max_power,
+ VTY_NEWLINE);
+ return CMD_SUCCESS;
+}
+
+static int config_write_mgr(struct vty *vty)
+{
+ vty_out(vty, "config-mgr%s", VTY_NEWLINE);
+
+ vty_out(vty, " temperature-warning board %d %d%s",
+ mgr_cfg->temp_min_board_warn_limit,
+ mgr_cfg->temp_max_board_warn_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-severe board %d %d%s",
+ mgr_cfg->temp_min_board_severe_limit,
+ mgr_cfg->temp_max_board_severe_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-warning pa %d %d%s",
+ mgr_cfg->temp_min_pa_warn_limit,
+ mgr_cfg->temp_max_pa_warn_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " temperature-severe pa %d %d%s",
+ mgr_cfg->temp_min_pa_severe_limit,
+ mgr_cfg->temp_max_pa_severe_limit,
+ VTY_NEWLINE);
+
+ vty_out(vty, " power-action %s %s %s%s",
+ mgr_cfg->master_power_act ? "on" : "off",
+ mgr_cfg->slave_power_act ? "on" : "off",
+ mgr_cfg->pa_power_act ? "on" : "off",
+ VTY_NEWLINE);
+
+ vty_out(vty, " power-reduce-transmitter %d%s",
+ mgr_cfg->reduce_max_power,
+ VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_board_temp_warn, cfg_mgr_board_temp_warn_cmd,
+ "temperature-warning board <-255-255> <-255-255>",
+ MGR_TEMP_WARN_STR
+ "Set warning temperature limits on the Board\n"
+ "Warning temperature low limit on the Board\n"
+ "Warning temperature high limit on the Board\n")
+{
+ mgr_cfg->temp_min_board_warn_limit = atoi(argv[0]);
+ mgr_cfg->temp_max_board_warn_limit = atoi(argv[1]);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_board_temp_sever, cfg_mgr_board_temp_sever_cmd,
+ "temperature-severe board <-255-255> <-255-255>",
+ MGR_TEMP_SEVERE_STR
+ "Set severe temperature limits on the Board\n"
+ "Severe temperature low limit on the Board\n"
+ "Severe Temperature high limit on the Board\n")
+{
+ mgr_cfg->temp_min_board_severe_limit = atoi(argv[0]);
+ mgr_cfg->temp_max_board_severe_limit = atoi(argv[1]);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_pa_temp_warn, cfg_mgr_pa_temp_warn_cmd,
+ "temperature-warning pa <-255-255> <-255-255>",
+ MGR_TEMP_WARN_STR
+ "Set warning temperature limits on the PA\n"
+ "Warning temperature low limit on the PA\n"
+ "Warning temperature high limit on the PA\n")
+{
+ mgr_cfg->temp_min_pa_warn_limit = atoi(argv[0]);
+ mgr_cfg->temp_max_pa_warn_limit = atoi(argv[1]);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_pa_temp_sever, cfg_mgr_pa_temp_sever_cmd,
+ "temperature-severe pa <-255-255> <-255-255>",
+ MGR_TEMP_SEVERE_STR
+ "Set severe temperature limits on the Board\n"
+ "Severe temperature low limit on the PA\n"
+ "Severe temperature high limit on the PA\n")
+{
+ mgr_cfg->temp_min_pa_severe_limit = atoi(argv[0]);
+ mgr_cfg->temp_max_pa_severe_limit = atoi(argv[1]);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_pwr_action, cfg_mgr_pwr_action_cmd,
+ "power-action (on|off) (on|off) (on|off)",
+ "Configure which devices we want to turn on/off in several situation\n"
+ "Turn on the Master\n"
+ "Turn off the Master\n"
+ "Turn on the Slave\n"
+ "Turn off the Slave\n"
+ "Turn on the PA\n"
+ "Turn off the PA\n")
+{
+ if (strcmp(argv[0], "on") == 0)
+ mgr_cfg->master_power_act = 1;
+ else if (strcmp(argv[0], "off") == 0)
+ mgr_cfg->master_power_act = 0;
+
+ if (strcmp(argv[1], "on") == 0)
+ mgr_cfg->slave_power_act = 1;
+ else if (strcmp(argv[1], "off") == 0)
+ mgr_cfg->slave_power_act = 0;
+
+ if (strcmp(argv[2], "on") == 0)
+ mgr_cfg->pa_power_act = 1;
+ else if (strcmp(argv[2], "off") == 0)
+ mgr_cfg->pa_power_act = 0;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_mgr_pa_baud_action, cfg_mgr_pa_baud_action_cmd,
+ "power-reduce-transmitter <0-255>",
+ "Configure the power that we want to reduce in warning situation\n"
+ "Power baud transmition that we want to reduce in the PA\n")
+{
+ mgr_cfg->reduce_max_power = atoi(argv[0]);
+
+ return CMD_SUCCESS;
+}
+
+int sysmobts_mgr_vty_init(void)
+
+{
+ install_element_ve(&show_mgr_cmd);
+
+ install_node(&mgr_node, config_write_mgr);
+ install_element(CONFIG_NODE, &cfg_mgr_cmd);
+ vty_install_default(MGR_NODE);
+
+ install_element(MGR_NODE, &cfg_mgr_board_temp_warn_cmd);
+ install_element(MGR_NODE, &cfg_mgr_board_temp_sever_cmd);
+ install_element(MGR_NODE, &cfg_mgr_pa_temp_warn_cmd);
+ install_element(MGR_NODE, &cfg_mgr_pa_temp_sever_cmd);
+ install_element(MGR_NODE, &cfg_mgr_pwr_action_cmd);
+ install_element(MGR_NODE, &cfg_mgr_pa_baud_action_cmd);
+
+ return 0;
+}
+
+int sysmobts_mgr_parse_config(const char *config_file,
+ struct sbts2050_config_info *cfg)
+{
+ int rc;
+
+ mgr_cfg = cfg;
+
+ rc = vty_read_config_file(config_file, NULL);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to parse the config file: '%s'\n",
+ config_file);
+ return rc;
+ }
+
+ return 0;
+}