mirror of
https://github.com/e-m-b-a/emba.git
synced 2026-10-12 02:13:21 +00:00
518 lines
19 KiB
Bash
Executable File
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
|