1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-03 01:17:45 +03:00

Merge pull request #13136 from keszybz/readd-ntp-units.d

ntp-units.d support
This commit is contained in:
Lennart Poettering 2019-07-23 15:49:37 +02:00 committed by GitHub
commit 0eebcd4c68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 116 additions and 40 deletions

View File

@ -31,7 +31,7 @@
<para><filename>systemd-timedated</filename> is a system service <para><filename>systemd-timedated</filename> is a system service
that may be used as a mechanism to change the system clock and that may be used as a mechanism to change the system clock and
timezone, as well as to enable/disable NTP time synchronization. timezone, as well as to enable/disable network time synchronization.
<filename>systemd-timedated</filename> is automatically activated <filename>systemd-timedated</filename> is automatically activated
on request and terminates itself when it is unused.</para> on request and terminates itself when it is unused.</para>
@ -46,25 +46,36 @@
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>Environment</title> <title>List of network time synchronization services</title>
<variablelist class='environment-variables'> <para><command>systemd-timesyncd</command> will look for files with a <literal>.list</literal> extension
<varlistentry> in <filename>ntp-units.d/</filename> directories. Each file is parsed as a list of unit names, one per
<term><varname>$SYSTEMD_TIMEDATED_NTP_SERVICES</varname></term> line. Empty lines and lines with comments (<literal>#</literal>) are ignored. Files are read from
<filename>/usr/lib/systemd/ntp-units.d/</filename> and the corresponding directories under
<filename>/etc/</filename>, <filename>/run/</filename>, <filename>/usr/local/lib/</filename>. Files in
<filename>/etc/</filename> override files with the same name in <filename>/run/</filename>,
<filename>/usr/local/lib/</filename>, and <filename>/usr/lib/</filename>. Files in
<filename>/run/</filename> override files with the same name under <filename>/usr/</filename>. Packages
should install their configuration files in <filename>/usr/lib/</filename> (distribution packages) or
<filename>/usr/local/lib/</filename> (local installs).</para>
<listitem><para>Colon-separated list of unit names of NTP client services. <example>
If not set, then <title><filename>ntp-units.d/</filename> entry for <command>systemd-timesyncd</command></title>
<citerefentry><refentrytitle>systemd-timesyncd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry> <programlisting># /usr/lib/systemd/ntp-units.d/80-systemd-timesync.list
is used. See the entries of NTP related commands of systemd-timesyncd.service
<citerefentry><refentrytitle>timedatectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> </programlisting>
for details about this.</para> </example>
<para>Example: <para>If the environment variable <varname>$SYSTEMD_TIMEDATED_NTP_SERVICES</varname> is set,
<programlisting>SYSTEMD_TIMEDATED_NTP_SERVICES=ntpd.service:chronyd.service:systemd-timesyncd.service</programlisting> <command>systemd-timesyncd</command> will parse the contents of that variable as a colon-separated list
</para></listitem> of unit names. When set, this variable overrides the file-based list described above.</para>
</varlistentry>
</variablelist> <example>
<title>An override that specifies that <command>chronyd</command> should be used if available</title>
<programlisting>SYSTEMD_TIMEDATED_NTP_SERVICES=chronyd.service:systemd-timesyncd.service</programlisting>
</example>
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>See Also</title> <title>See Also</title>
<para> <para>

View File

@ -23,22 +23,25 @@
<refsynopsisdiv> <refsynopsisdiv>
<cmdsynopsis> <cmdsynopsis>
<command>timedatectl <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="req">COMMAND</arg></command> <command>timedatectl</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="req">COMMAND</arg>
</cmdsynopsis> </cmdsynopsis>
</refsynopsisdiv> </refsynopsisdiv>
<refsect1> <refsect1>
<title>Description</title> <title>Description</title>
<para><command>timedatectl</command> may be used to query and <para><command>timedatectl</command> may be used to query and change the system clock and its settings,
change the system clock and its settings.</para> and enable or disable time synchronization services.</para>
<para>Use <para>Use
<citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry> <citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
to initialize the system time zone for mounted (but not booted) to initialize the system time zone for mounted (but not booted)
system images.</para> system images.</para>
<para><command>timedatectl</command> may be used to show the current status of <para><command>timedatectl</command> may be used to show the current status of time synchronization
services, for example
<citerefentry><refentrytitle>systemd-timesyncd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>. <citerefentry><refentrytitle>systemd-timesyncd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
</para> </para>
@ -123,11 +126,8 @@
<varlistentry> <varlistentry>
<term><command>status</command></term> <term><command>status</command></term>
<listitem><para>Show current settings of the system clock and RTC, <listitem><para>Show current settings of the system clock and RTC, including whether network time
including whether network time synchronization through synchronization is active. If no command is specified, this is the implied default.
<filename>systemd-timesyncd.service</filename> is active. Even if it is
inactive, a different service might still synchronize the clock.
If no command is specified, this is the implied default.
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
@ -193,11 +193,11 @@
<varlistentry> <varlistentry>
<term><command>set-ntp [BOOL]</command></term> <term><command>set-ntp [BOOL]</command></term>
<listitem><para>Takes a boolean argument. Controls whether network time synchronization is active <listitem><para>Takes a boolean argument. Controls whether network time synchronization is active and
and enabled (if available). If the argument is true, this enables and starts the first existed enabled (if available). If the argument is true, this enables and starts the first existing network
service listed in the environment variable <varname>$SYSTEMD_TIMEDATED_NTP_SERVICES</varname> synchronization service. If the argument is false, then this disables and stops the known network
of <filename>systemd-timedated.service</filename>. If the argument is false, then this disables and synchronization services. The way that the list of services is built is described below.</para>
stops the all services listed in <varname>$SYSTEMD_TIMEDATED_NTP_SERVICES</varname>.</para></listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
@ -250,8 +250,7 @@
<refsect1> <refsect1>
<title>Exit status</title> <title>Exit status</title>
<para>On success, 0 is returned, a non-zero failure <para>On success, 0 is returned, a non-zero failure code otherwise.</para>
code otherwise.</para>
</refsect1> </refsect1>
<xi:include href="less-variables.xml" /> <xi:include href="less-variables.xml" />

View File

@ -157,6 +157,7 @@ systemdstatedir = join_paths(localstatedir, 'lib/systemd')
catalogstatedir = join_paths(systemdstatedir, 'catalog') catalogstatedir = join_paths(systemdstatedir, 'catalog')
randomseeddir = join_paths(localstatedir, 'lib/systemd') randomseeddir = join_paths(localstatedir, 'lib/systemd')
profiledir = join_paths(rootlibexecdir, 'portable', 'profile') profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
docdir = get_option('docdir') docdir = get_option('docdir')
if docdir == '' if docdir == ''

View File

@ -247,6 +247,11 @@ static int guess_type(const char **name, bool *is_usr, bool *is_collection, cons
if (path_equal(n, "kernel/install.d")) if (path_equal(n, "kernel/install.d"))
ext = ".install"; ext = ".install";
if (path_equal(n, "systemd/ntp-units.d")) {
coll = true;
ext = ".list";
}
if (PATH_IN_SET(n, "systemd/system-preset", "systemd/user-preset")) { if (PATH_IN_SET(n, "systemd/system-preset", "systemd/user-preset")) {
coll = true; coll = true;
ext = ".preset"; ext = ".preset";

View File

@ -15,7 +15,9 @@
#include "bus-error.h" #include "bus-error.h"
#include "bus-util.h" #include "bus-util.h"
#include "clock-util.h" #include "clock-util.h"
#include "conf-files.h"
#include "def.h" #include "def.h"
#include "fd-util.h"
#include "fileio-label.h" #include "fileio-label.h"
#include "fileio.h" #include "fileio.h"
#include "fs-util.h" #include "fs-util.h"
@ -36,6 +38,8 @@
#define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n" #define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
#define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n" #define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
#define UNIT_LIST_DIRS (const char* const*) CONF_PATHS_STRV("systemd/ntp-units.d")
typedef struct UnitStatusInfo { typedef struct UnitStatusInfo {
char *name; char *name;
char *load_state; char *load_state;
@ -117,20 +121,17 @@ static int context_add_ntp_service(Context *c, const char *s) {
return 0; return 0;
} }
static int context_parse_ntp_services(Context *c) { static int context_parse_ntp_services_from_environment(Context *c) {
const char *env, *p; const char *env, *p;
int r; int r;
assert(c); assert(c);
env = getenv("SYSTEMD_TIMEDATED_NTP_SERVICES"); env = getenv("SYSTEMD_TIMEDATED_NTP_SERVICES");
if (!env) { if (!env)
r = context_add_ntp_service(c, "systemd-timesyncd.service");
if (r < 0)
log_warning_errno(r, "Failed to add NTP service \"systemd-timesyncd.service\", ignoring: %m");
return 0; return 0;
}
log_debug("Using list of ntp services from environment variable $SYSTEMD_TIMEDATED_NTP_SERVICES.");
for (p = env;;) { for (p = env;;) {
_cleanup_free_ char *word = NULL; _cleanup_free_ char *word = NULL;
@ -150,7 +151,62 @@ static int context_parse_ntp_services(Context *c) {
log_warning_errno(r, "Failed to add NTP service \"%s\", ignoring: %m", word); log_warning_errno(r, "Failed to add NTP service \"%s\", ignoring: %m", word);
} }
return 0; return 1;
}
static int context_parse_ntp_services_from_disk(Context *c) {
_cleanup_strv_free_ char **files = NULL;
char **f;
int r;
r = conf_files_list_strv(&files, ".list", NULL, CONF_FILES_FILTER_MASKED, UNIT_LIST_DIRS);
if (r < 0)
return log_error_errno(r, "Failed to enumerate .list files: %m");
STRV_FOREACH(f, files) {
_cleanup_fclose_ FILE *file = NULL;
log_debug("Reading file '%s'", *f);
r = fopen_unlocked(*f, "re", &file);
if (r < 0) {
log_error_errno(r, "Failed to open %s, ignoring: %m", *f);
continue;
}
for (;;) {
_cleanup_free_ char *line = NULL;
const char *word;
r = read_line(file, LINE_MAX, &line);
if (r < 0) {
log_error_errno(r, "Failed to read %s, ignoring: %m", *f);
continue;
}
if (r == 0)
break;
word = strstrip(line);
if (isempty(word) || startswith("#", word))
continue;
r = context_add_ntp_service(c, word);
if (r < 0)
log_warning_errno(r, "Failed to add NTP service \"%s\", ignoring: %m", word);
}
}
return 1;
}
static int context_parse_ntp_services(Context *c) {
int r;
r = context_parse_ntp_services_from_environment(c);
if (r != 0)
return r;
return context_parse_ntp_services_from_disk(c);
} }
static int context_ntp_service_is_active(Context *c) { static int context_ntp_service_is_active(Context *c) {

View File

@ -0,0 +1 @@
systemd-timesyncd.service

View File

@ -32,6 +32,8 @@ if conf.get('ENABLE_TIMESYNCD') == 1
install_dir : dbuspolicydir) install_dir : dbuspolicydir)
install_data('org.freedesktop.timesync1.service', install_data('org.freedesktop.timesync1.service',
install_dir : dbussystemservicedir) install_dir : dbussystemservicedir)
install_data('80-systemd-timesync.list',
install_dir : ntpservicelistdir)
endif endif
############################################################ ############################################################

View File

@ -15,6 +15,7 @@ ConditionVirtualization=!container
DefaultDependencies=no DefaultDependencies=no
After=systemd-remount-fs.service systemd-sysusers.service After=systemd-remount-fs.service systemd-sysusers.service
Before=time-set.target sysinit.target shutdown.target Before=time-set.target sysinit.target shutdown.target
Conflicts=chronyd.service ntpd.service
Conflicts=shutdown.target Conflicts=shutdown.target
Wants=time-set.target time-sync.target Wants=time-set.target time-sync.target