mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 12:13:33 +08:00
main: implement manager configuration file
This commit is contained in:
parent
c846ff4798
commit
487393e9f1
@ -38,10 +38,12 @@ systemunitdir=$(rootdir)/lib/systemd/system
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-include $(top_builddir)/config.h \
|
||||
-DSYSTEM_CONFIG_FILE=\"$(pkgsysconfdir)/system.conf\" \
|
||||
-DSYSTEM_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/system\" \
|
||||
-DSYSTEM_DATA_UNIT_PATH=\"$(systemunitdir)\" \
|
||||
-DSYSTEM_SYSVINIT_PATH=\"$(SYSTEM_SYSVINIT_PATH)\" \
|
||||
-DSYSTEM_SYSVRCND_PATH=\"$(SYSTEM_SYSVRCND_PATH)\" \
|
||||
-DSESSION_CONFIG_FILE=\"$(pkgsysconfdir)/session.conf\" \
|
||||
-DSESSION_CONFIG_UNIT_PATH=\"$(pkgsysconfdir)/session\" \
|
||||
-DSESSION_DATA_UNIT_PATH=\"$(sessionunitdir)\" \
|
||||
-DCGROUP_AGENT_PATH=\"$(rootlibexecdir)/systemd-cgroups-agent\" \
|
||||
@ -81,6 +83,9 @@ pamlib_LTLIBRARIES = \
|
||||
pam_systemd.la
|
||||
endif
|
||||
|
||||
dist_pkgsysconf_DATA = \
|
||||
src/system.conf
|
||||
|
||||
dist_dbuspolicy_DATA = \
|
||||
src/org.freedesktop.systemd1.conf
|
||||
|
||||
|
@ -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_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
|
||||
|
@ -43,33 +43,6 @@
|
||||
#define COMMENTS "#;\n"
|
||||
#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(
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
@ -496,8 +469,8 @@ static int config_parse_usec(
|
||||
return 0;
|
||||
}
|
||||
|
||||
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_type, service_type, ServiceType, "Failed to parse service type");
|
||||
static DEFINE_CONFIG_PARSE_ENUM(config_parse_service_restart, service_restart, ServiceRestart, "Failed to parse service restart specifier");
|
||||
|
||||
static int config_parse_bindtodevice(
|
||||
const char *filename,
|
||||
@ -528,8 +501,8 @@ static int config_parse_bindtodevice(
|
||||
return 0;
|
||||
}
|
||||
|
||||
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_output, exec_output, ExecOutput, "Failed to parse output specifier");
|
||||
static DEFINE_CONFIG_PARSE_ENUM(config_parse_input, exec_input, ExecInput, "Failed to parse input specifier");
|
||||
|
||||
static int config_parse_facility(
|
||||
const char *filename,
|
||||
@ -725,13 +698,13 @@ static int config_parse_cpu_affinity(
|
||||
if (!(t = strndup(w, l)))
|
||||
return -ENOMEM;
|
||||
|
||||
r = safe_atou(t, &cpu);
|
||||
free(t);
|
||||
|
||||
if (!(c->cpuset))
|
||||
if (!(c->cpuset = cpu_set_malloc(&c->cpuset_ncpus)))
|
||||
return -ENOMEM;
|
||||
|
||||
r = safe_atou(t, &cpu);
|
||||
free(t);
|
||||
|
||||
if (r < 0 || cpu >= c->cpuset_ncpus) {
|
||||
log_error("[%s:%u] Failed to parse CPU affinity: %s", filename, line, rvalue);
|
||||
return -EBADMSG;
|
||||
@ -973,7 +946,7 @@ static int config_parse_sysv_priority(
|
||||
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(
|
||||
const char *filename,
|
||||
@ -1234,7 +1207,7 @@ static int config_parse_ip_tos(
|
||||
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
|
||||
|
||||
|
167
src/main.c
167
src/main.c
@ -42,6 +42,7 @@
|
||||
#include "load-fragment.h"
|
||||
#include "fdset.h"
|
||||
#include "special.h"
|
||||
#include "conf-parser.h"
|
||||
|
||||
static enum {
|
||||
ACTION_RUN,
|
||||
@ -338,6 +339,169 @@ static int parse_proc_cmdline_word(const char *word) {
|
||||
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) {
|
||||
char *line;
|
||||
int r;
|
||||
@ -694,6 +858,9 @@ int main(int argc, char *argv[]) {
|
||||
/* If we are init, we can block sigkill. Yay. */
|
||||
ignore_signals(SIGNALS_IGNORE, -1);
|
||||
|
||||
if (parse_config_file() < 0)
|
||||
goto finish;
|
||||
|
||||
if (arg_running_as == MANAGER_SYSTEM)
|
||||
if (parse_proc_cmdline() < 0)
|
||||
goto finish;
|
||||
|
19
src/system.conf
Normal file
19
src/system.conf
Normal file
@ -0,0 +1,19 @@
|
||||
# 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
|
Loading…
Reference in New Issue
Block a user