Commit 487393e9 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

main: implement manager configuration file

parent c846ff47
...@@ -38,10 +38,12 @@ systemunitdir=$(rootdir)/lib/systemd/system ...@@ -38,10 +38,12 @@ systemunitdir=$(rootdir)/lib/systemd/system
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-include $(top_builddir)/config.h \ -include $(top_builddir)/config.h \
-DSYSTEM_CONFIG_FILE=\"$(pkgsysconfdir)/system.conf\" \
-DSYSTEM_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/system\" \ -DSYSTEM_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/system\" \
-DSYSTEM_DATA_UNIT_PATH=\"$(systemunitdir)\" \ -DSYSTEM_DATA_UNIT_PATH=\"$(systemunitdir)\" \
-DSYSTEM_SYSVINIT_PATH=\"$(SYSTEM_SYSVINIT_PATH)\" \ -DSYSTEM_SYSVINIT_PATH=\"$(SYSTEM_SYSVINIT_PATH)\" \
-DSYSTEM_SYSVRCND_PATH=\"$(SYSTEM_SYSVRCND_PATH)\" \ -DSYSTEM_SYSVRCND_PATH=\"$(SYSTEM_SYSVRCND_PATH)\" \
-DSESSION_CONFIG_FILE=\"$(pkgsysconfdir)/session.conf\" \
-DSESSION_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/session\" \ -DSESSION_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/session\" \
-DSESSION_DATA_UNIT_PATH=\"$(sessionunitdir)\" \ -DSESSION_DATA_UNIT_PATH=\"$(sessionunitdir)\" \
-DCGROUP_AGENT_PATH=\"$(rootlibexecdir)/systemd-cgroups-agent\" \ -DCGROUP_AGENT_PATH=\"$(rootlibexecdir)/systemd-cgroups-agent\" \
...@@ -81,6 +83,9 @@ pamlib_LTLIBRARIES = \ ...@@ -81,6 +83,9 @@ pamlib_LTLIBRARIES = \
pam_systemd.la pam_systemd.la
endif endif
dist_pkgsysconf_DATA = \
src/system.conf
dist_dbuspolicy_DATA = \ dist_dbuspolicy_DATA = \
src/org.freedesktop.systemd1.conf src/org.freedesktop.systemd1.conf
......
...@@ -53,4 +53,32 @@ int config_parse_path(const char *filename, unsigned line, const char *section, ...@@ -53,4 +53,32 @@ int config_parse_path(const char *filename, unsigned line, const char *section,
int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
int config_parse_path_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata); int config_parse_path_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
#define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \
int function( \
const char *filename, \
unsigned line, \
const char *section, \
const char *lvalue, \
const char *rvalue, \
void *data, \
void *userdata) { \
\
type *i = data, x; \
\
assert(filename); \
assert(lvalue); \
assert(rvalue); \
assert(data); \
\
if ((x = name##_from_string(rvalue)) < 0) { \
log_error("[%s:%u] " msg ": %s", filename, line, rvalue); \
return -EBADMSG; \
} \
\
*i = x; \
\
return 0; \
}
#endif #endif
...@@ -43,33 +43,6 @@ ...@@ -43,33 +43,6 @@
#define COMMENTS "#;\n" #define COMMENTS "#;\n"
#define LINE_MAX 4096 #define LINE_MAX 4096
#define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \
static int function( \
const char *filename, \
unsigned line, \
const char *section, \
const char *lvalue, \
const char *rvalue, \
void *data, \
void *userdata) { \
\
type *i = data, x; \
\
assert(filename); \
assert(lvalue); \
assert(rvalue); \
assert(data); \
\
if ((x = name##_from_string(rvalue)) < 0) { \
log_error("[%s:%u] " msg ": %s", filename, line, rvalue); \
return -EBADMSG; \
} \
\
*i = x; \
\
return 0; \
}
static int config_parse_deps( static int config_parse_deps(
const char *filename, const char *filename,
unsigned line, unsigned line,
...@@ -496,8 +469,8 @@ static int config_parse_usec( ...@@ -496,8 +469,8 @@ static int config_parse_usec(
return 0; return 0;
} }
DEFINE_CONFIG_PARSE_ENUM(config_parse_service_type, service_type, ServiceType, "Failed to parse service type"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_service_type, service_type, ServiceType, "Failed to parse service type");
DEFINE_CONFIG_PARSE_ENUM(config_parse_service_restart, service_restart, ServiceRestart, "Failed to parse service restart specifier"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_service_restart, service_restart, ServiceRestart, "Failed to parse service restart specifier");
static int config_parse_bindtodevice( static int config_parse_bindtodevice(
const char *filename, const char *filename,
...@@ -528,8 +501,8 @@ static int config_parse_bindtodevice( ...@@ -528,8 +501,8 @@ static int config_parse_bindtodevice(
return 0; return 0;
} }
DEFINE_CONFIG_PARSE_ENUM(config_parse_output, exec_output, ExecOutput, "Failed to parse output specifier"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_output, exec_output, ExecOutput, "Failed to parse output specifier");
DEFINE_CONFIG_PARSE_ENUM(config_parse_input, exec_input, ExecInput, "Failed to parse input specifier"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_input, exec_input, ExecInput, "Failed to parse input specifier");
static int config_parse_facility( static int config_parse_facility(
const char *filename, const char *filename,
...@@ -725,13 +698,13 @@ static int config_parse_cpu_affinity( ...@@ -725,13 +698,13 @@ static int config_parse_cpu_affinity(
if (!(t = strndup(w, l))) if (!(t = strndup(w, l)))
return -ENOMEM; return -ENOMEM;
r = safe_atou(t, &cpu);
free(t);
if (!(c->cpuset)) if (!(c->cpuset))
if (!(c->cpuset = cpu_set_malloc(&c->cpuset_ncpus))) if (!(c->cpuset = cpu_set_malloc(&c->cpuset_ncpus)))
return -ENOMEM; return -ENOMEM;
r = safe_atou(t, &cpu);
free(t);
if (r < 0 || cpu >= c->cpuset_ncpus) { if (r < 0 || cpu >= c->cpuset_ncpus) {
log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue); log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
return -EBADMSG; return -EBADMSG;
...@@ -973,7 +946,7 @@ static int config_parse_sysv_priority( ...@@ -973,7 +946,7 @@ static int config_parse_sysv_priority(
return 0; return 0;
} }
DEFINE_CONFIG_PARSE_ENUM(config_parse_kill_mode, kill_mode, KillMode, "Failed to parse kill mode"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_kill_mode, kill_mode, KillMode, "Failed to parse kill mode");
static int config_parse_mount_flags( static int config_parse_mount_flags(
const char *filename, const char *filename,
...@@ -1234,7 +1207,7 @@ static int config_parse_ip_tos( ...@@ -1234,7 +1207,7 @@ static int config_parse_ip_tos(
return 0; return 0;
} }
DEFINE_CONFIG_PARSE_ENUM(config_parse_notify_access, notify_access, NotifyAccess, "Failed to parse notify access specifier"); static DEFINE_CONFIG_PARSE_ENUM(config_parse_notify_access, notify_access, NotifyAccess, "Failed to parse notify access specifier");
#define FOLLOW_MAX 8 #define FOLLOW_MAX 8
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "load-fragment.h" #include "load-fragment.h"
#include "fdset.h" #include "fdset.h"
#include "special.h" #include "special.h"
#include "conf-parser.h"
static enum { static enum {
ACTION_RUN, ACTION_RUN,
...@@ -338,6 +339,169 @@ static int parse_proc_cmdline_word(const char *word) { ...@@ -338,6 +339,169 @@ static int parse_proc_cmdline_word(const char *word) {
return 0; return 0;
} }
static int config_parse_level(
const char *filename,
unsigned line,
const char *section,
const char *lvalue,
const char *rvalue,
void *data,
void *userdata) {
assert(filename);
assert(lvalue);
assert(rvalue);
log_set_max_level_from_string(rvalue);
return 0;
}
static int config_parse_target(
const char *filename,
unsigned line,
const char *section,
const char *lvalue,
const char *rvalue,
void *data,
void *userdata) {
assert(filename);
assert(lvalue);
assert(rvalue);
log_set_target_from_string(rvalue);
return 0;
}
static int config_parse_color(
const char *filename,
unsigned line,
const char *section,
const char *lvalue,
const char *rvalue,
void *data,
void *userdata) {
assert(filename);
assert(lvalue);
assert(rvalue);
log_show_color_from_string(rvalue);
return 0;
}
static int config_parse_location(
const char *filename,
unsigned line,
const char *section,
const char *lvalue,
const char *rvalue,
void *data,
void *userdata) {
assert(filename);
assert(lvalue);
assert(rvalue);
log_show_location_from_string(rvalue);
return 0;
}
static int config_parse_cpu_affinity(
const char *filename,
unsigned line,
const char *section,
const char *lvalue,
const char *rvalue,
void *data,
void *userdata) {
char *w;
size_t l;
char *state;
cpu_set_t *c = NULL;
unsigned ncpus = 0;
assert(filename);
assert(lvalue);
assert(rvalue);
FOREACH_WORD(w, l, rvalue, state) {
char *t;
int r;
unsigned cpu;
if (!(t = strndup(w, l)))
return -ENOMEM;
r = safe_atou(t, &cpu);
free(t);
if (!c)
if (!(c = cpu_set_malloc(&ncpus)))
return -ENOMEM;
if (r < 0 || cpu >= ncpus) {
log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
CPU_FREE(c);
return -EBADMSG;
}
CPU_SET_S(cpu, CPU_ALLOC_SIZE(ncpus), c);
}
if (c) {
if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0)
log_warning("Failed to set CPU affinity: %m");
CPU_FREE(c);
}
return 0;
}
static int parse_config_file(void) {
const ConfigItem items[] = {
{ "LogLevel", config_parse_level, NULL, "Manager" },
{ "LogTarget", config_parse_target, NULL, "Manager" },
{ "LogColor", config_parse_color, NULL, "Manager" },
{ "LogLocation", config_parse_location, NULL, "Manager" },
{ "DumpCore", config_parse_bool, &arg_dump_core, "Manager" },
{ "CrashShell", config_parse_bool, &arg_crash_shell, "Manager" },
{ "ShowStatus", config_parse_bool, &arg_show_status, "Manager" },
{ "CrashChVT", config_parse_int, &arg_crash_chvt, "Manager" },
{ "CPUAffinity", config_parse_cpu_affinity, NULL, "Manager" },
{ NULL, NULL, NULL, NULL }
};
static const char * const sections[] = {
"Manager",
NULL
};
FILE *f;
const char *fn;
int r;
fn = arg_running_as == MANAGER_SYSTEM ? SYSTEM_CONFIG_FILE : SESSION_CONFIG_FILE;
if (!(f = fopen(fn, "re"))) {
if (errno == ENOENT)
return 0;
log_warning("Failed to open configuration file '%s': %m", fn);
return 0;
}
if ((r = config_parse(fn, f, sections, items, false, NULL)) < 0)
log_warning("Failed to parse configuration file: %s", strerror(-r));
fclose(f);
return 0;
}
static int parse_proc_cmdline(void) { static int parse_proc_cmdline(void) {
char *line; char *line;
int r; int r;
...@@ -694,6 +858,9 @@ int main(int argc, char *argv[]) { ...@@ -694,6 +858,9 @@ int main(int argc, char *argv[]) {
/* If we are init, we can block sigkill. Yay. */ /* If we are init, we can block sigkill. Yay. */
ignore_signals(SIGNALS_IGNORE, -1); ignore_signals(SIGNALS_IGNORE, -1);
if (parse_config_file() < 0)
goto finish;
if (arg_running_as == MANAGER_SYSTEM) if (arg_running_as == MANAGER_SYSTEM)
if (parse_proc_cmdline() < 0) if (parse_proc_cmdline() < 0)
goto finish; goto finish;
......
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# See system.conf(5) for details
[Manager]
#LogLevel=info
#LogTarget=syslog-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#CrashShell=no
#ShowStatus=yes
#CrashChVT=1
#CPUAffinity=1 2
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment