2020-11-12 12:27:34 -05:00
#!/usr/bin/env bash
2021-07-19 10:28:49 -04:00
DetectActions( ) {
FILE = " ${ 1 } "
2024-01-06 12:39:39 -05:00
if [ " ${ VALIDATE_GITHUB_ACTIONS } " = = "false" ] ; then
debug " Don't check if ${ FILE } is a GitHub Actions file because VALIDATE_GITHUB_ACTIONS is: ${ VALIDATE_GITHUB_ACTIONS } "
return 1
fi
2021-07-19 10:28:49 -04:00
debug " Checking if ${ FILE } is a GitHub Actions file... "
# Check if in the users .github, or the super linter test suite
2023-12-15 03:50:35 -05:00
if [ [ " $( dirname " ${ FILE } " ) " = = *".github/workflows" * ] ] || [ [ " $( dirname " ${ FILE } " ) " = = *" ${ TEST_CASE_FOLDER } /github_actions " * ] ] ; then
2021-07-19 10:28:49 -04:00
debug " ${ FILE } is GitHub Actions file. "
return 0
else
debug " ${ FILE } is NOT GitHub Actions file. "
return 1
fi
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectOpenAPIFile( ) {
FILE = " ${ 1 } "
2024-01-06 12:39:39 -05:00
if [ " ${ VALIDATE_OPENAPI } " = = "false" ] ; then
debug " Don't check if ${ FILE } is an OpenAPI file because VALIDATE_OPENAPI is: ${ VALIDATE_OPENAPI } "
return 1
fi
2020-11-12 12:27:34 -05:00
2024-01-06 12:39:39 -05:00
debug " Checking if ${ FILE } is an OpenAPI file... "
2020-11-12 12:27:34 -05:00
2024-01-06 12:39:39 -05:00
if grep -E '"openapi":|"swagger":|^openapi:|^swagger:' " ${ FILE } " >/dev/null; then
2021-01-27 14:47:34 -05:00
debug " ${ FILE } is an OpenAPI descriptor "
2020-11-12 12:27:34 -05:00
return 0
else
2021-01-27 14:47:34 -05:00
debug " ${ FILE } is NOT an OpenAPI descriptor "
2020-11-12 12:27:34 -05:00
return 1
fi
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectTektonFile( ) {
FILE = " ${ 1 } "
2024-01-06 12:39:39 -05:00
if [ " ${ VALIDATE_TEKTON } " = = "false" ] ; then
debug " Don't check if ${ FILE } is a Tekton file because VALIDATE_TEKTON is: ${ VALIDATE_TEKTON } "
return 1
fi
2020-11-12 12:27:34 -05:00
debug " Checking if ${ FILE } is a Tekton file... "
2024-01-06 12:39:39 -05:00
if grep -q -E 'apiVersion: tekton' " ${ FILE } " >/dev/null; then
2020-11-12 12:27:34 -05:00
return 0
else
return 1
fi
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectARMFile( ) {
2024-01-06 12:39:39 -05:00
FILE = " ${ 1 } "
if [ " ${ VALIDATE_ARM } " = = "false" ] ; then
debug " Don't check if ${ FILE } is an ARM file because VALIDATE_ARM is: ${ VALIDATE_ARM } "
return 1
fi
2020-11-12 12:27:34 -05:00
debug " Checking if ${ FILE } is an ARM file... "
2024-01-06 12:39:39 -05:00
if grep -E 'schema.management.azure.com' " ${ FILE } " >/dev/null; then
2020-11-12 12:27:34 -05:00
return 0
else
return 1
fi
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectCloudFormationFile( ) {
2024-01-06 12:39:39 -05:00
FILE = " ${ 1 } "
if [ " ${ VALIDATE_CLOUDFORMATION } " = = "false" ] ; then
debug " Don't check if ${ FILE } is a CloudFormation file because VALIDATE_CLOUDFORMATION is: ${ VALIDATE_CLOUDFORMATION } "
return 1
fi
2020-11-12 12:27:34 -05:00
debug " Checking if ${ FILE } is a Cloud Formation file... "
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html
# AWSTemplateFormatVersion is optional
2024-01-06 12:39:39 -05:00
# Check if file has AWS Template info
2020-11-12 12:27:34 -05:00
if grep -q 'AWSTemplateFormatVersion' " ${ FILE } " >/dev/null; then
return 0
fi
2024-01-06 12:39:39 -05:00
# See if it contains AWS References
2020-11-12 12:27:34 -05:00
if grep -q -E '(AWS|Alexa|Custom)::' " ${ FILE } " >/dev/null; then
return 0
fi
return 1
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectKubernetesFile( ) {
2024-01-06 12:39:39 -05:00
FILE = " ${ 1 } "
if [ " ${ VALIDATE_KUBERNETES_KUBECONFORM } " = = "false" ] ; then
debug " Don't check if ${ FILE } is a Kubernetes file because VALIDATE_KUBERNETES_KUBECONFORM is: ${ VALIDATE_KUBERNETES_KUBECONFORM } "
return 1
fi
2020-11-12 12:27:34 -05:00
debug " Checking if ${ FILE } is a Kubernetes descriptor... "
2022-03-14 10:22:58 -04:00
if grep -q -v 'kustomize.config.k8s.io' " ${ FILE } " &&
grep -q -v "tekton" " ${ FILE } " &&
2023-06-20 15:27:03 -04:00
grep -q -E '(^apiVersion):' " ${ FILE } " &&
grep -q -E '(^kind):' " ${ FILE } " ; then
2020-11-12 12:27:34 -05:00
debug " ${ FILE } is a Kubernetes descriptor "
return 0
fi
debug " ${ FILE } is NOT a Kubernetes descriptor "
return 1
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
DetectAWSStatesFIle( ) {
2024-01-06 12:39:39 -05:00
FILE = " ${ 1 } "
if [ " ${ VALIDATE_STATES } " = = "false" ] ; then
debug " Don't check if ${ FILE } is an AWS states file because VALIDATE_STATES is: ${ VALIDATE_STATES } "
return 1
fi
2020-11-12 12:27:34 -05:00
debug " Checking if ${ FILE } is a AWS states descriptor... "
# https://states-language.net/spec.html#example
2021-09-09 14:03:41 -04:00
if grep -q '"Resource": *"arn' " ${ FILE } " &&
grep -q '"States"' " ${ FILE } " ; then
2020-11-12 12:27:34 -05:00
return 0
fi
return 1
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
CheckInArray( ) {
NEEDLE = " $1 " # Language we need to match
######################################
# Check if Language was in the array #
######################################
for LANG in " ${ UNIQUE_LINTED_ARRAY [@] } " ; do
if [ [ " ${ LANG } " = = " ${ NEEDLE } " ] ] ; then
return 0
fi
done
return 1
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
function GetFileType( ) {
# Need to run the file through the 'file' exec to help determine
# The type of file being parsed
FILE = " $1 "
GET_FILE_TYPE_CMD = $( file " ${ FILE } " 2>& 1)
echo " ${ GET_FILE_TYPE_CMD } "
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
function CheckFileType( ) {
# Need to run the file through the 'file' exec to help determine
# The type of file being parsed
FILE = " $1 "
GET_FILE_TYPE_CMD = " $( GetFileType " $FILE " ) "
2024-01-11 14:44:16 -05:00
local FILE_TYPE_MESSAGE
2020-11-12 12:27:34 -05:00
if [ [ ${ GET_FILE_TYPE_CMD } = = *"Ruby script" * ] ] ; then
2024-01-11 14:44:16 -05:00
FILE_TYPE_MESSAGE = " Found Ruby script without extension ( ${ FILE } ). Rename the file with proper extension for Ruby files. "
2020-11-12 12:27:34 -05:00
FILE_ARRAY_RUBY += ( " ${ FILE } " )
2022-01-19 12:09:26 -05:00
elif [ [ ${ GET_FILE_TYPE_CMD } = = *"Python script" * ] ] ; then
2024-01-11 14:44:16 -05:00
FILE_TYPE_MESSAGE = " Found Python script without extension ( ${ FILE } ). Rename the file with proper extension for Python files. "
2022-01-19 12:09:26 -05:00
FILE_ARRAY_PYTHON += ( " ${ FILE } " )
elif [ [ ${ GET_FILE_TYPE_CMD } = = *"Perl script" * ] ] ; then
2024-01-11 14:44:16 -05:00
FILE_TYPE_MESSAGE = " Found Perl script without extension ( ${ FILE } ). Rename the file with proper extension for Perl files. "
2022-01-19 12:09:26 -05:00
FILE_ARRAY_PERL += ( " ${ FILE } " )
2020-11-12 12:27:34 -05:00
else
2024-01-11 14:44:16 -05:00
FILE_TYPE_MESSAGE = " Failed to get file type for: ${ FILE } "
fi
if [ " ${ SUPPRESS_FILE_TYPE_WARN } " = = "false" ] ; then
warn " ${ FILE_TYPE_MESSAGE } "
else
debug " ${ FILE_TYPE_MESSAGE } "
2020-11-12 12:27:34 -05:00
fi
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
function GetFileExtension( ) {
FILE = " $1 "
###########################
# Get the files extension #
###########################
# Extract just the file extension
FILE_TYPE = ${ FILE ##*. }
# To lowercase
FILE_TYPE = ${ FILE_TYPE ,, }
echo " $FILE_TYPE "
}
2024-01-06 12:39:39 -05:00
2020-11-12 12:27:34 -05:00
function IsValidShellScript( ) {
FILE = " $1 "
2024-01-06 12:39:39 -05:00
if [ " ${ VALIDATE_BASH } " = = "false" ] && [ " ${ VALIDATE_BASH_EXEC } " = = "false" ] && [ " ${ VALIDATE_SHELL_SHFMT } " = = "false" ] ; then
debug " Don't check if ${ FILE } is a shell script because VALIDATE_BASH, VALIDATE_BASH_EXEC, and VALIDATE_SHELL_SHFMT are set to: ${ VALIDATE_BASH } , ${ VALIDATE_BASH_EXEC } , ${ VALIDATE_SHELL_SHFMT } "
return 1
fi
2020-11-12 12:27:34 -05:00
FILE_EXTENSION = " $( GetFileExtension " $FILE " ) "
GET_FILE_TYPE_CMD = " $( GetFileType " $FILE " ) "
trace " File:[ ${ FILE } ], File extension:[ ${ FILE_EXTENSION } ], File type: [ ${ GET_FILE_TYPE_CMD } ] "
if [ [ " ${ FILE_EXTENSION } " = = "zsh" ] ] ||
[ [ ${ GET_FILE_TYPE_CMD } = = *"zsh script" * ] ] ; then
warn " $FILE is a ZSH script. Skipping... "
return 1
fi
if [ " ${ FILE_EXTENSION } " = = "sh" ] ||
[ " ${ FILE_EXTENSION } " = = "bash" ] ||
2021-07-19 10:30:44 -04:00
[ " ${ FILE_EXTENSION } " = = "bats" ] ||
2020-11-12 12:27:34 -05:00
[ " ${ FILE_EXTENSION } " = = "dash" ] ||
[ " ${ FILE_EXTENSION } " = = "ksh" ] ; then
debug " $FILE is a valid shell script (has a valid extension: ${ FILE_EXTENSION } ) "
return 0
fi
if [ [ " ${ GET_FILE_TYPE_CMD } " = = *"POSIX shell script" * ] ] ||
[ [ ${ GET_FILE_TYPE_CMD } = = *"Bourne-Again shell script" * ] ] ||
[ [ ${ GET_FILE_TYPE_CMD } = = *"dash script" * ] ] ||
[ [ ${ GET_FILE_TYPE_CMD } = = *"ksh script" * ] ] ||
[ [ ${ GET_FILE_TYPE_CMD } = = *"/usr/bin/env sh script" * ] ] ; then
debug " $FILE is a valid shell script (has a valid file type: ${ GET_FILE_TYPE_CMD } ) "
return 0
fi
trace " $FILE is NOT a supported shell script. Skipping "
return 1
}
2024-01-06 12:39:39 -05:00
2021-06-28 08:59:11 -04:00
function IsGenerated( ) {
FILE = " $1 "
2024-01-06 12:39:39 -05:00
if [ " ${ IGNORE_GENERATED_FILES } " = = "false" ] ; then
debug " Don't check if ${ FILE } is generated because IGNORE_GENERATED_FILES is: ${ IGNORE_GENERATED_FILES } "
return 1
fi
2021-06-28 08:59:11 -04:00
2024-01-06 12:39:39 -05:00
if ! grep -q "@generated" " $FILE " ; then
2021-06-28 08:59:11 -04:00
trace " File:[ ${ FILE } ] is not generated, because it doesn't have @generated marker "
return 1
fi
2024-01-06 12:39:39 -05:00
if grep -q "@not-generated" " $FILE " ; then
2021-06-28 08:59:11 -04:00
trace " File:[ ${ FILE } ] is not-generated because it has @not-generated marker "
return 1
else
trace " File:[ ${ FILE } ] is generated because it has @generated marker "
return 0
fi
}
2024-01-06 12:39:39 -05:00
2021-09-10 10:43:20 -04:00
function RunAdditionalInstalls( ) {
##################################
# Run installs for Psalm and PHP #
##################################
if [ " ${ VALIDATE_PHP_PSALM } " = = "true" ] && [ " ${# FILE_ARRAY_PHP_PSALM [@] } " -ne 0 ] ; then
# found PHP files and were validating it, need to composer install
info "Found PHP files to validate, and [VALIDATE_PHP_PSALM] set to true, need to run composer install"
info "looking for composer.json in the users repository..."
mapfile -t COMPOSER_FILE_ARRAY < <( find / -name composer.json 2>& 1)
2021-10-01 13:41:13 -04:00
debug " COMPOSER_FILE_ARRAY contents:[ ${ COMPOSER_FILE_ARRAY [*] } ] "
2021-09-10 10:43:20 -04:00
############################################
# Check if we found the file in the system #
############################################
if [ " ${# COMPOSER_FILE_ARRAY [@] } " -ne 0 ] ; then
for LINE in " ${ COMPOSER_FILE_ARRAY [@] } " ; do
2022-03-23 12:43:28 -04:00
COMPOSER_PATH = $( dirname " ${ LINE } " 2>& 1)
2021-09-10 10:43:20 -04:00
info " Found [composer.json] at:[ ${ LINE } ] "
COMPOSER_CMD = $(
2022-03-23 12:43:28 -04:00
cd " ${ COMPOSER_PATH } " || exit 1
2021-10-01 13:41:13 -04:00
composer install --no-progress -q 2>& 1
2021-09-10 10:43:20 -04:00
)
##############
# Error code #
##############
ERROR_CODE = $?
##############################
# Check the shell for errors #
##############################
if [ " ${ ERROR_CODE } " -ne 0 ] ; then
# Error
2022-03-23 12:43:28 -04:00
error " ERROR! Failed to run composer install at location:[ ${ COMPOSER_PATH } ] "
2021-09-10 10:43:20 -04:00
fatal " ERROR:[ ${ COMPOSER_CMD } ] "
else
# Success
info "Successfully ran:[composer install] for PHP validation"
fi
done
fi
fi
2021-10-05 09:46:38 -04:00
###############################
# Run installs for R language #
###############################
if [ " ${ VALIDATE_R } " = = "true" ] && [ " ${# FILE_ARRAY_R [@] } " -ne 0 ] ; then
info "Detected R Language files to lint."
info " Trying to install the R package inside:[ ${ WORKSPACE_PATH } ] "
#########################
# Run the build command #
#########################
BUILD_CMD = $( R CMD build " ${ WORKSPACE_PATH } " 2>& 1)
##############
# Error code #
##############
ERROR_CODE = $?
##############################
# Check the shell for errors #
##############################
if [ " ${ ERROR_CODE } " -ne 0 ] ; then
# Error
warn " ERROR! Failed to run:[R CMD build] at location:[ ${ WORKSPACE_PATH } ] "
warn " BUILD_CMD:[ ${ BUILD_CMD } ] "
else
# Get the build package
BUILD_PKG = $(
cd " ${ WORKSPACE_PATH } " || exit 0
echo *.tar.gz 2>& 1
)
##############################
# Install the build packages #
##############################
INSTALL_CMD = $(
cd " ${ WORKSPACE_PATH } " || exit 0
2022-10-28 13:41:13 -04:00
R -e "remotes::install_local('.', dependencies=T)" 2>& 1
2021-11-09 15:35:36 -05:00
)
2021-10-05 09:46:38 -04:00
##############
# Error code #
##############
ERROR_CODE = $?
##############################
# Check the shell for errors #
##############################
2023-01-16 13:28:56 -05:00
debug " INSTALL_CMD:[ ${ INSTALL_CMD } ] "
2021-10-05 09:46:38 -04:00
if [ " ${ ERROR_CODE } " -ne 0 ] ; then
2023-10-15 01:10:37 -04:00
warn " ERROR: Failed to install the build package at:[ ${ BUILD_PKG } ] "
2021-10-05 09:46:38 -04:00
fi
fi
fi
2022-03-28 14:32:04 -04:00
####################################
# Run installs for TFLINT language #
####################################
if [ " ${ VALIDATE_TERRAFORM_TFLINT } " = = "true" ] && [ " ${# FILE_ARRAY_TERRAFORM_TFLINT [@] } " -ne 0 ] ; then
info "Detected TFLint Language files to lint."
info " Trying to install the TFLint init inside:[ ${ WORKSPACE_PATH } ] "
#########################
# Run the build command #
#########################
BUILD_CMD = $(
cd " ${ WORKSPACE_PATH } " || exit 0
2023-12-15 04:29:34 -05:00
tflint --init -c " ${ TERRAFORM_TFLINT_LINTER_RULES } " 2>& 1
2022-03-28 14:32:04 -04:00
)
##############
# Error code #
##############
ERROR_CODE = $?
##############################
# Check the shell for errors #
##############################
if [ " ${ ERROR_CODE } " -ne 0 ] ; then
2023-12-15 04:29:34 -05:00
fatal " ERROR! Failed to initialize tflint with the ${ TERRAFORM_TFLINT_LINTER_RULES } config file: ${ BUILD_CMD } "
2022-03-28 14:32:04 -04:00
else
2023-12-15 04:29:34 -05:00
info " Successfully initialized tflint with the ${ TERRAFORM_TFLINT_LINTER_RULES } config file "
debug " Tflint output: ${ BUILD_CMD } "
2022-03-28 14:32:04 -04:00
fi
fi
2021-09-10 10:43:20 -04:00
}