From 3c9eb7bce769e7a902e437cdb411be9f5179fe27 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Thu, 15 Aug 2019 16:15:47 +0200 Subject: [PATCH 01/36] [__hostname] Support all systemd OSes and prefer hostnamectl --- cdist/conf/type/__hostname/explorer/hostname | 48 ++++++++++++++++++++ cdist/conf/type/__hostname/gencode-remote | 32 +++++++++---- cdist/conf/type/__hostname/manifest | 4 +- 3 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 cdist/conf/type/__hostname/explorer/hostname diff --git a/cdist/conf/type/__hostname/explorer/hostname b/cdist/conf/type/__hostname/explorer/hostname new file mode 100644 index 00000000..aaaa3a30 --- /dev/null +++ b/cdist/conf/type/__hostname/explorer/hostname @@ -0,0 +1,48 @@ +#!/bin/sh +# +# 2019 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 . +# +# +# Retrieve the running hostname +# + +# Firstly, check hostnamectl if available. +if command -v hostnamectl >/dev/null +then + hostnamectl --static && exit 0 +fi + + +# Almost any distribution +if [ -f /etc/hostname ]; then + cat /etc/hostname +# SuSE +elif [ -f /etc/HOSTNAME ]; then + cat /etc/HOSTNAME +# OpenBSD +elif [ -f /etc/myname ]; then + cat /etc/myname +# FreeBSD +elif [ "$(uname -s)" == FreeBSD ]; then + (. /etc/rc.conf && echo $hostname) +# Mac OS X +elif [ "$(uname -s)" == Darwin -a -f "$(command -v scutil)" ]; then + scutil --get HostName 2>/dev/null || hostname -s +else + command -v hostname && hostname -s +fi diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 8b5797dd..20de7078 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -2,6 +2,7 @@ # # 2014-2017 Steven Armstrong (steven-cdist at armstrong.cc) # 2014 Nico Schottelius (nico-cdist at schottelius.org) +# 2019 Dennis Camera (dennis.camera at ssrq-sds-fds.ch) # # This file is part of cdist. # @@ -46,8 +47,9 @@ case "$os" in fi ;; *) - echo "Unsupported os: $os" >&2 - exit 1 + if [ "$name_running" -a "$name_running" = "$name_should" ]; then + exit 0 + fi ;; esac @@ -56,23 +58,35 @@ esac # echo changed >> "$__messages_out" -# Use the good old way to set the hostname even on machines running systemd. + +# First try to set the hostname using hostnamectl, if available. +if [ "$has_hostnamectl" ]; then + # Allow hostnamectl to fail silently. + # Who the fuck invented a tool that needs dbus to set the hostname anyway ... + + cat < /etc/hostname + exit 0 +fi +EOF +fi + +# Use the good old way to set the hostname. Also if hostnamectl fails. case "$os" in archlinux|debian|ubuntu|devuan|centos|coreos|alpine) printf "printf '%%s\\\\n' '$name_should' > /etc/hostname\\n" echo "hostname -F /etc/hostname" ;; freebsd|openbsd) + # NOTE: Writing the hostname to file is done in the manifest. echo "hostname '$name_should'" ;; suse) echo "hostname '$name_should'" printf "printf '%%s\\\\n' '$name_should' > /etc/HOSTNAME\\n" ;; + *) + echo "echo 'Unsupported OS: $os' >&2; exit 1" + ;; esac - -if [ "$has_hostnamectl" ]; then - # Allow hostnamectl set-hostname to fail silently. - # Who the fuck invented a tool that needs dbus to set the hostname anyway ... - echo "hostnamectl set-hostname '$name_should' || true" -fi diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 8f1adf12..5ea3b8ff 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -2,6 +2,7 @@ # # 2012 Steven Armstrong (steven-cdist at armstrong.cc) # 2014 Nico Schottelius (nico-cdist at schottelius.org) +# 2019 Dennis Camera (dennis.camera at ssrq-sds-fds.ch) # # This file is part of cdist. # @@ -63,6 +64,7 @@ case "$os" in echo "$name_should" | __file /etc/myname --source - ;; *) - not_supported + # On other operating systems we fall back to hostnamectl if available… + test -n "$(cat "$__object/explorer/has_hostnamectl")" || not_supported ;; esac From 2804a8bae6de1f0c3ae376092a3102d8a6964373 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Thu, 15 Aug 2019 16:16:38 +0200 Subject: [PATCH 02/36] [__hostname] Add support for macosx --- cdist/conf/type/__hostname/explorer/hostname | 2 +- cdist/conf/type/__hostname/gencode-remote | 3 +++ cdist/conf/type/__hostname/manifest | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/hostname b/cdist/conf/type/__hostname/explorer/hostname index aaaa3a30..0b562d11 100644 --- a/cdist/conf/type/__hostname/explorer/hostname +++ b/cdist/conf/type/__hostname/explorer/hostname @@ -41,7 +41,7 @@ elif [ -f /etc/myname ]; then elif [ "$(uname -s)" == FreeBSD ]; then (. /etc/rc.conf && echo $hostname) # Mac OS X -elif [ "$(uname -s)" == Darwin -a -f "$(command -v scutil)" ]; then +elif [ "$(uname -s)" == Darwin -a -x "$(command -v scutil)" ]; then scutil --get HostName 2>/dev/null || hostname -s else command -v hostname && hostname -s diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 20de7078..ee12f822 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -86,6 +86,9 @@ case "$os" in echo "hostname '$name_should'" printf "printf '%%s\\\\n' '$name_should' > /etc/HOSTNAME\\n" ;; + macosx) + echo "scutil --set HostName '$name_should'" + ;; *) echo "echo 'Unsupported OS: $os' >&2; exit 1" ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 5ea3b8ff..fe067718 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -42,7 +42,7 @@ not_supported() { } case "$os" in - archlinux|debian|suse|ubuntu|devuan|coreos|alpine) + archlinux|debian|suse|ubuntu|devuan|coreos|alpine|macosx) # handled in gencode-remote : ;; From abc765bd99fae9e479dfed2a3d39e780a1ab3c34 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Mon, 30 Sep 2019 12:52:43 +0200 Subject: [PATCH 03/36] [__hostname/explorer/hostname] Darwin: Always fall back to hostname if scutil is missing or fails --- cdist/conf/type/__hostname/explorer/hostname | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/hostname b/cdist/conf/type/__hostname/explorer/hostname index 0b562d11..8aab1ec0 100644 --- a/cdist/conf/type/__hostname/explorer/hostname +++ b/cdist/conf/type/__hostname/explorer/hostname @@ -41,8 +41,8 @@ elif [ -f /etc/myname ]; then elif [ "$(uname -s)" == FreeBSD ]; then (. /etc/rc.conf && echo $hostname) # Mac OS X -elif [ "$(uname -s)" == Darwin -a -x "$(command -v scutil)" ]; then - scutil --get HostName 2>/dev/null || hostname -s +elif [ "$(uname -s)" == Darwin ]; then + [ -x "$(command -v scutil)" ] && scutil --get HostName 2>/dev/null || hostname -s else command -v hostname && hostname -s fi From 81ba849af8340ff3d59646d602a429b9170b9701 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Thu, 3 Oct 2019 19:19:06 +0200 Subject: [PATCH 04/36] Move __hostname hostname explorer to global scope --- cdist/conf/explorer/hostname | 24 ++++++++-- cdist/conf/type/__hostname/explorer/hostname | 48 ------------------- .../__hostname/explorer/hostname_sysconfig | 2 +- 3 files changed, 21 insertions(+), 53 deletions(-) delete mode 100644 cdist/conf/type/__hostname/explorer/hostname diff --git a/cdist/conf/explorer/hostname b/cdist/conf/explorer/hostname index 7715c6b0..13ac91c2 100755 --- a/cdist/conf/explorer/hostname +++ b/cdist/conf/explorer/hostname @@ -1,7 +1,6 @@ #!/bin/sh # -# 2010-2014 Nico Schottelius (nico-cdist at schottelius.org) -# 2012 Steven Armstrong (steven-cdist at armstrong.cc) +# 2019 Dennis Camera (dennis.camera at ssrq-sds-fds.ch) # # This file is part of cdist. # @@ -19,7 +18,24 @@ # along with cdist. If not, see . # # +# Retrieve the running hostname +# -if command -v uname >/dev/null; then - uname -n +# Firstly, check hostnamectl if available. +if command -v hostnamectl >/dev/null +then + hostnamectl status --static && exit 0 +fi + +# In case hostnamectl is missing or failed: +# We fall back to alternative approaches +if [ "$(uname -s)" = Darwin ] && command -v scutil >/dev/null +then + # Mac OS X + scutil --get HostName 2>/dev/null +elif command -v hostname >/dev/null +then + hostname -s +else + uname -n fi diff --git a/cdist/conf/type/__hostname/explorer/hostname b/cdist/conf/type/__hostname/explorer/hostname deleted file mode 100644 index 8aab1ec0..00000000 --- a/cdist/conf/type/__hostname/explorer/hostname +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh -# -# 2019 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 . -# -# -# Retrieve the running hostname -# - -# Firstly, check hostnamectl if available. -if command -v hostnamectl >/dev/null -then - hostnamectl --static && exit 0 -fi - - -# Almost any distribution -if [ -f /etc/hostname ]; then - cat /etc/hostname -# SuSE -elif [ -f /etc/HOSTNAME ]; then - cat /etc/HOSTNAME -# OpenBSD -elif [ -f /etc/myname ]; then - cat /etc/myname -# FreeBSD -elif [ "$(uname -s)" == FreeBSD ]; then - (. /etc/rc.conf && echo $hostname) -# Mac OS X -elif [ "$(uname -s)" == Darwin ]; then - [ -x "$(command -v scutil)" ] && scutil --get HostName 2>/dev/null || hostname -s -else - command -v hostname && hostname -s -fi diff --git a/cdist/conf/type/__hostname/explorer/hostname_sysconfig b/cdist/conf/type/__hostname/explorer/hostname_sysconfig index d0d7b4e7..4d6b8513 100755 --- a/cdist/conf/type/__hostname/explorer/hostname_sysconfig +++ b/cdist/conf/type/__hostname/explorer/hostname_sysconfig @@ -18,7 +18,7 @@ # along with cdist. If not, see . # # -# Retrieve the contents of /etc/hostname +# Retrieve the contents of /etc/sysconfig/network # if [ -f /etc/sysconfig/network ]; then From ee440ec61996b53889dff3327d1fd4c4fa0f2a57 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Thu, 3 Oct 2019 21:41:51 +0200 Subject: [PATCH 05/36] [__hostname] Compress state check --- cdist/conf/type/__hostname/gencode-remote | 29 +++++++++-------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index ee12f822..c6779a22 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -33,25 +33,18 @@ name_sysconfig=$(cat "$__object/explorer/hostname_sysconfig") has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") ################################################################################ -# If everything is ok -> exit +# Check if the hostname is already correct # -case "$os" in - archlinux|debian|suse|ubuntu|devuan|coreos|alpine) - if [ "$name_config" = "$name_should" ] && [ "$name_running" = "$name_should" ]; then - exit 0 - fi - ;; - scientific|centos|freebsd|openbsd) - if [ "$name_sysconfig" = "$name_should" ] && [ "$name_running" = "$name_should" ]; then - exit 0 - fi - ;; - *) - if [ "$name_running" -a "$name_running" = "$name_should" ]; then - exit 0 - fi - ;; -esac +if [ "$name_running" = "$name_should" ]; then + case "$os" in + archlinux|debian|suse|ubuntu|devuan|coreos|alpine) + [ "$name_config" != "$name_should" ] || exit 0 + ;; + scientific|centos|freebsd|openbsd) + [ "$name_sysconfig" != "$name_should" ] || exit 0 + ;; + esac +fi ################################################################################ # Setup hostname From f5342e9a35c6660004392f400c0843b26e65562a Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Fri, 4 Oct 2019 20:03:19 +0200 Subject: [PATCH 06/36] [explorer/hostname] Remove code reading persistent hostname --- cdist/conf/explorer/hostname | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/cdist/conf/explorer/hostname b/cdist/conf/explorer/hostname index 13ac91c2..a16afb65 100755 --- a/cdist/conf/explorer/hostname +++ b/cdist/conf/explorer/hostname @@ -21,19 +21,7 @@ # Retrieve the running hostname # -# Firstly, check hostnamectl if available. -if command -v hostnamectl >/dev/null -then - hostnamectl status --static && exit 0 -fi - -# In case hostnamectl is missing or failed: -# We fall back to alternative approaches -if [ "$(uname -s)" = Darwin ] && command -v scutil >/dev/null -then - # Mac OS X - scutil --get HostName 2>/dev/null -elif command -v hostname >/dev/null +if command -v hostname >/dev/null then hostname -s else From 56c654808d84630e82f60ae0376cf3e5b54274c2 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Fri, 4 Oct 2019 20:35:14 +0200 Subject: [PATCH 07/36] [__hostname] Unify persistent hostname explorers --- .../type/__hostname/explorer/hostname_file | 30 ----------- .../__hostname/explorer/hostname_sysconfig | 26 ---------- .../__hostname/explorer/persistent_hostname | 52 +++++++++++++++++++ cdist/conf/type/__hostname/gencode-remote | 14 ++--- 4 files changed, 55 insertions(+), 67 deletions(-) delete mode 100755 cdist/conf/type/__hostname/explorer/hostname_file delete mode 100755 cdist/conf/type/__hostname/explorer/hostname_sysconfig create mode 100755 cdist/conf/type/__hostname/explorer/persistent_hostname diff --git a/cdist/conf/type/__hostname/explorer/hostname_file b/cdist/conf/type/__hostname/explorer/hostname_file deleted file mode 100755 index 6a00aa9f..00000000 --- a/cdist/conf/type/__hostname/explorer/hostname_file +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh -# -# 2014 Nico Schottelius (nico-cdist at schottelius.org) -# -# 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 . -# -# -# Retrieve the contents of /etc/hostname -# - -# Almost any distribution -if [ -f /etc/hostname ]; then - cat /etc/hostname -# SuSE -elif [ -f /etc/HOSTNAME ]; then - cat /etc/HOSTNAME -fi diff --git a/cdist/conf/type/__hostname/explorer/hostname_sysconfig b/cdist/conf/type/__hostname/explorer/hostname_sysconfig deleted file mode 100755 index 4d6b8513..00000000 --- a/cdist/conf/type/__hostname/explorer/hostname_sysconfig +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# -# 2014 Nico Schottelius (nico-cdist at schottelius.org) -# -# 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 . -# -# -# Retrieve the contents of /etc/sysconfig/network -# - -if [ -f /etc/sysconfig/network ]; then - awk -F= '/^HOSTNAME=/ { print $2 }' /etc/sysconfig/network -fi diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname new file mode 100755 index 00000000..9ec5639b --- /dev/null +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -0,0 +1,52 @@ +#!/bin/sh +# +# 2019 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 . +# +# +# Retrieve the persistent hostname +# + +# Firstly, check hostnamectl if available. +if command -v hostnamectl >/dev/null +then + hostnamectl status --static && exit 0 +fi + +# In case hostnamectl is missing or failed: +# Fall back to alternative OS-specific approaches. +case $("$__explorer/os") +in + alpine|archlinux|coreos|debian|devuan|suse|ubuntu) + [ -f /etc/hostname ] && cat /etc/hostname + ;; + suse) + [ -f /etc/HOSTNAME ] && cat /etc/HOSTNAME + ;; + scientific|centos) + [ -f /etc/sysconfig/network ] && awk -F= '/^HOSTNAME=/ { print $2 }' /etc/sysconfig/network + ;; + freebsd) + (. /etc/rc.conf && echo "$hostname") + ;; + openbsd) + cat /etc/myname + ;; + macosx) + scutil --get HostName 2>/dev/null + ;; +esac diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index c6779a22..e7f32323 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -28,22 +28,14 @@ fi os=$(cat "$__global/explorer/os") name_running=$(cat "$__global/explorer/hostname") -name_config=$(cat "$__object/explorer/hostname_file") -name_sysconfig=$(cat "$__object/explorer/hostname_sysconfig") +name_config=$(cat "$__object/explorer/persistent_hostname") has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") ################################################################################ # Check if the hostname is already correct # -if [ "$name_running" = "$name_should" ]; then - case "$os" in - archlinux|debian|suse|ubuntu|devuan|coreos|alpine) - [ "$name_config" != "$name_should" ] || exit 0 - ;; - scientific|centos|freebsd|openbsd) - [ "$name_sysconfig" != "$name_should" ] || exit 0 - ;; - esac +if [ "$name_running" = "$name_should" ] && [ ! "$name_config" -o "$name_config" = "$name_should" ]; then + exit 0 fi ################################################################################ From 1bab641c948174d82653736bfbbd39b09aa61801 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 5 Oct 2019 18:43:06 +0200 Subject: [PATCH 08/36] [explorer/hostname] Do not shorten hostname in any case --- cdist/conf/explorer/hostname | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/explorer/hostname b/cdist/conf/explorer/hostname index a16afb65..dca004d1 100755 --- a/cdist/conf/explorer/hostname +++ b/cdist/conf/explorer/hostname @@ -23,7 +23,7 @@ if command -v hostname >/dev/null then - hostname -s + hostname else uname -n fi From d43eb5b22f11696d6992cbb6375806f7a8af133a Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 5 Oct 2019 20:10:52 +0200 Subject: [PATCH 09/36] [__hostname] Add support for NetBSD --- .../conf/type/__hostname/explorer/persistent_hostname | 10 ++++++++++ cdist/conf/type/__hostname/manifest | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index 9ec5639b..8909ebaa 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -43,6 +43,16 @@ in freebsd) (. /etc/rc.conf && echo "$hostname") ;; + netbsd) + if grep -q '^hostname=' /etc/rc.conf + then + (. /etc/rc.conf && echo "$hostname") + elif [ -f /etc/myname ] + then + # Fall back to /etc/myname file + cat /etc/myname + fi + ;; openbsd) cat /etc/myname ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index fe067718..b0948d24 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -60,6 +60,15 @@ case "$os" in --key 'hostname' \ --value "$name_should" ;; + netbsd) + __key_value rcconf-hostname \ + --file /etc/rc.conf \ + --delimiter '=' \ + --key 'hostname' \ + --value "\"$name_should\"" + # To avoid confusion, ensure that the hostname is only stored once + __file /etc/myname --state absent + ;; openbsd) echo "$name_should" | __file /etc/myname --source - ;; From 77210c349e70bd1f54394f1873c768ddb62d7ea9 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 17:56:37 +0200 Subject: [PATCH 10/36] [__hostname] Extend os switches with RedHat-derivatives (CentOS, Fedora, RedHat, Scientific) --- cdist/conf/type/__hostname/explorer/persistent_hostname | 2 +- cdist/conf/type/__hostname/gencode-remote | 6 +++--- cdist/conf/type/__hostname/manifest | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index 8909ebaa..ce71d06a 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -37,7 +37,7 @@ in suse) [ -f /etc/HOSTNAME ] && cat /etc/HOSTNAME ;; - scientific|centos) + centos|fedora|redhat|scientific) [ -f /etc/sysconfig/network ] && awk -F= '/^HOSTNAME=/ { print $2 }' /etc/sysconfig/network ;; freebsd) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index e7f32323..e3f1bee4 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -58,12 +58,12 @@ EOF fi # Use the good old way to set the hostname. Also if hostnamectl fails. -case "$os" in - archlinux|debian|ubuntu|devuan|centos|coreos|alpine) +case $os in + archlinux|debian|ubuntu|devuan|coreos|alpine) printf "printf '%%s\\\\n' '$name_should' > /etc/hostname\\n" echo "hostname -F /etc/hostname" ;; - freebsd|openbsd) + centos|fedora|redhat|scientific|freebsd|openbsd) # NOTE: Writing the hostname to file is done in the manifest. echo "hostname '$name_should'" ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index b0948d24..ccd11c4e 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -46,7 +46,7 @@ case "$os" in # handled in gencode-remote : ;; - scientific|centos) + centos|fedora|redhat|scientific) __key_value sysconfig-hostname \ --file /etc/sysconfig/network \ --delimiter '=' \ From 7bf203509bdaf42c88fbc67fbdd8dd1a15a6e21d Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:01:58 +0200 Subject: [PATCH 11/36] [__hostname] Use __key_value exact_delimiter for shell-like files --- cdist/conf/type/__hostname/manifest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index ccd11c4e..f1c17653 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -49,21 +49,21 @@ case "$os" in centos|fedora|redhat|scientific) __key_value sysconfig-hostname \ --file /etc/sysconfig/network \ - --delimiter '=' \ + --delimiter '=' --exact_delimiter \ --key HOSTNAME \ - --value "$name_should" --exact_delimiter + --value "\"$name_should\"" ;; freebsd) __key_value rcconf-hostname \ --file /etc/rc.conf \ - --delimiter '=' \ + --delimiter '=' --exact_delimiter \ --key 'hostname' \ --value "$name_should" ;; netbsd) __key_value rcconf-hostname \ --file /etc/rc.conf \ - --delimiter '=' \ + --delimiter '=' --exact_delimiter \ --key 'hostname' \ --value "\"$name_should\"" # To avoid confusion, ensure that the hostname is only stored once From 74568e8a0aa0f1e8222aff49c9b00f667694b0c3 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:02:24 +0200 Subject: [PATCH 12/36] [__hostname] Use FQDN as hostname on RedHat derivatives and BSDs --- cdist/conf/type/__hostname/manifest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index f1c17653..5d9eeeeb 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -25,10 +25,13 @@ if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" else case "$os" in - openbsd) + # RedHat-derivatives and BSDs + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) + # Hostname is FQDN name_should="${__target_host}" ;; *) + # Hostname is only first component of FQDN name_should="${__target_host%%.*}" ;; esac From 3e7cf68de590c755c74bd3542166a698b86b27d4 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:14:35 +0200 Subject: [PATCH 13/36] [__hostname] Source sysconfig file instead of processing through AWK This way quotes and expansions will be handled correctly. --- cdist/conf/type/__hostname/explorer/persistent_hostname | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index ce71d06a..6bc0786f 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -38,7 +38,8 @@ in [ -f /etc/HOSTNAME ] && cat /etc/HOSTNAME ;; centos|fedora|redhat|scientific) - [ -f /etc/sysconfig/network ] && awk -F= '/^HOSTNAME=/ { print $2 }' /etc/sysconfig/network + [ -f /etc/sysconfig/network ] \ + && (. /etc/sysconfig/network && echo "$HOSTNAME") ;; freebsd) (. /etc/rc.conf && echo "$hostname") From cbb108d61c20d2699946f819aff77de99b7bb94f Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:23:56 +0200 Subject: [PATCH 14/36] [__hostname] Copy FQDN-logic to gencode-remote Otherwise, the code-remote gets run on the remote every time. --- cdist/conf/type/__hostname/gencode-remote | 23 +++++++++++++++++------ cdist/conf/type/__hostname/manifest | 20 ++++++++++---------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index e3f1bee4..973d1d97 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -20,17 +20,28 @@ # along with cdist. If not, see . # -if [ -f "$__object/parameter/name" ]; then - name_should="$(cat "$__object/parameter/name")" -else - name_should="${__target_host%%.*}" -fi - os=$(cat "$__global/explorer/os") name_running=$(cat "$__global/explorer/hostname") name_config=$(cat "$__object/explorer/persistent_hostname") has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") + +if [ -f "$__object/parameter/name" ]; then + name_should="$(cat "$__object/parameter/name")" +else + case $os in + # RedHat-derivatives and BSDs + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) + # Hostname is FQDN + name_should="${__target_host}" + ;; + *) + # Hostname is only first component of FQDN + name_should="${__target_host%%.*}" + ;; + esac +fi + ################################################################################ # Check if the hostname is already correct # diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 5d9eeeeb..699f3e93 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -24,16 +24,16 @@ os=$(cat "$__global/explorer/os") if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" else - case "$os" in - # RedHat-derivatives and BSDs - centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) - # Hostname is FQDN - name_should="${__target_host}" - ;; - *) - # Hostname is only first component of FQDN - name_should="${__target_host%%.*}" - ;; + case $os in + # RedHat-derivatives and BSDs + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) + # Hostname is FQDN + name_should="${__target_host}" + ;; + *) + # Hostname is only first component of FQDN + name_should="${__target_host%%.*}" + ;; esac fi From 6e1a105c22021e0f98e63930eeade65b416aaa2d Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:36:43 +0200 Subject: [PATCH 15/36] [__hostname] Lint --- cdist/conf/type/__hostname/gencode-remote | 12 ++++++++---- cdist/conf/type/__hostname/manifest | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 973d1d97..b258165d 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -29,7 +29,8 @@ has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" else - case $os in + case $os + in # RedHat-derivatives and BSDs centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) # Hostname is FQDN @@ -45,14 +46,16 @@ fi ################################################################################ # Check if the hostname is already correct # -if [ "$name_running" = "$name_should" ] && [ ! "$name_config" -o "$name_config" = "$name_should" ]; then +if [ "$name_running" = "$name_should" ] \ + && [ -z "$name_config" -o "$name_config" = "$name_should" ] +then exit 0 fi ################################################################################ # Setup hostname # -echo changed >> "$__messages_out" +echo 'changed' >> "$__messages_out" # First try to set the hostname using hostnamectl, if available. @@ -69,7 +72,8 @@ EOF fi # Use the good old way to set the hostname. Also if hostnamectl fails. -case $os in +case $os +in archlinux|debian|ubuntu|devuan|coreos|alpine) printf "printf '%%s\\\\n' '$name_should' > /etc/hostname\\n" echo "hostname -F /etc/hostname" diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 699f3e93..18152c3e 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -24,7 +24,8 @@ os=$(cat "$__global/explorer/os") if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" else - case $os in + case $os + in # RedHat-derivatives and BSDs centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) # Hostname is FQDN @@ -44,7 +45,8 @@ not_supported() { exit 1 } -case "$os" in +case $os +in archlinux|debian|suse|ubuntu|devuan|coreos|alpine|macosx) # handled in gencode-remote : From da1d70e16ac56511fb03f30bf9c76645c01caab8 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 18:43:27 +0200 Subject: [PATCH 16/36] [__hostname] Also quote hostname in FreeBSD rc.conf --- cdist/conf/type/__hostname/manifest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 18152c3e..53e530d7 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -63,7 +63,7 @@ in --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ - --value "$name_should" + --value "\"$name_should\"" ;; netbsd) __key_value rcconf-hostname \ From 064e992a7aec8916a2bc65e5279f65bab4464140 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 21:03:49 +0200 Subject: [PATCH 17/36] [__hostname] Support openSUSE and replace printf with echo --- .../type/__hostname/explorer/persistent_hostname | 12 ++++++------ cdist/conf/type/__hostname/gencode-remote | 12 +++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index 6bc0786f..ec52bbd2 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -31,12 +31,9 @@ fi # Fall back to alternative OS-specific approaches. case $("$__explorer/os") in - alpine|archlinux|coreos|debian|devuan|suse|ubuntu) + alpine|archlinux|coreos|debian|devuan|ubuntu) [ -f /etc/hostname ] && cat /etc/hostname ;; - suse) - [ -f /etc/HOSTNAME ] && cat /etc/HOSTNAME - ;; centos|fedora|redhat|scientific) [ -f /etc/sysconfig/network ] \ && (. /etc/sysconfig/network && echo "$HOSTNAME") @@ -44,6 +41,9 @@ in freebsd) (. /etc/rc.conf && echo "$hostname") ;; + macosx) + scutil --get HostName 2>/dev/null + ;; netbsd) if grep -q '^hostname=' /etc/rc.conf then @@ -57,7 +57,7 @@ in openbsd) cat /etc/myname ;; - macosx) - scutil --get HostName 2>/dev/null + suse) + cat /etc/HOSTNAME 2>/dev/null ;; esac diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index b258165d..37ace1b7 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -75,20 +75,22 @@ fi case $os in archlinux|debian|ubuntu|devuan|coreos|alpine) - printf "printf '%%s\\\\n' '$name_should' > /etc/hostname\\n" + echo "printf '%s\\n' '$name_should' > /etc/hostname" echo "hostname -F /etc/hostname" ;; centos|fedora|redhat|scientific|freebsd|openbsd) # NOTE: Writing the hostname to file is done in the manifest. echo "hostname '$name_should'" ;; - suse) - echo "hostname '$name_should'" - printf "printf '%%s\\\\n' '$name_should' > /etc/HOSTNAME\\n" - ;; macosx) echo "scutil --set HostName '$name_should'" ;; + suse) + # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE + # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. + echo "printf '%s\\n' '$name_should' > /etc/HOSTNAME" + echo 'hostname -F /etc/HOSTNAME' + ;; *) echo "echo 'Unsupported OS: $os' >&2; exit 1" ;; From c11e757dfac865fc54f2bbe7b5ad015d25e813ad Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 6 Oct 2019 23:34:59 +0200 Subject: [PATCH 18/36] [__hostname] Add support for Gentoo --- .../conf/type/__hostname/explorer/persistent_hostname | 3 +++ cdist/conf/type/__hostname/gencode-remote | 10 +++++----- cdist/conf/type/__hostname/manifest | 7 +++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index ec52bbd2..141c44fe 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -41,6 +41,9 @@ in freebsd) (. /etc/rc.conf && echo "$hostname") ;; + gentoo) + (. /etc/conf.d/hostname && echo "$hostname") + ;; macosx) scutil --get HostName 2>/dev/null ;; diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 37ace1b7..64fff7ad 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -74,14 +74,10 @@ fi # Use the good old way to set the hostname. Also if hostnamectl fails. case $os in - archlinux|debian|ubuntu|devuan|coreos|alpine) + alpine|archlinux|coreos|debian|devuan|ubuntu) echo "printf '%s\\n' '$name_should' > /etc/hostname" echo "hostname -F /etc/hostname" ;; - centos|fedora|redhat|scientific|freebsd|openbsd) - # NOTE: Writing the hostname to file is done in the manifest. - echo "hostname '$name_should'" - ;; macosx) echo "scutil --set HostName '$name_should'" ;; @@ -91,6 +87,10 @@ in echo "printf '%s\\n' '$name_should' > /etc/HOSTNAME" echo 'hostname -F /etc/HOSTNAME' ;; + centos|fedora|freebsd|gentoo|netbsd|openbsd|redhat|scientific) + # NOTE: Writing the hostname to file is done in the manifest. + echo "hostname '$name_should'" + ;; *) echo "echo 'Unsupported OS: $os' >&2; exit 1" ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 53e530d7..0ffd7678 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -58,6 +58,13 @@ in --key HOSTNAME \ --value "\"$name_should\"" ;; + gentoo) + __key_value confd-hostname \ + --file /etc/conf.d/hostname \ + --delimiter '=' --exact_delimiter \ + --key 'hostname' \ + --value "\"$name_should\"" + ;; freebsd) __key_value rcconf-hostname \ --file /etc/rc.conf \ From 30c7d153e828afd52d1e76328622deb06aca6aaa Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 12 Oct 2019 18:47:27 +0200 Subject: [PATCH 19/36] [__hostname] Only write to distro specific file when hostnamectl is missing --- cdist/conf/type/__hostname/gencode-remote | 7 +++++- cdist/conf/type/__hostname/manifest | 30 +++++++++++++++-------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 64fff7ad..182d37ae 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -78,6 +78,11 @@ in echo "printf '%s\\n' '$name_should' > /etc/hostname" echo "hostname -F /etc/hostname" ;; + gentoo) + # NOTE: Writing the hostname to file is done in the manifest for OpenRC. + # For systemd hostnamectl should take care of that. + echo "hostname '$name_should'" + ;; macosx) echo "scutil --set HostName '$name_should'" ;; @@ -87,7 +92,7 @@ in echo "printf '%s\\n' '$name_should' > /etc/HOSTNAME" echo 'hostname -F /etc/HOSTNAME' ;; - centos|fedora|freebsd|gentoo|netbsd|openbsd|redhat|scientific) + centos|fedora|freebsd|netbsd|openbsd|redhat|scientific) # NOTE: Writing the hostname to file is done in the manifest. echo "hostname '$name_should'" ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 0ffd7678..58034a19 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -52,18 +52,28 @@ in : ;; centos|fedora|redhat|scientific) - __key_value sysconfig-hostname \ - --file /etc/sysconfig/network \ - --delimiter '=' --exact_delimiter \ - --key HOSTNAME \ - --value "\"$name_should\"" + if test -z "$(cat "$__object/explorer/has_hostnamectl")" + then + # Only write to /etc/sysconfig/network on non-systemd versions. + # On systemd-based versions this entry is ignored. + __key_value sysconfig-hostname \ + --file /etc/sysconfig/network \ + --delimiter '=' --exact_delimiter \ + --key HOSTNAME \ + --value "\"$name_should\"" + fi ;; gentoo) - __key_value confd-hostname \ - --file /etc/conf.d/hostname \ - --delimiter '=' --exact_delimiter \ - --key 'hostname' \ - --value "\"$name_should\"" + if test -z "$(cat "$__object/explorer/has_hostnamectl")" + then + # Only write to /etc/conf.d/hostname on OpenRC-based installations. + # On systemd use hostnamectl(1) in gencode-remote. + __key_value confd-hostname \ + --file /etc/conf.d/hostname \ + --delimiter '=' --exact_delimiter \ + --key 'hostname' \ + --value "\"$name_should\"" + fi ;; freebsd) __key_value rcconf-hostname \ From cee553a6dd27e2099e60763dec8bb9d061ef3aad Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 12 Oct 2019 18:49:31 +0200 Subject: [PATCH 20/36] [__hostname] Improve systemd hostname setting This means we write to /etc/hostname before running hostnamectl, so that it can overwrite the file if it wants to. --- cdist/conf/type/__hostname/gencode-remote | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 182d37ae..36593ef2 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -61,23 +61,29 @@ echo 'changed' >> "$__messages_out" # First try to set the hostname using hostnamectl, if available. if [ "$has_hostnamectl" ]; then # Allow hostnamectl to fail silently. - # Who the fuck invented a tool that needs dbus to set the hostname anyway ... + # Who the fuck invented a tool that needs dbus to set the hostname anyway… - cat < /etc/hostname - exit 0 -fi -EOF + # NOTE: We write the static hostname to /etc/hostname first in case + # hostnamectl fails. Fallback-code below will then adjust the running + # hostname below. + echo "printf '%s\\n' '$name_should' > /etc/hostname" + + echo "hostnamectl set-hostname '$name_should' && exit 0" fi # Use the good old way to set the hostname. Also if hostnamectl fails. case $os in - alpine|archlinux|coreos|debian|devuan|ubuntu) + alpine|archlinux|debian|devuan|ubuntu) echo "printf '%s\\n' '$name_should' > /etc/hostname" echo "hostname -F /etc/hostname" ;; + coreos|openbmc-phosphor) + # NOTE: systemd-only distros have the hostname already written above. + # But since hostamectl failed, we update the running hostname + # manually. + echo "hostname -F /etc/hostname" + ;; gentoo) # NOTE: Writing the hostname to file is done in the manifest for OpenRC. # For systemd hostnamectl should take care of that. From c3b066c14733fd62969abd7a36e3ac881ed71227 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Thu, 24 Oct 2019 19:44:51 +0200 Subject: [PATCH 21/36] [__hostname] Check hostname length if getconf(1) is available --- cdist/conf/type/__hostname/explorer/max_len | 10 ++++++++++ cdist/conf/type/__hostname/manifest | 18 ++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 cdist/conf/type/__hostname/explorer/max_len diff --git a/cdist/conf/type/__hostname/explorer/max_len b/cdist/conf/type/__hostname/explorer/max_len new file mode 100644 index 00000000..97d8a142 --- /dev/null +++ b/cdist/conf/type/__hostname/explorer/max_len @@ -0,0 +1,10 @@ +#!/bin/sh -e + +command -v getconf >/dev/null || exit 0 + +val=$(getconf HOST_NAME_MAX 2>/dev/null) + +if test -n "${val}" -a "${val}" != 'undefined' +then + echo "${val}" +fi diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 58034a19..2c6057d6 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -20,6 +20,13 @@ # along with cdist. If not, see . # +not_supported() { + echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 + echo "Please contribute an implementation for it if you can." >&2 + exit 1 +} + + os=$(cat "$__global/explorer/os") if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" @@ -38,12 +45,11 @@ else esac fi - -not_supported() { - echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 - echo "Please contribute an implementation for it if you can." >&2 - exit 1 -} +if test -n "${max_len}" -a "$(wc -c "${name_should}")" -gt "${max_len}"a +then + printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 + exit 1 +fi case $os in From 629d443f5aa61eaf8d41c066011108e2b3b9caa1 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Fri, 25 Oct 2019 01:40:48 +0200 Subject: [PATCH 22/36] [__hostname] Fix "command not found" errors with old Bash --- cdist/conf/type/__hostname/explorer/has_hostnamectl | 2 +- cdist/conf/type/__hostname/explorer/max_len | 2 +- cdist/conf/type/__hostname/explorer/persistent_hostname | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cdist/conf/type/__hostname/explorer/has_hostnamectl b/cdist/conf/type/__hostname/explorer/has_hostnamectl index 9040023d..2f531f30 100755 --- a/cdist/conf/type/__hostname/explorer/has_hostnamectl +++ b/cdist/conf/type/__hostname/explorer/has_hostnamectl @@ -21,4 +21,4 @@ # Check whether system has hostnamectl # -command -v hostnamectl || true +command -v hostnamectl 2>/dev/null || true diff --git a/cdist/conf/type/__hostname/explorer/max_len b/cdist/conf/type/__hostname/explorer/max_len index 97d8a142..fb863949 100644 --- a/cdist/conf/type/__hostname/explorer/max_len +++ b/cdist/conf/type/__hostname/explorer/max_len @@ -2,7 +2,7 @@ command -v getconf >/dev/null || exit 0 -val=$(getconf HOST_NAME_MAX 2>/dev/null) +val=$(getconf HOST_NAME_MAX 2>/dev/null) || exit 0 if test -n "${val}" -a "${val}" != 'undefined' then diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname index 141c44fe..0feb0809 100755 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ b/cdist/conf/type/__hostname/explorer/persistent_hostname @@ -22,7 +22,7 @@ # # Firstly, check hostnamectl if available. -if command -v hostnamectl >/dev/null +if command -v hostnamectl >/dev/null 2>&1 then hostnamectl status --static && exit 0 fi @@ -32,10 +32,10 @@ fi case $("$__explorer/os") in alpine|archlinux|coreos|debian|devuan|ubuntu) - [ -f /etc/hostname ] && cat /etc/hostname + test -f /etc/hostname && cat /etc/hostname ;; centos|fedora|redhat|scientific) - [ -f /etc/sysconfig/network ] \ + test -f /etc/sysconfig/network \ && (. /etc/sysconfig/network && echo "$HOSTNAME") ;; freebsd) From d4313c7501b39c09e01cee530ec36a7452bcfc53 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Fri, 25 Oct 2019 01:41:26 +0200 Subject: [PATCH 23/36] [__hostname] Fix checking of maximum hostname length against sysconf(3) --- cdist/conf/type/__hostname/manifest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 2c6057d6..f3739f6c 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -28,6 +28,8 @@ not_supported() { os=$(cat "$__global/explorer/os") +max_len=$(cat "$__object/explorer/max_len") + if [ -f "$__object/parameter/name" ]; then name_should="$(cat "$__object/parameter/name")" else @@ -45,7 +47,7 @@ else esac fi -if test -n "${max_len}" -a "$(wc -c "${name_should}")" -gt "${max_len}"a +if test -n "${max_len}" -a "$(printf "${name_should}" | wc -c)" -gt "${max_len}" then printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 exit 1 From b65ceba56936b581870754afa879284b686e057b Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Fri, 25 Oct 2019 02:16:43 +0200 Subject: [PATCH 24/36] [__hostame] Resolve shellcheck errors --- cdist/conf/type/__hostname/gencode-remote | 10 +++++----- cdist/conf/type/__hostname/manifest | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 36593ef2..5942b2e3 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -55,18 +55,18 @@ fi ################################################################################ # Setup hostname # -echo 'changed' >> "$__messages_out" +echo 'changed' >>"$__messages_out" # First try to set the hostname using hostnamectl, if available. -if [ "$has_hostnamectl" ]; then +if [ -n "$has_hostnamectl" ]; then # Allow hostnamectl to fail silently. # Who the fuck invented a tool that needs dbus to set the hostname anyway… # NOTE: We write the static hostname to /etc/hostname first in case # hostnamectl fails. Fallback-code below will then adjust the running # hostname below. - echo "printf '%s\\n' '$name_should' > /etc/hostname" + echo "echo '$name_should' >/etc/hostname" echo "hostnamectl set-hostname '$name_should' && exit 0" fi @@ -75,7 +75,7 @@ fi case $os in alpine|archlinux|debian|devuan|ubuntu) - echo "printf '%s\\n' '$name_should' > /etc/hostname" + echo "echo '$name_should' >/etc/hostname" echo "hostname -F /etc/hostname" ;; coreos|openbmc-phosphor) @@ -95,7 +95,7 @@ in suse) # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. - echo "printf '%s\\n' '$name_should' > /etc/HOSTNAME" + echo "echo '$name_should' >/etc/HOSTNAME" echo 'hostname -F /etc/HOSTNAME' ;; centos|fedora|freebsd|netbsd|openbsd|redhat|scientific) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index f3739f6c..a4068cc2 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -47,7 +47,7 @@ else esac fi -if test -n "${max_len}" -a "$(printf "${name_should}" | wc -c)" -gt "${max_len}" +if test -n "${max_len}" -a "$(printf '%s' "${name_should}" | wc -c)" -gt "${max_len}" then printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 exit 1 From 6eec5f87a4e2c3b006a2bded1e85ec565cd7acc6 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 26 Oct 2019 17:11:35 +0200 Subject: [PATCH 25/36] [__hostame] Simplify and revert hostnamectl to be a last resort --- .../__hostname/explorer/persistent_hostname | 66 ---------------- cdist/conf/type/__hostname/gencode-remote | 73 +++++++---------- cdist/conf/type/__hostname/manifest | 78 +++++++++++++++---- 3 files changed, 90 insertions(+), 127 deletions(-) delete mode 100755 cdist/conf/type/__hostname/explorer/persistent_hostname diff --git a/cdist/conf/type/__hostname/explorer/persistent_hostname b/cdist/conf/type/__hostname/explorer/persistent_hostname deleted file mode 100755 index 0feb0809..00000000 --- a/cdist/conf/type/__hostname/explorer/persistent_hostname +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh -# -# 2019 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 . -# -# -# Retrieve the persistent hostname -# - -# Firstly, check hostnamectl if available. -if command -v hostnamectl >/dev/null 2>&1 -then - hostnamectl status --static && exit 0 -fi - -# In case hostnamectl is missing or failed: -# Fall back to alternative OS-specific approaches. -case $("$__explorer/os") -in - alpine|archlinux|coreos|debian|devuan|ubuntu) - test -f /etc/hostname && cat /etc/hostname - ;; - centos|fedora|redhat|scientific) - test -f /etc/sysconfig/network \ - && (. /etc/sysconfig/network && echo "$HOSTNAME") - ;; - freebsd) - (. /etc/rc.conf && echo "$hostname") - ;; - gentoo) - (. /etc/conf.d/hostname && echo "$hostname") - ;; - macosx) - scutil --get HostName 2>/dev/null - ;; - netbsd) - if grep -q '^hostname=' /etc/rc.conf - then - (. /etc/rc.conf && echo "$hostname") - elif [ -f /etc/myname ] - then - # Fall back to /etc/myname file - cat /etc/myname - fi - ;; - openbsd) - cat /etc/myname - ;; - suse) - cat /etc/HOSTNAME 2>/dev/null - ;; -esac diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 5942b2e3..253bf5ea 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -22,17 +22,17 @@ os=$(cat "$__global/explorer/os") name_running=$(cat "$__global/explorer/hostname") -name_config=$(cat "$__object/explorer/persistent_hostname") has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") -if [ -f "$__object/parameter/name" ]; then - name_should="$(cat "$__object/parameter/name")" +if test -s "$__object/parameter/name" +then + name_should=$(cat "$__object/parameter/name") else case $os in # RedHat-derivatives and BSDs - centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) + centos|fedora|redhat|scientific|freebsd|macosx|netbsd|openbsd) # Hostname is FQDN name_should="${__target_host}" ;; @@ -43,66 +43,49 @@ else esac fi + ################################################################################ -# Check if the hostname is already correct +# Check if the (running) hostname is already correct # -if [ "$name_running" = "$name_should" ] \ - && [ -z "$name_config" -o "$name_config" = "$name_should" ] -then - exit 0 -fi +test "$name_running" != "$name_should" || exit 0 + ################################################################################ # Setup hostname # echo 'changed' >>"$__messages_out" - -# First try to set the hostname using hostnamectl, if available. -if [ -n "$has_hostnamectl" ]; then - # Allow hostnamectl to fail silently. - # Who the fuck invented a tool that needs dbus to set the hostname anyway… - - # NOTE: We write the static hostname to /etc/hostname first in case - # hostnamectl fails. Fallback-code below will then adjust the running - # hostname below. - echo "echo '$name_should' >/etc/hostname" - - echo "hostnamectl set-hostname '$name_should' && exit 0" -fi - -# Use the good old way to set the hostname. Also if hostnamectl fails. +# Use the good old way to set the hostname. case $os in - alpine|archlinux|debian|devuan|ubuntu) - echo "echo '$name_should' >/etc/hostname" - echo "hostname -F /etc/hostname" + alpine|debian|devuan|ubuntu) + echo 'hostname -F /etc/hostname' ;; - coreos|openbmc-phosphor) - # NOTE: systemd-only distros have the hostname already written above. - # But since hostamectl failed, we update the running hostname - # manually. - echo "hostname -F /etc/hostname" - ;; - gentoo) - # NOTE: Writing the hostname to file is done in the manifest for OpenRC. - # For systemd hostnamectl should take care of that. + archlinux|centos|fedora|redhat|scientific|freebsd|netbsd|gentoo) echo "hostname '$name_should'" ;; macosx) echo "scutil --set HostName '$name_should'" ;; + openbsd) + echo 'hostname -F /etc/myname' + ;; suse) - # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE - # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. - echo "echo '$name_should' >/etc/HOSTNAME" echo 'hostname -F /etc/HOSTNAME' ;; - centos|fedora|freebsd|netbsd|openbsd|redhat|scientific) - # NOTE: Writing the hostname to file is done in the manifest. - echo "hostname '$name_should'" - ;; *) - echo "echo 'Unsupported OS: $os' >&2; exit 1" + # Fall back to set the hostname using hostnamectl, if available. + if test -n "$has_hostnamectl" + then + # Don't use hostnamectl as the primary means to set the hostname for + # systemd systems, because it cannot be trusted to work reliably and + # exit with non-zero when it fails. + # Who invented a tool that needs dbus to set the hostname anyway… + + echo "hostnamectl set-hostname \"\$(cat /etc/hostname)\"" + echo "test \"\$(hostname)\" = \"\$(cat /etc/hostname)\" || hostname -F /etc/hostname" + else + printf "echo 'Unsupported OS: %s' >&2\nexit 1\n" "$os" + fi ;; esac diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index a4068cc2..78adc20b 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -20,18 +20,25 @@ # along with cdist. If not, see . # +onchange_cmd="echo changed >>'$__messages_out'" + not_supported() { - echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 - echo "Please contribute an implementation for it if you can." >&2 - exit 1 + echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 + echo "Please contribute an implementation for it if you can." >&2 + exit 1 } +set_hostname_systemd() { + echo "$1" | __file /etc/hostname --source - --onchange "$onchange_cmd" +} os=$(cat "$__global/explorer/os") max_len=$(cat "$__object/explorer/max_len") +has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") -if [ -f "$__object/parameter/name" ]; then - name_should="$(cat "$__object/parameter/name")" +if test -s "$__object/parameter/name" +then + name_should=$(cat "$__object/parameter/name") else case $os in @@ -49,18 +56,37 @@ fi if test -n "${max_len}" -a "$(printf '%s' "${name_should}" | wc -c)" -gt "${max_len}" then - printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 - exit 1 + printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 + exit 1 fi case $os in - archlinux|debian|suse|ubuntu|devuan|coreos|alpine|macosx) + alpine|debian|devuan|ubuntu) + echo "$name_should" \ + | __file /etc/hostname --source - --onchange "$onchange_cmd" + ;; + macosx) # handled in gencode-remote : ;; + archlinux) + if test -n "$has_hostnamectl" + then + set_hostname_systemd "$name_should" + else + # Only for ancient ArchLinux, write to /etc/rc.conf on pre-systemd + # versions. + __key_value sysconfig-hostname \ + --file /etc/rc.conf \ + --delimiter '=' --exact_delimiter \ + --key 'HOSTNAME' \ + --value "\"$name_should\"" \ + --onchange "$onchange_cmd" + fi + ;; centos|fedora|redhat|scientific) - if test -z "$(cat "$__object/explorer/has_hostnamectl")" + if test -z "$has_hostnamectl" then # Only write to /etc/sysconfig/network on non-systemd versions. # On systemd-based versions this entry is ignored. @@ -68,11 +94,14 @@ in --file /etc/sysconfig/network \ --delimiter '=' --exact_delimiter \ --key HOSTNAME \ - --value "\"$name_should\"" + --value "\"$name_should\"" \ + --onchange "$onchange_cmd" + else + set_hostname_systemd "$name_should" fi ;; gentoo) - if test -z "$(cat "$__object/explorer/has_hostnamectl")" + if test -z "$has_hostnamectl" then # Only write to /etc/conf.d/hostname on OpenRC-based installations. # On systemd use hostnamectl(1) in gencode-remote. @@ -81,6 +110,8 @@ in --delimiter '=' --exact_delimiter \ --key 'hostname' \ --value "\"$name_should\"" + else + set_hostname_systemd "$name_should" fi ;; freebsd) @@ -88,22 +119,37 @@ in --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ - --value "\"$name_should\"" + --value "\"$name_should\"" \ + --onchange "$onchange_cmd" ;; netbsd) __key_value rcconf-hostname \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ - --value "\"$name_should\"" + --value "\"$name_should\"" \ + --onchange "$onchange_cmd" + # To avoid confusion, ensure that the hostname is only stored once __file /etc/myname --state absent ;; openbsd) - echo "$name_should" | __file /etc/myname --source - + echo "$name_should" \ + | __file /etc/myname --source - --onchange "$onchange_cmd" + ;; + suse) + # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE + # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. + echo "$name_should" \ + | __file /etc/HOSTNAME --source - --onchange "$onchange_cmd" ;; *) - # On other operating systems we fall back to hostnamectl if available… - test -n "$(cat "$__object/explorer/has_hostnamectl")" || not_supported + # On other operating systems we fall back to systemd's hostnamectl if available… + if test -n "$has_hostnamectl" + then + set_hostname_systemd "$name_should" + else + not_supported + fi ;; esac From e7279680edbd645249eca3c2d363d233dd1cd269 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 26 Oct 2019 17:12:08 +0200 Subject: [PATCH 26/36] [__hostname/man.rst] Add link to RFC 1178 --- cdist/conf/type/__hostname/man.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__hostname/man.rst b/cdist/conf/type/__hostname/man.rst index d23a3b8a..72aefbab 100644 --- a/cdist/conf/type/__hostname/man.rst +++ b/cdist/conf/type/__hostname/man.rst @@ -8,7 +8,10 @@ cdist-type__hostname - Set the hostname DESCRIPTION ----------- -Set's the hostname on various operating systems. +Sets the hostname on various operating systems. + +**Tip:** For advice on choosing a hostname, see +`RFC 1178 `_. REQUIRED PARAMETERS @@ -18,7 +21,7 @@ None. OPTIONAL PARAMETERS ------------------- name - The hostname to set. Defaults to the first segment of __target_host + The hostname to set. Defaults to the first segment of __target_host (${__target_host%%.*}) From f276813f7f1fe0af7775bb41adf37dcd3d377992 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 26 Oct 2019 17:25:44 +0200 Subject: [PATCH 27/36] [__hostname] Remove incorrectly sent messages (again) The --onchage sent the message on the target where messaging is not supported. Now the result is that a "changed" message is only emitted when the running hostname changes, not when the persistent hostname changes. --- cdist/conf/type/__hostname/manifest | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 78adc20b..49591926 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -20,8 +20,6 @@ # along with cdist. If not, see . # -onchange_cmd="echo changed >>'$__messages_out'" - not_supported() { echo "Your operating system ($os) is currently not supported by this type (${__type##*/})." >&2 echo "Please contribute an implementation for it if you can." >&2 @@ -29,7 +27,7 @@ not_supported() { } set_hostname_systemd() { - echo "$1" | __file /etc/hostname --source - --onchange "$onchange_cmd" + echo "$1" | __file /etc/hostname --source - } os=$(cat "$__global/explorer/os") @@ -64,7 +62,7 @@ case $os in alpine|debian|devuan|ubuntu) echo "$name_should" \ - | __file /etc/hostname --source - --onchange "$onchange_cmd" + | __file /etc/hostname --source - ;; macosx) # handled in gencode-remote @@ -81,8 +79,7 @@ in --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'HOSTNAME' \ - --value "\"$name_should\"" \ - --onchange "$onchange_cmd" + --value "\"$name_should\"" fi ;; centos|fedora|redhat|scientific) @@ -94,8 +91,7 @@ in --file /etc/sysconfig/network \ --delimiter '=' --exact_delimiter \ --key HOSTNAME \ - --value "\"$name_should\"" \ - --onchange "$onchange_cmd" + --value "\"$name_should\"" else set_hostname_systemd "$name_should" fi @@ -119,29 +115,27 @@ in --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ - --value "\"$name_should\"" \ - --onchange "$onchange_cmd" + --value "\"$name_should\"" ;; netbsd) __key_value rcconf-hostname \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ - --value "\"$name_should\"" \ - --onchange "$onchange_cmd" + --value "\"$name_should\"" # To avoid confusion, ensure that the hostname is only stored once __file /etc/myname --state absent ;; openbsd) echo "$name_should" \ - | __file /etc/myname --source - --onchange "$onchange_cmd" + | __file /etc/myname --source - ;; suse) # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. echo "$name_should" \ - | __file /etc/HOSTNAME --source - --onchange "$onchange_cmd" + | __file /etc/HOSTNAME --source - ;; *) # On other operating systems we fall back to systemd's hostnamectl if available… From cbae534af58859da299972b95d9f5c05040c33e5 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 26 Oct 2019 21:01:54 +0200 Subject: [PATCH 28/36] [__hostname] Patch for modern ArchLinux without hostname(1) --- cdist/conf/type/__hostname/gencode-remote | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 253bf5ea..6840ca9e 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -61,7 +61,12 @@ in alpine|debian|devuan|ubuntu) echo 'hostname -F /etc/hostname' ;; - archlinux|centos|fedora|redhat|scientific|freebsd|netbsd|gentoo) + archlinux) + echo 'command -v hostnamectl >/dev/null 2>&1' \ + "&& hostnamectl set-hostname '$name_should'" \ + "|| hostname '$name_should'" + ;; + centos|fedora|redhat|scientific|freebsd|netbsd|gentoo) echo "hostname '$name_should'" ;; macosx) From b9571a2bbdf3cb9cca52444f5da2db16327801c9 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 26 Oct 2019 22:17:08 +0200 Subject: [PATCH 29/36] [__hostname] Add support for Void Linux --- cdist/conf/type/__hostname/gencode-remote | 2 +- cdist/conf/type/__hostname/manifest | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 6840ca9e..90312fad 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -66,7 +66,7 @@ in "&& hostnamectl set-hostname '$name_should'" \ "|| hostname '$name_should'" ;; - centos|fedora|redhat|scientific|freebsd|netbsd|gentoo) + centos|fedora|redhat|scientific|freebsd|netbsd|gentoo|void) echo "hostname '$name_should'" ;; macosx) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 49591926..4465038d 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -60,7 +60,7 @@ fi case $os in - alpine|debian|devuan|ubuntu) + alpine|debian|devuan|ubuntu|void) echo "$name_should" \ | __file /etc/hostname --source - ;; From 66c85230a0aa35a64323e2cfc68490ef87055670 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 27 Oct 2019 13:16:05 +0100 Subject: [PATCH 30/36] [__hostname] Make __key_value names more meaningful --- cdist/conf/type/__hostname/manifest | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 4465038d..64f90492 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -61,12 +61,7 @@ fi case $os in alpine|debian|devuan|ubuntu|void) - echo "$name_should" \ - | __file /etc/hostname --source - - ;; - macosx) - # handled in gencode-remote - : + echo "$name_should" | __file /etc/hostname --source - ;; archlinux) if test -n "$has_hostnamectl" @@ -75,7 +70,8 @@ in else # Only for ancient ArchLinux, write to /etc/rc.conf on pre-systemd # versions. - __key_value sysconfig-hostname \ + # There are some versions which use /etc/hostname but not systemd. It is unclear which ones these are. + __key_value '/etc/rc.conf:HOSTNAME' \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'HOSTNAME' \ @@ -87,7 +83,7 @@ in then # Only write to /etc/sysconfig/network on non-systemd versions. # On systemd-based versions this entry is ignored. - __key_value sysconfig-hostname \ + __key_value '/etc/sysconfig/network:HOSTNAME' \ --file /etc/sysconfig/network \ --delimiter '=' --exact_delimiter \ --key HOSTNAME \ @@ -101,7 +97,7 @@ in then # Only write to /etc/conf.d/hostname on OpenRC-based installations. # On systemd use hostnamectl(1) in gencode-remote. - __key_value confd-hostname \ + __key_value '/etc/conf.d/hostname:hostname' \ --file /etc/conf.d/hostname \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ @@ -111,14 +107,18 @@ in fi ;; freebsd) - __key_value rcconf-hostname \ + __key_value '/etc/rc.conf:hostname' \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ --value "\"$name_should\"" ;; + macosx) + # handled in gencode-remote + : + ;; netbsd) - __key_value rcconf-hostname \ + __key_value '/etc/rc.conf:hostname' \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ --key 'hostname' \ @@ -128,14 +128,12 @@ in __file /etc/myname --state absent ;; openbsd) - echo "$name_should" \ - | __file /etc/myname --source - + echo "$name_should" | __file /etc/myname --source - ;; suse) # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. - echo "$name_should" \ - | __file /etc/HOSTNAME --source - + echo "$name_should" | __file /etc/HOSTNAME --source - ;; *) # On other operating systems we fall back to systemd's hostnamectl if available… From 5eb9fec550907d3ae65ce9ef62849093afc7c9f4 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 27 Oct 2019 15:14:09 +0100 Subject: [PATCH 31/36] [__hostname] Add support for Slackware --- cdist/conf/type/__hostname/gencode-remote | 2 +- cdist/conf/type/__hostname/manifest | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 90312fad..1e798036 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -66,7 +66,7 @@ in "&& hostnamectl set-hostname '$name_should'" \ "|| hostname '$name_should'" ;; - centos|fedora|redhat|scientific|freebsd|netbsd|gentoo|void) + centos|fedora|redhat|scientific|freebsd|netbsd|gentoo|slackware|void) echo "hostname '$name_should'" ;; macosx) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 64f90492..8b4d26b1 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -41,7 +41,7 @@ else case $os in # RedHat-derivatives and BSDs - centos|fedora|redhat|scientific|freebsd|netbsd|openbsd) + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd|slackware) # Hostname is FQDN name_should="${__target_host}" ;; @@ -130,6 +130,12 @@ in openbsd) echo "$name_should" | __file /etc/myname --source - ;; + slackware) + # We write the FQDN into /etc/HOSTNAME. + # But /etc/rc.d/rc.M will only read the first component from this file + # and set it as the running hostname on boot. + echo "$name_should" | __file /etc/HOSTNAME --source - + ;; suse) # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. From c939bd6bf676b186ced82bebf925ce83b7c79df4 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 27 Oct 2019 20:12:10 +0100 Subject: [PATCH 32/36] [__hostname] Small fixes --- cdist/conf/type/__hostname/gencode-remote | 5 +---- cdist/conf/type/__hostname/manifest | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 1e798036..4532bacf 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -66,15 +66,12 @@ in "&& hostnamectl set-hostname '$name_should'" \ "|| hostname '$name_should'" ;; - centos|fedora|redhat|scientific|freebsd|netbsd|gentoo|slackware|void) + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd|gentoo|slackware|void) echo "hostname '$name_should'" ;; macosx) echo "scutil --set HostName '$name_should'" ;; - openbsd) - echo 'hostname -F /etc/myname' - ;; suse) echo 'hostname -F /etc/HOSTNAME' ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 8b4d26b1..31d43264 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -52,7 +52,7 @@ else esac fi -if test -n "${max_len}" -a "$(printf '%s' "${name_should}" | wc -c)" -gt "${max_len}" +if test -n "${max_len}" && test "$(printf '%s' "${name_should}" | wc -c)" -gt "${max_len}" then printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 exit 1 @@ -69,8 +69,8 @@ in set_hostname_systemd "$name_should" else # Only for ancient ArchLinux, write to /etc/rc.conf on pre-systemd - # versions. - # There are some versions which use /etc/hostname but not systemd. It is unclear which ones these are. + # versions. There are some versions which use /etc/hostname but not + # systemd. It is unclear which ones these are. __key_value '/etc/rc.conf:HOSTNAME' \ --file /etc/rc.conf \ --delimiter '=' --exact_delimiter \ From 88947d45b3a6a8496b568e0880a94afd6553bbed Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 16 Nov 2019 14:57:27 +0100 Subject: [PATCH 33/36] [__hostname] Add support for Solaris --- cdist/conf/type/__hostname/gencode-remote | 3 +++ cdist/conf/type/__hostname/manifest | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index 4532bacf..f06ee145 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -72,6 +72,9 @@ in macosx) echo "scutil --set HostName '$name_should'" ;; + solaris) + echo "uname -S '$name_should'" + ;; suse) echo 'hostname -F /etc/HOSTNAME' ;; diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 31d43264..6b26cada 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -136,6 +136,9 @@ in # and set it as the running hostname on boot. echo "$name_should" | __file /etc/HOSTNAME --source - ;; + solaris) + echo "$name_should" | __file /etc/nodename --source - + ;; suse) # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. From a885082534dedb56a78f2b2ee7c3ff7a20348b59 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 16 Nov 2019 14:58:30 +0100 Subject: [PATCH 34/36] [__hostname] Little bit of clean up --- cdist/conf/type/__hostname/manifest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 6b26cada..f2f65155 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -52,7 +52,7 @@ else esac fi -if test -n "${max_len}" && test "$(printf '%s' "${name_should}" | wc -c)" -gt "${max_len}" +if test -n "$max_len" && test "$(printf '%s' "$name_should" | wc -c)" -gt "$max_len" then printf "Host name too long. Up to %u characters allowed.\n" "${max_len}" >&2 exit 1 @@ -93,10 +93,10 @@ in fi ;; gentoo) + # Only write to /etc/conf.d/hostname on OpenRC-based installations. + # On systemd use hostnamectl(1) in gencode-remote. if test -z "$has_hostnamectl" then - # Only write to /etc/conf.d/hostname on OpenRC-based installations. - # On systemd use hostnamectl(1) in gencode-remote. __key_value '/etc/conf.d/hostname:hostname' \ --file /etc/conf.d/hostname \ --delimiter '=' --exact_delimiter \ From f18bdd1fade8b2caea80bdeb4d0c099f421a3d18 Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sat, 16 Nov 2019 23:31:58 +0100 Subject: [PATCH 35/36] [__hostname] Comment out support for ancient ArchLinux versions --- cdist/conf/type/__hostname/manifest | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index f2f65155..7e36cb53 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -68,14 +68,17 @@ in then set_hostname_systemd "$name_should" else + echo 'Ancient ArchLinux variants without hostnamectl are not supported.' >&2 + exit 1 # Only for ancient ArchLinux, write to /etc/rc.conf on pre-systemd # versions. There are some versions which use /etc/hostname but not - # systemd. It is unclear which ones these are. - __key_value '/etc/rc.conf:HOSTNAME' \ - --file /etc/rc.conf \ - --delimiter '=' --exact_delimiter \ - --key 'HOSTNAME' \ - --value "\"$name_should\"" + # systemd. It is unclear which ones these are. + + # __key_value '/etc/rc.conf:HOSTNAME' \ + # --file /etc/rc.conf \ + # --delimiter '=' --exact_delimiter \ + # --key 'HOSTNAME' \ + # --value "\"$name_should\"" fi ;; centos|fedora|redhat|scientific) From a45e30612301a93e1156f97309c9b0f090c4a4ce Mon Sep 17 00:00:00 2001 From: Dennis Camera Date: Sun, 17 Nov 2019 14:46:37 +0100 Subject: [PATCH 36/36] [__hostname] Better support different versions of SuSE --- cdist/conf/type/__hostname/gencode-remote | 16 +++++--- cdist/conf/type/__hostname/manifest | 50 ++++++++++++++++++----- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/cdist/conf/type/__hostname/gencode-remote b/cdist/conf/type/__hostname/gencode-remote index f06ee145..ae224611 100755 --- a/cdist/conf/type/__hostname/gencode-remote +++ b/cdist/conf/type/__hostname/gencode-remote @@ -66,7 +66,7 @@ in "&& hostnamectl set-hostname '$name_should'" \ "|| hostname '$name_should'" ;; - centos|fedora|redhat|scientific|freebsd|netbsd|openbsd|gentoo|slackware|void) + centos|fedora|redhat|scientific|freebsd|netbsd|openbsd|gentoo|void) echo "hostname '$name_should'" ;; macosx) @@ -75,8 +75,11 @@ in solaris) echo "uname -S '$name_should'" ;; - suse) - echo 'hostname -F /etc/HOSTNAME' + slackware|suse|opensuse-leap) + # We do not read from /etc/HOSTNAME, because the running + # hostname is the first component only while the file contains + # the FQDN. + echo "hostname '$name_should'" ;; *) # Fall back to set the hostname using hostnamectl, if available. @@ -84,11 +87,12 @@ in then # Don't use hostnamectl as the primary means to set the hostname for # systemd systems, because it cannot be trusted to work reliably and - # exit with non-zero when it fails. - # Who invented a tool that needs dbus to set the hostname anyway… + # exit with non-zero when it fails (e.g. hostname too long, + # D-Bus failure, etc.). echo "hostnamectl set-hostname \"\$(cat /etc/hostname)\"" - echo "test \"\$(hostname)\" = \"\$(cat /etc/hostname)\" || hostname -F /etc/hostname" + echo "test \"\$(hostname)\" = \"\$(cat /etc/hostname)\"" \ + " || hostname -F /etc/hostname" else printf "echo 'Unsupported OS: %s' >&2\nexit 1\n" "$os" fi diff --git a/cdist/conf/type/__hostname/manifest b/cdist/conf/type/__hostname/manifest index 7e36cb53..75a90027 100755 --- a/cdist/conf/type/__hostname/manifest +++ b/cdist/conf/type/__hostname/manifest @@ -31,6 +31,9 @@ set_hostname_systemd() { } os=$(cat "$__global/explorer/os") +os_version=$(cat "$__global/explorer/os_version") +os_major=$(echo "$os_version" | grep -o '^[0-9][0-9]*') + max_len=$(cat "$__object/explorer/max_len") has_hostnamectl=$(cat "$__object/explorer/has_hostnamectl") @@ -45,8 +48,21 @@ else # Hostname is FQDN name_should="${__target_host}" ;; + suse|opensuse-leap) + # Classic SuSE stores the FQDN in /etc/HOSTNAME, while + # systemd does not. The running hostname is the first + # component in both cases. + # In versions before 15.x, the FQDN is stored in /etc/hostname. + if test -n "$has_hostnamectl" && test "$os_major" -ge 15 \ + && test "$os_major" -ne 42 + then + name_should="${__target_host%%.*}" + else + name_should="${__target_host}" + fi + ;; *) - # Hostname is only first component of FQDN + # Hostname is only first component of FQDN on all other systems. name_should="${__target_host%%.*}" ;; esac @@ -127,28 +143,42 @@ in --key 'hostname' \ --value "\"$name_should\"" - # To avoid confusion, ensure that the hostname is only stored once + # To avoid confusion, ensure that the hostname is only stored once. __file /etc/myname --state absent ;; openbsd) echo "$name_should" | __file /etc/myname --source - ;; slackware) - # We write the FQDN into /etc/HOSTNAME. - # But /etc/rc.d/rc.M will only read the first component from this file - # and set it as the running hostname on boot. + # We write the FQDN into /etc/HOSTNAME. But /etc/rc.d/rc.M will only + # read the first component from this file and set it as the running + # hostname on boot. echo "$name_should" | __file /etc/HOSTNAME --source - ;; solaris) echo "$name_should" | __file /etc/nodename --source - ;; - suse) - # We write into /etc/HOSTNAME for backwards-compatibility. Modern SuSE - # has hostnamectl anyway and symlinks /etc/HOSTNAME to /etc/hostname. - echo "$name_should" | __file /etc/HOSTNAME --source - + suse|opensuse-leap) + # Modern SuSE provides /etc/HOSTNAME as a symlink for + # backwards-compatibility. Unfortunately it cannot be used + # here as __file does not follow the symlink. + # Therefore, we use the presence of the hostnamectl binary as + # an indication of which file to use. This unfortunately does + # not work correctly on openSUSE 12.x which provides + # hostnamectl but not /etc/hostname. + + if test -n "$has_hostnamectl" -a "$os_major" -gt 12 + then + hostname_file='/etc/hostname' + else + hostname_file='/etc/HOSTNAME' + fi + + echo "$name_should" | __file "$hostname_file" --source - ;; *) - # On other operating systems we fall back to systemd's hostnamectl if available… + # On other operating systems we fall back to systemd's + # hostnamectl if available… if test -n "$has_hostnamectl" then set_hostname_systemd "$name_should"