Files
emba/check_project.sh
T

518 lines
19 KiB
Bash
Executable File

#!/bin/bash -p
# EMBA - EMBEDDED LINUX ANALYZER
#
# Copyright 2020-2023 Siemens AG
# Copyright 2020-2026 Siemens Energy AG
#
# EMBA comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
# welcome to redistribute it under the terms of the GNU General Public License.
# See LICENSE file for usage of this software.
#
# EMBA is licensed under GPLv3
# SPDX-License-Identifier: GPL-3.0-only
#
# Author(s): Michael Messner, Pascal Eckmann
# Contributor(s): Benedikt Kuehne
# Description: Check all shell scripts inside ./helpers, ./modules, emba and itself with shellchecker
STRICT_MODE=1
INVOCATION_PATH="$(dirname "${0}")"
INSTALLER_DIR="${INVOCATION_PATH}/installer"
HELP_DIR="${INVOCATION_PATH}/helpers"
MOD_DIR="${INVOCATION_PATH}/modules"
MOD_DIR_LOCAL="${INVOCATION_PATH}/modules_local"
CONF_DIR="${INVOCATION_PATH}/config"
EXT_DIR="${INVOCATION_PATH}/external"
REP_DIR="${CONF_DIR}/report_templates"
if [[ "${STRICT_MODE}" -eq 1 ]]; then
# shellcheck source=./installer/wickStrictModeFail.sh
source "${INSTALLER_DIR}"/wickStrictModeFail.sh
export DEBUG_SCRIPT=0
# shellcheck source=./helpers/helpers_emba_load_strict_settings.sh
source "${HELP_DIR}"/helpers_emba_load_strict_settings.sh
load_strict_mode_settings
trap 'wickStrictModeFail $?' ERR # The ERR trap is triggered when a script catches an error
fi
if [[ "$*" == *"--fast"* ]]; then
FAST_EXECUTION=1
elif [[ "$*" == *"--help"* ]]; then
echo "Usage: ${0} [--fast]"
exit 0
fi
export GREEN='\033[0;32m'
export ORANGE='\033[0;33m'
export RED='\033[0;31m'
export BLUE='\033[0;34m'
export BOLD='\033[1m'
export NC='\033[0m' # no color
SOURCES=()
JSON_SOURCES=()
MODULES_TO_CHECK_ARR=()
MODULES_TO_CHECK_ARR_TAB=()
MODULES_TO_CHECK_ARR_SEMGREP=()
MODULES_TO_CHECK_ARR_DOCKER=()
MODULES_TO_CHECK_ARR_PERM=()
MODULES_TO_CHECK_ARR_COMMENT=()
MODULES_TO_CHECK_ARR_GREP=()
MODULES_TO_CHECK_ARR_COPYRIGHT=()
MODULES_TO_CHECK_ARR_FCT_SPACE=()
MODULES_TO_CHECK_ARR_JSON=()
CNT_VAR_CHECKER_ISSUES=0
import_config_scripts() {
HELPERS=()
mapfile -t HELPERS < <(find "${CONF_DIR}" -iname "*.sh" 2>/dev/null)
for LINE in "${HELPERS[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
import_helper() {
HELPERS=()
mapfile -t HELPERS < <(find "${HELP_DIR}" -iname "*.sh" 2>/dev/null)
for LINE in "${HELPERS[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
import_reporting_templates() {
REP_TEMP=()
mapfile -t REP_TEMP < <(find "${REP_DIR}" -iname "*.sh" 2>/dev/null)
for LINE in "${REP_TEMP[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
import_json() {
JSON_FILES=()
mapfile -t JSON_FILES < <(find "${CONF_DIR}" -iname "*.json" 2>/dev/null)
for LINE in "${JSON_FILES[@]}"; do
if (file "${LINE}" | grep -q "json"); then
echo "${LINE}"
JSON_SOURCES+=("${LINE}")
fi
done
}
import_module() {
MODULES=()
mapfile -t MODULES < <(find "${MOD_DIR}" -iname "*.sh" 2>/dev/null)
if [[ -d "${MOD_DIR_LOCAL}" ]]; then
mapfile -t MODULES_LOCAL < <(find "${MOD_DIR_LOCAL}" -iname "*.sh" 2>/dev/null)
MODULES=("${MODULES[@]}" "${MODULES_LOCAL[@]}")
fi
for LINE in "${MODULES[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
import_installer() {
MODULES=()
mapfile -t MODULES < <(find "${INSTALLER_DIR}" -iname "*.sh" 2>/dev/null)
for LINE in "${MODULES[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
import_emba_main() {
MODULES=()
mapfile -t MODULES < <(find ./ -iname "emba" -o -iname "installer.sh" -o -iname "check_project.sh" 2>/dev/null)
for LINE in "${MODULES[@]}"; do
if (file "${LINE}" | grep -q "shell script"); then
echo "${LINE}"
SOURCES+=("${LINE}")
fi
done
}
dockerchecker() {
echo -e "\\n""${ORANGE}""${BOLD}""EMBA docker-files check""${NC}"
echo -e "${BOLD}""=================================================================""${NC}"
mapfile -t DOCKER_COMPS < <(find . -maxdepth 1 -iname "docker-compose*.yml")
for DOCKER_COMP in "${DOCKER_COMPS[@]}"; do
echo -e "\\n""${GREEN}""Run docker check on ${DOCKER_COMP}:""${NC}""\\n"
if docker compose -f "${DOCKER_COMP}" config 1>/dev/null || [[ $? -ne 1 ]]; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}${BOLD}==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_DOCKER+=("${DOCKER_COMP}")
fi
done
}
check() {
echo -e "\\n""${ORANGE}""${BOLD}""Embedded Linux Analyzer Shellcheck""${NC}"
echo -e "${BOLD}""=================================================================""${NC}"
echo -e "\\n""${GREEN}""Load all files for check:""${NC}""\\n"
if [[ "${FAST_EXECUTION:-0}" -eq 1 ]]; then
mapfile -t SOURCES < <(git status -s | grep -v "\.swp$" | grep -v "\.json$" | awk '{print $2}' | sort -u)
mapfile -t JSON_SOURCES < <(git status -s | grep -v "\.swp$" | grep "\.json$" | awk '{print $2}' | sort -u)
else
import_emba_main
import_installer
import_helper
import_config_scripts
import_reporting_templates
import_module
import_json
fi
echo -e "\\n""${GREEN}""Check all source for correct tab usage:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Run ${ORANGE}tab check${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if [[ $(grep -cP '\t' "${SOURCE}") -eq 0 ]]; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_TAB+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Check all source for correct comment usage:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Run ${ORANGE}comment check${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if [[ $(grep -E -r "^( )+?#" "${SOURCE}" | grep -v "#\ \|bash\|/bin/sh\|/firmadyne/sh\|shellcheck" | grep -v -E -c "#$") -eq 0 ]]; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
grep -E -r -n "^( )+?#" "${SOURCE}" | grep -v "#\ \|bash\|shellcheck\|/firmadyne/sh" | grep -v -E "#$"
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_COMMENT+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Check all source for correct space usage:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Run ${ORANGE}space check${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if ! grep -q -E ' +$' "${SOURCE}"; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
grep -E -H -n ' +$' "${SOURCE}"
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_COMMENT+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Check all scripts for not using grep -R:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
[[ "${SOURCE}" == *"check_project.sh" ]] && continue
echo -e "\\n""${GREEN}""Run ${ORANGE}recursive grep check${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if [[ $(grep -cP "grep.* -R " "${SOURCE}") -eq 0 ]]; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_GREP+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Run shellcheck and semgrep:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Run ${ORANGE}shellcheck${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if shellcheck -x -o require-variable-braces -P "${INSTALLER_DIR}":"${HELP_DIR}":"${MOD_DIR}":"${MOD_DIR_LOCAL}" "${SOURCE}" || [[ $? -ne 1 && $? -ne 2 ]]; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR+=("${SOURCE}")
fi
echo -e "\\n""${GREEN}""Run ${ORANGE}semgrep${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
semgrep --disable-version-check --metrics=off --config "${EXT_DIR}"/semgrep-rules/bash "${SOURCE}" 2>&1 | tee /tmp/emba_semgrep.log
if grep -q ": 0 findings." /tmp/emba_semgrep.log; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_SEMGREP+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Check JSON with json_pp:""${NC}""\\n"
for SOURCE in "${JSON_SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Check ${ORANGE}json validity${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if (json_pp <"${SOURCE}" &>/dev/null); then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_JSON+=("${SOURCE}")
fi
done
echo -e "\\n""${GREEN}""Check all scripts for correct permissions:""${NC}""\\n"
for SOURCE in "${SOURCES[@]}"; do
[[ ! -f "${SOURCE}" ]] && continue
echo -e "\\n""${GREEN}""Check ${ORANGE}permission${GREEN} on ${ORANGE}${SOURCE}""${NC}""\\n"
if stat -L -c "%a" "${SOURCE}" | grep -q "755"; then
echo -e "${GREEN}""${BOLD}""==> SUCCESS""${NC}""\\n"
else
echo -e "\\n""${ORANGE}""${BOLD}""==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_PERM+=("${SOURCE}")
fi
done
}
summary() {
if [[ -f /tmp/emba_semgrep.log ]]; then
rm /tmp/emba_semgrep.log
fi
if [[ "${#MODULES_TO_CHECK_ARR_TAB[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (tab vs spaces): ${#MODULES_TO_CHECK_ARR_TAB[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_TAB[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_COMMENT[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (space after # sign): ${#MODULES_TO_CHECK_ARR_COMMENT[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_COMMENT[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (shellcheck): ${#MODULES_TO_CHECK_ARR[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_SEMGREP[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (semgrep): ${#MODULES_TO_CHECK_ARR_SEMGREP[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_SEMGREP[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_DOCKER[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (docker compose): ${#MODULES_TO_CHECK_ARR_DOCKER[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_DOCKER[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_PERM[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (permissions): ${#MODULES_TO_CHECK_ARR_PERM[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_PERM[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_GREP[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (recursive grep usage -R): ${#MODULES_TO_CHECK_ARR_GREP[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_GREP[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${#MODULES_TO_CHECK_ARR_FCT_SPACE[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (space usage in function definition): ${#MODULES_TO_CHECK_ARR_FCT_SPACE[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_FCT_SPACE[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX MODULE: ""${MODULE}""${NC}"
done
echo -e "${ORANGE}""WARNING: Fix the errors before pushing to the EMBA repository!"
fi
if [[ "${CNT_VAR_CHECKER_ISSUES}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Found ${ORANGE}${CNT_VAR_CHECKER_ISSUES}${NC} variable scope issues in EMBA scripts${NC}\\n"
echo -e "\\n""${ORANGE}${BOLD}==> FIX ERRORS""${NC}""\\n"
else
echo -e "\\n""${GREEN}""==> Found no problems with variable scope definition""${NC}""\\n"
fi
if [[ "${#MODULES_TO_CHECK_ARR_JSON[@]}" -gt 0 ]]; then
echo -e "\\n\\n""${GREEN}${BOLD}""SUMMARY:${NC}\\n"
echo -e "Modules to check (invalid json file): ${#MODULES_TO_CHECK_ARR_JSON[@]}\\n"
for MODULE in "${MODULES_TO_CHECK_ARR_JSON[@]}"; do
echo -e "${ORANGE}${BOLD}==> FIX JSON: ""${MODULE}""${NC}"
done
else
echo -e "\\n""${GREEN}""==> Found no invalid json files""${NC}""\\n"
fi
}
# check that all tools are installed
check_tools() {
TOOLS=("semgrep" "shellcheck" "json_pp")
for TOOL in "${TOOLS[@]}"; do
if ! command -v "${TOOL}" >/dev/null; then
echo -e "\\n""${RED}""${TOOL} is not installed correctly""${NC}""\\n"
exit 1
fi
done
if ! [[ -d ./external/semgrep-rules/bash ]]; then
echo -e "\\n""${RED}""${BOLD}""Please install semgrep-rules to directory ./external to perform all checks""${NC}""\\n"
echo -e "${ORANGE}git clone https://github.com/returntocorp/semgrep-rules.git external/semgrep-rules${NC}"
exit 1
fi
if [[ ! -f "${HELP_DIR}"/var_check.sh ]]; then
echo -e "\\n""${RED}""${BOLD}""EMBA var_checker helper script missing""${NC}""\\n"
echo -e "\\n""${RED}""${BOLD}""Please fix the EMBA installation to perform all checks""${NC}""\\n"
exit 1
fi
}
list_linter_exceptions() {
# lists all linter exceptions for a given toolname inside a directory
# $1 tool name
# $2 directory
# $3 excluded dir for find
local TOOL_NAME_="${1:-}"
local DIR_="${2:-}"
local EXCLUDE_="${3:-}"
local SEARCH_PAR_=""
local SEARCH_TYPE_=""
echo -e "\\n""${GREEN}""Checking for ${TOOL_NAME_} exceptions inside ${DIR_}:""${NC}""\\n"
case "${TOOL_NAME_}" in
shellcheck)
SEARCH_PAR_="shellcheck disable"
SEARCH_TYPE_="sh"
;;
semgrep)
SEARCH_PAR_="nosemgrep"
SEARCH_TYPE_="sh"
;;
esac
mapfile -t EXCEPTION_SCRIPTS < <(find "${DIR_}" -type d -path "${EXCLUDE_}" -prune -false -o -iname "*.${SEARCH_TYPE_}" -exec grep -H "${SEARCH_PAR_}" {} \;)
if [[ "${#EXCEPTION_SCRIPTS[@]}" -gt 0 ]]; then
for EXCEPTION_ in "${EXCEPTION_SCRIPTS[@]}"; do
echo -e "${GREEN}Found exception in ${ORANGE}${EXCEPTION_%%:*}:${EXCEPTION_##*:}${NC}"
EXCEPTIONS_TO_CHECK_ARR+=("${EXCEPTION_%%:*}")
done
else
echo -e "\\n""${GREEN}""=> Found no exceptions for ${TOOL_NAME_}""${NC}""\\n"
fi
}
copy_right_check() {
# checks all Copyright occurences for supplied end-year
# $1 copyright holder
# $2 end-year
# $3 dir to look in
# $4 excluded dir for find
local OWNER_="${1:-}"
local YEAR_="${2:-}"
local DIR_="${3:-}"
local EXCLUDE_="${4:-}"
echo -e "\\n""${ORANGE}""${BOLD}""EMBA Copyright check""${NC}""\\n""${BOLD}""=================================================================""${NC}"
mapfile -t COPYRIGHT_LINE_ < <(find "${DIR_}" -type d -path "${EXCLUDE_}" -prune -false -o -type f -not -wholename "${0}" -iname "*.sh" -exec grep -H "Copyright" {} \;)
if [[ "${#COPYRIGHT_LINE_[@]}" -gt 0 ]]; then
for LINE_ in "${COPYRIGHT_LINE_[@]}"; do
if [[ "${LINE_##*:}" == *"${OWNER_}" && "${LINE_##*:}" != *"${YEAR_}"* ]]; then
MODULES_TO_CHECK_ARR_COPYRIGHT+=("${LINE_%%:*}")
echo -e "Found problem with Copyright for ${GREEN}${OWNER_}${NC} in ${LINE_%%:*}: ${ORANGE}${LINE_##*:}""${NC}""\\n"
echo -e "\\n""${ORANGE}${BOLD}==> FIX ERRORS""${NC}""\\n"
fi
done
fi
if [[ "${#MODULES_TO_CHECK_ARR_COPYRIGHT[@]}" -eq 0 ]]; then
echo -e "\\n""${GREEN}""==> Found no problems with copyrights""${NC}""\\n"
fi
}
function_entry_space_check() {
# ensure we have the space in the function definition:
# function_name() {
# invalid:
# function_name(){
echo -e "\\n""${ORANGE}""${BOLD}""EMBA function space definition check""${NC}""\\n""${BOLD}""=================================================================""${NC}"
mapfile -t FCT_SPACE_MODULES_ARR < <(grep -r '(){' modules/*.sh || true)
mapfile -t FCT_SPACE_HLP_ARR < <(grep -r '(){' helpers/*.sh || true)
if [[ "${#FCT_SPACE_MODULES_ARR[@]}" -gt 0 ]] || [[ "${#FCT_SPACE_HLP_ARR[@]}" -gt 0 ]]; then
echo -e "Found problem with spaces in function definition${NC}\\n"
echo -e "\\n""${ORANGE}${BOLD}==> FIX ERRORS""${NC}""\\n"
MODULES_TO_CHECK_ARR_FCT_SPACE=("${FCT_SPACE_MODULES_ARR[@]}" "${FCT_SPACE_HLP_ARR[@]}")
else
echo -e "\\n""${GREEN}""==> Found no problems with spaces in function definition. Helpers are currently ignored.""${NC}""\\n"
fi
}
var_checker() {
local MODE="${1:-}"
local RET_ISSUES=0
echo -e "\\n""${ORANGE}""${BOLD}""EMBA variable declaration scope check for ${MODE}""${NC}""\\n""${BOLD}""=================================================================""${NC}"
disable_strict_mode 1
"${HELP_DIR}"/var_check.sh "${MODE}"
RET_ISSUES="$?"
CNT_VAR_CHECKER_ISSUES=$((CNT_VAR_CHECKER_ISSUES + RET_ISSUES))
if [[ "${CNT_VAR_CHECKER_ISSUES}" -gt 0 ]]; then
echo -e "Found ${ORANGE}${CNT_VAR_CHECKER_ISSUES}${NC} variable scope issues in EMBA ${MODE} scripts${NC}\\n"
echo -e "\\n""${ORANGE}${BOLD}==> FIX ERRORS""${NC}""\\n"
else
echo -e "\\n""${GREEN}""==> Found no problems with variable scope definition""${NC}""\\n"
fi
enable_strict_mode 1
}
# main:
check_tools
check
# the following checks are only performed in full check mode (without --fast switch)
if [[ "${FAST_EXECUTION:-0}" -ne 1 ]]; then
var_checker modules
var_checker helpers
function_entry_space_check
dockerchecker
copy_right_check "Siemens Energy AG" 2026 ./ ./external
list_linter_exceptions shellcheck ./ ./external
list_linter_exceptions semgrep ./ ./external
fi
summary
if [[ "${#MODULES_TO_CHECK_ARR_TAB[@]}" -gt 0 ]] || [[ "${#MODULES_TO_CHECK_ARR[@]}" -gt 0 ]] ||
[[ "${#MODULES_TO_CHECK_ARR_SEMGREP[@]}" -gt 0 ]] ||
[[ "${#MODULES_TO_CHECK_ARR_DOCKER[@]}" -gt 0 ]] || [[ "${#MODULES_TO_CHECK_ARR_PERM[@]}" -gt 0 ]] ||
[[ "${#MODULES_TO_CHECK_ARR_COMMENT[@]}" -gt 0 ]] || [[ "${#MODULES_TO_CHECK_ARR_GREP[@]}" -gt 0 ]] ||
[[ "${#MODULES_TO_CHECK_ARR_COPYRIGHT[@]}" -gt 0 ]] || [[ "${#MODULES_TO_CHECK_ARR_FCT_SPACE[@]}" -gt 0 ]] ||
[[ "${CNT_VAR_CHECKER_ISSUES}" -gt 0 ]] || [[ "${#MODULES_TO_CHECK_ARR_JSON[@]}" -gt 0 ]]; then
exit 1
fi