mirror of https://github.com/yandex/odyssey.git
odyssey configuration from CLI
This commit is contained in:
parent
1d478f7d14
commit
2019c6419e
|
@ -1,5 +1,5 @@
|
|||
pid_file "/tmp/odyssey.pid"
|
||||
daemonize no
|
||||
daemonize yes
|
||||
|
||||
unix_socket_dir "/tmp"
|
||||
unix_socket_mode "0644"
|
||||
|
|
|
@ -39,7 +39,8 @@ set(od_src
|
|||
watchdog.c
|
||||
ejection.c
|
||||
thread_global.c
|
||||
compression.c)
|
||||
compression.c
|
||||
option.c)
|
||||
|
||||
if (PAM_FOUND)
|
||||
list(APPEND od_src pam.c)
|
||||
|
|
|
@ -37,12 +37,31 @@ void od_instance_free(od_instance_t *instance)
|
|||
od_config_free(&instance->config);
|
||||
// as mallocd on start
|
||||
free(instance->config_file);
|
||||
free(instance->exec_path);
|
||||
od_log(&instance->logger, "shutdown", NULL, NULL, "Stopping Odyssey");
|
||||
od_logger_close(&instance->logger);
|
||||
machinarium_free();
|
||||
}
|
||||
|
||||
static inline void od_usage(od_instance_t *instance, char *path)
|
||||
static inline void od_bind_args(struct argp *argp)
|
||||
{
|
||||
/* Program documentation. */
|
||||
static char doc[] = "Odyssey - scalable postgresql connection pooler";
|
||||
|
||||
/* A description of the arguments we accept. */
|
||||
static char args_doc[] = "odyssey.conf [ --opt1 ...]";
|
||||
|
||||
memset(argp, 0, sizeof(struct argp));
|
||||
argp->options = options;
|
||||
argp->parser = parse_opt;
|
||||
argp->args_doc = args_doc;
|
||||
argp->doc = doc;
|
||||
}
|
||||
|
||||
const char *argp_program_version;
|
||||
const char *argp_program_bug_address = "<x4mmm@yandex-team.ru>";
|
||||
|
||||
void od_usage(od_instance_t *instance, char *path)
|
||||
{
|
||||
od_log(&instance->logger, "init", NULL, NULL, "odyssey (git: %s %s)",
|
||||
OD_VERSION_GIT, OD_VERSION_BUILD);
|
||||
|
@ -50,8 +69,42 @@ static inline void od_usage(od_instance_t *instance, char *path)
|
|||
path);
|
||||
}
|
||||
|
||||
static inline void od_bind_version()
|
||||
{
|
||||
od_asprintf(&argp_program_version, "odyssey (git: %s %s %s)",
|
||||
OD_VERSION_NUMBER, OD_VERSION_GIT, OD_VERSION_BUILD);
|
||||
}
|
||||
|
||||
static inline od_retcode_t od_args_init(od_arguments_t *args,
|
||||
od_instance_t *instance)
|
||||
{
|
||||
args->silent = 0;
|
||||
args->verbose = 0;
|
||||
args->console = 0;
|
||||
args->instance = instance;
|
||||
return OK_RESPONSE;
|
||||
}
|
||||
|
||||
int od_instance_main(od_instance_t *instance, int argc, char **argv)
|
||||
{
|
||||
od_arguments_t args;
|
||||
struct argp argp;
|
||||
od_bind_args(&argp);
|
||||
od_bind_version();
|
||||
|
||||
// odyssey accept only ONE positional arg - to path config
|
||||
if (od_args_init(&args, instance) != OK_RESPONSE) {
|
||||
goto error;
|
||||
}
|
||||
instance->exec_path = strdup(argv[0]);
|
||||
/* validate command line options */
|
||||
int argindx; // index of fisrt unparsed indx
|
||||
if (argp_parse(&argp, argc, argv, 0, &argindx, &args) != OK_RESPONSE) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
od_log(&instance->logger, "startup", NULL, NULL, "Starting Odyssey");
|
||||
|
||||
/* prepare system services */
|
||||
od_system_t system;
|
||||
od_router_t router;
|
||||
|
@ -60,32 +113,14 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
|
|||
od_extention_t extentions;
|
||||
od_global_t global;
|
||||
|
||||
od_log(&instance->logger, "startup", NULL, NULL, "Starting Odyssey");
|
||||
|
||||
od_system_init(&system);
|
||||
od_router_init(&router, &global);
|
||||
od_cron_init(&cron);
|
||||
od_worker_pool_init(&worker_pool);
|
||||
//od_modules_init(&modules);
|
||||
od_extentions_init(&extentions);
|
||||
od_global_init(&global, instance, &system, &router, &cron, &worker_pool,
|
||||
&extentions);
|
||||
|
||||
/* validate command line options */
|
||||
if (argc != 2) {
|
||||
od_usage(instance, argv[0]);
|
||||
goto error;
|
||||
}
|
||||
if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) {
|
||||
od_usage(instance, argv[0]);
|
||||
od_router_free(&router);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// do not use argv point as it may contain invalid data atfer setproctitle()
|
||||
instance->config_file = malloc(sizeof(char) * (1 + strlen(argv[1])));
|
||||
strcpy(instance->config_file, argv[1]);
|
||||
|
||||
/* read config file */
|
||||
od_error_t error;
|
||||
od_error_init(&error);
|
||||
|
@ -111,6 +146,12 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
|
|||
goto error;
|
||||
}
|
||||
|
||||
rc = od_apply_validate_cli_args(&instance->logger, &instance->config,
|
||||
&args);
|
||||
if (rc != OK_RESPONSE) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* configure logger */
|
||||
od_logger_set_format(&instance->logger, instance->config.log_format);
|
||||
od_logger_set_debug(&instance->logger, instance->config.log_debug);
|
||||
|
|
|
@ -14,6 +14,7 @@ struct od_instance {
|
|||
od_pid_t pid;
|
||||
od_logger_t logger;
|
||||
char *config_file;
|
||||
char *exec_path;
|
||||
od_config_t config;
|
||||
char *orig_argv_ptr;
|
||||
int64_t shutdown_worker_id;
|
||||
|
|
|
@ -100,6 +100,7 @@
|
|||
#include "sources/router_cancel.h"
|
||||
#include "sources/router.h"
|
||||
#include "sources/instance.h"
|
||||
#include "sources/option.h"
|
||||
#include "sources/cron.h"
|
||||
#include "sources/system.h"
|
||||
#include "sources/sighandler.h"
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
|
||||
/*
|
||||
* Odyssey.
|
||||
*
|
||||
* Scalable PostgreSQL connection pooler.
|
||||
*/
|
||||
|
||||
#include <machinarium.h>
|
||||
#include <odyssey.h>
|
||||
|
||||
od_retcode_t od_apply_validate_cli_args(od_logger_t *logger, od_config_t *conf,
|
||||
od_arguments_t *args)
|
||||
{
|
||||
if (conf->daemonize && !args->console) {
|
||||
od_dbg_printf_on_dvl_lvl(
|
||||
1,
|
||||
"daemonize config opt is %d and console flag is %d, so daemonizing process\n",
|
||||
conf->daemonize, args->console);
|
||||
conf->daemonize |= args->console;
|
||||
} else {
|
||||
conf->daemonize = 0;
|
||||
}
|
||||
|
||||
if (args->silent && args->verbose) {
|
||||
od_log(logger, "startup", NULL, NULL,
|
||||
"silent and verbose option both specified");
|
||||
return NOT_OK_RESPONSE;
|
||||
}
|
||||
|
||||
if (args->silent) {
|
||||
conf->log_debug = 0;
|
||||
conf->log_session = 0;
|
||||
conf->log_query = 0;
|
||||
}
|
||||
if (args->verbose) {
|
||||
conf->log_debug = 1;
|
||||
conf->log_session = 1;
|
||||
conf->log_query = 1;
|
||||
}
|
||||
|
||||
return OK_RESPONSE;
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
#ifndef OD_OPTION_H
|
||||
#define OD_OPTION_H
|
||||
|
||||
#include <kiwi.h>
|
||||
#include <argp.h>
|
||||
|
||||
extern void od_usage(od_instance_t *instance, char *path);
|
||||
|
||||
typedef struct {
|
||||
od_instance_t *instance;
|
||||
int silent;
|
||||
int verbose;
|
||||
int console;
|
||||
} od_arguments_t;
|
||||
|
||||
enum { OD_OPT_CONSOLE = 10001, // >= than any utf symbol like -q -l etc
|
||||
OD_OPT_SILENT = 10002,
|
||||
OD_OPT_VERBOSE = 10003,
|
||||
} od_cli_options;
|
||||
|
||||
static struct argp_option options[] = {
|
||||
{ "verbose", OD_OPT_VERBOSE, 0, 0, "do log everything" },
|
||||
{ "silent", OD_OPT_SILENT, 0, 0, "do not log anything" },
|
||||
{ "console", OD_OPT_CONSOLE, 0, 0, "do not fork on startup" },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static inline error_t parse_opt(int key, char *arg, struct argp_state *state)
|
||||
{
|
||||
/* Get the input argument from argp_parse, which we
|
||||
know is a pointer to our arguments structure. */
|
||||
od_arguments_t *arguments = state->input;
|
||||
od_instance_t *instance = arguments->instance;
|
||||
|
||||
switch (key) {
|
||||
case 'q':
|
||||
case 's':
|
||||
case OD_OPT_SILENT:
|
||||
arguments->silent = 1;
|
||||
break;
|
||||
case 'v':
|
||||
case OD_OPT_VERBOSE:
|
||||
arguments->verbose = 1;
|
||||
break;
|
||||
case 'h': {
|
||||
od_usage(instance, instance->exec_path);
|
||||
} break;
|
||||
case OD_OPT_CONSOLE: {
|
||||
arguments->console = 1;
|
||||
} break;
|
||||
case ARGP_KEY_ARG: {
|
||||
if (state->arg_num >= 1) {
|
||||
/* Too many arguments. */
|
||||
od_usage(instance, instance->exec_path);
|
||||
return ARGP_KEY_ERROR;
|
||||
}
|
||||
|
||||
instance->config_file = strdup(arg);
|
||||
} break;
|
||||
case ARGP_KEY_END:
|
||||
if (state->arg_num < 1) {
|
||||
/* Not enough arguments. */
|
||||
od_usage(instance, instance->exec_path);
|
||||
return ARGP_KEY_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return ARGP_ERR_UNKNOWN;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern od_retcode_t od_apply_validate_cli_args(od_logger_t *logger,
|
||||
od_config_t *conf,
|
||||
od_arguments_t *args);
|
||||
#endif // OD_OPTION_H
|
Loading…
Reference in New Issue