diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae5d0f2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Vscode +.vscode/* \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4315402 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,224 @@ +variables: + GIT_STRATEGY: "clone" + BUILD_IMAGE_CENTOS7: "git.mesalab.cn:7443/mesa_platform/build-env:master" + BUILD_IMAGE_CENTOS8: "git.mesalab.cn:7443/mesa_platform/build-env:rockylinux" + BUILD_PADDING_PREFIX: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX/ + INSTALL_DEPENDENCY_LIBRARY: framework_env openssl-devel libasan + +stages: +- build + +.build_before_script: + before_script: + - mkdir -p $BUILD_PADDING_PREFIX/$CI_PROJECT_NAMESPACE/ + - ln -s $CI_PROJECT_DIR $BUILD_PADDING_PREFIX/$CI_PROJECT_PATH + - cd $BUILD_PADDING_PREFIX/$CI_PROJECT_PATH + - chmod +x ./ci/travis.sh + - yum makecache + - yum install -y elfutils-libelf-devel + + +.build_by_travis_for_centos7: + stage: build + image: $BUILD_IMAGE_CENTOS7 + extends: .build_before_script + script: + - yum install -y libmnl-devel + - yum install -y libnfnetlink-devel + - ./ci/travis.sh + - cd build + tags: + - share + +.build_by_travis_for_centos8: + stage: build + image: $BUILD_IMAGE_CENTOS8 + extends: .build_before_script + script: + - dnf --enablerepo=powertools install -y libmnl-devel + - dnf --enablerepo=powertools install -y libnfnetlink-devel + - ./ci/travis.sh + tags: + - share + +branch_build_debug_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: Debug + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +branch_build_release_for_centos7: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + extends: .build_by_travis_for_centos7 + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +develop_build_debug_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD: 1 + ASAN_OPTION: ADDRESS + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el7 + PULP3_DIST_NAME: framework-testing-x86_64.el7 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +develop_build_release_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD: 1 + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el7 + PULP3_DIST_NAME: framework-testing-x86_64.el7 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +release_build_debug_for_centos7: + stage: build + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD: 1 + PULP3_REPO_NAME: framework-stable-x86_64.el7 + PULP3_DIST_NAME: framework-stable-x86_64.el7 + extends: .build_by_travis_for_centos7 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - tags + +release_build_release_for_centos7: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD: 1 + UPLOAD_SYMBOL_FILES: 1 + SYMBOL_TARGET: libmaatframe + PULP3_REPO_NAME: framework-stable-x86_64.el7 + PULP3_DIST_NAME: framework-stable-x86_64.el7 + extends: .build_by_travis_for_centos7 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - tags + +branch_build_debug_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: Debug + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +branch_build_release_for_centos8: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + extends: .build_by_travis_for_centos8 + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +develop_build_debug_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD: 1 + ASAN_OPTION: ADDRESS + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el8 + PULP3_DIST_NAME: framework-testing-x86_64.el8 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +develop_build_release_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD: 1 + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el8 + PULP3_DIST_NAME: framework-testing-x86_64.el8 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +release_build_debug_for_centos8: + stage: build + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD: 1 + PULP3_REPO_NAME: framework-stable-x86_64.el8 + PULP3_DIST_NAME: framework-stable-x86_64.el8 + extends: .build_by_travis_for_centos8 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - tags + +release_build_release_for_centos8: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD: 1 + UPLOAD_SYMBOL_FILES: 1 + SYMBOL_TARGET: libmaatframe + PULP3_REPO_NAME: framework-stable-x86_64.el8 + PULP3_DIST_NAME: framework-stable-x86_64.el8 + extends: .build_by_travis_for_centos8 + artifacts: + name: "maatframe-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - tags diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..e69de29 diff --git a/autorevision.sh b/autorevision.sh new file mode 100644 index 0000000..3baa179 --- /dev/null +++ b/autorevision.sh @@ -0,0 +1,1268 @@ +#!/bin/sh + +# Copyright (c) 2012 - 2016 dak180 and contributors. See +# https://opensource.org/licenses/mit-license.php or the included +# COPYING.md for licence terms. +# +# autorevision - extracts metadata about the head version from your +# repository. + +# Usage message. +arUsage() { + cat > "/dev/stderr" << EOF +usage: autorevision {-t output-type | -s symbol} [-o cache-file [-f] ] [-V] + Options include: + -t output-type = specify output type + -s symbol = specify symbol output + -o cache-file = specify cache file location + -f = force the use of cache data + -U = check for untracked files in svn + -V = emit version and exit + -? = help message + +The following are valid output types: + clojure = clojure file + c = C/C++ file + h = Header for use with c/c++ + hpp = Alternate C++ header strings with namespace + ini = INI file + java = Java file + javaprop = Java properties file + js = javascript file + json = JSON file + lua = Lua file + m4 = m4 file + matlab = matlab file + octave = octave file + php = PHP file + pl = Perl file + py = Python file + rpm = rpm file + scheme = scheme file + sh = Bash sytax + swift = Swift file + tex = (La)TeX file + xcode = Header useful for populating info.plist files + cmake = CMake file + + +The following are valid symbols: + VCS_TYPE + VCS_BASENAME + VCS_UUID + VCS_NUM + VCS_DATE + VCS_BRANCH + VCS_TAG + VCS_TICK + VCS_EXTRA + VCS_FULL_HASH + VCS_SHORT_HASH + VCS_WC_MODIFIED + VCS_ACTION_STAMP +EOF + exit 1 +} + +# Config +ARVERSION="&&ARVERSION&&" +TARGETFILE="/dev/stdout" +while getopts ":t:o:s:VfU" OPTION; do + case "${OPTION}" in + t) + AFILETYPE="${OPTARG}" + ;; + o) + CACHEFILE="${OPTARG}" + ;; + f) + CACHEFORCE="1" + ;; + s) + VAROUT="${OPTARG}" + ;; + U) + UNTRACKEDFILES="1" + ;; + V) + echo "autorevision ${ARVERSION}" + exit 0 + ;; + ?) + # If an unknown flag is used (or -?): + arUsage + ;; + esac +done + +if [ ! -z "${VAROUT}" ] && [ ! -z "${AFILETYPE}" ]; then + # If both -s and -t are specified: + echo "error: Improper argument combination." 1>&2 + exit 1 +elif [ -z "${VAROUT}" ] && [ -z "${AFILETYPE}" ]; then + # If neither -s or -t are specified: + arUsage +elif [ -z "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # If -f is specified without -o: + arUsage +elif [ ! -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # If we are forced to use the cache but it does not exist. + echo "error: Cache forced but no cache found." 1>&2 + exit 1 +fi + +# Make sure that the path we are given is one we can source +# (dash, we are looking at you). +if [ ! -z "${CACHEFILE}" ] && ! echo "${CACHEFILE}" | grep -q '^\.*/'; then + CACHEFILE="./${CACHEFILE}" +fi + +GENERATED_HEADER="Generated by autorevision - do not hand-hack!" + +# Functions to extract data from different repo types. +# For git repos +# shellcheck disable=SC2039,SC2164,SC2155 +gitRepo() { + local oldPath="${PWD}" + + cd "$(git rev-parse --show-toplevel)" + + VCS_TYPE="git" + + VCS_BASENAME="$(basename "${PWD}")" + + VCS_UUID="$(git rev-list --max-parents=0 --date-order --reverse HEAD 2>/dev/null | sed -n 1p)" + if [ -z "${VCS_UUID}" ]; then + VCS_UUID="$(git rev-list --topo-order HEAD | tail -n 1)" + fi + + # Is the working copy clean? + test -z "$(git status --untracked-files=normal --porcelain)" + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(git rev-list --count HEAD 2>/dev/null)" + if [ -z "${VCS_NUM}" ]; then + echo "warning: Counting the number of revisions may be slower due to an outdated git version less than 1.7.2.3. If something breaks, please update it." 1>&2 + VCS_NUM="$(git rev-list HEAD | wc -l)" + fi + + # This may be a git-svn remote. If so, report the Subversion revision. + if [ -z "$(git config svn-remote.svn.url 2>/dev/null)" ]; then + # The full revision hash + VCS_FULL_HASH="$(git rev-parse HEAD)" + + # The short hash + VCS_SHORT_HASH="$(echo "${VCS_FULL_HASH}" | cut -b 1-7)" + else + # The git-svn revision number + VCS_FULL_HASH="$(git svn find-rev HEAD)" + VCS_SHORT_HASH="${VCS_FULL_HASH}" + fi + + # Current branch + VCS_BRANCH="$(git rev-parse --symbolic-full-name --verify "$(git name-rev --name-only --no-undefined HEAD 2>/dev/null)" 2>/dev/null | sed -e 's:refs/heads/::' | sed -e 's:refs/::')" + + # Cache the description + local DESCRIPTION="$(git describe --long --tags 2>/dev/null)" + + # Current or last tag ancestor (empty if no tags) + VCS_TAG="$(echo "${DESCRIPTION}" | sed -e "s:-g${VCS_SHORT_HASH}\$::" -e 's:-[0-9]*$::')" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${DESCRIPTION}" ]; then + VCS_TICK="$(echo "${DESCRIPTION}" | sed -e "s:${VCS_TAG}-::" -e "s:-g${VCS_SHORT_HASH}::")" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(TZ=UTC git show -s --date=iso-strict-local --pretty=format:%ad | sed -e 's|+00:00|Z|')" + if [ -z "${VCS_DATE}" ]; then + echo "warning: Action stamps require git version 2.7+." 1>&2 + VCS_DATE="$(git log -1 --pretty=format:%ci | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')" + local ASdis="1" + fi + + # Action Stamp + if [ -z "${ASdis}" ]; then + VCS_ACTION_STAMP="${VCS_DATE}!$(git show -s --pretty=format:%cE)" + else + VCS_ACTION_STAMP="" + fi + + cd "${oldPath}" +} + +# For hg repos +# shellcheck disable=SC2039,SC2164 +hgRepo() { + local oldPath="${PWD}" + + cd "$(hg root)" + + VCS_TYPE="hg" + + VCS_BASENAME="$(basename "${PWD}")" + + VCS_UUID="$(hg log -r "0" -l 1 --template '{node}\n')" + + # Is the working copy clean? + test -z "$(hg status -duram)" + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(hg id -n | tr -d '+')" + + # The full revision hash + VCS_FULL_HASH="$(hg log -r "${VCS_NUM}" -l 1 --template '{node}\n')" + + # The short hash + VCS_SHORT_HASH="$(hg id -i | tr -d '+')" + + # Current bookmark (bookmarks are roughly equivalent to git's branches) + # or branch if no bookmark + VCS_BRANCH="$(hg id -B | cut -d ' ' -f 1)" + # Fall back to the branch if there are no bookmarks + if [ -z "${VCS_BRANCH}" ]; then + VCS_BRANCH="$(hg id -b)" + fi + + # Current or last tag ancestor (excluding auto tags, empty if no tags) + VCS_TAG="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttag}\n' 2>/dev/null | sed -e 's:qtip::' -e 's:tip::' -e 's:qbase::' -e 's:qparent::' -e "s:$(hg --config 'extensions.color=' --config 'extensions.mq=' --color never qtop 2>/dev/null)::" | cut -d ' ' -f 1)" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${VCS_TAG}" ]; then + VCS_TICK="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttagdistance}\n' 2>/dev/null)" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(hg log -r "${VCS_NUM}" -l 1 --template '{date|isodatesec}\n' 2>/dev/null | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')" + + # Action Stamp + VCS_ACTION_STAMP="$(TZ=UTC hg log -r "${VCS_NUM}" -l 1 --template '{date|localdate|rfc3339date}\n' 2>/dev/null | sed -e 's|+00:00|Z|')!$(hg log -r "${VCS_NUM}" -l 1 --template '{author|email}\n' 2>/dev/null)" + + cd "${oldPath}" +} + +# For bzr repos +# shellcheck disable=SC2039,SC2164 +bzrRepo() { + local oldPath="${PWD}" + + cd "$(bzr root)" + + VCS_TYPE="bzr" + + VCS_BASENAME="$(basename "${PWD}")" + + # Currently unimplemented because more investigation is needed. + VCS_UUID="" + + # Is the working copy clean? + bzr version-info --custom --template='{clean}\n' | grep -q '1' + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(bzr revno)" + + # The full revision hash + VCS_FULL_HASH="$(bzr version-info --custom --template='{revision_id}\n')" + + # The short hash + VCS_SHORT_HASH="${VCS_NUM}" + + # Nick of the current branch + VCS_BRANCH="$(bzr nick)" + + # Current or last tag ancestor (excluding auto tags, empty if no tags) + VCS_TAG="$(bzr tags --sort=time | sed '/?$/d' | tail -n1 | cut -d ' ' -f1)" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${VCS_TAG}" ]; then + VCS_TICK="$(bzr log --line -r "tag:${VCS_TAG}.." | tail -n +2 | wc -l | sed -e 's:^ *::')" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(bzr version-info --custom --template='{date}\n' | sed -e 's: :T:' -e 's: ::')" + + # Action Stamp + # Currently unimplemented because more investigation is needed. + VCS_ACTION_STAMP="" + + cd "${oldPath}" +} + +# For svn repos +# shellcheck disable=SC2039,SC2164,SC2155 +svnRepo() { + local oldPath="${PWD}" + + VCS_TYPE="svn" + + case "${PWD}" in + /*trunk*|/*branches*|/*tags*) + local fn="${PWD}" + while [ "$(basename "${fn}")" != 'trunk' ] && [ "$(basename "${fn}")" != 'branches' ] && [ "$(basename "${fn}")" != 'tags' ] && [ "$(basename "${fn}")" != '/' ]; do + local fn="$(dirname "${fn}")" + done + local fn="$(dirname "${fn}")" + if [ "${fn}" = '/' ]; then + VCS_BASENAME="$(basename "${PWD}")" + else + VCS_BASENAME="$(basename "${fn}")" + fi + ;; + *) VCS_BASENAME="$(basename "${PWD}")" ;; + esac + + VCS_UUID="$(svn info --xml | sed -n -e 's:::' -e 's:::p')" + + # Cache svnversion output + local SVNVERSION="$(svnversion)" + + # Is the working copy clean? + echo "${SVNVERSION}" | grep -q "M" + case "${?}" in + 0) + VCS_WC_MODIFIED="1" + ;; + 1) + if [ ! -z "${UNTRACKEDFILES}" ]; then + # `svnversion` does not detect untracked files and `svn status` is really slow, so only run it if we really have to. + if [ -z "$(svn status)" ]; then + VCS_WC_MODIFIED="0" + else + VCS_WC_MODIFIED="1" + fi + else + VCS_WC_MODIFIED="0" + fi + ;; + esac + + # Enumeration of changesets + VCS_NUM="$(echo "${SVNVERSION}" | cut -d : -f 1 | sed -e 's:M::' -e 's:S::' -e 's:P::')" + + # The full revision hash + VCS_FULL_HASH="${SVNVERSION}" + + # The short hash + VCS_SHORT_HASH="${VCS_NUM}" + + # Current branch + case "${PWD}" in + /*trunk*|/*branches*|/*tags*) + local lastbase="" + local fn="${PWD}" + while : + do + base="$(basename "${fn}")" + if [ "${base}" = 'trunk' ]; then + VCS_BRANCH='trunk' + break + elif [ "${base}" = 'branches' ] || [ "${base}" = 'tags' ]; then + VCS_BRANCH="${lastbase}" + break + elif [ "${base}" = '/' ]; then + VCS_BRANCH="" + break + fi + local lastbase="${base}" + local fn="$(dirname "${fn}")" + done + ;; + *) VCS_BRANCH="" ;; + esac + + # Current or last tag ancestor (empty if no tags). But "current + # tag" can't be extracted reliably because Subversion doesn't + # have tags the way other VCSes do. + VCS_TAG="" + VCS_TICK="" + + # Date of the current commit + VCS_DATE="$(svn info --xml | sed -n -e 's:::' -e 's:::p')" + + # Action Stamp + VCS_ACTION_STAMP="${VCS_DATE}!$(svn log --xml -l 1 -r "${VCS_SHORT_HASH}" | sed -n -e 's:::' -e 's:::p')" + + cd "${oldPath}" +} + + +# Functions to output data in different formats. +# For bash output +shOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE="${VCS_TYPE}" +VCS_BASENAME="${VCS_BASENAME}" +VCS_UUID="${VCS_UUID}" +VCS_NUM="${VCS_NUM}" +VCS_DATE="${VCS_DATE}" +VCS_BRANCH="${VCS_BRANCH}" +VCS_TAG="${VCS_TAG}" +VCS_TICK="${VCS_TICK}" +VCS_EXTRA="${VCS_EXTRA}" + +VCS_ACTION_STAMP="${VCS_ACTION_STAMP}" +VCS_FULL_HASH="${VCS_FULL_HASH}" +VCS_SHORT_HASH="${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED="${VCS_WC_MODIFIED}" + +# end +EOF +} + +# For source C output +cOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +const char *VCS_TYPE = "${VCS_TYPE}"; +const char *VCS_BASENAME = "${VCS_BASENAME}"; +const char *VCS_UUID = "${VCS_UUID}"; +const int VCS_NUM = ${VCS_NUM}; +const char *VCS_DATE = "${VCS_DATE}"; +const char *VCS_BRANCH = "${VCS_BRANCH}"; +const char *VCS_TAG = "${VCS_TAG}"; +const int VCS_TICK = ${VCS_TICK}; +const char *VCS_EXTRA = "${VCS_EXTRA}"; + +const char *VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; +const char *VCS_FULL_HASH = "${VCS_FULL_HASH}"; +const char *VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + +const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +/* end */ +EOF +} + +# For header output +hOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ +#ifndef AUTOREVISION_H +#define AUTOREVISION_H + +#define VCS_TYPE "${VCS_TYPE}" +#define VCS_BASENAME "${VCS_BASENAME}" +#define VCS_UUID "${VCS_UUID}" +#define VCS_NUM ${VCS_NUM} +#define VCS_DATE "${VCS_DATE}" +#define VCS_BRANCH "${VCS_BRANCH}" +#define VCS_TAG "${VCS_TAG}" +#define VCS_TICK ${VCS_TICK} +#define VCS_EXTRA "${VCS_EXTRA}" + +#define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}" +#define VCS_FULL_HASH "${VCS_FULL_HASH}" +#define VCS_SHORT_HASH "${VCS_SHORT_HASH}" + +#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED} + +#endif + +/* end */ +EOF +} + +# A header output for use with xcode to populate info.plist strings +xcodeOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ +#ifndef AUTOREVISION_H +#define AUTOREVISION_H + +#define VCS_TYPE ${VCS_TYPE} +#define VCS_BASENAME ${VCS_BASENAME} +#define VCS_UUID ${VCS_UUID} +#define VCS_NUM ${VCS_NUM} +#define VCS_DATE ${VCS_DATE} +#define VCS_BRANCH ${VCS_BRANCH} +#define VCS_TAG ${VCS_TAG} +#define VCS_TICK ${VCS_TICK} +#define VCS_EXTRA ${VCS_EXTRA} + +#define VCS_ACTION_STAMP ${VCS_ACTION_STAMP} +#define VCS_FULL_HASH ${VCS_FULL_HASH} +#define VCS_SHORT_HASH ${VCS_SHORT_HASH} + +#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED} + +#endif + +/* end */ +EOF +} + +# For Swift output +swiftOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + # For values that may not exist depending on the type of repo we + # have read from, set them to `nil` when they are empty. + if [ -z "${VCS_UUID}" ]; then + VCS_UUID="nil" + else + VCS_UUID="\"${VCS_UUID}\"" + fi + if [ -z "${VCS_TAG}" ]; then + VCS_TAG="nil" + else + VCS_TAG="\"${VCS_TAG}\"" + fi + : "${VCS_TICK:="nil"}" + if [ -z "${VCS_EXTRA}" ]; then + VCS_EXTRA="nil" + else + VCS_EXTRA="\"${VCS_EXTRA}\"" + fi + if [ -z "${VCS_ACTION_STAMP}" ]; then + VCS_ACTION_STAMP="nil" + else + VCS_ACTION_STAMP="\"${VCS_ACTION_STAMP}\"" + fi + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +let VCS_TYPE = "${VCS_TYPE}" +let VCS_BASENAME = "${VCS_BASENAME}" +let VCS_UUID: String? = ${VCS_UUID} +let VCS_NUM: Int = ${VCS_NUM} +let VCS_DATE = "${VCS_DATE}" +let VCS_BRANCH: String = "${VCS_BRANCH}" +let VCS_TAG: String? = ${VCS_TAG} +let VCS_TICK: Int? = ${VCS_TICK} +let VCS_EXTRA: String? = ${VCS_EXTRA} + +let VCS_ACTION_STAMP: String? = ${VCS_ACTION_STAMP} +let VCS_FULL_HASH: String = "${VCS_FULL_HASH}" +let VCS_SHORT_HASH: String = "${VCS_SHORT_HASH}" + +let VCS_WC_MODIFIED: Bool = ${VCS_WC_MODIFIED} + +/* end */ +EOF +} + +# For Python output +pyOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="False" ;; + 1) VCS_WC_MODIFIED="True" ;; + esac + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" + +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} + +# end +EOF +} + +# For Perl output +plOutput() { + cat << EOF +# ${GENERATED_HEADER} + +\$VCS_TYPE = '${VCS_TYPE}'; +\$VCS_BASENAME = '${VCS_BASENAME}'; +\$VCS_UUID = '${VCS_UUID}'; +\$VCS_NUM = ${VCS_NUM}; +\$VCS_DATE = '${VCS_DATE}'; +\$VCS_BRANCH = '${VCS_BRANCH}'; +\$VCS_TAG = '${VCS_TAG}'; +\$VCS_TICK = ${VCS_TICK}; +\$VCS_EXTRA = '${VCS_EXTRA}'; + +\$VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +\$VCS_FULL_HASH = '${VCS_FULL_HASH}'; +\$VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +\$VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +# end +1; +EOF +} + +# For lua output +luaOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +-- ${GENERATED_HEADER} + +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" + +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} + +-- end +EOF +} + +# For php output +phpOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF + "${VCS_TYPE}", + "VCS_BASENAME" => "${VCS_BASENAME}", + "VCS_UUID" => "${VCS_UUID}", + "VCS_NUM" => ${VCS_NUM}, + "VCS_DATE" => "${VCS_DATE}", + "VCS_BRANCH" => "${VCS_BRANCH}", + "VCS_TAG" => "${VCS_TAG}", + "VCS_TICK" => ${VCS_TICK}, + "VCS_EXTRA" => "${VCS_EXTRA}", + "VCS_ACTION_STAMP" => "${VCS_ACTION_STAMP}", + "VCS_FULL_HASH" => "${VCS_FULL_HASH}", + "VCS_SHORT_HASH" => "${VCS_SHORT_HASH}", + "VCS_WC_MODIFIED" => ${VCS_WC_MODIFIED} +); + +# end +?> +EOF +} + +# For ini output +iniOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +; ${GENERATED_HEADER} +[VCS] +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} +; end +EOF +} + +# For javascript output +jsOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +/** ${GENERATED_HEADER} */ + +var autorevision = { + VCS_TYPE: "${VCS_TYPE}", + VCS_BASENAME: "${VCS_BASENAME}", + VCS_UUID: "${VCS_UUID}", + VCS_NUM: ${VCS_NUM}, + VCS_DATE: "${VCS_DATE}", + VCS_BRANCH: "${VCS_BRANCH}", + VCS_TAG: "${VCS_TAG}", + VCS_TICK: ${VCS_TICK}, + VCS_EXTRA: "${VCS_EXTRA}", + + VCS_ACTION_STAMP: "${VCS_ACTION_STAMP}", + VCS_FULL_HASH: "${VCS_FULL_HASH}", + VCS_SHORT_HASH: "${VCS_SHORT_HASH}", + + VCS_WC_MODIFIED: ${VCS_WC_MODIFIED} +}; + +/** Node.js compatibility */ +if (typeof module !== 'undefined') { + module.exports = autorevision; +} + +/** end */ +EOF +} + +# For JSON output +jsonOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +{ + "_comment": "${GENERATED_HEADER}", + "VCS_TYPE": "${VCS_TYPE}", + "VCS_BASENAME": "${VCS_BASENAME}", + "VCS_UUID": "${VCS_UUID}", + "VCS_NUM": ${VCS_NUM}, + "VCS_DATE": "${VCS_DATE}", + "VCS_BRANCH":"${VCS_BRANCH}", + "VCS_TAG": "${VCS_TAG}", + "VCS_TICK": ${VCS_TICK}, + "VCS_EXTRA": "${VCS_EXTRA}", + + "VCS_ACTION_STAMP": "${VCS_ACTION_STAMP}", + "VCS_FULL_HASH": "${VCS_FULL_HASH}", + "VCS_SHORT_HASH": "${VCS_SHORT_HASH}", + + "VCS_WC_MODIFIED": ${VCS_WC_MODIFIED} +} +EOF +} + +# For Java output +javaOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +public class autorevision { + public static final String VCS_TYPE = "${VCS_TYPE}"; + public static final String VCS_BASENAME = "${VCS_BASENAME}"; + public static final String VCS_UUID = "${VCS_UUID}"; + public static final long VCS_NUM = ${VCS_NUM}; + public static final String VCS_DATE = "${VCS_DATE}"; + public static final String VCS_BRANCH = "${VCS_BRANCH}"; + public static final String VCS_TAG = "${VCS_TAG}"; + public static final long VCS_TICK = ${VCS_TICK}; + public static final String VCS_EXTRA = "${VCS_EXTRA}"; + + public static final String VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; + public static final String VCS_FULL_HASH = "${VCS_FULL_HASH}"; + public static final String VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + + public static final boolean VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; +} +EOF +} + +# For Java properties output +javapropOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE=${VCS_TYPE} +VCS_BASENAME=${VCS_BASENAME} +VCS_UUID=${VCS_UUID} +VCS_NUM=${VCS_NUM} +VCS_DATE=${VCS_DATE} +VCS_BRANCH=${VCS_BRANCH} +VCS_TAG=${VCS_TAG} +VCS_TICK=${VCS_TICK} +VCS_EXTRA=${VCS_EXTRA} + +VCS_ACTION_STAMP=${VCS_ACTION_STAMP} +VCS_FULL_HASH=${VCS_FULL_HASH} +VCS_SHORT_HASH=${VCS_SHORT_HASH} + +VCS_WC_MODIFIED=${VCS_WC_MODIFIED} +EOF +} + +# For m4 output +m4Output() { + cat > "${TARGETFILE}" << EOF +dnl ${GENERATED_HEADER} +define(\`VCS_TYPE', \`${VCS_TYPE}')dnl +define(\`VCS_BASENAME', \`${VCS_BASENAME}')dnl +define(\`VCS_UUID', \`${VCS_UUID}')dnl +define(\`VCS_NUM', \`${VCS_NUM}')dnl +define(\`VCS_DATE', \`${VCS_DATE}')dnl +define(\`VCS_BRANCH', \`${VCS_BRANCH}')dnl +define(\`VCS_TAG', \`${VCS_TAG}')dnl +define(\`VCS_TICK', \`${VCS_TICK}')dnl +define(\`VCS_EXTRA', \`${VCS_EXTRA}')dnl +define(\`VCS_ACTIONSTAMP', \`${VCS_ACTION_STAMP}')dnl +define(\`VCS_FULLHASH', \`${VCS_FULL_HASH}')dnl +define(\`VCS_SHORTHASH', \`${VCS_SHORT_HASH}')dnl +define(\`VCS_WC_MODIFIED', \`${VCS_WC_MODIFIED}')dnl +EOF +} + +# For (La)TeX output +texOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} +\def \vcsType {${VCS_TYPE}} +\def \vcsBasename {${VCS_BASENAME}} +\def \vcsUUID {${VCS_UUID}} +\def \vcsNum {${VCS_NUM}} +\def \vcsDate {${VCS_DATE}} +\def \vcsBranch {${VCS_BRANCH}} +\def \vcsTag {${VCS_TAG}} +\def \vcsTick {${VCS_TICK}} +\def \vcsExtra {${VCS_EXTRA}} +\def \vcsACTIONSTAMP {${VCS_ACTION_STAMP}} +\def \vcsFullHash {${VCS_FULL_HASH}} +\def \vcsShortHash {${VCS_SHORT_HASH}} +\def \vcsWCModified {${VCS_WC_MODIFIED}} +\endinput +EOF +} + +# For scheme output +schemeOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="#f" ;; + 1) VCS_WC_MODIFIED="#t" ;; + esac + cat > "${TARGETFILE}" << EOF +;; ${GENERATED_HEADER} +(define VCS_TYPE "${VCS_TYPE}") +(define VCS_BASENAME "${VCS_BASENAME}") +(define VCS_UUID "${VCS_UUID}") +(define VCS_NUM ${VCS_NUM}) +(define VCS_DATE "${VCS_DATE}") +(define VCS_BRANCH "${VCS_BRANCH}") +(define VCS_TAG "${VCS_TAG}") +(define VCS_TICK ${VCS_TICK}) +(define VCS_EXTRA "${VCS_EXTRA}") + +(define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}") +(define VCS_FULL_HASH "${VCS_FULL_HASH}") +(define VCS_SHORT_HASH "${VCS_SHORT_HASH}") + +(define VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) +;; end +EOF +} + +# For clojure output +clojureOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +;; ${GENERATED_HEADER} +(def VCS_TYPE "${VCS_TYPE}") +(def VCS_BASENAME "${VCS_BASENAME}") +(def VCS_UUID "${VCS_UUID}") +(def VCS_NUM ${VCS_NUM}) +(def VCS_DATE "${VCS_DATE}") +(def VCS_BRANCH "${VCS_BRANCH}") +(def VCS_TAG "${VCS_TAG}") +(def VCS_TICK ${VCS_TICK}) +(def VCS_EXTRA "${VCS_EXTRA}") + +(def VCS_ACTION_STAMP "${VCS_ACTION_STAMP}") +(def VCS_FULL_HASH "${VCS_FULL_HASH}") +(def VCS_SHORT_HASH "${VCS_SHORT_HASH}") + +(def VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) +;; end +EOF +} + +# For rpm spec file output +rpmOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} +$([ "${VCS_TYPE}" ] && echo "%define vcs_type ${VCS_TYPE}") +$([ "${VCS_BASENAME}" ] && echo "%define vcs_basename ${VCS_BASENAME}") +$([ "${VCS_UUID}" ] && echo "%define vcs_uuid ${VCS_UUID}") +$([ "${VCS_NUM}" ] && echo "%define vcs_num ${VCS_NUM}") +$([ "${VCS_DATE}" ] && echo "%define vcs_date ${VCS_DATE}") +$([ "${VCS_BRANCH}" ] && echo "%define vcs_branch ${VCS_BRANCH}") +$([ "${VCS_TAG}" ] && echo "%define vcs_tag ${VCS_TAG}") +$([ "${VCS_TICK}" ] && echo "%define vcs_tick ${VCS_TICK}") +$([ "${VCS_EXTRA}" ] && echo "%define vcs_extra ${VCS_EXTRA}") + +$([ "${VCS_ACTION_STAMP}" ] && echo "%define vcs_action_stamp ${VCS_ACTION_STAMP}") +$([ "${VCS_FULL_HASH}" ] && echo "%define vcs_full_hash ${VCS_FULL_HASH}") +$([ "${VCS_SHORT_HASH}" ] && echo "%define vcs_short_hash ${VCS_SHORT_HASH}") + +$([ "${VCS_WC_MODIFIED}" ] && echo "%define vcs_wc_modified ${VCS_WC_MODIFIED}") +# end +EOF +} + +# shellcheck disable=SC2155,SC2039 +hppOutput() { + local NAMESPACE="$(echo "${VCS_BASENAME}" | sed -e 's:_::g' | tr '[:lower:]' '[:upper:]')" + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +#ifndef ${NAMESPACE}_AUTOREVISION_H +#define ${NAMESPACE}_AUTOREVISION_H + +#include + +namespace $(echo "${NAMESPACE}" | tr '[:upper:]' '[:lower:]') +{ + const std::string VCS_TYPE = "${VCS_TYPE}"; + const std::string VCS_BASENAME = "${VCS_BASENAME}"; + const std::string VCS_UUID = "${VCS_UUID}"; + const int VCS_NUM = ${VCS_NUM}; + const std::string VCS_DATE = "${VCS_DATE}"; + const std::string VCS_BRANCH = "${VCS_BRANCH}"; + const std::string VCS_TAG = "${VCS_TAG}"; + const int VCS_TICK = ${VCS_TICK}; + const std::string VCS_EXTRA = "${VCS_EXTRA}"; + + const std::string VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; + const std::string VCS_FULL_HASH = "${VCS_FULL_HASH}"; + const std::string VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + + const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; +} + +#endif + +/* end */ +EOF +} + +matlabOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="FALSE" ;; + 1) VCS_WC_MODIFIED="TRUE" ;; + esac + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} + +VCS_TYPE = '${VCS_TYPE}'; +VCS_BASENAME = '${VCS_BASENAME}'; +VCS_UUID = '${VCS_UUID}'; +VCS_NUM = ${VCS_NUM}; +VCS_DATE = '${VCS_DATE}'; +VCS_BRANCH = '${VCS_BRANCH}'; +VCS_TAG = '${VCS_TAG}'; +VCS_TICK = ${VCS_TICK}; +VCS_EXTRA = '${VCS_EXTRA}'; + +VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +VCS_FULL_HASH = '${VCS_FULL_HASH}'; +VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +% end +EOF +} + +octaveOutput() { + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} + +VCS_TYPE = '${VCS_TYPE}'; +VCS_BASENAME = '${VCS_BASENAME}'; +VCS_UUID = '${VCS_UUID}'; +VCS_NUM = ${VCS_NUM}; +VCS_DATE = '${VCS_DATE}'; +VCS_BRANCH = '${VCS_BRANCH}'; +VCS_TAG = '${VCS_TAG}'; +VCS_TICK = ${VCS_TICK}; +VCS_EXTRA = '${VCS_EXTRA}'; + +VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +VCS_FULL_HASH = '${VCS_FULL_HASH}'; +VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +% end +EOF +} + +cmakeOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +set(VCS_TYPE ${VCS_TYPE}) +set(VCS_BASENAME ${VCS_BASENAME}) +set(VCS_UUID ${VCS_UUID}) +set(VCS_NUM ${VCS_NUM}) +set(VCS_DATE ${VCS_DATE}) +set(VCS_BRANCH ${VCS_BRANCH}) +set(VCS_TAG ${VCS_TAG}) +set(VCS_TICK ${VCS_TICK}) +set(VCS_EXTRA ${VCS_EXTRA}) + +set(VCS_ACTION_STAMP ${VCS_ACTION_STAMP}) +set(VCS_FULL_HASH ${VCS_FULL_HASH}) +set(VCS_SHORT_HASH ${VCS_SHORT_HASH}) + +set(VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) + +# end +EOF +} + + +# Helper functions +# Count path segments +# shellcheck disable=SC2039 +pathSegment() { + local pathz="${1}" + local depth="0" + + if [ ! -z "${pathz}" ]; then + # Continue until we are at / or there are no path separators left. + while [ ! "${pathz}" = "/" ] && [ ! "${pathz}" = "$(echo "${pathz}" | sed -e 's:/::')" ]; do + pathz="$(dirname "${pathz}")" + depth="$((depth+1))" + done + fi + echo "${depth}" +} + +# Largest of four numbers +# shellcheck disable=SC2039 +multiCompare() { + local larger="${1}" + local numA="${2}" + local numB="${3}" + local numC="${4}" + + [ "${numA}" -gt "${larger}" ] && larger="${numA}" + [ "${numB}" -gt "${larger}" ] && larger="${numB}" + [ "${numC}" -gt "${larger}" ] && larger="${numC}" + echo "${larger}" +} + +# Test for repositories +# shellcheck disable=SC2155,SC2039 +repoTest() { + REPONUM="0" + if [ ! -z "$(git rev-parse HEAD 2>/dev/null)" ]; then + local gitPath="$(git rev-parse --show-toplevel)" + local gitDepth="$(pathSegment "${gitPath}")" + REPONUM="$((REPONUM+1))" + else + local gitDepth="0" + fi + if [ ! -z "$(hg root 2>/dev/null)" ]; then + local hgPath="$(hg root 2>/dev/null)" + local hgDepth="$(pathSegment "${hgPath}")" + REPONUM="$((REPONUM+1))" + else + local hgDepth="0" + fi + if [ ! -z "$(bzr root 2>/dev/null)" ]; then + local bzrPath="$(bzr root 2>/dev/null)" + local bzrDepth="$(pathSegment "${bzrPath}")" + REPONUM="$((REPONUM+1))" + else + local bzrDepth="0" + fi + if [ ! -z "$(svn info 2>/dev/null)" ]; then + local stringz="" + local stringx="" + local svnPath="$(svn info --xml | sed -n -e "s:${stringz}::" -e "s:${stringx}::p")" + # An old enough svn will not be able give us a path; default + # to 1 for that case. + if [ -z "${svnPath}" ]; then + local svnDepth="1" + else + local svnDepth="$(pathSegment "${svnPath}")" + fi + REPONUM="$((REPONUM+1))" + else + local svnDepth="0" + fi + + # Do not do more work then we have to. + if [ "${REPONUM}" = "0" ]; then + return + fi + + # Figure out which repo is the deepest and use it. + local wonRepo="$(multiCompare "${gitDepth}" "${hgDepth}" "${bzrDepth}" "${svnDepth}")" + if [ "${wonRepo}" = "${gitDepth}" ]; then + gitRepo + elif [ "${wonRepo}" = "${hgDepth}" ]; then + hgRepo + elif [ "${wonRepo}" = "${bzrDepth}" ]; then + bzrRepo + elif [ "${wonRepo}" = "${svnDepth}" ]; then + svnRepo + fi +} + + + +# Detect which repos we are in and gather data. +# shellcheck source=/dev/null +if [ -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # When requested only read from the cache to populate our symbols. + . "${CACHEFILE}" +else + # If a value is not set through the environment set VCS_EXTRA to nothing. + : "${VCS_EXTRA:=""}" + repoTest + + if [ -f "${CACHEFILE}" ] && [ "${REPONUM}" = "0" ]; then + # We are not in a repo; try to use a previously generated cache to populate our symbols. + . "${CACHEFILE}" + # Do not overwrite the cache if we know we are not going to write anything new. + CACHEFORCE="1" + elif [ "${REPONUM}" = "0" ]; then + echo "error: No repo or cache detected." 1>&2 + exit 1 + fi +fi + + +# -s output is handled here. +if [ ! -z "${VAROUT}" ]; then + if [ "${VAROUT}" = "VCS_TYPE" ]; then + echo "${VCS_TYPE}" + elif [ "${VAROUT}" = "VCS_BASENAME" ]; then + echo "${VCS_BASENAME}" + elif [ "${VAROUT}" = "VCS_NUM" ]; then + echo "${VCS_NUM}" + elif [ "${VAROUT}" = "VCS_DATE" ]; then + echo "${VCS_DATE}" + elif [ "${VAROUT}" = "VCS_BRANCH" ]; then + echo "${VCS_BRANCH}" + elif [ "${VAROUT}" = "VCS_TAG" ]; then + echo "${VCS_TAG}" + elif [ "${VAROUT}" = "VCS_TICK" ]; then + echo "${VCS_TICK}" + elif [ "${VAROUT}" = "VCS_FULL_HASH" ]; then + echo "${VCS_FULL_HASH}" + elif [ "${VAROUT}" = "VCS_SHORT_HASH" ]; then + echo "${VCS_SHORT_HASH}" + elif [ "${VAROUT}" = "VCS_WC_MODIFIED" ]; then + echo "${VCS_WC_MODIFIED}" + elif [ "${VAROUT}" = "VCS_ACTION_STAMP" ]; then + echo "${VCS_ACTION_STAMP}" + else + echo "error: Not a valid output symbol." 1>&2 + exit 1 + fi +fi + + +# Detect requested output type and use it. +if [ ! -z "${AFILETYPE}" ]; then + if [ "${AFILETYPE}" = "c" ]; then + cOutput + elif [ "${AFILETYPE}" = "h" ]; then + hOutput + elif [ "${AFILETYPE}" = "xcode" ]; then + xcodeOutput + elif [ "${AFILETYPE}" = "swift" ]; then + swiftOutput + elif [ "${AFILETYPE}" = "sh" ]; then + shOutput + elif [ "${AFILETYPE}" = "py" ] || [ "${AFILETYPE}" = "python" ]; then + pyOutput + elif [ "${AFILETYPE}" = "pl" ] || [ "${AFILETYPE}" = "perl" ]; then + plOutput + elif [ "${AFILETYPE}" = "lua" ]; then + luaOutput + elif [ "${AFILETYPE}" = "php" ]; then + phpOutput + elif [ "${AFILETYPE}" = "ini" ]; then + iniOutput + elif [ "${AFILETYPE}" = "js" ]; then + jsOutput + elif [ "${AFILETYPE}" = "json" ]; then + jsonOutput + elif [ "${AFILETYPE}" = "java" ]; then + javaOutput + elif [ "${AFILETYPE}" = "javaprop" ]; then + javapropOutput + elif [ "${AFILETYPE}" = "tex" ]; then + texOutput + elif [ "${AFILETYPE}" = "m4" ]; then + m4Output + elif [ "${AFILETYPE}" = "scheme" ]; then + schemeOutput + elif [ "${AFILETYPE}" = "clojure" ]; then + clojureOutput + elif [ "${AFILETYPE}" = "rpm" ]; then + rpmOutput + elif [ "${AFILETYPE}" = "hpp" ]; then + hppOutput + elif [ "${AFILETYPE}" = "matlab" ]; then + matlabOutput + elif [ "${AFILETYPE}" = "octave" ]; then + octaveOutput + elif [ "${AFILETYPE}" = "cmake" ]; then + cmakeOutput + else + echo "error: Not a valid output type." 1>&2 + exit 1 + fi +fi + + +# If requested, make a cache file. +if [ ! -z "${CACHEFILE}" ] && [ ! "${CACHEFORCE}" = "1" ]; then + TARGETFILE="${CACHEFILE}.tmp" + shOutput + + # Check to see if there have been any actual changes. + if [ ! -f "${CACHEFILE}" ]; then + mv -f "${CACHEFILE}.tmp" "${CACHEFILE}" + elif cmp -s "${CACHEFILE}.tmp" "${CACHEFILE}"; then + rm -f "${CACHEFILE}.tmp" + else + mv -f "${CACHEFILE}.tmp" "${CACHEFILE}" + fi +fi diff --git a/readme.md b/readme.md index e69de29..f1ecf16 100644 --- a/readme.md +++ b/readme.md @@ -0,0 +1,25 @@ +# 简介 +MAAT是古埃及神话中真理与正义女神,她的羽毛(feather)能够判断离世之人能否前往天堂。 + +MAAT框架对网络流处理中的配置进行抽象,并具有配置写入、多机同步(基于Redis)、加载、扫描的功能。 + +maat.h中描述了初始化和配置扫描的API。 + +maat_command.h中描述了配置写入的API。 + +# 编译 +普通编译 + +` Make` + +带调试符号编译 + +`Make debug` + +安装 + +`Make install` + +生成动态链接库 `./build/src/libmaatframe.so` + +生成静态链接库 `./build/src/libmaatframe.a` \ No newline at end of file diff --git a/scanner/adapter_hs.cpp b/scanner/adapter_hs.cpp index 6d22301..f2dad66 100644 --- a/scanner/adapter_hs.cpp +++ b/scanner/adapter_hs.cpp @@ -465,6 +465,29 @@ int is_real_matched_pattern(struct matched_pattern *matched_pat, enum hs_match_m return -1; } +int hs_tag_validate(struct hs_tag *hs_tag, struct matched_pattern_container *matched_pat_container, + size_t data_len) +{ + /* check if real matched pattern, because pattern match_mode is different */ + for (size_t i = 0; i < hs_tag->n_pat_attr; i++) { + struct matched_pattern *tmp_matched_pat = NULL; + int pattern_id = hs_tag->pat_attr[i].pattern_id; + HASH_FIND_INT(matched_pat_container->pat_hash, &pattern_id, tmp_matched_pat); + if (tmp_matched_pat) { + int matched_ret = is_real_matched_pattern(tmp_matched_pat, + hs_tag->pat_attr[i].match_mode, + data_len, + hs_tag->pat_attr[i].l_offset, + hs_tag->pat_attr[i].r_offset); + if (matched_ret < 0) { + return -1; + } + } + } + + return 0; +} + int adapter_hs_scan(struct adapter_hs *hs_instance, int thread_id, const char *data, size_t data_len, struct hs_scan_result *results, @@ -518,7 +541,6 @@ int adapter_hs_scan(struct adapter_hs *hs_instance, int thread_id, } int ret = 0; - int matched_index = 0; int real_matched_index = 0; struct hs_tag *hs_tag = NULL; struct bool_expr_match *bool_matcher_results = ALLOC(struct bool_expr_match, hs_instance->n_expr); @@ -533,29 +555,20 @@ int adapter_hs_scan(struct adapter_hs *hs_instance, int thread_id, bool_matcher_ret = n_result; } - for (matched_index = 0; matched_index < bool_matcher_ret; matched_index++) { - hs_tag = (struct hs_tag *)bool_matcher_results[matched_index].user_tag; + for (int index = 0; index < bool_matcher_ret; index++) { + hs_tag = (struct hs_tag *)bool_matcher_results[index].user_tag; - /* check if real matched pattern, because pattern match_mode is different */ - for (i = 0; i < hs_tag->n_pat_attr; i++) { - struct matched_pattern *tmp_matched_pat = NULL; - int pattern_id = hs_tag->pat_attr[i].pattern_id; - HASH_FIND_INT(matched_pat_container.pat_hash, &pattern_id, tmp_matched_pat); - if (tmp_matched_pat) { - int matched_ret = is_real_matched_pattern(tmp_matched_pat, - hs_tag->pat_attr[i].match_mode, - data_len, - hs_tag->pat_attr[i].l_offset, - hs_tag->pat_attr[i].r_offset); - if (0 == matched_ret) { - results[real_matched_index].item_id = bool_matcher_results[matched_index].expr_id; - results[real_matched_index].user_tag = hs_tag->user_tag; - real_matched_index++; - break; - } - } + int tag_ret = hs_tag_validate(hs_tag, &matched_pat_container, data_len); + if (tag_ret < 0) { + //bool_matcher_results[index] is invalid hit, continue + continue; } + + results[real_matched_index].item_id = bool_matcher_results[index].expr_id; + results[real_matched_index].user_tag = hs_tag->user_tag; + real_matched_index++; } + *n_hit_result = real_matched_index; next: FREE(bool_matcher_results); diff --git a/scanner/adapter_hs.h b/scanner/adapter_hs.h index b2b81a5..8a8fde4 100644 --- a/scanner/adapter_hs.h +++ b/scanner/adapter_hs.h @@ -34,6 +34,7 @@ enum hs_scan_mode { /* match method */ enum hs_match_mode { + HS_MATCH_MODE_INVALID = -1, HS_MATCH_MODE_EXACTLY = 1, /* scan data must match pattern exactly */ HS_MATCH_MODE_PREFIX, /* pattern must in the head of scan_data */ HS_MATCH_MODE_SUFFIX, /* pattern must in the end of scan_data */ @@ -60,6 +61,7 @@ struct hs_scan_result { typedef struct { enum hs_case_sensitive case_sensitive; enum hs_match_mode match_mode; + int is_hexbin; /* 1(yes) 0(no) */ /* * just match in scan_data's range of [l_offset, r_offset], -1 means no limits diff --git a/src/maat_api.c b/src/maat_api.c index dac9729..b5951f0 100644 --- a/src/maat_api.c +++ b/src/maat_api.c @@ -865,10 +865,9 @@ int maat_scan_integer(struct maat *maat_instance, int table_id, int thread_id, } int group_hit_cnt = interval_runtime_scan((struct interval_runtime *)interval_rt, - thread_id, - intval, group_ids, - MAX_SCANNER_HIT_GROUP_NUM, - vtable_id, mid); + thread_id, intval, group_ids, + MAX_SCANNER_HIT_GROUP_NUM, + vtable_id, mid); if (group_hit_cnt < 0) { return MAAT_SCAN_ERR; } @@ -1141,10 +1140,10 @@ int maat_scan_string(struct maat *maat_instance, int table_id, int thread_id, } int group_hit_cnt = expr_runtime_scan((struct expr_runtime *)expr_rt, - thread_id, - data, data_len, group_ids, - MAX_SCANNER_HIT_GROUP_NUM, - vtable_id, mid); + thread_id, data, data_len, + group_ids, + MAX_SCANNER_HIT_GROUP_NUM, + vtable_id, mid); if (group_hit_cnt < 0) { return MAAT_SCAN_ERR; } diff --git a/src/maat_compile.c b/src/maat_compile.c index 88ce8c3..e6bea35 100644 --- a/src/maat_compile.c +++ b/src/maat_compile.c @@ -1065,7 +1065,7 @@ maat_compile_bool_matcher_new(struct maat_compile *compile_hash, //TODO:mytest need to delete #if 0 - printf("bool_matcher_new....................\n"); + printf("bool_matcher_new....................expr_cnt:%zu\n", expr_cnt); for (expr_index = 0; expr_index < expr_cnt; expr_index++) { printf("bool_expr_array[%zu].expr_id:%llu, item_num:%zu\n", expr_index, bool_expr_array[expr_index].expr_id, bool_expr_array[expr_index].item_num); @@ -1780,9 +1780,9 @@ int maat_compile_state_update(struct maat_item *item_hash, int vtable_id, for (size_t i = 0; i < hit_item_cnt; i++) { HASH_FIND_INT(item_hash, &(hit_item_ids[i]), item); - assert(item != NULL); + //assert(item != NULL); if (!item) { - // should not come here + // item config has been deleted continue; } diff --git a/src/maat_expr.c b/src/maat_expr.c index 1957950..8f932fc 100644 --- a/src/maat_expr.c +++ b/src/maat_expr.c @@ -41,6 +41,7 @@ struct expr_schema { }; enum expr_type { + EXPR_TYPE_INVALID = -1, EXPR_TYPE_STRING = 0, EXPR_TYPE_AND, EXPR_TYPE_REGEX, @@ -91,7 +92,7 @@ struct expr_runtime { enum expr_type int_to_expr_type(int expr_type) { - enum expr_type type = EXPR_TYPE_MAX; + enum expr_type type = EXPR_TYPE_INVALID; switch (expr_type) { case 0: @@ -115,7 +116,7 @@ enum expr_type int_to_expr_type(int expr_type) enum hs_match_mode int_to_match_mode(int match_method) { - enum hs_match_mode mode = HS_MATCH_MODE_MAX; + enum hs_match_mode mode = HS_MATCH_MODE_INVALID; switch (match_method) { case 0: @@ -197,6 +198,12 @@ struct expr_item *expr_item_new(const char *line, struct expr_schema *expr_schem expr_type = atoi(line + column_offset); expr_item->expr_type = int_to_expr_type(expr_type); + if (expr_item->expr_type == EXPR_TYPE_INVALID) { + log_error(logger, MODULE_EXPR, + "expr table(table_id:%d) line:%s has invalid expr_type", + expr_schema->table_id, line); + goto error; + } ret = get_column_pos(line, expr_schema->match_method_column, &column_offset, &column_len); if (ret < 0) { @@ -208,6 +215,12 @@ struct expr_item *expr_item_new(const char *line, struct expr_schema *expr_schem match_method_type = atoi(line + column_offset); expr_item->match_mode = int_to_match_mode(match_method_type); + if (expr_item->match_mode == HS_MATCH_MODE_INVALID) { + log_error(logger, MODULE_EXPR, + "expr table(table_id:%d) line:%s has invalid match_method", + expr_schema->table_id, line); + goto error; + } ret = get_column_pos(line, expr_schema->is_hexbin_column, &column_offset, &column_len); if (ret < 0) { @@ -522,7 +535,7 @@ enum hs_pattern_type expr_type2pattern_type(enum expr_type expr_type) return pattern_type; } -int convertHextoint(char srctmp) +static int convertHextoint(char srctmp) { if (isdigit(srctmp)) { return srctmp - '0'; @@ -533,7 +546,7 @@ int convertHextoint(char srctmp) } } -size_t hex2bin(char *hex, int hex_len, char *binary, size_t size) +static size_t hex2bin(char *hex, int hex_len, char *binary, size_t size) { size_t resultlen = 0; int high,low; @@ -559,8 +572,13 @@ and_expr_t *expr_item_to_expr_rule(struct expr_item *expr_item, void *user_data, char *tmp = NULL; char *saveptr = NULL; char *sub_key_array[MAAT_MAX_EXPR_ITEM_NUM]; - int key_left_offset[MAAT_MAX_EXPR_ITEM_NUM] = {-1}; - int key_right_offset[MAAT_MAX_EXPR_ITEM_NUM] = {-1}; + int key_left_offset[MAAT_MAX_EXPR_ITEM_NUM]; + int key_right_offset[MAAT_MAX_EXPR_ITEM_NUM]; + + /* -1 means offset no limit, As long as the pattern appears in the scan data, it will hit */ + memset(key_left_offset, -1, sizeof(key_left_offset)); + memset(key_right_offset, -1, sizeof(key_right_offset)); + and_expr_t *expr_rule = ALLOC(and_expr_t, 1); switch (expr_item->expr_type) { @@ -852,6 +870,7 @@ int expr_runtime_scan(struct expr_runtime *expr_rt, int thread_id, struct maat_item_inner *item = NULL; int real_hit_item_cnt = 0; int district_id = state->district_id; + for (size_t i = 0; i < n_hit_item; i++) { item = (struct maat_item_inner *)(hit_results[i].user_tag); if (item->district_id == district_id || district_id == DISTRICT_ANY) { diff --git a/src/maat_ip.c b/src/maat_ip.c index 6f821f8..e8e6d7a 100644 --- a/src/maat_ip.c +++ b/src/maat_ip.c @@ -488,12 +488,13 @@ int ip_runtime_scan(struct ip_runtime *ip_rt, int thread_id, int ip_type, struct ip_data scan_data; if (ip_type == IPv4) { scan_data.type = IPv4; - scan_data.ipv4 = *(uint32_t *)ip_addr; + scan_data.ipv4 = ntohl(*(uint32_t *)ip_addr); } else { scan_data.type = IPv6; for (int i = 0; i < 4; i++) { scan_data.ipv6[i] = *((uint32_t *)ip_addr + i); } + ipv6_ntoh(scan_data.ipv6); } n_hit_item = ip_matcher_match(ip_rt->ip_matcher, &scan_data, scan_results, MAX_SCANNER_HIT_ITEM_NUM); diff --git a/src/maat_table.c b/src/maat_table.c index 3a418b2..3419800 100644 --- a/src/maat_table.c +++ b/src/maat_table.c @@ -696,7 +696,7 @@ int table_manager_set_scan_district(struct table_manager *tbl_mgr, const char *d int table_manager_get_district_id(struct table_manager *tbl_mgr, const char *district) { - int district_id = -1; + int district_id = DISTRICT_ANY; int map_ret = maat_kv_read(tbl_mgr->district_map, district, &district_id); if (map_ret < 0) { diff --git a/src/maat_utils.c b/src/maat_utils.c index fd4b229..8d66ae3 100644 --- a/src/maat_utils.c +++ b/src/maat_utils.c @@ -447,7 +447,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co return -1; } - //ipv4_addr = ntohl(ipv4_addr); + ipv4_addr = ntohl(ipv4_addr); uint32_t ipv4_range_end = 0; uint32_t ipv4_mask = 0; switch (format) { @@ -457,7 +457,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co if (ret <= 0) { return -1; } - //ipv4_range_end = ntohl(ipv4_range_end); + ipv4_range_end = ntohl(ipv4_range_end); range_end[0] = ipv4_range_end; break; case IP_FORMAT_MASK: @@ -465,7 +465,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co if (ret <= 0) { return -1; } - //ipv4_mask = ntohl(ipv4_mask); + ipv4_mask = ntohl(ipv4_mask); range_begin[0] = ipv4_addr & ipv4_mask; range_end[0] = ipv4_addr | ~ipv4_mask; break; @@ -492,7 +492,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co if (ret <= 0) { return -1; } - //ipv6_ntoh(ipv6_addr); + ipv6_ntoh(ipv6_addr); switch (format) { case IP_FORMAT_RANGE: @@ -500,7 +500,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co if (ret <= 0) { return -1; } - //ipv6_ntoh(ipv6_range_end); + ipv6_ntoh(ipv6_range_end); memcpy(range_begin, ipv6_addr, sizeof(ipv6_addr)); memcpy(range_end, ipv6_range_end, sizeof(ipv6_range_end)); @@ -510,7 +510,7 @@ int ip_format2range(int ip_type, enum maat_ip_format format, const char *ip1, co if (ret <= 0) { return -1; } - //ipv6_ntoh(ipv6_mask); + ipv6_ntoh(ipv6_mask); for (i = 0; i < 4; i++) { range_begin[i]=ipv6_addr[i] & ipv6_mask[i]; diff --git a/test/adapter_hs_gtest.cpp b/test/adapter_hs_gtest.cpp index 5d67760..4669baa 100644 --- a/test/adapter_hs_gtest.cpp +++ b/test/adapter_hs_gtest.cpp @@ -41,6 +41,44 @@ enum hs_case_sensitive case_sensitive_str_to_enum(const char *str) return case_sensitive; } +int is_hexbin_str_to_int(const char *str) +{ + int ret = 0; + + if (strcmp(str, "yes") == 0) { + ret = 1; + } + + return ret; +} + +static int convertHextoint(char srctmp) +{ + if (isdigit(srctmp)) { + return srctmp - '0'; + } else { + char temp = toupper(srctmp); + temp = temp - 'A' + 10; + return temp; + } +} + +static size_t hex2bin(char *hex, int hex_len, char *binary, size_t size) +{ + size_t resultlen = 0; + int high,low; + for (int i = 0; i < hex_len && size > resultlen; i += 2, resultlen++) { + high = convertHextoint(hex[i]); + low = convertHextoint(hex[i+1]); + binary[resultlen] = high * 16 + low; + } + + size = resultlen; + binary[resultlen] = '\0'; + + return resultlen; +} + int parse_config_file(const char *filename, and_expr_t exprs[], size_t *n_expr) { unsigned char *json_buff = NULL; @@ -101,11 +139,26 @@ int parse_config_file(const char *filename, and_expr_t exprs[], size_t *n_expr) exprs[i].patterns[j].case_sensitive = case_sensitive_str_to_enum(item->valuestring); } + item = cJSON_GetObjectItem(pat_item, "is_hexbin"); + if (item != NULL && item->type == cJSON_String) { + exprs[i].patterns[j].is_hexbin = is_hexbin_str_to_int(item->valuestring); + } + item = cJSON_GetObjectItem(pat_item, "pattern"); if (item != NULL && item->type == cJSON_String) { exprs[i].patterns[j].pat = ALLOC(char, strlen(item->valuestring)); - memcpy(exprs[i].patterns[j].pat, item->valuestring, strlen(item->valuestring)); - exprs[i].patterns[j].pat_len = strlen(item->valuestring); + + if (exprs[i].patterns[j].is_hexbin == 1) { + size_t pat_str_len = strlen(item->valuestring) + 1; + char *pat_str = ALLOC(char, pat_str_len); + pat_str_len = hex2bin(item->valuestring, strlen(item->valuestring), pat_str, pat_str_len); + + memcpy(exprs[i].patterns[j].pat, pat_str, pat_str_len); + exprs[i].patterns[j].pat_len = pat_str_len; + } else { + memcpy(exprs[i].patterns[j].pat, item->valuestring, strlen(item->valuestring)); + exprs[i].patterns[j].pat_len = strlen(item->valuestring); + } } if (exprs[i].patterns->match_mode == HS_MATCH_MODE_SUB) { @@ -154,15 +207,15 @@ TEST(block_mode_initialize, invalid_input_parameter) /* case1: invalid scan_mode parameter */ hs_instance = adapter_hs_initialize(HS_SCAN_MODE_MAX, HS_PATTERN_TYPE_REG, 1, exprs, 1, g_logger); - EXPECT_EQ(hs_instance, nullptr); + EXPECT_EQ(hs_instance, NULL); /* case2: invalid expr parameter */ - hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, nullptr, 1, g_logger); - EXPECT_EQ(hs_instance, nullptr); + hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, NULL, 1, g_logger); + EXPECT_EQ(hs_instance, NULL); /* case3: invalid expr num */ hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, exprs, 0, g_logger); - EXPECT_EQ(hs_instance, nullptr); + EXPECT_EQ(hs_instance, NULL); } TEST(block_mode_scan, invalid_input_parameter) @@ -170,24 +223,24 @@ TEST(block_mode_scan, invalid_input_parameter) and_expr_t expr_array[64]; size_t n_expr_array = 0; - struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, nullptr, 0, g_logger); - EXPECT_EQ(hs_instance, nullptr); + struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, NULL, 0, g_logger); + EXPECT_EQ(hs_instance, NULL); hs_instance = adapter_hs_initialize(HS_SCAN_MODE_MAX, HS_PATTERN_TYPE_REG, 1, expr_array, n_expr_array, g_logger); - EXPECT_EQ(hs_instance, nullptr); + EXPECT_EQ(hs_instance, NULL); n_expr_array = 1; expr_array[0].expr_id = 101; expr_array[0].n_patterns = 10; hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, expr_array, n_expr_array, g_logger); - EXPECT_EQ(hs_instance, nullptr); + EXPECT_EQ(hs_instance, NULL); memset(expr_array, 0, sizeof(expr_array)); n_expr_array = 1; expr_array[0].expr_id = 101; expr_array[0].n_patterns = 1; hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_REG, 1, expr_array, n_expr_array, g_logger); - EXPECT_EQ(hs_instance, nullptr); + EXPECT_EQ(hs_instance, NULL); } TEST(block_mode_scan, literal_sub_has_normal_offset) @@ -197,10 +250,10 @@ TEST(block_mode_scan, literal_sub_has_normal_offset) int ret = parse_config_file("./literal_expr.conf", expr_array, &n_expr_array); EXPECT_EQ(ret, 0); - EXPECT_EQ(n_expr_array, 15); + EXPECT_EQ(n_expr_array, 11); struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello aaa"; @@ -227,7 +280,7 @@ TEST(block_mode_scan, literal_sub_has_normal_offset) EXPECT_EQ(n_result, 0); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_sub_has_left_unlimit_offset) @@ -237,10 +290,9 @@ TEST(block_mode_scan, literal_sub_has_left_unlimit_offset) int ret = parse_config_file("./literal_expr.conf", expr_array, &n_expr_array); EXPECT_EQ(ret, 0); - EXPECT_EQ(n_expr_array, 15); struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello bbb"; @@ -268,7 +320,7 @@ TEST(block_mode_scan, literal_sub_has_left_unlimit_offset) EXPECT_EQ(n_result, 0); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_sub_has_right_unlimit_offset) @@ -278,10 +330,9 @@ TEST(block_mode_scan, literal_sub_has_right_unlimit_offset) int ret = parse_config_file("./literal_expr.conf", expr_array, &n_expr_array); EXPECT_EQ(ret, 0); - EXPECT_EQ(n_expr_array, 15); struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello ccc"; @@ -324,7 +375,7 @@ TEST(block_mode_scan, literal_sub_has_right_unlimit_offset) EXPECT_EQ(result[0].item_id, 103); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_sub_with_no_offset) @@ -336,7 +387,7 @@ TEST(block_mode_scan, literal_sub_with_no_offset) EXPECT_EQ(ret, 0); struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello ddd"; @@ -371,7 +422,7 @@ TEST(block_mode_scan, literal_sub_with_no_offset) EXPECT_EQ(n_result, 0); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_exactly) @@ -383,7 +434,7 @@ TEST(block_mode_scan, literal_exactly) EXPECT_EQ(ret, 0); struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello eee"; @@ -412,7 +463,7 @@ TEST(block_mode_scan, literal_exactly) EXPECT_EQ(n_result, 0); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_prefix) @@ -425,7 +476,7 @@ TEST(block_mode_scan, literal_prefix) struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello fff"; @@ -463,7 +514,7 @@ TEST(block_mode_scan, literal_prefix) EXPECT_EQ(result[0].item_id, 106); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } TEST(block_mode_scan, literal_suffix) @@ -476,7 +527,7 @@ TEST(block_mode_scan, literal_suffix) struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char scan_data1[64] = "hello ggg"; @@ -514,33 +565,41 @@ TEST(block_mode_scan, literal_suffix) EXPECT_EQ(n_result, 0); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } -// TEST(block_mode_scan, literal_sub_with_hexbin) -// { -// and_expr_t expr_array[64] = {0}; -// size_t n_expr_array = 0; +TEST(block_mode_scan, literal_sub_with_hexbin) +{ + and_expr_t expr_array[64] = {0}; + size_t n_expr_array = 0; -// int ret = parse_config_file("./and_expr.conf", expr_array, &n_expr_array); -// EXPECT_EQ(ret, 0); + int ret = parse_config_file("./literal_expr.conf", expr_array, &n_expr_array); + EXPECT_EQ(ret, 0); -// struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, 1, -// expr_array, n_expr_array, g_logger); -// EXPECT_NE(hs_instance, nullptr); -// expr_array_free(expr_array, n_expr_array); + struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, + expr_array, n_expr_array, g_logger); + EXPECT_NE(hs_instance, NULL); + expr_array_free(expr_array, n_expr_array); -// char data0[64] = "Cookie: Txa123aheadBCAxd"; -// struct hs_scan_result result0[64] = {0}; -// size_t n_result0 = 0; -// ret = adapter_hs_scan(hs_instance, 0, data0, strlen(data0), result0, 64, &n_result0); -// EXPECT_EQ(ret, 0); -// EXPECT_EQ(n_result0, 1); -// EXPECT_EQ(result0[0].item_id, 107); + char scan_data1[64] = "Content-Type: /html"; + struct hs_scan_result result[64] = {0}; + size_t n_result = 0; + ret = adapter_hs_scan(hs_instance, 0, scan_data1, strlen(scan_data1), result, 64, &n_result); + EXPECT_EQ(ret, 0); + EXPECT_EQ(n_result, 1); + EXPECT_EQ(result[0].item_id, 108); -// adapter_hs_destroy(hs_instance); -// hs_instance = nullptr; -// } + char scan_data2[64] = " html"; + memset(result, 0, sizeof(result)); + n_result = 0; + + ret = adapter_hs_scan(hs_instance, 0, scan_data2, strlen(scan_data2), result, 64, &n_result); + EXPECT_EQ(ret, 0); + EXPECT_EQ(n_result, 0); + + adapter_hs_destroy(hs_instance); + hs_instance = NULL; +} TEST(block_mode_scan, literal_with_chinese) { @@ -552,7 +611,7 @@ TEST(block_mode_scan, literal_with_chinese) struct adapter_hs *hs_instance = adapter_hs_initialize(HS_SCAN_MODE_BLOCK, HS_PATTERN_TYPE_STR, 1, expr_array, n_expr_array, g_logger); - EXPECT_NE(hs_instance, nullptr); + EXPECT_NE(hs_instance, NULL); expr_array_free(expr_array, n_expr_array); char data0[64] = "#中国 你好"; @@ -561,10 +620,10 @@ TEST(block_mode_scan, literal_with_chinese) ret = adapter_hs_scan(hs_instance, 0, data0, strlen(data0), result0, 64, &n_result0); EXPECT_EQ(ret, 0); EXPECT_EQ(n_result0, 1); - EXPECT_EQ(result0[0].item_id, 114); + EXPECT_EQ(result0[0].item_id, 110); adapter_hs_destroy(hs_instance); - hs_instance = nullptr; + hs_instance = NULL; } int main(int argc, char **argv) diff --git a/test/maat_api_gtest.cpp b/test/maat_api_gtest.cpp index 5754251..7e4421c 100644 --- a/test/maat_api_gtest.cpp +++ b/test/maat_api_gtest.cpp @@ -12,4 +12,4 @@ int main(int argc, char ** argv) ::testing::InitGoogleTest(&argc, argv); ret=RUN_ALL_TESTS(); return ret; -} \ No newline at end of file +} diff --git a/test/maat_framework_gtest.cpp b/test/maat_framework_gtest.cpp index 19e7113..57c5a16 100644 --- a/test/maat_framework_gtest.cpp +++ b/test/maat_framework_gtest.cpp @@ -11,6 +11,9 @@ #define MODULE_FRAMEWORK_GTEST module_name_str("maat.framework_gtest") +#define ARRAY_SIZE 10 +#define HIT_PATH_SIZE 128 + const char *table_info_path = "./table_info.conf"; const char *json_path="./maat_json.json"; const char *json_filename = "maat_json.json"; @@ -22,38 +25,33 @@ class MaatFlagScan : public testing::Test { protected: static void SetUpTestCase() { - flag_table_id = maat_table_get_id(g_maat_instance, "FLAG_CONFIG"); - expr_table_id = maat_table_get_id(g_maat_instance, "HTTP_URL"); + } static void TearDownTestCase() { } - static int flag_table_id; - static int expr_table_id; }; -int MaatFlagScan::flag_table_id; -int MaatFlagScan::expr_table_id; TEST_F(MaatFlagScan, basic) { - int flag_table_id = MaatFlagScan::flag_table_id; + int flag_table_id = maat_table_get_id(g_maat_instance, "FLAG_CONFIG"); //compile_id:192 flag: 0000 0001 mask: 0000 0011 //scan_data: 0000 1001 or 0000 1101 should hit uint64_t scan_data = 9; - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; int ret = maat_scan_flag(g_maat_instance, flag_table_id, 0, scan_data, results, - 5, &n_hit_result, &state); + ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 1); EXPECT_EQ(results[0], 192); - struct maat_hit_path hit_path[128] = {0}; + struct maat_hit_path hit_path[HIT_PATH_SIZE] = {0}; int n_read = 0; - n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, sizeof(hit_path)); + n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, HIT_PATH_SIZE); EXPECT_NE(n_read, 0); maat_state_free(&state); @@ -61,7 +59,7 @@ TEST_F(MaatFlagScan, basic) { memset(results, 0, sizeof(results)); n_hit_result = 0; ret = maat_scan_flag(g_maat_instance, flag_table_id, 0, scan_data, results, - 5, &n_hit_result, &state); + ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 1); EXPECT_EQ(results[0], 192); @@ -71,36 +69,36 @@ TEST_F(MaatFlagScan, basic) { memset(results, 0, sizeof(results)); n_hit_result = 0; ret = maat_scan_flag(g_maat_instance, flag_table_id, 0, scan_data, results, - 5, &n_hit_result, &state); + ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); EXPECT_EQ(n_hit_result, 0); maat_state_free(&state); } TEST_F(MaatFlagScan, withExprRegion) { - int flag_table_id = MaatFlagScan::flag_table_id; - int expr_table_id = MaatFlagScan::expr_table_id; + int flag_table_id = maat_table_get_id(g_maat_instance, "FLAG_CONFIG"); + int expr_table_id = maat_table_get_id(g_maat_instance, "HTTP_URL_LITERAL"); //compile_id:193 flag: 0000 0010 mask: 0000 0011 //scan_data: 0000 0010 or 0000 0100 should hit uint64_t flag_scan_data = 2; - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; int ret = maat_scan_flag(g_maat_instance, flag_table_id, 0, flag_scan_data, results, - 5, &n_hit_result, &state); + ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); EXPECT_EQ(n_hit_result, 0); - struct maat_hit_path hit_path[128] = {0}; + struct maat_hit_path hit_path[HIT_PATH_SIZE] = {0}; int n_read = 0; - n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, sizeof(hit_path)); + n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, HIT_PATH_SIZE); EXPECT_NE(n_read, 0); const char *expr_scan_data = "hello world"; ret = maat_scan_string(g_maat_instance, expr_table_id, 0, expr_scan_data, strlen(expr_scan_data), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 1); EXPECT_EQ(results[0], 193); @@ -108,26 +106,26 @@ TEST_F(MaatFlagScan, withExprRegion) { } TEST_F(MaatFlagScan, hitMultiCompile) { - int flag_table_id = MaatFlagScan::flag_table_id; + int flag_table_id = maat_table_get_id(g_maat_instance, "FLAG_CONFIG"); //compile_id:192 flag: 0000 0001 mask: 0000 0011 //compile_id:194 flag: 0001 0101 mask: 0001 1111 //scan_data: 0001 0101 should hit compile192 and compile194 uint64_t flag_scan_data = 21; - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; int ret = maat_scan_flag(g_maat_instance, flag_table_id, 0, flag_scan_data, results, - 5, &n_hit_result, &state); + ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 2); EXPECT_EQ(results[0], 194); EXPECT_EQ(results[1], 192); - struct maat_hit_path hit_path[128] = {0}; + struct maat_hit_path hit_path[HIT_PATH_SIZE] = {0}; int n_read = 0; - n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, sizeof(hit_path)); + n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, HIT_PATH_SIZE); EXPECT_NE(n_read, 0); maat_state_free(&state); @@ -137,7 +135,6 @@ class MaatStringScan : public testing::Test { protected: static void SetUpTestCase() { - table_id = maat_table_get_id(g_maat_instance, "KEYWORDS_TABLE"); } static void TearDownTestCase() { @@ -149,35 +146,35 @@ protected: int MaatStringScan::table_id; TEST_F(MaatStringScan, Expr8) { - int table_id = MaatStringScan::table_id; + int table_id = maat_table_get_id(g_maat_instance, "KEYWORDS_TABLE"); char scan_data[128] = "string1, string2, string3, string4, string5, string6, string7, string8"; - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; int ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data, strlen(scan_data), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 1); EXPECT_EQ(results[0], 182); - struct maat_hit_path hit_path[128] = {0}; + struct maat_hit_path hit_path[HIT_PATH_SIZE] = {0}; int n_read = 0; - n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, sizeof(hit_path)); + n_read = maat_state_get_hit_paths(g_maat_instance, &state, hit_path, HIT_PATH_SIZE); EXPECT_NE(n_read, 0); maat_state_free(&state); } TEST_F(MaatStringScan, Regex) { int ret = 0; - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; const char *cookie = "Cookie: Txa123aheadBCAxd"; - int table_id = maat_table_get_id(g_maat_instance, "HTTP_URL"); + int table_id = maat_table_get_id(g_maat_instance, "HTTP_URL_REGEX"); ASSERT_GT(table_id, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, cookie, strlen(cookie), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 146); maat_state_free(&state); @@ -206,7 +203,7 @@ TEST_F(MaatStringScan, Regex) { } TEST_F(MaatStringScan, ExprPlus) { - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; const char *region_name1 ="HTTP URL"; @@ -218,13 +215,13 @@ TEST_F(MaatStringScan, ExprPlus) { ASSERT_GT(table_id, 0); int ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data1, strlen(scan_data1), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_ERR);//Should return error for district not setting. ret = maat_state_set_scan_district(g_maat_instance, &state, region_name1, strlen(region_name1)); ASSERT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data1, strlen(scan_data1), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 128); maat_state_free(&state); @@ -232,7 +229,7 @@ TEST_F(MaatStringScan, ExprPlus) { ret = maat_state_set_scan_district(g_maat_instance, &state, region_name2, strlen(region_name2)); ASSERT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data2, strlen(scan_data2), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 190); maat_state_free(&state); @@ -241,7 +238,7 @@ TEST_F(MaatStringScan, ExprPlus) { //TODO: #if 0 TEST_F(MaatStringScan, ShouldNotHitExprPlus) { - int results[5] = {0}; + int results[ARRAY] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; const char *region_name = "tcp.payload"; @@ -266,13 +263,13 @@ TEST_F(MaatStringScan, ShouldNotHitExprPlus) { ASSERT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, (char *)udp_payload_not_hit, sizeof(udp_payload_not_hit), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); maat_state_free(&state); } TEST_F(MaatStringScan, ExprPlusWithHex) { - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; const char *scan_data1 = "text/html; charset=UTF-8"; @@ -286,19 +283,19 @@ TEST_F(MaatStringScan, ExprPlusWithHex) { int ret = maat_state_set_scan_district(g_maat_instance, &state, region_name1, strlen(region_name1)); ASSERT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data1, strlen(scan_data1), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 156); ret = maat_state_set_scan_district(g_maat_instance, &state, region_name2, strlen(region_name2)); ASSERT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data1, strlen(scan_data1), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); table_id = maat_table_get_id(g_maat_instance, "KEYWORDS_TABLE"); ret = maat_scan_string(g_maat_instance, table_id, 0, scan_data2, strlen(scan_data2), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 132); maat_state_free(&state); @@ -306,7 +303,7 @@ TEST_F(MaatStringScan, ExprPlusWithHex) { TEST_F(MaatStringScan, ExprPlusWithOffset) { - int results[5] = {0}; + int results[ARRAY_SIZE] = {0}; size_t n_hit_result = 0; struct maat_state *state = NULL; const char *region_name = "Payload"; @@ -344,11 +341,11 @@ TEST_F(MaatStringScan, ExprPlusWithOffset) EXPECT_EQ(ret, 0); ret = maat_scan_string(g_maat_instance, table_id, 0, (char*)udp_payload_not_hit, sizeof(udp_payload_not_hit), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_OK); ret = maat_scan_string(g_maat_instance, table_id, 0, (char*)udp_payload_hit, sizeof(udp_payload_hit), - results, 5, &n_hit_result, &state); + results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(results[0], 148); @@ -356,32 +353,117 @@ TEST_F(MaatStringScan, ExprPlusWithOffset) } #endif +TEST_F(MaatStringScan, dynamic_config) { + int table_id = maat_table_get_id(g_maat_instance, "HTTP_URL_LITERAL"); + + char data[128] = "hello world"; + int results[ARRAY_SIZE] = {0}; + size_t n_hit_result = 0; + struct maat_state *state = NULL; + int ret = maat_scan_string(g_maat_instance, table_id, 0, data, strlen(data), results, + ARRAY_SIZE, &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); + EXPECT_EQ(n_hit_result, 0); + maat_state_free(&state); + + /* add new line in GROUP2COMPILE table */ + const char *g2c_table_name = "GROUP2COMPILE"; + const char *g2c_table_line_add = "8888\t9999\t1\t0\tnull\t1"; + struct maat_cmd_line line_rule; + line_rule.rule_id = 8888; + line_rule.table_line = g2c_table_line_add; + line_rule.table_name = g2c_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* add new line in COMPILE table */ + const char *compile_table_name = "COMPILE"; + const char *compile_table_line_add = "9999\t0\t0\t0\t0\t0\tanything\t1\t1\t0.0"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9999; + line_rule.table_line = compile_table_line_add; + line_rule.table_name = compile_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* add new line in HTTP_URL_LITERAL table */ + const char *table_name = "HTTP_URL_LITERAL"; + const char *table_line_add = "9999\t8888\thello world\t0\t0\t0\t1\t"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9999; + line_rule.table_line = table_line_add; + line_rule.table_name = table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + sleep(2); + state = NULL; + ret = maat_scan_string(g_maat_instance, table_id, 0, data, strlen(data), results, + ARRAY_SIZE, &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HIT); + EXPECT_EQ(n_hit_result, 1); + EXPECT_EQ(results[0], 9999); + maat_state_free(&state); + + /* del new line from HTTP_URL_LITERAL table */ + const char *table_line_del = "9999\t8888\thello world\t0\t0\t0\t0\t"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9999; + line_rule.table_line = table_line_del; + line_rule.table_name = table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* del new line from COMPILE table */ + const char *compile_table_line_del = "9999\t0\t0\t0\t0\t0\tanything\t0\t1\t0.0"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9999; + line_rule.table_line = compile_table_line_del; + line_rule.table_name = compile_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* del new line from GROUP2COMPILE table */ + const char *g2c_table_line_del = "8888\t9999\t0\t0\tnull\t1"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 8888; + line_rule.table_line = g2c_table_line_del; + line_rule.table_name = g2c_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + sleep(2); + state = NULL; + ret = maat_scan_string(g_maat_instance, table_id, 0, data, strlen(data), results, + ARRAY_SIZE, &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); + EXPECT_EQ(n_hit_result, 0); + maat_state_free(&state); +} + class MaatIPScan : public testing::Test { protected: static void SetUpTestCase() { - table_id = maat_table_get_id(g_maat_instance, "IP_PLUS_CONFIG"); + } static void TearDownTestCase() { } - - static int table_id; }; -int MaatIPScan::table_id; TEST_F(MaatIPScan, IPv4) { - int table_id = MaatIPScan::table_id; + int table_id = maat_table_get_id(g_maat_instance, "IP_PLUS_CONFIG"); char ip_str[32] = "10.0.7.100"; uint32_t sip; int ret = inet_pton(AF_INET, ip_str, &sip); EXPECT_EQ(ret, 1); - int results[3] = {-1}; + int results[ARRAY_SIZE] = {-1}; size_t n_hit_result = 0; struct maat_state *state = NULL; - ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, 3, + ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 2); @@ -391,16 +473,16 @@ TEST_F(MaatIPScan, IPv4) { } TEST_F(MaatIPScan, IPv6) { - int table_id = MaatIPScan::table_id; + int table_id = maat_table_get_id(g_maat_instance, "IP_PLUS_CONFIG"); char ip_str[32] = "1001:da8:205:1::101"; uint8_t sip[16]; int ret = inet_pton(AF_INET6, ip_str, &sip); EXPECT_EQ(ret, 1); - int results[3] = {-1}; + int results[ARRAY_SIZE] = {-1}; size_t n_hit_result = 0; struct maat_state *state = NULL; - ret = maat_scan_ipv6(g_maat_instance, table_id, 0, sip, results, 3, + ret = maat_scan_ipv6(g_maat_instance, table_id, 0, sip, results, ARRAY_SIZE, &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); EXPECT_EQ(n_hit_result, 1); @@ -409,70 +491,150 @@ TEST_F(MaatIPScan, IPv6) { maat_state_free(&state); } -TEST_F(MaatStringScan, dynamic_config) { - int table_id = maat_table_get_id(g_maat_instance, "HTTP_URL"); - - char data[128] = "hello world"; - int results[5] = {0}; - size_t n_hit_result = 0; - struct maat_state *state = NULL; - int ret = maat_scan_string(g_maat_instance, table_id, 0, data, strlen(data), results, sizeof(results), &n_hit_result, &state); - EXPECT_EQ(ret, MAAT_SCAN_OK); - EXPECT_EQ(n_hit_result, 0); - maat_state_free(&state); - - const char *table_name = "HTTP_URL"; - const char *table_line = "9999\t8888\thello world\t0\t0\t0\t1\t"; - struct maat_cmd_line line_rule; - line_rule.rule_id = 101; - line_rule.table_line = table_line; - line_rule.table_name = table_name; - ret = maat_cmd_set_line(g_maat_instance, &line_rule); - EXPECT_EQ(ret, 1); - - sleep(2); - state = NULL; - ret = maat_scan_string(g_maat_instance, table_id, 0, data, strlen(data), results, sizeof(results), &n_hit_result, &state); - EXPECT_EQ(ret, MAAT_SCAN_HIT); - EXPECT_EQ(n_hit_result, 1); - EXPECT_EQ(results[0], 9999); - maat_state_free(&state); -} - TEST_F(MaatIPScan, dynamic_config) { int table_id = maat_table_get_id(g_maat_instance, "IP_PLUS_CONFIG"); - char ip_str[32] = "10.0.6.201"; + char ip_str[32] = "100.100.100.100"; uint32_t sip; int ret = inet_pton(AF_INET, ip_str, &sip); EXPECT_EQ(ret, 1); - int results[3] = {-1}; + int results[ARRAY_SIZE] = {-1}; size_t n_hit_result = 0; struct maat_state *state = NULL; - ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, sizeof(results), &n_hit_result, &state); - EXPECT_EQ(ret, MAAT_SCAN_OK); - EXPECT_EQ(n_hit_result, 0); + ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, ARRAY_SIZE, + &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HIT); + EXPECT_EQ(n_hit_result, 1); + EXPECT_EQ(results[0], 169); maat_state_free(&state); - const char *table_name = "IP_PLUS_CONFIG"; - const char *table_line = "9998\t8887\t4\trange\t10.0.6.201\t255.255.0.0\trange\t0\t65535\t6\t0\t1"; + /* add new line in GROUP2COMPILE table */ + const char *g2c_table_name = "GROUP2COMPILE"; + const char *g2c_table_line_add = "8887\t9998\t1\t0\tnull\t1"; struct maat_cmd_line line_rule; - line_rule.rule_id = 101; - line_rule.table_line = table_line; + line_rule.rule_id = 8887; + line_rule.table_line = g2c_table_line_add; + line_rule.table_name = g2c_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* add new line in COMPILE table */ + const char *compile_table_name = "COMPILE"; + const char *compile_table_line_add = "9998\t0\t0\t0\t0\t0\tanything\t1\t1\t0.0"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9998; + line_rule.table_line = compile_table_line_add; + line_rule.table_name = compile_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* add new line in IP_PLUS_CONFIG */ + const char *table_name = "IP_PLUS_CONFIG"; + const char *table_line_add = "9998\t8887\t4\trange\t100.100.100.100\t100.100.100.100\trange\t0\t65535\trange\t10.0.6.201\t255.255.0.0\trange\t0\t65535\t6\t0\t1"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9998; + line_rule.table_line = table_line_add; line_rule.table_name = table_name; ret = maat_cmd_set_line(g_maat_instance, &line_rule); - EXPECT_EQ(ret, 0); + EXPECT_EQ(ret, 1); sleep(2); state = NULL; - ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, sizeof(results), &n_hit_result, &state); + ret = maat_scan_ipv4(g_maat_instance, table_id, 0, sip, results, ARRAY_SIZE, + &n_hit_result, &state); EXPECT_EQ(ret, MAAT_SCAN_HIT); - EXPECT_EQ(n_hit_result, 1); + EXPECT_EQ(n_hit_result, 2); EXPECT_EQ(results[0], 9998); + EXPECT_EQ(results[1], 169); maat_state_free(&state); + + /* del new line in IP_PLUS_CONFIG */ + const char *table_line_del = "9998\t8887\t4\trange\t100.100.100.100\t100.100.100.100\trange\t0\t65535\trange\t10.0.6.201\t255.255.0.0\trange\t0\t65535\t6\t0\t0"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9998; + line_rule.table_line = table_line_del; + line_rule.table_name = table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* del new line in COMPILE table */ + const char *compile_table_line_del = "9998\t0\t0\t0\t0\t0\tanything\t0\t1\t0.0"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 9998; + line_rule.table_line = compile_table_line_del; + line_rule.table_name = compile_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); + + /* del new line in GROUP2COMPILE table */ + const char *g2c_table_line_del = "8887\t9998\t0\t0\tnull\t1"; + memset(&line_rule, 0, sizeof(line_rule)); + line_rule.rule_id = 8887; + line_rule.table_line = g2c_table_line_del; + line_rule.table_name = g2c_table_name; + ret = maat_cmd_set_line(g_maat_instance, &line_rule); + EXPECT_EQ(ret, 1); } +class MaatIntervalScan : public testing::Test +{ +protected: + static void SetUpTestCase() { + + } + + static void TearDownTestCase() { + + } +}; +#if 0 +TEST_F(MaatIntervalScan, Pure) { + int results[ARRAY_SIZE] = {0}; + size_t n_hit_result = 0; + struct maat_state *state = NULL; + const char *table_name = "CONTENT_SIZE"; + + int table_id = maat_table_get_id(g_maat_instance, table_name); + ASSERT_GT(table_id, 0); + + unsigned int scan_data1 = 2015; + int ret = maat_scan_integer(g_maat_instance, table_id, 0, scan_data1, results, ARRAY_SIZE, + &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HALF_HIT); + maat_state_free(&state); + + unsigned int scan_data2 = 300; + int ret = maat_scan_integer(g_maat_instance, table_id, 0, scan_data2, results, ARRAY_SIZE, + &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HIT); + EXPECT_EQ(n_hit_result, 1); + EXPECT_EQ(results[0], 124); + maat_state_free(&state); +} + +TEST_F(MaatIntervalScan, IntervalPlus) { + int results[ARRAY_SIZE] = {0}; + size_t n_hit_result = 0; + struct maat_state *state = NULL; + const char *table_name = "INTERGER_PLUS"; + + int table_id = maat_table_get_id(g_maat_instance, table_name); + ASSERT_GT(table_id, 0); + + const char *district_str = "interval.plus"; + int ret = maat_state_set_scan_district(g_maat_instance, &state, district_str, strlen(district_str)); + ASSERT_GT(ret, 0); + + unsigned int scan_data1 = 2020; + ret = maat_scan_integer(g_maat_instance, table_id, 0, scan_data1, results, ARRAY_SIZE, + &n_hit_result, &state); + EXPECT_EQ(ret, MAAT_SCAN_HIT); + EXPECT_EQ(n_hit_result, 1); + EXPECT_EQ(results[0], 179); + maat_state_free(&state); +} +#endif int count_line_num_cb(const char *table_name, const char *line, void *u_para) { (*((unsigned int *)u_para))++; @@ -527,12 +689,12 @@ int write_config_to_redis(char *redis_ip, int redis_port, int redis_db, snprintf(json_iris_path, sizeof(json_iris_path), "./%s_iris_tmp", json_filename); redisContext *c = maat_cmd_connect_redis(redis_ip, redis_port, redis_db, logger); - if (nullptr == c) { + if (NULL == c) { return -1; } redisReply *reply = maat_cmd_wrap_redis_command(c, "flushdb"); - if (nullptr == reply) { + if (NULL == reply) { return -1; } diff --git a/test/maat_input_mode_gtest.cpp b/test/maat_input_mode_gtest.cpp index b8a31ae..211bf7d 100644 --- a/test/maat_input_mode_gtest.cpp +++ b/test/maat_input_mode_gtest.cpp @@ -34,7 +34,7 @@ TEST(json_mode, maat_scan_string) { maat_options_set_json_file(opts, json_path); struct maat *maat_instance = maat_new(opts, table_info_path); - EXPECT_NE(maat_instance, nullptr); + EXPECT_NE(maat_instance, NULL); int table_id = maat_table_get_id(maat_instance, "KEYWORDS_TABLE"); @@ -79,7 +79,7 @@ TEST(iris_mode, maat_scan_string) { maat_options_set_iris(opts, tmp_iris_full_idx_path, tmp_iris_inc_idx_path); struct maat *maat_instance = maat_new(opts, table_info_path); - EXPECT_NE(maat_instance, nullptr); + EXPECT_NE(maat_instance, NULL); int table_id = maat_table_get_id(maat_instance, "KEYWORDS_TABLE"); @@ -153,10 +153,10 @@ TEST(redis_mode, maat_scan_string) { snprintf(json_iris_path, sizeof(json_iris_path), "./%s_iris_tmp", json_filename); redisContext *c = maat_cmd_connect_redis(redis_ip, redis_port, redis_db, g_logger); - EXPECT_NE(c, nullptr); + EXPECT_NE(c, NULL); redisReply *reply = maat_cmd_wrap_redis_command(c, "flushdb"); - EXPECT_NE(reply, nullptr); + EXPECT_NE(reply, NULL); if (access(json_iris_path, F_OK) < 0) { char tmp_iris_path[128] = {0}; diff --git a/test/maat_json.json b/test/maat_json.json index f4de4af..c7c77c0 100644 --- a/test/maat_json.json +++ b/test/maat_json.json @@ -231,7 +231,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "abckkk&123", @@ -285,7 +285,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "should_not_hit_any_rule", @@ -376,7 +376,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "C#中国", @@ -506,7 +506,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "novel&27122.txt", @@ -609,7 +609,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "should&hit&aaa", @@ -636,7 +636,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "should&hit&bbb", @@ -689,7 +689,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "i.ytimg.com", @@ -714,7 +714,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": ",IgpwcjA0LnN2bzAzKgkxMjcuMC4wLjE", @@ -740,7 +740,7 @@ "not_flag":0, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-contained-string-of-rule-143", @@ -755,7 +755,7 @@ "not_flag":1, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-not-contained-string-of-rule-143", @@ -781,7 +781,7 @@ "not_flag":0, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-contained-string-of-rule-144", @@ -822,7 +822,7 @@ "not_flag":0, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-contained-string-of-rule-145", @@ -851,7 +851,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_REGEX", "table_type": "expr", "table_content": { "keywords": "Cookie:\\s&head", @@ -876,7 +876,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "googlevideo.com/videoplayback&mn=sn-35153iuxa-5a56%2Csn-n8v7znz7", @@ -1315,7 +1315,7 @@ "not_flag":0, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "https://blog.csdn.net/littlefang/article/details/8213058", @@ -1469,7 +1469,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "cavemancircus.com/", @@ -1511,7 +1511,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "2019/12/27/pretty-girls-6", @@ -1538,7 +1538,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "2019/12/27", @@ -1565,7 +1565,7 @@ "group_name": "Untitled", "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "2019/12/27", @@ -1992,7 +1992,7 @@ "table_content": { "keywords": "string1&string2&string3&string4&string5&string6&string7&string8", "expr_type": "and", - "match_method": "expr", + "match_method": "sub", "format": "uncase plain" } } @@ -2096,7 +2096,7 @@ "not_flag": 1, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-not-contained-string-of-rule-186", @@ -2148,7 +2148,7 @@ "not_flag": 1, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-not-contained-string-of-rule-187", @@ -2200,7 +2200,7 @@ "not_flag": 1, "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "must-not-contained-string-of-rule-188", @@ -2368,7 +2368,7 @@ { "regions": [ { - "table_name": "HTTP_URL", + "table_name": "HTTP_URL_LITERAL", "table_type": "expr", "table_content": { "keywords": "hello", diff --git a/test/rcu_hash_gtest.cpp b/test/rcu_hash_gtest.cpp index c97814c..1d97f53 100644 --- a/test/rcu_hash_gtest.cpp +++ b/test/rcu_hash_gtest.cpp @@ -14,14 +14,14 @@ void data_free(void *user_ctx, void *data) } TEST(rcu_hash_new, invalid_input_parameter) { - struct rcu_hash_table *htable = rcu_hash_new(nullptr); - EXPECT_EQ(htable, nullptr); + struct rcu_hash_table *htable = rcu_hash_new(NULL); + EXPECT_EQ(htable, NULL); } TEST(rcu_hash_add_one_node, single_thread) { /* add one node to hash */ struct rcu_hash_table *htable = rcu_hash_new(data_free); - EXPECT_NE(htable, nullptr); + EXPECT_NE(htable, NULL); struct user_data *data = ALLOC(struct user_data, 1); data->id = 101; @@ -35,7 +35,7 @@ TEST(rcu_hash_add_one_node, single_thread) { /* find in hash before commit */ void *res = rcu_hash_find(htable, key, key_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); int ret = rcu_hash_count(htable); EXPECT_EQ(ret, 0); @@ -51,7 +51,7 @@ TEST(rcu_hash_add_one_node, single_thread) { /* find in hash after commit */ res = rcu_hash_find(htable, key, key_len); - EXPECT_NE(res, nullptr); + EXPECT_NE(res, NULL); struct user_data *res_data = (struct user_data *)res; EXPECT_EQ(res_data->id, 101); @@ -72,7 +72,7 @@ TEST(rcu_hash_add_one_node, single_thread) { TEST(rcu_hash_add_multi_node, single_thread) { /* add multi node to hash */ struct rcu_hash_table *htable = rcu_hash_new(data_free); - EXPECT_NE(htable, nullptr); + EXPECT_NE(htable, NULL); struct user_data *data0 = ALLOC(struct user_data, 1); data0->id = 101; @@ -92,9 +92,9 @@ TEST(rcu_hash_add_multi_node, single_thread) { /* find in hash before commit */ void *res = rcu_hash_find(htable, key0, key0_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); res = rcu_hash_find(htable, key1, key1_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); int ret = rcu_hash_count(htable); EXPECT_EQ(ret, 0); @@ -110,14 +110,14 @@ TEST(rcu_hash_add_multi_node, single_thread) { /* find in hash after commit */ res = rcu_hash_find(htable, key0, key0_len); - EXPECT_NE(res, nullptr); + EXPECT_NE(res, NULL); struct user_data *res_data0 = (struct user_data *)res; EXPECT_EQ(res_data0->id, 101); EXPECT_STREQ(res_data0->name, "www.baidu.com"); res = rcu_hash_find(htable, key1, key1_len); - EXPECT_NE(res, nullptr); + EXPECT_NE(res, NULL); struct user_data *res_data1 = (struct user_data *)res; EXPECT_EQ(res_data1->id, 102); @@ -138,7 +138,7 @@ TEST(rcu_hash_add_multi_node, single_thread) { TEST(rcu_hash_del_one_node, single_thread) { /* case1: add and del before commit */ struct rcu_hash_table *htable = rcu_hash_new(data_free); - EXPECT_NE(htable, nullptr); + EXPECT_NE(htable, NULL); struct user_data *data = ALLOC(struct user_data, 1); data->id = 101; @@ -156,7 +156,7 @@ TEST(rcu_hash_del_one_node, single_thread) { /* find in hash before commit */ void *res = rcu_hash_find(htable, key, key_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); ret = rcu_hash_count(htable); EXPECT_EQ(ret, 0); @@ -173,7 +173,7 @@ TEST(rcu_hash_del_one_node, single_thread) { /* find in hash after commit */ res = rcu_hash_find(htable, key, key_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); /* case2: add && commit, and del */ struct user_data *data1 = ALLOC(struct user_data, 1); @@ -190,7 +190,7 @@ TEST(rcu_hash_del_one_node, single_thread) { rcu_hash_del(htable, key1, key1_len); res = rcu_hash_find(htable, key1, key1_len); - EXPECT_NE(res, nullptr); + EXPECT_NE(res, NULL); struct user_data *res_data = (struct user_data *)res; EXPECT_EQ(res_data->id, 102); @@ -205,7 +205,7 @@ TEST(rcu_hash_del_one_node, single_thread) { /* delete commit */ rcu_hash_commit(htable); res = rcu_hash_find(htable, key1, key1_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); ret = rcu_hash_count(htable); EXPECT_EQ(ret, 0); @@ -219,7 +219,7 @@ TEST(rcu_hash_del_one_node, single_thread) { TEST(rcu_hash_del_multi_node, single_thread) { /* case1: add and del before commit */ struct rcu_hash_table *htable = rcu_hash_new(data_free); - EXPECT_NE(htable, nullptr); + EXPECT_NE(htable, NULL); struct user_data *data1 = ALLOC(struct user_data, 1); data1->id = 101; @@ -239,7 +239,7 @@ TEST(rcu_hash_del_multi_node, single_thread) { /* find in hash before commit */ void *res = rcu_hash_find(htable, key1, key1_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); int ret = rcu_hash_count(htable); EXPECT_EQ(ret, 0); @@ -257,10 +257,10 @@ TEST(rcu_hash_del_multi_node, single_thread) { /* find in hash after commit */ res = rcu_hash_find(htable, key1, key1_len); - EXPECT_EQ(res, nullptr); + EXPECT_EQ(res, NULL); res = rcu_hash_find(htable, key2, key2_len); - EXPECT_NE(res, nullptr); + EXPECT_NE(res, NULL); ret = rcu_hash_count(htable); EXPECT_EQ(ret, 1); @@ -277,4 +277,4 @@ int main(int argc, char ** argv) ::testing::InitGoogleTest(&argc, argv); ret=RUN_ALL_TESTS(); return ret; -} \ No newline at end of file +} diff --git a/test/rule/full/HTTP_URL.000001 b/test/rule/full/HTTP_URL.000001 deleted file mode 100644 index 71524fe..0000000 --- a/test/rule/full/HTTP_URL.000001 +++ /dev/null @@ -1,7 +0,0 @@ -0000000006 -101 1 hello 0 0 0 1 -102 2 maat 0 0 0 1 -103 3 [W|w]orld 2 0 0 1 -104 4 hello&world 1 0 0 1 -105 5 [0-9]hello&world 2 0 0 1 -106 6 [0-9]hello&[0-9]world 2 0 0 1 \ No newline at end of file diff --git a/test/rule/full/index/full_config_index.000001 b/test/rule/full/index/full_config_index.000001 deleted file mode 100644 index f16a255..0000000 --- a/test/rule/full/index/full_config_index.000001 +++ /dev/null @@ -1 +0,0 @@ -HTTP_URL 6 /home/liuwentan/project/maat-v4/test/rule/full/HTTP_URL.000001 \ No newline at end of file diff --git a/test/table_info.conf b/test/table_info.conf index ca2905b..1bf0200 100644 --- a/test/table_info.conf +++ b/test/table_info.conf @@ -42,7 +42,7 @@ }, { "table_id":3, - "table_name":"HTTP_URL", + "table_name":"HTTP_URL_LITERAL", "table_type":"expr", "valid_column":7, "custom": { @@ -55,26 +55,10 @@ "match_method":5, "is_hexbin":6 } - }, - { - "table_id":3, - "table_name":"HTTP_HOST", - "table_type":"expr", - "valid_column":7, - "custom": { - "scan_mode":"block", - "pattern_type":"literal", - "item_id":1, - "group_id":2, - "keywords":3, - "expr_type":4, - "match_method":5, - "is_hexbin":6 - } - }, + }, { "table_id":4, - "table_name":"KEYWORDS_TABLE", + "table_name":"HTTP_URL_REGEX", "table_type":"expr", "valid_column":7, "custom": { @@ -90,6 +74,38 @@ }, { "table_id":5, + "table_name":"HTTP_HOST", + "table_type":"expr", + "valid_column":7, + "custom": { + "scan_mode":"block", + "pattern_type":"literal", + "item_id":1, + "group_id":2, + "keywords":3, + "expr_type":4, + "match_method":5, + "is_hexbin":6 + } + }, + { + "table_id":6, + "table_name":"KEYWORDS_TABLE", + "table_type":"expr", + "valid_column":7, + "custom": { + "scan_mode":"block", + "pattern_type":"literal", + "item_id":1, + "group_id":2, + "keywords":3, + "expr_type":4, + "match_method":5, + "is_hexbin":6 + } + }, + { + "table_id":7, "table_name":"IP_CONFIG", "table_type":"ip_plus", "valid_column":18, @@ -103,7 +119,7 @@ } }, { - "table_id":6, + "table_id":8, "table_name":"CONTENT_SIZE", "table_type":"intval", "valid_column":5, @@ -115,7 +131,7 @@ } }, { - "table_id":7, + "table_id":9, "table_name":"QD_ENTRY_INFO", "table_type":"plugin", "valid_column":4, @@ -125,7 +141,7 @@ } }, { - "table_id":9, + "table_id":10, "table_name":"HTTP_SIGNATURE", "table_type":"expr_plus", "valid_column":8, diff --git a/vendor/CMakeLists.txt b/vendor/CMakeLists.txt index 4b6a964..bb1f6e3 100644 --- a/vendor/CMakeLists.txt +++ b/vendor/CMakeLists.txt @@ -84,7 +84,7 @@ file(MAKE_DIRECTORY ${VENDOR_BUILD}/include) add_library(hiredis-static STATIC IMPORTED GLOBAL) add_dependencies(hiredis-static hiredis) -set_property(TARGET hiredis-static PROPERTY IMPORTED_LOCATION ${VENDOR_BUILD}/lib64/libhiredis.a) +set_property(TARGET hiredis-static PROPERTY IMPORTED_LOCATION ${VENDOR_BUILD}/lib64/libhiredisd.a) set_property(TARGET hiredis-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${VENDOR_BUILD}/include) #igraph-0.7.1