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>
This commit is contained in:
Álvaro Neira Ayuso
2014-05-17 10:56:07 +02:00
committed by Holger Hans Peter Freyther
parent c6ab90b270
commit c5fedd24c9
5 changed files with 372 additions and 3 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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;
}