From ac8c2de701e1bcd0dc99e5bf39fdd36c6a44691c Mon Sep 17 00:00:00 2001 From: m8in Date: Wed, 7 Oct 2026 23:55:29 +0200 Subject: [PATCH] Refactoring using "local -r" --- core/addAndCheckGitRepository.sh | 22 ++++------ core/addNormalUser.sh | 4 +- core/addToCrontabEveryHour.sh | 6 +-- core/base.module.sh | 52 +++++++++++------------ core/defineAuthorizedKeysOfUser.sh | 31 ++++++-------- core/ensureUsageOfDefinitions.sh | 67 +++++++++++++----------------- prepareThisHostBeforeCloning.sh | 13 +++--- setupCoreOntoThisHost.sh | 36 +++++----------- updateRepositories.sh | 3 +- 9 files changed, 97 insertions(+), 137 deletions(-) diff --git a/core/addAndCheckGitRepository.sh b/core/addAndCheckGitRepository.sh index 26e2f02..934f6d9 100755 --- a/core/addAndCheckGitRepository.sh +++ b/core/addAndCheckGitRepository.sh @@ -27,10 +27,8 @@ function checkPermissions() { } function cloneOrPull() { - local _FOLDER _REPOSITORY - _FOLDER="${1:?"Missing first parameter FOLDER"}" - _REPOSITORY="${2:?"Missing second parameter REPOSITORY"}" - readonly _FOLDER _REPOSITORY + local -r _FOLDER="${1:?"Missing first parameter FOLDER"}" + local -r _REPOSITORY="${2:?"Missing second parameter REPOSITORY"}" [ -d "${_FOLDER}.git" ] \ && git -C "${_FOLDER}" pull &> /dev/null \ @@ -47,11 +45,9 @@ function cloneOrPull() { } function printRepository() { - local _FOLDER _CONFIGURED_REPOSITORY _SUGGESTED_REPOSITORY - _FOLDER="${1:?"Missing first parameter FOLDER"}" - _CONFIGURED_REPOSITORY="$(git -C "${_FOLDER:?"Missing FOLDER"}" config --get remote.origin.url 2> /dev/null)" - _SUGGESTED_REPOSITORY="${2}" - readonly _FOLDER _CONFIGURED_REPOSITORY _SUGGESTED_REPOSITORY + local -r _FOLDER="${1:?"Missing first parameter FOLDER"}" + local -r _CONFIGURED_REPOSITORY="$(git -C "${_FOLDER:?"Missing FOLDER"}" config --get remote.origin.url 2> /dev/null)" + local -r _SUGGESTED_REPOSITORY="${2}" ! [ -z "${_CONFIGURED_REPOSITORY}" ] \ && echo "${_CONFIGURED_REPOSITORY}" \ @@ -74,11 +70,9 @@ function printRepository() { # Note that an unprivileged user can use this script successfully, # if no user has to be added to the host because it already exists. function addAndCheckGitRepository() { - local _FOLDER _REPOSITORY _RIGHTS - _FOLDER="${1:?"Missing first parameter FOLDER"}" - _RIGHTS="${2:?"Missing second parameter RIGHTS: (readonly, writable) "}" - _REPOSITORY="$(printRepository "${_FOLDER}" "${3}")" - readonly _FOLDER _REPOSITORY _RIGHTS + local -r _FOLDER="${1:?"Missing first parameter FOLDER"}" + local -r _RIGHTS="${2:?"Missing second parameter RIGHTS: (readonly, writable) "}" + local -r _REPOSITORY="$(printRepository "${_FOLDER}" "${3}")" echo \ && cloneOrPull "${_FOLDER}" "${_REPOSITORY:?"Missing REPOSITORY: e.g. ssh://git@your.domain.com/cis.git"}" \ diff --git a/core/addNormalUser.sh b/core/addNormalUser.sh index 6dd89e2..93e6b4c 100755 --- a/core/addNormalUser.sh +++ b/core/addNormalUser.sh @@ -9,9 +9,7 @@ source /cis/core/base.module.sh # Note that an unprivileged user can use this script successfully, # if no user has to be added to the host because it already exists. function addNormalUser() { - local _USER - _USER="${1:?"Missing first parameter USER"}" - readonly _USER + local -r _USER="${1:?"Missing first parameter USER"}" #The user already exists id -u "${_USER}" &> /dev/null \ diff --git a/core/addToCrontabEveryHour.sh b/core/addToCrontabEveryHour.sh index 769e864..e713df3 100755 --- a/core/addToCrontabEveryHour.sh +++ b/core/addToCrontabEveryHour.sh @@ -9,10 +9,8 @@ source /cis/core/base.module.sh # Note that an unprivileged user can use this script successfully, # if no user has to be added to the host because it already exists. function addToCrontabEveryHour() { - local _MINUTE_VALUE _STRING - ! [ -z "${2##*[!0-9]*}" ] && _MINUTE_VALUE=$((${2}%60)) # if second parameter is integer then (minute-value % 60) as safe guard - _STRING="${_MINUTE_VALUE:?"Missing MINUTE_VALUE"} * * * * ${1:?"Missing first parameter COMMAND"} > /dev/null 2>&1" - readonly _MINUTE_VALUE _STRING + ! [ -z "${2##*[!0-9]*}" ] && local -r _MINUTE_VALUE=$((${2}%60)) # if second parameter is integer then (minute-value % 60) as safe guard + local -r _STRING="${_MINUTE_VALUE:?"Missing MINUTE_VALUE"} * * * * ${1:?"Missing first parameter COMMAND"} > /dev/null 2>&1" [ "$(id -u)" == "0" ] \ && crontab -l | grep -qF "${_STRING:?"Missing CRON_STRING"}" \ diff --git a/core/base.module.sh b/core/base.module.sh index 6353b7f..879ae19 100755 --- a/core/base.module.sh +++ b/core/base.module.sh @@ -396,51 +396,47 @@ function base.printWithColor() { } function base.set() { - local _CLEAN_VARNAME _MODE _REGEX _VALUE _VARNAME - _VARNAME="${1:?"base.set(): Missing first parameter VARNAME"}" - _CLEAN_VARNAME="${_VARNAME//[^a-zA-Z0-9_]/}" - _VALUE="${2}" - _REGEX="${3:?"base.set(): Missing third parameter REGEX"}" - _MODE="${4}" - readonly _CLEAN_VARNAME _MODE _REGEX _VALUE _VARNAME + local -r _base_set_VARNAME="${1:?"base.set(): Missing first parameter VARNAME"}" + local -r _base_set_CLEAN_VARNAME="${_base_set_VARNAME//[^a-zA-Z0-9_]/}" + local -r _base_set_VALUE="${2}" + local -r _base_set_REGEX="${3:?"base.set(): Missing third parameter REGEX"}" + local -r _base_set_MODE="${4}" - [ "${_VARNAME}" != "${_CLEAN_VARNAME}" ] \ - && echo "FAILURE - base.set(): Invalid name of variable: ${_VARNAME}" >&2 \ + [ "${_base_set_VARNAME}" != "${_base_set_CLEAN_VARNAME}" ] \ + && echo "FAILURE - base.set(): Invalid name of variable: ${_base_set_VARNAME}" >&2 \ && exit 1 - [ -z "${_VALUE}" ] \ - && [ "${_MODE}" == 'optional' ] \ - && readonly "${_CLEAN_VARNAME}" \ + [ -z "${_base_set_VALUE}" ] \ + && [ "${_base_set_MODE}" == 'optional' ] \ + && readonly "${_base_set_CLEAN_VARNAME}" \ && return 0 - # Sets the value to a global variable with name $_VARNAME - [[ "${_VALUE}" =~ ^(${_REGEX})$ ]] \ - && printf -v "${_CLEAN_VARNAME}" -- "%s" "${_VALUE}" \ - && readonly "${_CLEAN_VARNAME}" \ + # Sets the value to a global variable with name $_base_set_VARNAME + [[ "${_base_set_VALUE}" =~ ^(${_base_set_REGEX})$ ]] \ + && printf -v "${_base_set_CLEAN_VARNAME}" -- "%s" "${_base_set_VALUE}" \ + && readonly "${_base_set_CLEAN_VARNAME}" \ && return 0 - printf -- '%s\n' "FAILURE: - base.set(): Unable to set variable '${_VARNAME}' to value '${_VALUE}', validation failed: '${_REGEX}'" >&2 + printf -- '%s\n' "FAILURE: - base.set(): Unable to set variable '${_base_set_VARNAME}' to value '${_base_set_VALUE}', validation failed: '${_REGEX}'" >&2 exit 1 } function base.setFromFile() { - local _CLEAN_VARNAME _FILENAME _VARNAME - _VARNAME="${1:?"base.setFromFile(): Missing first parameter VARNAME"}" - _CLEAN_VARNAME="${_VARNAME//[^a-zA-Z0-9_]/}" - _FILENAME="${2:?"base.serFromFile(): Missing second parameter FILENAME"}" - readonly _CLEAN_VARNAME _FILENAME _VARNAME + local -r _base_setFromFile_VARNAME="${1:?"base.setFromFile(): Missing first parameter VARNAME"}" + local -r _base_setFromFile_CLEAN_VARNAME="${_base_setFromFile_VARNAME//[^a-zA-Z0-9_]/}" + local -r _base_setFromFile_FILENAME="${2:?"base.serFromFile(): Missing second parameter FILENAME"}" - [ "${_VARNAME}" != "${_CLEAN_VARNAME}" ] \ - && echo "FAILURE - base.setFromFile(): Invalid name of variable: ${_VARNAME}" >&2 \ + [ "${_base_setFromFile_VARNAME}" != "${_base_setFromFile_CLEAN_VARNAME}" ] \ + && echo "FAILURE - base.setFromFile(): Invalid name of variable: ${_base_setFromFile_VARNAME}" >&2 \ && exit 1 - local _LINE=$(grep -m 1 -oE "^[[:blank:]]*${_CLEAN_VARNAME}=[^[:blank:]]+.*" "${_FILENAME}" 2> /dev/null) \ + local _LINE=$(grep -m 1 -oE "^[[:blank:]]*${_base_setFromFile_CLEAN_VARNAME}=[^[:blank:]]+.*" "${_base_setFromFile_FILENAME}" 2> /dev/null) \ && [ -n "${_LINE}" ] \ - && printf -v "${_CLEAN_VARNAME}" -- "%s" "${_LINE#*=}" \ - && readonly "${_CLEAN_VARNAME}" \ + && printf -v "${_base_setFromFile_CLEAN_VARNAME}" -- "%s" "${_LINE#*=}" \ + && readonly "${_base_setFromFile_CLEAN_VARNAME}" \ && return 0 - printf -- '%s\n' "FAILURE: - base.setFromFile(): Unable to set variable '${_VARNAME}' from file '${_FILENAME}', value not found." >&2 + printf -- '%s\n' "FAILURE: - base.setFromFile(): Unable to set variable '${_base_setFromFile_VARNAME}' from file '${_base_setFromFile_FILENAME}', value not found." >&2 exit 1 } diff --git a/core/defineAuthorizedKeysOfUser.sh b/core/defineAuthorizedKeysOfUser.sh index 62b5d70..a1aca0e 100755 --- a/core/defineAuthorizedKeysOfUser.sh +++ b/core/defineAuthorizedKeysOfUser.sh @@ -7,11 +7,9 @@ source /cis/core/base.module.sh function prepareFolder() { - local _HOME_FOLDER _SSH_FOLDER _USER - _SSH_FOLDER="${1:?"prepareFolder(): Missing parameter SSH_PATH"}" - _HOME_FOLDER="${_SSH_FOLDER%%/.ssh*}" #Removes longest matching pattern '/.ssh*' from the end - _USER="${_HOME_FOLDER##*/}" #Removes longest matching pattern '*/' from the begin - readonly _HOME_FOLDER _SSH_FOLDER _USER + local -r _SSH_FOLDER="${1:?"prepareFolder(): Missing parameter SSH_PATH"}" + local -r _HOME_FOLDER="${_SSH_FOLDER%%/.ssh*}" #Removes longest matching pattern '/.ssh*' from the end + local -r _USER="${_HOME_FOLDER##*/}" #Removes longest matching pattern '*/' from the begin ! id "${_USER}" &> /dev/null \ && echo "FAIL: The given user does not exist: ("$(readlink -f ${0})")" \ @@ -67,10 +65,8 @@ function prepareFolder() { } function ensureGroupMembership() { - local _SSH_GROUP _USER - _SSH_GROUP="ssh_login" - _USER="${1:?"ensureGroupMembership(): Missing first parameter USER"}" - readonly _SSH_GROUP _USER + local -r _SSH_GROUP="ssh_login" + local -r _USER="${1:?"ensureGroupMembership(): Missing first parameter USER"}" ! id "${_USER}" &> /dev/null \ && echo "FAIL: The given user does not exist: ("$(readlink -f ${0})")" \ @@ -107,17 +103,16 @@ function ensureGroupMembership() { } function defineAuthorizedKeysOfUser() { - local _CIS_ROOT _CORE_SCRIPTS _DOMAIN _DEFINITIONS _USER - _DEFINITIONS="$(realpath -s "${1:?"Missing first parameter DEFINITIONS: 'ROOT/definitions/DOMAIN'"}")" - _CIS_ROOT="${_DEFINITIONS%%/definitions/*}/" #Removes longest matching pattern '/definitions/*' from the end - _DOMAIN="${_DEFINITIONS##*/definitions/}" #Removes longest matching pattern '*/definitions/' from the begin - _DOMAIN="${_DOMAIN%/}" #Removes shortest matching pattern '/' from the end + local _DEFINITIONS="$(realpath -s "${1:?"Missing first parameter DEFINITIONS: 'ROOT/definitions/DOMAIN'"}")" + local -r _CIS_ROOT="${_DEFINITIONS%%/definitions/*}/" #Removes longest matching pattern '/definitions/*' from the end + local _DOMAIN="${_DEFINITIONS##*/definitions/}" #Removes longest matching pattern '*/definitions/' from the begin + readonly _DOMAIN="${_DOMAIN%/}" #Removes shortest matching pattern '/' from the end #Build from components for safety - _DEFINITIONS="${_CIS_ROOT:?"Missing ROOT"}definitions/${_DOMAIN:?"Missing DOMAIN"}" + readonly _DEFINITIONS="${_CIS_ROOT:?"Missing ROOT"}definitions/${_DOMAIN:?"Missing DOMAIN"}" - _USER="${2:?"Missing second parameter USER"}" - _CORE_SCRIPTS="${_CIS_ROOT:?"Missing ROOT"}core/" - readonly _CIS_ROOT _CORE_SCRIPTS _DOMAIN _DEFINITIONS _USER + + local -r _USER="${2:?"Missing second parameter USER"}" + local -r _CORE_SCRIPTS="${_CIS_ROOT:?"Missing ROOT"}core/" case "${_USER:?"Missing USER"}" in root) diff --git a/core/ensureUsageOfDefinitions.sh b/core/ensureUsageOfDefinitions.sh index ac00385..ed54414 100755 --- a/core/ensureUsageOfDefinitions.sh +++ b/core/ensureUsageOfDefinitions.sh @@ -34,9 +34,7 @@ function isCoreDefinition() { } function filterInvalidAuthorizedKeysFilesOfRoot() { - local _FILE_DEFINED - _FILE_DEFINED="${1:?"Missing DEFINITION FILE"}" - readonly _FILE_DEFINED + local -r _FILE_DEFINED="${1:?"Missing DEFINITION FILE"}" #If the full filename contains 'root/.ssh/authorized_keys' then check the content. #Skip lines starting with '#' and if at least one remaining line contains 'ssh' and '@' then print the filename. @@ -56,15 +54,13 @@ function filterInvalidAuthorizedKeysFilesOfRoot() { } function printSelectedDefinition() { - local _DEFINITIONS _CORE_FILE_DEFAULT_ALL_HOSTS _CORE_FILE_DEFINED_ALL_HOSTS _CORE_FILE_DEFINED_THIS_HOST _FILE_DEFAULT_ALL_HOSTS _FILE_DEFINED_ALL_HOSTS _FILE_DEFINED_THIS_HOST - _DEFINITIONS="${1:?"Missing CIS_ROOT"}definitions/${2:?"Missing DOMAIN"}/" - _CORE_FILE_DEFAULT_ALL_HOSTS="${1:?"Missing CIS_ROOT"}definitions/default/core/all${3:?"Missing CURRENT_FULLFILE"}" - _CORE_FILE_DEFINED_ALL_HOSTS="${_DEFINITIONS:?"Missing DEFINITIONS"}core/all${3:?"Missing CURRENT_FULLFILE"}" - _CORE_FILE_DEFINED_THIS_HOST="${_DEFINITIONS:?"Missing DEFINITIONS"}core/$(hostname -s)${3:?"Missing CURRENT_FULLFILE"}" - _FILE_DEFAULT_ALL_HOSTS="${1:?"Missing CIS_ROOT"}definitions/default/hosts/all${3:?"Missing CURRENT_FULLFILE"}" - _FILE_DEFINED_ALL_HOSTS="${_DEFINITIONS:?"Missing DEFINITIONS"}hosts/all${3:?"Missing CURRENT_FULLFILE"}" - _FILE_DEFINED_THIS_HOST="${_DEFINITIONS:?"Missing DEFINITIONS"}hosts/$(hostname -s)${3:?"Missing CURRENT_FULLFILE"}" - readonly _DEFINITIONS _CORE_FILE_DEFAULT_ALL_HOSTS _CORE_FILE_DEFINED_ALL_HOSTS _CORE_FILE_DEFINED_THIS_HOST _FILE_DEFAULT_ALL_HOSTS _FILE_DEFINED_ALL_HOSTS _FILE_DEFINED_THIS_HOST + local -r _DEFINITIONS="${1:?"Missing CIS_ROOT"}definitions/${2:?"Missing DOMAIN"}/" + local -r _CORE_FILE_DEFAULT_ALL_HOSTS="${1:?"Missing CIS_ROOT"}definitions/default/core/all${3:?"Missing CURRENT_FULLFILE"}" + local -r _CORE_FILE_DEFINED_ALL_HOSTS="${_DEFINITIONS:?"Missing DEFINITIONS"}core/all${3:?"Missing CURRENT_FULLFILE"}" + local -r _CORE_FILE_DEFINED_THIS_HOST="${_DEFINITIONS:?"Missing DEFINITIONS"}core/$(hostname -s)${3:?"Missing CURRENT_FULLFILE"}" + local -r _FILE_DEFAULT_ALL_HOSTS="${1:?"Missing CIS_ROOT"}definitions/default/hosts/all${3:?"Missing CURRENT_FULLFILE"}" + local -r _FILE_DEFINED_ALL_HOSTS="${_DEFINITIONS:?"Missing DEFINITIONS"}hosts/all${3:?"Missing CURRENT_FULLFILE"}" + local -r _FILE_DEFINED_THIS_HOST="${_DEFINITIONS:?"Missing DEFINITIONS"}hosts/$(hostname -s)${3:?"Missing CURRENT_FULLFILE"}" #The following are special definitions that affect the core functionality. #Try this host first because it should be priorized. @@ -105,12 +101,10 @@ function printSelectedDefinition() { } function createSymlinkToDefinition() { - local _CURRENT_FOLDER _CURRENT_FULLFILE _DEFINED_FULLFILE _SAVED_FULLFILE - _CURRENT_FOLDER="${1:?"Missing CURRENT_FOLDER"}" - _CURRENT_FULLFILE="${2:?"Missing CURRENT_FULLFILE"}" - _DEFINED_FULLFILE="${3:?"Missing DEFINED_FULLFILE"}" - _SAVED_FULLFILE="${4:?"Missing SAVED_FULLFILE"}" - readonly _CURRENT_FOLDER _CURRENT_FULLFILE _DEFINED_FULLFILE _SAVED_FULLFILE + local -r _CURRENT_FOLDER="${1:?"Missing CURRENT_FOLDER"}" + local -r _CURRENT_FULLFILE="${2:?"Missing CURRENT_FULLFILE"}" + local -r _DEFINED_FULLFILE="${3:?"Missing DEFINED_FULLFILE"}" + local -r _SAVED_FULLFILE="${4:?"Missing SAVED_FULLFILE"}" [ -f "${_CURRENT_FULLFILE}" ] \ && [ "$(sha256sum "${_DEFINED_FULLFILE}" | cut -d' ' -f1)" == "$(sha256sum "${_CURRENT_FULLFILE}" | cut -d' ' -f1)" ] \ @@ -132,36 +126,35 @@ function createSymlinkToDefinition() { } function ensureUsageOfDefinitions() { - local _CIS_ROOT _CURRENT_FILE _CURRENT_FOLDER _CURRENT_FULLFILE _DEFINITIONS _DOMAIN _DEFINED_FULLFILE _NOW _SAVED_FULLFILE - _DEFINITIONS="$(realpath -s "${1:?"Missing first parameter DEFINITIONS: 'ROOT/definitions/DOMAIN'"}")/" - _CIS_ROOT="${_DEFINITIONS%%/definitions/*}/" #Removes longest matching pattern '/definitions/*' from the end - _DOMAIN="${_DEFINITIONS##*/definitions/}" #Removes longest matching pattern '*/definitions/' from the begin - _DOMAIN="${_DOMAIN%/}" #Removes shortest matching pattern '/' from the end + local _DEFINITIONS="$(realpath -s "${1:?"Missing first parameter DEFINITIONS: 'ROOT/definitions/DOMAIN'"}")/" + local -r _CIS_ROOT="${_DEFINITIONS%%/definitions/*}/" #Removes longest matching pattern '/definitions/*' from the end + local _DOMAIN="${_DEFINITIONS##*/definitions/}" #Removes longest matching pattern '*/definitions/' from the begin + readonly _DOMAIN="${_DOMAIN%/}" #Removes shortest matching pattern '/' from the end #Build from components for safety - _DEFINITIONS="$(printIfEqual "${_DEFINITIONS}" "${_CIS_ROOT:?"Missing ROOT"}definitions/${_DOMAIN:?"Missing DOMAIN"}/")" + readonly _DEFINITIONS="$(printIfEqual "${_DEFINITIONS}" "${_CIS_ROOT:?"Missing ROOT"}definitions/${_DOMAIN:?"Missing DOMAIN"}/")" - _CURRENT_FULLFILE="${2:?"Missing second parameter CURRENT_FULLFILE"}" - _CURRENT_FOLDER="${_CURRENT_FULLFILE%/*}/" #Removes shortest matching pattern '/*' from the end - ! [ -d "${_CURRENT_FOLDER}" ] \ + local _CURRENT_FULLFILE="${2:?"Missing second parameter CURRENT_FULLFILE"}" + local _CURRENT_FOLDER="${_CURRENT_FULLFILE%/*}/" #Removes shortest matching pattern '/*' from the end + if [ -d "${_CURRENT_FOLDER:?"Missing CURRENT_FOLDER"}" ]; then + _CURRENT_FOLDER="$(realpath -s "${_CURRENT_FOLDER}")" + readonly _CURRENT_FOLDER="${_CURRENT_FOLDER%/}/" #Removes shortest matching pattern '/' from the end + else + true \ && echo "FAIL: The folder cannot be read: ("$(readlink -f ${0})")" \ && echo " - '${_CURRENT_FOLDER}'" \ && echo " - user '"$(whoami)"' has insufficient rights on this host '$(hostname -s)'" \ && echo " - or the folder does not exist." \ && return 1 - - _CURRENT_FOLDER="$(realpath -s "${_CURRENT_FOLDER:?"Missing CURRENT_FOLDER"}")" - _CURRENT_FOLDER="${_CURRENT_FOLDER%/}/" #Removes shortest matching pattern '/' from the end - - _CURRENT_FILE="$(basename "${2:?"Missing second parameter CURRENT_FULLFILE"}")" + fi + local -r _CURRENT_FILE="$(basename "${2:?"Missing second parameter CURRENT_FULLFILE"}")" #Build from components for safety - _CURRENT_FULLFILE="${_CURRENT_FOLDER:?"Missing CURRENT_FOLDER"}${_CURRENT_FILE:?"Missing CURRENT_FILE"}" + readonly _CURRENT_FULLFILE="${_CURRENT_FOLDER:?"Missing CURRENT_FOLDER"}${_CURRENT_FILE:?"Missing CURRENT_FILE"}" - _DEFINED_FULLFILE="$(printSelectedDefinition "${_CIS_ROOT}" "${_DOMAIN}" "${_CURRENT_FULLFILE}")" - _NOW="$(date +%Y%m%d_%H%M)" - _SAVED_FULLFILE="${_CURRENT_FULLFILE}.backup@${_NOW:?"Missing NOW"}" - readonly _CIS_ROOT _CURRENT_FILE _CURRENT_FOLDER _CURRENT_FULLFILE _DEFINITIONS _DOMAIN _DEFINED_FULLFILE _NOW _SAVED_FULLFILE + local -r _DEFINED_FULLFILE="$(printSelectedDefinition "${_CIS_ROOT}" "${_DOMAIN}" "${_CURRENT_FULLFILE}")" + local -r _NOW="$(date +%Y%m%d_%H%M)" + local -r _SAVED_FULLFILE="${_CURRENT_FULLFILE}.backup@${_NOW:?"Missing NOW"}" [ -z "${_DEFINED_FULLFILE}" ] \ && isCoreDefinition "${_CURRENT_FULLFILE}" \ diff --git a/prepareThisHostBeforeCloning.sh b/prepareThisHostBeforeCloning.sh index c5f39c6..a0bec2d 100755 --- a/prepareThisHostBeforeCloning.sh +++ b/prepareThisHostBeforeCloning.sh @@ -6,11 +6,12 @@ && exit 1 function goOn() { - local _QUESTION="${1:?"goOn(): Mising first parameter QUESTION"}" - local _TIPP="${2}" + local -r _QUESTION="${1:?"goOn(): Mising first parameter QUESTION"}" + local -r _TIPP="${2}" local _ANSWER read -p "${_QUESTION}: [y]es or [n]o : " _ANSWER + readonly _ANSWER [ "${_ANSWER}" == "y" ] && return 0 [ "${_ANSWER}" == "Y" ] && return 0 [ "${_ANSWER}" == "yes" ] && return 0 @@ -18,13 +19,13 @@ function goOn() { [ "${_ANSWER}" == "YES" ] && return 0 echo - echo "${_TIPP}" + [ -n "${_TIPP}" ] && echo "${_TIPP}" echo return 1 } function setNeededHostnameOrExit() { - _FQDN="${1}" + local -r _FQDN="${1}" [ -z "${_FQDN}" ] \ && ! echo "$(hostname -b)" | grep -q -F '.' \ @@ -55,8 +56,8 @@ function setNeededHostnameOrExit() { function printOrGenerateSSHKeys() { git --version > /dev/null || (apt update; apt upgrade -y; apt install git) - local _FULL_USERNAME="$(whoami)@$(hostname -b)" - local _PUBKEY_FILE=~/.ssh/id_ed25519.pub + local -r _FULL_USERNAME="$(whoami)@$(hostname -b)" + local -r _PUBKEY_FILE=~/.ssh/id_ed25519.pub echo echo "Printing public SSH-Key of ${_FULL_USERNAME}:" diff --git a/setupCoreOntoThisHost.sh b/setupCoreOntoThisHost.sh index af8244e..bdab800 100755 --- a/setupCoreOntoThisHost.sh +++ b/setupCoreOntoThisHost.sh @@ -32,9 +32,7 @@ function checkGitIsAvailable() { } function checkPreconditions() { - local _DOMAIN - _DOMAIN="${1}" # Optional parameter DOMAIN - readonly _DOMAIN + local -r _DOMAIN="${1}" # Optional parameter DOMAIN ! [ -z "${_DOMAIN}" ] \ && [ "$(hostname -d)" != "${_DOMAIN}" ] \ @@ -69,11 +67,9 @@ function checkPreconditions() { } function getOrSetDomain() { - local _CURRENT_DOMAIN _GIVEN_DOMAIN _OVERRIDE_DOMAIN_FILE - _CURRENT_DOMAIN="${CIS[DOMAIN]:?"Missing CIS_DOMAIN"}" - _GIVEN_DOMAIN="${1}" # Optional parameter DOMAIN - _OVERRIDE_DOMAIN_FILE="${CIS[ROOT]:?"Missing CIS_ROOT"}overrideOwnDomain" - readonly _CURRENT_DOMAIN _GIVEN_DOMAIN _OVERRIDE_DOMAIN_FILE + local -r _CURRENT_DOMAIN="${CIS[DOMAIN]:?"Missing CIS_DOMAIN"}" + local -r _GIVEN_DOMAIN="${1}" # Optional parameter DOMAIN + local -r _OVERRIDE_DOMAIN_FILE="${CIS[ROOT]:?"Missing CIS_ROOT"}overrideOwnDomain" ! [ -z "${_CURRENT_DOMAIN}" ] \ && [ -z "${_GIVEN_DOMAIN}" ] \ @@ -104,9 +100,8 @@ function getOrSetDomain() { } function getRemoteRepositoryPath() { - local _REPOSITORY="$(git -C "${CIS[ROOT]:?"Missing CIS_ROOT"}" config --get remote.origin.url 2> /dev/null | grep -i 'git@')" - local _PATH="${_REPOSITORY%/*}" #Removes shortest matching pattern '/*' from the end - readonly _REPOSITORY _PATH + local -r _REPOSITORY="$(git -C "${CIS[ROOT]:?"Missing CIS_ROOT"}" config --get remote.origin.url 2> /dev/null | grep -i 'git@')" + local -r _PATH="${_REPOSITORY%/*}" #Removes shortest matching pattern '/*' from the end ! [ -z "${_PATH}" ] \ && echo "${_PATH}/" \ @@ -116,9 +111,7 @@ function getRemoteRepositoryPath() { } function setSSLPermissions(){ - local _SSLPATHS - _SSLPATHS="${CIS[DOMAINSTATES]}hosts/*/etc/ssl/domains/" - readonly _SSLPATHS + local -r _SSLPATHS="${CIS[DOMAINSTATES]}hosts/*/etc/ssl/domains/" addgroup --gid 775 ssl 2> /dev/null for _path in ${_SSLPATHS}; do @@ -132,9 +125,7 @@ function setSSLPermissions(){ } function addDefinition(){ - local _REPOSITORY - _REPOSITORY="$(getRemoteRepositoryPath)cis-definition-${CIS[DOMAIN]}.git" - readonly _REPOSITORY + local -r _REPOSITORY="$(getRemoteRepositoryPath)cis-definition-${CIS[DOMAIN]}.git" [ "$(id -u)" == "0" ] \ && echo \ @@ -154,9 +145,7 @@ function addDefinition(){ } function addState() { - local _REPOSITORY - _REPOSITORY="$(getRemoteRepositoryPath)cis-state-${CIS[DOMAIN]}.git" - readonly _REPOSITORY + local -r _REPOSITORY="$(getRemoteRepositoryPath)cis-state-${CIS[DOMAIN]}.git" [ "$(id -u)" == "0" ] \ && echo \ @@ -178,9 +167,7 @@ function addState() { } function setupCoreFunctionality() { - local _MINUTE_FROM_OWN_IP - _MINUTE_FROM_OWN_IP="$(hostname -I | xargs -n 1 | grep -F '.' | head -n 1 | cut -d. -f4 || echo 0)" #uses last value from first own ipv4 or 0 as minute value - readonly _MINUTE_FROM_OWN_IP + local -r _MINUTE_FROM_OWN_IP="$(hostname -I | xargs -n 1 | grep -F '.' | head -n 1 | cut -d. -f4 || echo 0)" #uses last value from first own ipv4 or 0 as minute value [ "$(id -u)" != "0" ] \ && echo \ @@ -208,8 +195,7 @@ function setupCoreFunctionality() { } function setup() { - local _DOMAIN="$(getOrSetDomain "${1}")" - readonly _DOMAIN + local -r _DOMAIN="$(getOrSetDomain "${1}")" ! checkPreconditions "${_DOMAIN}" \ && return 1 diff --git a/updateRepositories.sh b/updateRepositories.sh index 25bdde7..ef9be42 100755 --- a/updateRepositories.sh +++ b/updateRepositories.sh @@ -23,8 +23,7 @@ source /cis/core/base.module.sh function update_repositories() { - local _MODE="${1:-"--core"}" - readonly _MODE + local -r _MODE="${1:-"--core"}" [ "${_MODE}" == "--repair" ] \ && (git -C "${CIS[ROOT]:?"Missing CISROOT"}" reset --hard origin/main; \