mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 12:18:42 +00:00
CLI now has a configuration structure
This commit is contained in:
parent
09f50f3766
commit
a95fff3793
@ -14,6 +14,7 @@
|
|||||||
#include "lib/hash.h"
|
#include "lib/hash.h"
|
||||||
#include "lib/resource.h"
|
#include "lib/resource.h"
|
||||||
#include "lib/timer.h"
|
#include "lib/timer.h"
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
|
||||||
/* Configuration structure */
|
/* Configuration structure */
|
||||||
struct config {
|
struct config {
|
||||||
@ -25,6 +26,7 @@ struct config {
|
|||||||
list logfiles; /* Configured log files (sysdep) */
|
list logfiles; /* Configured log files (sysdep) */
|
||||||
list tests; /* Configured unit tests (f_bt_test_suite) */
|
list tests; /* Configured unit tests (f_bt_test_suite) */
|
||||||
list symbols; /* Configured symbols in config order */
|
list symbols; /* Configured symbols in config order */
|
||||||
|
TLIST_STRUCT_DEF(cli_config, struct cli_config) cli; /* Configured CLI sockets */
|
||||||
|
|
||||||
int mrtdump_file; /* Configured MRTDump file (sysdep, fd in unix) */
|
int mrtdump_file; /* Configured MRTDump file (sysdep, fd in unix) */
|
||||||
const char *syslog_name; /* Name used for syslog (NULL -> no syslog) */
|
const char *syslog_name; /* Name used for syslog (NULL -> no syslog) */
|
||||||
|
14
nest/cli.h
14
nest/cli.h
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#include "lib/resource.h"
|
#include "lib/resource.h"
|
||||||
#include "lib/event.h"
|
#include "lib/event.h"
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
#include "conf/conf.h"
|
||||||
|
|
||||||
#define CLI_RX_BUF_SIZE 4096
|
#define CLI_RX_BUF_SIZE 4096
|
||||||
#define CLI_TX_BUF_SIZE 4096
|
#define CLI_TX_BUF_SIZE 4096
|
||||||
@ -47,6 +49,18 @@ typedef struct cli {
|
|||||||
uint async_msg_size; /* Total size of async messages queued in tx_buf */
|
uint async_msg_size; /* Total size of async messages queued in tx_buf */
|
||||||
} cli;
|
} cli;
|
||||||
|
|
||||||
|
struct cli_config {
|
||||||
|
#define TLIST_PREFIX cli_config
|
||||||
|
#define TLIST_TYPE struct cli_config
|
||||||
|
#define TLIST_ITEM n
|
||||||
|
#define TLIST_DEFINED_BEFORE
|
||||||
|
#define TLIST_WANT_ADD_TAIL
|
||||||
|
TLIST_DEFAULT_NODE;
|
||||||
|
const char *name;
|
||||||
|
uint uid, gid, mode;
|
||||||
|
};
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
|
||||||
extern pool *cli_pool;
|
extern pool *cli_pool;
|
||||||
extern struct cli *this_cli; /* Used during parsing */
|
extern struct cli *this_cli; /* Used during parsing */
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ static struct log_config *this_log;
|
|||||||
|
|
||||||
CF_DECLS
|
CF_DECLS
|
||||||
|
|
||||||
CF_KEYWORDS(LOG, SYSLOG, NAME, STDERR, UDP, PORT)
|
CF_KEYWORDS(LOG, SYSLOG, NAME, STDERR, UDP, PORT, CLI)
|
||||||
CF_KEYWORDS(ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG)
|
CF_KEYWORDS(ALL, DEBUG, TRACE, INFO, REMOTE, WARNING, ERROR, AUTH, FATAL, BUG)
|
||||||
CF_KEYWORDS(DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING, TIMEOUT, THREADS)
|
CF_KEYWORDS(DEBUG, LATENCY, LIMIT, WATCHDOG, WARNING, TIMEOUT, THREADS)
|
||||||
|
|
||||||
@ -123,7 +123,6 @@ mrtdump_base:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
conf: debug_unix ;
|
conf: debug_unix ;
|
||||||
|
|
||||||
debug_unix:
|
debug_unix:
|
||||||
|
@ -1531,7 +1531,7 @@ err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sk_open_unix(sock *s, char *name)
|
sk_open_unix(sock *s, const char *name)
|
||||||
{
|
{
|
||||||
struct sockaddr_un sa;
|
struct sockaddr_un sa;
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -395,9 +395,12 @@ cmd_reconfig_status(void)
|
|||||||
* Command-Line Interface
|
* Command-Line Interface
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static sock *cli_sk;
|
|
||||||
static char *path_control_socket = PATH_CONTROL_SOCKET;
|
static char *path_control_socket = PATH_CONTROL_SOCKET;
|
||||||
|
static struct cli_config *main_control_socket_config = NULL;
|
||||||
|
static struct cli_listener {
|
||||||
|
sock *s;
|
||||||
|
struct cli_config *config;
|
||||||
|
} *main_control_socket = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cli_write(cli *c)
|
cli_write(cli *c)
|
||||||
@ -519,33 +522,65 @@ cli_connect(sock *s, uint size UNUSED)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static struct cli_listener *
|
||||||
cli_init_unix(uid_t use_uid, gid_t use_gid)
|
cli_listener(struct cli_config *cf)
|
||||||
{
|
{
|
||||||
sock *s;
|
struct cli_listener *l = mb_allocz(cli_pool, sizeof *l);
|
||||||
|
l->config = cf;
|
||||||
cli_init();
|
sock *s = l->s = sk_new(cli_pool);
|
||||||
s = cli_sk = sk_new(cli_pool);
|
|
||||||
s->type = SK_UNIX_PASSIVE;
|
s->type = SK_UNIX_PASSIVE;
|
||||||
s->rx_hook = cli_connect;
|
s->rx_hook = cli_connect;
|
||||||
s->err_hook = cli_connect_err;
|
s->err_hook = cli_connect_err;
|
||||||
|
s->data = cf;
|
||||||
s->rbsize = 1024;
|
s->rbsize = 1024;
|
||||||
s->fast_rx = 1;
|
s->fast_rx = 1;
|
||||||
|
|
||||||
/* Return value intentionally ignored */
|
/* Return value intentionally ignored */
|
||||||
unlink(path_control_socket);
|
unlink(cf->name);
|
||||||
|
|
||||||
if (sk_open_unix(s, path_control_socket) < 0)
|
if (sk_open_unix(s, cf->name) < 0)
|
||||||
die("Cannot create control socket %s: %m", path_control_socket);
|
{
|
||||||
|
log(L_ERR "Cannot create control socket %s: %m", cf->name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (use_uid || use_gid)
|
if (cf->uid || cf->gid)
|
||||||
if (chown(path_control_socket, use_uid, use_gid) < 0)
|
if (chown(cf->name, cf->uid, cf->gid) < 0)
|
||||||
die("chown: %m");
|
{
|
||||||
|
log(L_ERR "Cannot chown control socket %s: %m", cf->name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (chmod(path_control_socket, 0660) < 0)
|
if (chmod(cf->name, cf->mode) < 0)
|
||||||
die("chmod: %m");
|
{
|
||||||
|
log(L_ERR "Cannot chmod control socket %s: %m", cf->name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cli_init_unix(uid_t use_uid, gid_t use_gid)
|
||||||
|
{
|
||||||
|
ASSERT_DIE(main_control_socket_config == NULL);
|
||||||
|
|
||||||
|
main_control_socket_config = mb_alloc(&root_pool, sizeof *main_control_socket_config);
|
||||||
|
*main_control_socket_config = (struct cli_config) {
|
||||||
|
.name = path_control_socket,
|
||||||
|
.uid = use_uid,
|
||||||
|
.gid = use_gid,
|
||||||
|
.mode = 0660,
|
||||||
|
};
|
||||||
|
|
||||||
|
ASSERT_DIE(main_control_socket == NULL);
|
||||||
|
cli_init();
|
||||||
|
main_control_socket = cli_listener(main_control_socket_config);
|
||||||
|
if (!main_control_socket)
|
||||||
|
die("Won't run without control socket");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PID file
|
* PID file
|
||||||
*/
|
*/
|
||||||
|
@ -107,7 +107,7 @@ extern volatile sig_atomic_t async_shutdown_flag;
|
|||||||
void io_init(void);
|
void io_init(void);
|
||||||
void io_loop(void);
|
void io_loop(void);
|
||||||
void io_log_dump(void);
|
void io_log_dump(void);
|
||||||
int sk_open_unix(struct birdsock *s, char *name);
|
int sk_open_unix(struct birdsock *s, const char *name);
|
||||||
struct rfile *rf_open(struct pool *, const char *name, const char *mode);
|
struct rfile *rf_open(struct pool *, const char *name, const char *mode);
|
||||||
struct rfile *rf_fdopen(pool *p, int fd, const char *mode);
|
struct rfile *rf_fdopen(pool *p, int fd, const char *mode);
|
||||||
void *rf_file(struct rfile *f);
|
void *rf_file(struct rfile *f);
|
||||||
|
Loading…
Reference in New Issue
Block a user