[type/__hwclock] Add new type
This commit is contained in:
parent
b5a40eb0d1
commit
ebf471e8d0
7 changed files with 403 additions and 0 deletions
28
cdist/conf/type/__hwclock/explorer/adjtime_mode
Executable file
28
cdist/conf/type/__hwclock/explorer/adjtime_mode
Executable file
|
@ -0,0 +1,28 @@
|
|||
#!/bin/sh -e
|
||||
#
|
||||
# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# cdist 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 cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Prints the clock mode read from the /etc/adjtime file, if present.
|
||||
#
|
||||
|
||||
# not all operating systems use an adjfile
|
||||
test -f /etc/adjtime || exit 0
|
||||
|
||||
# 3rd line is clock mode
|
||||
# adjtime(5) https://man7.org/linux/man-pages/man5/adjtime.5.html
|
||||
sed -n 3p /etc/adjtime
|
27
cdist/conf/type/__hwclock/explorer/timedatectl_localrtc
Executable file
27
cdist/conf/type/__hwclock/explorer/timedatectl_localrtc
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh -e
|
||||
#
|
||||
# 2020 Dennis Camera (dennis.camera at ssrq-sds-fds.ch)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# cdist 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 cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Prints the LocalRTC property using timedatectl on systemd-based systems.
|
||||
#
|
||||
|
||||
command -v timedatectl >/dev/null 2>&1 || exit 0
|
||||
|
||||
# NOTE: Older versions of timedatectl do not support `timedatectl show'
|
||||
timedatectl --no-pager status \
|
||||
| awk -F': ' '$1 ~ "RTC in local TZ$" { sub(/[ \t]*$/, "", $2); print $2 }'
|
62
cdist/conf/type/__hwclock/gencode-remote
Executable file
62
cdist/conf/type/__hwclock/gencode-remote
Executable file
|
@ -0,0 +1,62 @@
|
|||
#!/bin/sh -e
|
||||
#
|
||||
# 2020 Dennis Camera (dennis.camera@ssrq-sds-fds.ch)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# cdist 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 cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
mode=$(cat "${__object:?}/parameter/mode")
|
||||
|
||||
timedatectl_localrtc=$(cat "${__object:?}/explorer/timedatectl_localrtc")
|
||||
adjtime_mode=$(cat "${__object:?}/explorer/adjtime_mode")
|
||||
|
||||
|
||||
case ${mode}
|
||||
in
|
||||
(localtime)
|
||||
adjtime_str=LOCAL
|
||||
local_rtc_str=yes
|
||||
;;
|
||||
(UTC|utc)
|
||||
adjtime_str=UTC
|
||||
local_rtc_str=no
|
||||
;;
|
||||
(*)
|
||||
printf 'Invalid value for --mode: %s\n' "${mode}" >&2
|
||||
printf 'Acceptable values are: localtime, utc.\n' >&2
|
||||
exit 1
|
||||
esac
|
||||
|
||||
|
||||
if test -n "${timedatectl_localrtc}"
|
||||
then
|
||||
# systemd
|
||||
timedatectl_should=${local_rtc_str}
|
||||
if test "${timedatectl_localrtc}" != "${timedatectl_should}"
|
||||
then
|
||||
printf 'timedatectl set-local-rtc %s\n' "${timedatectl_should}"
|
||||
fi
|
||||
elif test -n "${adjtime_mode}"
|
||||
then
|
||||
# others (update /etc/adjtime if present)
|
||||
if test "${adjtime_mode}" != "${adjtime_str}"
|
||||
then
|
||||
# Update /etc/adjtime (3rd line is clock mode)
|
||||
# adjtime(5) https://man7.org/linux/man-pages/man5/adjtime.5.html
|
||||
# FIXME: Should maybe add third line if adjfile only contains two lines
|
||||
printf "sed -i '3c\\\\\\n%s\\n' /etc/adjtime\\n" "${adjtime_str}"
|
||||
fi
|
||||
fi
|
63
cdist/conf/type/__hwclock/man.rst
Normal file
63
cdist/conf/type/__hwclock/man.rst
Normal file
|
@ -0,0 +1,63 @@
|
|||
cdist-type__hwclock(7)
|
||||
======================
|
||||
|
||||
NAME
|
||||
----
|
||||
cdist-type__hwclock - Manage the hardware real time clock.
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
This type can be used to control how the hardware clock is used by the operating
|
||||
system.
|
||||
|
||||
|
||||
REQUIRED PARAMETERS
|
||||
-------------------
|
||||
mode
|
||||
What mode the hardware clock is in.
|
||||
|
||||
Acceptable values:
|
||||
|
||||
localtime
|
||||
The hardware clock is set to local time (common for systems also running
|
||||
Windows.)
|
||||
UTC
|
||||
The hardware clock is set to UTC (common on UNIX systems.)
|
||||
|
||||
|
||||
OPTIONAL PARAMETERS
|
||||
-------------------
|
||||
None.
|
||||
|
||||
|
||||
BOOLEAN PARAMETERS
|
||||
------------------
|
||||
None.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
# Make the operating system treat the time read from the hwclock as UTC.
|
||||
__hwclock --mode UTC
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
:strong:`hwclock`\ (8)
|
||||
|
||||
|
||||
AUTHORS
|
||||
-------
|
||||
Dennis Camera <dennis.camera@ssrq-sds-fds.ch>
|
||||
|
||||
|
||||
COPYING
|
||||
-------
|
||||
Copyright \(C) 2020 Dennis Camera. 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 3 of the
|
||||
License, or (at your option) any later version.
|
222
cdist/conf/type/__hwclock/manifest
Executable file
222
cdist/conf/type/__hwclock/manifest
Executable file
|
@ -0,0 +1,222 @@
|
|||
#!/bin/sh -e
|
||||
#
|
||||
# 2020 Dennis Camera (dennis.camera@ssrq-sds-fds.ch)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# cdist 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 cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# TODO: Consider supporting BADYEAR
|
||||
|
||||
os=$(cat "${__global:?}/explorer/os")
|
||||
mode=$(cat "${__object:?}/parameter/mode")
|
||||
|
||||
has_systemd_timedatectl=$(test -s "${__object:?}/explorer/timedatectl_localrtc" && echo true || echo false)
|
||||
|
||||
|
||||
case ${mode}
|
||||
in
|
||||
(localtime)
|
||||
local_clock=true
|
||||
;;
|
||||
(UTC|utc)
|
||||
local_clock=false
|
||||
;;
|
||||
(*)
|
||||
printf 'Invalid value for --mode: %s\n' "${mode}" >&2
|
||||
printf 'Acceptable values are: UTC, localtime.\n' >&2
|
||||
exit 1
|
||||
esac
|
||||
|
||||
|
||||
case ${os}
|
||||
in
|
||||
(alpine|gentoo)
|
||||
if ! $has_systemd_timedatectl
|
||||
then
|
||||
# NOTE: Gentoo also supports systemd, in which case /etc/conf.d is
|
||||
# not used. So we check for systemd presence here and only
|
||||
# update /etc/conf.d if systemd is not installed.
|
||||
# https://wiki.gentoo.org/wiki/System_time#Hardware_clock
|
||||
|
||||
export CDIST_ORDER_DEPENDENCY=true
|
||||
__file /etc/conf.d/hwclock --state present \
|
||||
--owner root --group root --mode 0644
|
||||
__key_value /etc/conf.d/hwclock:clock \
|
||||
--file /etc/conf.d/hwclock \
|
||||
--key clock \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--value "\"$($local_clock && echo local || echo UTC)\""
|
||||
unset CDIST_ORDER_DEPENDENCY
|
||||
fi
|
||||
;;
|
||||
(centos|fedora|redhat|scientific)
|
||||
os_version=$(cat "${__global:?}/explorer/os_version")
|
||||
os_major=$(expr "${os_version}" : '.* release \([0-9]*\)')
|
||||
case ${os}
|
||||
in
|
||||
(centos|scientific)
|
||||
update_sysconfig=$(test "${os_major}" -lt 6 && echo true || echo false)
|
||||
;;
|
||||
(fedora)
|
||||
update_sysconfig=$(test "${os_major}" -lt 10 && echo true || echo false)
|
||||
;;
|
||||
(redhat|*)
|
||||
case ${os_version}
|
||||
in
|
||||
('Red Hat Enterprise Linux'*)
|
||||
update_sysconfig=$(test "${os_major}" -lt 6 && echo true || echo false)
|
||||
;;
|
||||
('Red Hat Linux'*)
|
||||
update_sysconfig=true
|
||||
;;
|
||||
(*)
|
||||
printf 'Could not determine Red Hat distribution.\n' >&2
|
||||
printf "Please contribute an implementation for it if you can.\n" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
if ${update_sysconfig:?}
|
||||
then
|
||||
export CDIST_ORDER_DEPENDENCY=true
|
||||
__file /etc/sysconfig/clock --state present \
|
||||
--owner root --group root --mode 0644
|
||||
__key_value /etc/sysconfig/clock:UTC \
|
||||
--file /etc/sysconfig/clock \
|
||||
--key UTC \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--value "$($local_clock && echo false || echo true)"
|
||||
unset CDIST_ORDER_DEPENDENCY
|
||||
fi
|
||||
;;
|
||||
(debian|devuan|ubuntu)
|
||||
os_major=$(sed 's/[^0-9].*$//' "${__global:?}/explorer/os_version")
|
||||
|
||||
case ${os}
|
||||
in
|
||||
(debian)
|
||||
if test "${os_major}" -ge 7
|
||||
then
|
||||
update_rcS=false
|
||||
elif test "${os_major}" -ge 3
|
||||
then
|
||||
update_rcS=true
|
||||
else
|
||||
# Debian 2.2 should be supportable using rcS.
|
||||
# Debian 2.1 uses the ancient GMT key.
|
||||
# Debian 1.3 does not have rcS.
|
||||
printf "Your operating system (Debian %s) is currently not supported by this type (%s)\n" \
|
||||
"$(cat "${__global:?}/explorer/os_version")" "${__type##*/}" >&2
|
||||
printf "Please contribute an implementation for it if you can.\n" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
(devuan)
|
||||
update_rcS=false
|
||||
;;
|
||||
(ubuntu)
|
||||
update_rcS=$(test "${os_major}" -lt 16 && echo true || echo false)
|
||||
;;
|
||||
esac
|
||||
|
||||
if ${update_rcS}
|
||||
then
|
||||
export CDIST_ORDER_DEPENDENCY=true
|
||||
__file /etc/default/rcS --state present \
|
||||
--owner root --group root --mode 0644
|
||||
__key_value /etc/default/rcS:UTC \
|
||||
--file /etc/default/rcS \
|
||||
--key UTC \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--value "$($local_clock && echo no || echo yes)"
|
||||
unset CDIST_ORDER_DEPENDENCY
|
||||
fi
|
||||
;;
|
||||
(freebsd)
|
||||
# cf. adjkerntz(8)
|
||||
__file /etc/wall_cmos_clock \
|
||||
--state "$($local_clock && echo present || echo absent)" \
|
||||
--owner root --group wheel --mode 0444
|
||||
;;
|
||||
(netbsd)
|
||||
# https://wiki.netbsd.org/guide/boot/#index9h2
|
||||
__key_value /etc/rc.conf:rtclocaltime \
|
||||
--file /etc/rc.conf \
|
||||
--key rtclocaltime \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--value "$($local_clock && echo YES || echo NO)"
|
||||
;;
|
||||
(slackware)
|
||||
__file /etc/hardwareclock --owner root --group root --mode 0644 \
|
||||
--source - <<-EOF
|
||||
# /etc/hardwareclock
|
||||
#
|
||||
# Tells how the hardware clock time is stored.
|
||||
# This file is managed by cdist.
|
||||
|
||||
$($local_clock && echo localtime || echo UTC)
|
||||
EOF
|
||||
;;
|
||||
(suse)
|
||||
if test -s "${__global:?}/explorer/os_release"
|
||||
then
|
||||
# shellcheck source=/dev/null
|
||||
os_version=$(. "${__global:?}/explorer/os_release" && echo "${VERSION}")
|
||||
else
|
||||
os_version=$(sed -n 's/^VERSION\ *=\ *//p' "${__global:?}/explorer/os_version")
|
||||
fi
|
||||
os_major=$(expr "${os_version}" : '\([0-9]\{1,\}\)')
|
||||
|
||||
# TODO: Consider using `yast2 timezone set hwclock' instead
|
||||
if expr "${os_major}" \< 12
|
||||
then
|
||||
# Starting with SuSE 12 (first systemd-based version)
|
||||
# /etc/sysconfig/clock does not contain the HWCLOCK line
|
||||
# anymore.
|
||||
# With SuSE 13, it has been reduced to TIMEZONE configuration.
|
||||
__key_value /etc/sysconfig/clock:HWCLOCK \
|
||||
--file /etc/sysconfig/clock \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--key HWCLOCK \
|
||||
--value "$($local_clock && echo '"--localtime"' || echo '"-u"')"
|
||||
fi
|
||||
;;
|
||||
(void)
|
||||
export CDIST_ORDER_DEPENDENCY=true
|
||||
__file /etc/rc.conf \
|
||||
--owner root --group root --mode 0644 \
|
||||
--state present
|
||||
__key_value /etc/rc.conf:HARDWARECLOCK \
|
||||
--file /etc/rc.conf \
|
||||
--delimiter '=' --exact_delimiter \
|
||||
--key HARDWARECLOCK \
|
||||
--value "\"$($local_clock && echo localtime || echo UTC)\""
|
||||
unset CDIST_ORDER_DEPENDENCY
|
||||
;;
|
||||
(*)
|
||||
if ! $has_systemd_timedatectl
|
||||
then
|
||||
printf "Your operating system (%s) is currently not supported by this type (%s)\n" "$os" "${__type##*/}" >&2
|
||||
printf "Please contribute an implementation for it if you can.\n" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# NOTE: timedatectl set-local-rtc for systemd is in gencode-remote
|
||||
# NOTE: /etc/adjtime is also updated in gencode-remote
|
1
cdist/conf/type/__hwclock/parameter/required
Normal file
1
cdist/conf/type/__hwclock/parameter/required
Normal file
|
@ -0,0 +1 @@
|
|||
mode
|
0
cdist/conf/type/__hwclock/singleton
Normal file
0
cdist/conf/type/__hwclock/singleton
Normal file
Loading…
Reference in a new issue