From 053bd55d37a1fa1400644a0b3a7721530abd65d3 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Mon, 29 Mar 2021 18:49:17 +0200 Subject: [PATCH] mxqd: Add option --prerequisites --- mxq_daemon.h | 1 + mxqd.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/mxq_daemon.h b/mxq_daemon.h index c1069f46..65474982 100644 --- a/mxq_daemon.h +++ b/mxq_daemon.h @@ -49,6 +49,7 @@ struct mxq_daemon { int daemon_flags; char *tags; + char *prerequisites; }; void mxq_daemon_free_content(struct mxq_daemon *daemon); diff --git a/mxqd.c b/mxqd.c index 40160bb9..3941912f 100644 --- a/mxqd.c +++ b/mxqd.c @@ -44,6 +44,7 @@ #include "mxqd_control.h" #include "keywordset.h" +#include "parser.tab.h" #ifndef MXQ_INITIAL_PATH # define MXQ_INITIAL_PATH "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" @@ -79,8 +80,8 @@ static void print_usage(void) "options:\n" " -j, --slots default: depends on number of cores\n" " -m, --memory default: 2G\n" - " -t, --max-time default: 0 (unlimited)" - "\n" + " -t, --max-time default: 0 (unlimited)\n" + " --prerequisites default: ''\n" " -x, --max-memory-per-slot-soft \n" " root user: default: /\n" " non-root user: default: \n" @@ -424,6 +425,22 @@ static void read_cpufeatures(struct keywordset *kws) { fclose(proc_cpuinfo); } +static int expression_is_valid(char *expr) { + struct keywordset *tags = keywordset_new(NULL); + struct parser_context parser_context = { + .input = expr, + .tags = tags, + .pos = 0, + .result = 0, + }; + int sts = yyparse(&parser_context); + keywordset_free(tags); + if (sts) + return 0; + else + return 1; +} + int server_init(struct mxq_server *server, int argc, char *argv[]) { assert(server); @@ -438,6 +455,7 @@ int server_init(struct mxq_server *server, int argc, char *argv[]) char *arg_logdir = NULL; char *arg_initial_path; char *arg_initial_tmpdir; + char *arg_prerequisites = ""; char arg_daemonize = 0; char arg_nolog = 0; char arg_recoveronly = 0; @@ -478,6 +496,7 @@ int server_init(struct mxq_server *server, int argc, char *argv[]) MX_OPTION_OPTIONAL_ARG("mysql-default-file", 'M'), MX_OPTION_OPTIONAL_ARG("mysql-default-group", 'S'), MX_OPTION_OPTIONAL_ARG("max-time", 't'), + MX_OPTION_OPTIONAL_ARG("prerequisites", 11), MX_OPTION_END }; @@ -631,6 +650,10 @@ int server_init(struct mxq_server *server, int argc, char *argv[]) return -EX_USAGE; } break; + + case 11: + arg_prerequisites = optctl.optarg; + break; } } @@ -662,6 +685,11 @@ int server_init(struct mxq_server *server, int argc, char *argv[]) server->initial_tmpdir = arg_initial_tmpdir; server->recoveronly = arg_recoveronly; + if (*arg_prerequisites != 0 && !expression_is_valid(arg_prerequisites)) { + mx_log_err("syntax error in --prerequisites expression \"%s\"", arg_prerequisites); + return -EX_UNAVAILABLE; + } + server->flock = mx_flock(LOCK_EX, "/dev/shm/mxqd.%s.%s.lck", server->hostname, server->daemon_name); if (!server->flock) { mx_log_err("mx_flock(/dev/shm/mxqd.%s.%s.lck) failed: %m", server->hostname, server->daemon_name); @@ -812,6 +840,7 @@ int server_init(struct mxq_server *server, int argc, char *argv[]) daemon->daemon_maxtime = server->maxtime; daemon->daemon_memory_limit_slot_soft = server->memory_limit_slot_soft; daemon->daemon_memory_limit_slot_hard = server->memory_limit_slot_hard; + daemon->prerequisites = arg_prerequisites; server->tags=keywordset_new("true"); keywordset_add(server->tags, server->hostname);