#! /usr/bin/env bash PRINT_HELP=false TMP_FOLDER_NAME="artifact_tmp" EXPECTED_COMPONENTS="debezium-connector-db2 debezium-connector-mongodb debezium-connector-mysql debezium-connector-oracle debezium-connector-postgres debezium-connector-sqlserver debezium-scripting" print_usage() { echo "Usage: maven-artifact-check [ -u | --url ] [ -f | --file ] [ --components ] ]" echo "downloads the maven artifact archive from URL or uses given file, unzips it and validates its artifact_version, components matching EXPECTED_COMPONENTS and checksums" echo "--components needs to be the last argument in order to parse an array of arguments" } OPTS=$(getopt -o u:f:h --long url:,components:,file:,help -n 'parse-options' -- "$@") if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi eval set -- "$OPTS" while true; do case "$1" in -f | --file ) ARTIFACT_FILE=$2; shift; shift ;; -u | --url ) ARTIFACT_URL=$2; shift; shift ;; --components ) EXPECTED_COMPONENTS=$2 shift; shift ;; -h | --help ) PRINT_HELP=true; shift ;; -- ) shift; break ;; * ) break ;; esac done if [ ${PRINT_HELP} == true ]; then print_usage exit fi if [ -z "${ARTIFACT_URL}" ] && [ -z "${ARTIFACT_FILE}" ]; then echo "either artifact file path or url must be specified!" echo "" print_usage exit 1 fi return_code=0 # check url/filename, parse artifact version if [ -n "${ARTIFACT_URL}" ]; then URL_PATTERN='^http[s]?:\/\/.*\/(debezium-([0-9]\.[0-9]\.[0-9]).*\.zip)$' [[ ${ARTIFACT_URL} =~ ${URL_PATTERN} ]] zip_name="${BASH_REMATCH[1]}" artifact_version="${BASH_REMATCH[2]}" if [ -z "${artifact_version}" ]; then echo "invalid artifact url" return_code=1 fi echo "${zip_name}" curl "${ARTIFACT_URL}" --output "${zip_name}" else FILE_PATTERN='^.*(debezium-([0-9]\.[0-9]\.[0-9]).*\.zip)$' [[ ${ARTIFACT_FILE} =~ ${FILE_PATTERN} ]] zip_name="${BASH_REMATCH[1]}" artifact_version="${BASH_REMATCH[2]}" if [ -z "${artifact_version}" ]; then echo "invalid artifact file" return_code=1 fi fi # unzip unzip "${zip_name}" -d ${TMP_FOLDER_NAME} pushd ${TMP_FOLDER_NAME} || exit 1 # enter the artifact directory and check directory structure for file in *; do if [ -d "${file}" ]; then # validate artifact_version from dir name if [[ ! "${file}" == *"${artifact_version}"* ]]; then echo "invalid artifact_version in root directory name" return_code=1 fi pushd "${file}" || exit 1 fi done if [ ! -d "./maven-repository/io/debezium/" ]; then echo "invalid directory structure of artifact!" exit 1 fi pushd "maven-repository/io/debezium/" >> /dev/null || exit 1 # check if correct artifact components are present actual_components=($(ls)) sorted_expected_components=$(printf '%s ' "${EXPECTED_COMPONENTS[@]}" | sort | xargs) if [[ ! "${sorted_expected_components[*]}" == "${actual_components[*]}" ]]; then echo "components of artifact don't match expected components" echo "expected components: ${sorted_expected_components[*]}" echo "actual_components ${actual_components[*]}" exit 1 fi # iterate components for component in *; do if [ ! -d "${component}" ]; then echo "component ${component} is not a directory" return_code=1 continue else echo "VALIDATING COMPONENT ${component}" pushd "${component}" >> /dev/null || exit 1 dir_content=($(ls)) # check that only one directory is present if [ ${#dir_content[@]} != 1 ]; then echo "component directory should only contain a single folder" return_code=1 fi # validate artifact version of component directory if [[ ! "${dir_content[0]}" == *"${artifact_version}"* ]]; then echo "invalid artifact version in component ${component}" return_code=1 fi pushd "${dir_content[0]}" >> /dev/null || exit 1 # validate component directory contents version_pattern=$(echo "${artifact_version}" | sed "s/\./\\\./g") archive_pattern="^${component}-${version_pattern}.*\.zip$" md5_pattern="^${component}-${version_pattern}.*\.zip\.md5$" sha1_pattern="^${component}-${version_pattern}.*\.zip\.sha1$" archive_filename="" md5_filename="" sha1_filename="" for file in *; do [[ ${file} =~ ${archive_pattern} ]] if [ -n "${BASH_REMATCH[0]}" ]; then archive_filename=${file} fi [[ ${file} =~ ${md5_pattern} ]] if [ -n "${BASH_REMATCH[0]}" ]; then md5_filename=${file} fi [[ ${file} =~ ${sha1_pattern} ]] if [ -n "${BASH_REMATCH[0]}" ]; then sha1_filename=${file} fi done if [ -z "${archive_filename}" ]; then echo "archive of component ${component} missing!" return_code=1 fi if [ -z "${md5_filename}" ]; then echo "md5 of component ${component} missing!" return_code=1 fi if [ -z "${sha1_filename}" ]; then echo "sha1 of component ${component} missing!" return_code=1 fi # check sha1 hash sha1_sum="$(cat "${sha1_filename}")" expected_sha1_sum=$(sha1sum "${archive_filename}" | head -n1 | awk '{print $1;}') if [ "${sha1_sum}" != "${expected_sha1_sum}" ]; then echo "sha1 checksum of component ${component} is incorrect!" return_code=1 fi # check md5 hash md5_sum="$(cat "${md5_filename}")" expected_md5_sum=$(md5sum "${archive_filename}" | head -n1 | awk '{print $1;}') if [ "${md5_sum}" != "${expected_md5_sum}" ]; then echo "md5 checksum of component ${component} is incorrect!" return_code=1 fi popd >> /dev/null || exit 1 popd >> /dev/null || exit 1 fi done exit ${return_code}