mirror of
https://github.com/systemd/systemd.git
synced 2025-03-24 14:50:17 +03:00
sysctl: implement native sysctl tool to support Debian-style /etc/sysctl.d
This commit is contained in:
parent
40f9afa721
commit
8e1bd70d4c
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
systemd-sysctl
|
||||
test-strv
|
||||
systemd-ac-power
|
||||
systemd-timestamp
|
||||
|
19
Makefile.am
19
Makefile.am
@ -119,7 +119,8 @@ rootlibexec_PROGRAMS = \
|
||||
systemd-fsck \
|
||||
systemd-quotacheck \
|
||||
systemd-timestamp \
|
||||
systemd-ac-power
|
||||
systemd-ac-power \
|
||||
systemd-sysctl
|
||||
|
||||
if HAVE_LIBCRYPTSETUP
|
||||
rootlibexec_PROGRAMS += \
|
||||
@ -223,7 +224,6 @@ dist_systemunit_DATA = \
|
||||
units/var-run.mount \
|
||||
units/hwclock-load.service \
|
||||
units/hwclock-save.service \
|
||||
units/sysctl.service \
|
||||
units/remount-rootfs.service \
|
||||
units/printer.target \
|
||||
units/bluetooth.target \
|
||||
@ -261,6 +261,7 @@ nodist_systemunit_DATA = \
|
||||
units/systemd-ask-password-wall.service \
|
||||
units/systemd-ask-password-plymouth.service \
|
||||
units/systemd-ask-password-console.service \
|
||||
units/systemd-sysctl.service \
|
||||
units/syslog.target \
|
||||
units/halt.service \
|
||||
units/poweroff.service \
|
||||
@ -306,6 +307,7 @@ EXTRA_DIST = \
|
||||
units/systemd-ask-password-wall.service.in \
|
||||
units/systemd-ask-password-plymouth.service.in \
|
||||
units/systemd-ask-password-console.service.in \
|
||||
units/systemd-sysctl.service.in \
|
||||
units/syslog.target.in \
|
||||
units/halt.service.in \
|
||||
units/poweroff.service.in \
|
||||
@ -713,6 +715,15 @@ systemd_tmpfiles_CFLAGS = \
|
||||
systemd_tmpfiles_LDADD = \
|
||||
libsystemd-basic.la
|
||||
|
||||
systemd_sysctl_SOURCES = \
|
||||
src/sysctl.c
|
||||
|
||||
systemd_sysctl_CFLAGS = \
|
||||
$(AM_CFLAGS)
|
||||
|
||||
systemd_sysctl_LDADD = \
|
||||
libsystemd-basic.la
|
||||
|
||||
systemd_fsck_SOURCES = \
|
||||
src/fsck.c \
|
||||
src/dbus-common.c
|
||||
@ -1227,7 +1238,7 @@ install-data-hook:
|
||||
systemd-modules-load.service \
|
||||
systemd-random-seed-load.service \
|
||||
systemd-tmpfiles-setup.service \
|
||||
sysctl.service \
|
||||
systemd-sysctl.service \
|
||||
systemd-ask-password-console.path && \
|
||||
$(LN_S) ../dev-hugepages.automount dev-hugepages.automount && \
|
||||
$(LN_S) ../dev-mqueue.automount dev-mqueue.automount && \
|
||||
@ -1238,7 +1249,7 @@ install-data-hook:
|
||||
$(LN_S) ../systemd-modules-load.service systemd-modules-load.service && \
|
||||
$(LN_S) ../systemd-random-seed-load.service systemd-random-seed-load.service && \
|
||||
$(LN_S) ../systemd-tmpfiles-setup.service systemd-tmpfiles-setup.service && \
|
||||
$(LN_S) ../sysctl.service sysctl.service && \
|
||||
$(LN_S) ../systemd-sysctl.service systemd-sysctl.service && \
|
||||
$(LN_S) ../systemd-ask-password-console.path systemd-ask-password-console.path )
|
||||
( cd $(DESTDIR)$(systemunitdir)/basic.target.wants && \
|
||||
rm -f systemd-tmpfiles-clean.timer && \
|
||||
|
2
TODO
2
TODO
@ -75,7 +75,7 @@
|
||||
|
||||
* isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target
|
||||
|
||||
* add to cpu cgroup by default
|
||||
* read description string from device in crypttsetup
|
||||
|
||||
External:
|
||||
|
||||
|
148
src/sysctl.c
Normal file
148
src/sysctl.c
Normal file
@ -0,0 +1,148 @@
|
||||
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright 2010 Lennart Poettering
|
||||
|
||||
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.
|
||||
|
||||
systemd is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <ftw.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "util.h"
|
||||
|
||||
#define PROC_SYS_PREFIX "/proc/sys/"
|
||||
|
||||
static int exit_code = 0;
|
||||
|
||||
static void apply_sysctl(const char *property, const char *value) {
|
||||
char *p, *n;
|
||||
int r;
|
||||
|
||||
log_debug("Setting '%s' to '%s'", property, value);
|
||||
|
||||
if (!(p = new(char, sizeof(PROC_SYS_PREFIX) + strlen(property)))) {
|
||||
log_error("Out of memory");
|
||||
exit_code = -ENOMEM;
|
||||
}
|
||||
|
||||
n = stpcpy(p, PROC_SYS_PREFIX);
|
||||
strcpy(n, property);
|
||||
|
||||
for (; *n; n++)
|
||||
if (*n == '.')
|
||||
*n = '/';
|
||||
|
||||
if ((r = write_one_line_file(p, value)) < 0) {
|
||||
log_warning("Failed to write '%s' to '%s': %s", value, p, strerror(-r));
|
||||
exit_code = r;
|
||||
}
|
||||
|
||||
free(p);
|
||||
}
|
||||
|
||||
static void apply_file(const char *path) {
|
||||
FILE *f;
|
||||
|
||||
assert(path);
|
||||
|
||||
if (!(f = fopen(path, "re"))) {
|
||||
log_error("Failed to open file '%s', ignoring: %m", path);
|
||||
exit_code = -errno;
|
||||
return;
|
||||
}
|
||||
|
||||
while (!feof(f)) {
|
||||
char l[LINE_MAX], *p, *value;
|
||||
|
||||
if (!fgets(l, sizeof(l), f)) {
|
||||
if (feof(f))
|
||||
break;
|
||||
|
||||
log_error("Failed to read file '%s', ignoring: %m", path);
|
||||
exit_code = -errno;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
p = strstrip(l);
|
||||
|
||||
if (!*p)
|
||||
continue;
|
||||
|
||||
if (strchr(COMMENTS, *p))
|
||||
continue;
|
||||
|
||||
if (!(value = strchr(p, '='))) {
|
||||
log_error("Line is not an assignment in file '%s': %s", path, value);
|
||||
exit_code = -EINVAL;
|
||||
continue;
|
||||
}
|
||||
|
||||
*value = 0;
|
||||
value++;
|
||||
|
||||
apply_sysctl(strstrip(p), strstrip(value));
|
||||
}
|
||||
|
||||
finish:
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
static int nftw_cb(
|
||||
const char *fpath,
|
||||
const struct stat *sb,
|
||||
int tflag,
|
||||
struct FTW *ftwbuf) {
|
||||
|
||||
if (tflag != FTW_F)
|
||||
return 0;
|
||||
|
||||
if (ignore_file(fpath + ftwbuf->base))
|
||||
return 0;
|
||||
|
||||
if (!endswith(fpath, ".conf"))
|
||||
return 0;
|
||||
|
||||
apply_file(fpath);
|
||||
return 0;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
if (argc > 2) {
|
||||
log_error("This program expects one or no arguments.");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
log_set_target(LOG_TARGET_AUTO);
|
||||
log_parse_environment();
|
||||
log_open();
|
||||
|
||||
if (argc > 1)
|
||||
nftw(argv[1], nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
|
||||
else {
|
||||
nftw("/etc/sysctl.conf", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
|
||||
nftw("/etc/sysctl.d", nftw_cb, 64, FTW_MOUNT|FTW_PHYS);
|
||||
}
|
||||
|
||||
return exit_code < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
@ -495,6 +495,9 @@ int write_one_line_file(const char *fn, const char *line) {
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!endswith(line, "\n"))
|
||||
fputc('\n', f);
|
||||
|
||||
r = 0;
|
||||
finish:
|
||||
fclose(f);
|
||||
|
1
units/.gitignore
vendored
1
units/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
systemd-sysctl.service
|
||||
systemd-ask-password-console.service
|
||||
rescue.service
|
||||
systemd-ask-password-plymouth.service
|
||||
|
@ -12,9 +12,9 @@ Conflicts=shutdown.target
|
||||
After=systemd-readahead-collect.service systemd-readahead-replay.service
|
||||
Before=basic.target shutdown.target
|
||||
ConditionPathExists=/etc/sysctl.conf
|
||||
ConditionDirectoryNotEmpty=/etc/sysctl.d
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/sbin/sysctl -e -q -p /etc/sysctl.conf
|
||||
StandardOutput=syslog
|
||||
ExecStart=@rootlibexecdir@/systemd-sysctl
|
Loading…
x
Reference in New Issue
Block a user