diff options
| -rw-r--r-- | .gitlab-ci.yml | 158 | ||||
| -rw-r--r-- | CMakeLists.txt | 13 | ||||
| -rw-r--r-- | ci/get-nprocessors.sh | 48 | ||||
| -rw-r--r-- | ci/perpare_pulp3_netrc.sh | 3 | ||||
| -rw-r--r-- | ci/travis.sh | 64 | ||||
| -rw-r--r-- | cmake/Package.cmake | 57 | ||||
| -rw-r--r-- | cmake/Version.cmake | 13 | ||||
| -rw-r--r-- | cmake/changelog.sh | 4 | ||||
| -rw-r--r-- | include/dns.h (renamed from src/dns.h) | 12 | ||||
| -rw-r--r-- | src/dns.cpp | 272 | ||||
| -rw-r--r-- | src/dns_global.map | 3 | ||||
| -rw-r--r-- | test/src/dns_test.c | 3 |
12 files changed, 529 insertions, 121 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 08e1ac9..b98dbaa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,92 +1,104 @@ -image: "docker:stable" - -services: - - docker:dind - +image: "git.mesalab.cn:7443/mesa_platform/build-env:master" variables: GIT_STRATEGY: "clone" - DOCKER_HOST: tcp://docker:2375 - DOCKER_DRIVER: overlay2 - IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + BUILD_PADDING_PREFIX: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX/ + INSTALL_PREFIX: "/opt/MESA/lib/" + INSTALL_DEPENDENCY_LIBRARY: libMESA_handle_logger-devel libcjson-devel libMESA_field_stat2-devel sapp-devel framework_env libMESA_prof_load-devel sapp-devel stages: - - build - - package - - release +- build -.build_before_script: +.build_by_travis: before_script: - - mkdir -p /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_NAMESPACE/ - - ln -s $CI_PROJECT_DIR /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH - - cd /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH - -.build_dns: - extends: .build_before_script - image: git.mesalab.cn:7443/mesa_framework/framework:master + - 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 script: - - cp src/dns.h /opt/MESA/include/MESA/ - - source /etc/profile.d/MESA.sh - - mkdir -p build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE - - make + - yum makecache + - ./ci/travis.sh + - cd build + tags: + - share -.package_dns: - extends: .build_before_script - image: git.mesalab.cn:7443/mesa_framework/framework:master - script: - - cp src/dns.h /opt/MESA/include/MESA/ - - source /etc/profile.d/MESA.sh - - mkdir -p build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE - - make package +branch_build_debug: + stage: build + extends: .build_by_travis + variables: + BUILD_TYPE: Debug + except: + - /^develop.*$/i + - /^master.*$/i + - tags -build: +branch_build_release: stage: build - extends: .build_dns - tags: - - share variables: - BUILD_TYPE: "Release" + BUILD_TYPE: RelWithDebInfo + extends: .build_by_travis except: + - /^develop.*$/i + - /^master.*$/i - tags -#build-docker: -# stage: build -# script: -# - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY -# - docker build -t $IMAGE_TAG . -# - docker push $IMAGE_TAG -# tags: -# - share -# only: -# - tags +develop_build_debug: + stage: build + extends: .build_by_travis + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + artifacts: + name: "dns-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i -dns-package: - stage: package - extends: .package_dns - tags: - - share - variables: - BUILD_TYPE: "Release" - artifacts: - name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME" - paths: - - ./build/*.rpm - only: - - tags +develop_build_release: + stage: build + extends: .build_by_travis + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + artifacts: + name: "dns-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i -release: - stage: release - image: git.mesalab.cn:7443/mesa_framework/framework:master - tags: - - share + +release_build_release: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD: 1 + PULP3_REPO_NAME: platform-stable-x86_64.el7 + PULP3_DIST_NAME: platform-stable-x86_64.el7 + extends: .build_by_travis + artifacts: + name: "dns-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm only: - tags + +release_build_release_devel: + stage: build variables: - ARTIFACTS_JOB: "dns-package" - PROJECT_NAME: "dns" - USER_DEFINE: "release" - script: - - /bin/bash -x ./autorelease.sh $CI_API_V4_URL $CI_PROJECT_URL $CI_PROJECT_ID $CI_TOKEN $CI_COMMIT_TAG $ARTIFACTS_JOB $CI_PROJECT_NAME $USER_DEFINE + BUILD_TYPE: RelWithDebInfo + ENABLE_DEVEL_SWITCH: "ON" + PACKAGE: 1 + UPLOAD: 1 + PULP3_REPO_NAME: platform-stable-x86_64.el7 + PULP3_DIST_NAME: platform-stable-x86_64.el7 + extends: .build_by_travis + artifacts: + name: "dns-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - tags diff --git a/CMakeLists.txt b/CMakeLists.txt index d913898..59f7512 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ elseif(ENABLE_SANITIZE_THREAD) endif() # end of for ASAN +include_directories(${PROJECT_SOURCE_DIR}/include) include_directories(/opt/MESA/include/MESA/) file(GLOB SRC @@ -45,10 +46,14 @@ else() set_target_properties(dns PROPERTIES OUTPUT_NAME ${lib_name}) endif() -install(TARGETS dns LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/protocol/dns) -install(FILES bin/dns.inf DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/protocol/dns) -install(FILES bin/dns.conf DESTINATION ${CMAKE_INSTALL_PREFIX}/conf/dns) -install(FILES src/${lib_name}.h DESTINATION /opt/MESA/include/MESA COMPONENT devel) +set(CPACK_RPM_USER_FILELIST "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/plug/protocol/dns/dns.inf" + "%config(noreplace) ${CMAKE_INSTALL_PREFIX}/conf/dns/dns.conf") + + +install(TARGETS dns LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/protocol/dns COMPONENT LIBRARY) +install(FILES bin/dns.inf DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/protocol/dns COMPONENT PROFILE) +install(FILES bin/dns.conf DESTINATION ${CMAKE_INSTALL_PREFIX}/conf/dns COMPONENT PROFILE) +install(FILES include/dns.h DESTINATION /opt/MESA/include/MESA COMPONENT HEADER) file(GLOB DEMO diff --git a/ci/get-nprocessors.sh b/ci/get-nprocessors.sh new file mode 100644 index 0000000..43635e7 --- /dev/null +++ b/ci/get-nprocessors.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This file is typically sourced by another script. +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi + +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi diff --git a/ci/perpare_pulp3_netrc.sh b/ci/perpare_pulp3_netrc.sh new file mode 100644 index 0000000..8414bbb --- /dev/null +++ b/ci/perpare_pulp3_netrc.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env sh +set -evx +echo "machine ${PULP3_SERVER_URL}\nlogin ${PULP3_SERVER_LOGIN}\npassword ${PULP3_SERVER_PASSWORD}\n" > ~/.netrc diff --git a/ci/travis.sh b/ci/travis.sh new file mode 100644 index 0000000..40a2780 --- /dev/null +++ b/ci/travis.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env sh +set -evx + +chmod +x ci/get-nprocessors.sh +. ci/get-nprocessors.sh + +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi + +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi + +# Tell make to use the processors. No preceding '-' required. +MAKEFLAGS="j${NPROCESSORS}" +export MAKEFLAGS + +env | sort + +# Set default values to OFF for these variables if not specified. +: "${NO_EXCEPTION:=OFF}" +: "${NO_RTTI:=OFF}" +: "${COMPILER_IS_GNUCXX:=OFF}" + +# Install dependency from YUM +if [ -n "${INSTALL_DEPENDENCY_LIBRARY}" ]; then + yum install -y $INSTALL_DEPENDENCY_LIBRARY + source /etc/profile.d/framework.sh +fi +mkdir build || true +cd build + +cmake3 -DCMAKE_CXX_FLAGS=$CXX_FLAGS \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ + -DENABLE_DEVEL=$ENABLE_DEVEL_SWITCH \ + .. + +make + +if [ -n "${PACKAGE}" ]; then + make package +fi + +if [ -n "${UPLOAD}" ]; then + cp ~/rpm_upload_tools.py ./ + python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm +fi + +#if [ -n "${UPLOAD_SYMBOL_FILES}" ]; then +# rpm -i tfe*debuginfo*.rpm +# cp /usr/lib/debug/opt/tsg/tfe/bin/tfe.debug /tmp/tfe.debuginfo.${CI_COMMIT_SHORT_SHA} +# sentry-cli upload-dif -t elf /tmp/tfe.debuginfo.${CI_COMMIT_SHORT_SHA} +#fi diff --git a/cmake/Package.cmake b/cmake/Package.cmake index abfd6be..6b4f698 100644 --- a/cmake/Package.cmake +++ b/cmake/Package.cmake @@ -1,41 +1,60 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CPACK_PACKAGE_NAME "${lib_name}-debug") + set(MY_RPM_NAME_PREFIX "${lib_name}-debug") else() - set(CPACK_PACKAGE_NAME ${lib_name}) + set(MY_RPM_NAME_PREFIX "${lib_name}") endif() -message(STATUS "Package: ${CPACK_PACKAGE_NAME}") +message(STATUS "Package: ${MY_RPM_NAME_PREFIX}") set(CPACK_PACKAGE_VECDOR "MESA") set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}.${VERSION_BUILD}") set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) +set(CPACK_PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}") +execute_process(COMMAND bash -c "echo -ne \"`uname -r | awk -F'.' '{print $5\".\"$6\".\"$7}'`\"" OUTPUT_VARIABLE SYSTEM_VERSION) -set(CPACK_COMPONENTS_ALL devel) -set(CPACK_RPM_PACKAGE_DEBUG 1) -set(CPACK_RPM_COMPONENT_INSTALL OFF) -set(CPACK_RPM_DEVEL_FILE_NAME "${PROJECT_NAME}-devel.rpm") -set(CPACK_RPM_DEVEL_DEBUGINFO_FILE_NAME "${PROJECT_NAME}-devel-debuginfo.rpm") +#execute_process(COMMAND bash -c "git log --branches=x10 --no-merges --date=local --show-signature --pretty=\"* %ad %an %ae %nhash: %H%ncommit:%n%B\" | awk -F\"-\" '{print "- "$0}' | sed 's/- \\*/\\*/g' | sed 's/- $//g' | sed 's/-/ -/g' | sed 's/[0-9]\\{2\\}:[0-9]\\{2\\}:[0-9]\\{2\\}//g'" OUTPUT_FILE "changelog.txt") +execute_process(COMMAND sh changelog.sh WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/cmake) +SET(CPACK_RPM_CHANGELOG_FILE ${PROJECT_SOURCE_DIR}/cmake/changelog.txt) # RPM Build set(CPACK_GENERATOR "RPM") -set(CPACK_RPM_AUTO_GENERATED_FILE_NAME ON) -set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") set(CPACK_RPM_PACKAGE_VENDOR "MESA") -set(CPACK_RPM_PACKAGE_AUTOREQPROV "no") -set(CPACK_RPM_PACKAGE_RELEASE_DIST ON) -set(CPACK_RPM_DEBUGINFO_PACKAGE ON) +set(CPACK_RPM_PACKAGE_AUTOREQPROV "yes") +set(CPACK_RPM_PACKAGE_RELEASE_LIBRARY "on") +set(CPACK_RPM_DEBUGINFO_PACKAGE "on") +set(CPACK_RPM_PACKAGE_DEBUG 1) + +set(CPACK_RPM_COMPONENT_INSTALL ON) +set(CPACK_COMPONENTS_IGNORE_GROUPS 1) +set(CPACK_COMPONENTS_GROUPING ONE_PER_GROUP) +set(CPACK_COMPONENT_HEADER_DISPLAY_NAME "develop") + +set(CPACK_COMPONENT_LIBRARY_REQUIRED TRUE) +set(CPACK_RPM_LIBRARY_PACKAGE_NAME ${MY_RPM_NAME_PREFIX}) +set(CPACK_RPM_LIBRARY_FILE_NAME "${CPACK_RPM_LIBRARY_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${SYSTEM_VERSION}.rpm") +set(CPACK_RPM_LIBRARY_DEBUGINFO_FILE_NAME "${CPACK_RPM_LIBRARY_PACKAGE_NAME}-debuginfo-${CPACK_PACKAGE_VERSION}-${SYSTEM_VERSION}.rpm") + +set(CPACK_COMPONENT_LIBRARY_GROUP "library") +set(CPACK_COMPONENT_PROFILE_GROUP "library") + +set(CPACK_COMPONENT_HEADER_REQUIRED TRUE) +set(CPACK_RPM_HEADER_PACKAGE_NAME "${MY_RPM_NAME_PREFIX}-devel") +set(CPACK_RPM_HEADER_FILE_NAME "${CPACK_RPM_HEADER_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${SYSTEM_VERSION}.rpm") +set(CPACK_RPM_HEADER_DEBUGINFO_FILE_NAME "${CPACK_RPM_HEADER_PACKAGE_NAME}-debuginfo-${CPACK_PACKAGE_VERSION}-${SYSTEM_VERSION}.rpm") +set(CPACK_COMPONENT_HEADER_GROUP "header") + +set(CPACK_RPM_HEADER_PACKAGE_REQUIRES_PRE ${CPACK_RPM_LIBRARY_PACKAGE_NAME}) +set(CPACK_RPM_HEADER_PACKAGE_CONFLICTS ${CPACK_RPM_HEADER_PACKAGE_NAME}) + +set(CPACK_COMPONENTS_ALL LIBRARY HEADER PROFILE) set(CPACK_BUILD_SOURCE_DIRS "${CMAKE_SOURCE_DIR}") # Must uninstall the debug package before install release package -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CPACK_RPM_PACKAGE_CONFLICTS "${lib_name}-debug") -else() - set(CPACK_RPM_PACKAGE_CONFLICTS ${lib_name}) - # set(CPACK_STRIP_FILES TRUE) -endif() +set(CPACK_RPM_PACKAGE_CONFLICTS ${MY_RPM_NAME_PREFIX}) +# set(CPACK_STRIP_FILES TRUE) include(CPack) diff --git a/cmake/Version.cmake b/cmake/Version.cmake index 088b05a..752f20f 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -38,7 +38,16 @@ set(VERSION_BUILD "${VCS_SHORT_HASH}") # print information message(STATUS "Version: ${VERSION}-${VERSION_BUILD}") +if(NOT DEFINE_GIT_VERSION) + option(DEFINE_GIT_VERSION "Set DEFINE_GIT_VERSION to OFF" OFF) + set(GIT_VERSION "${VERSION}-${CMAKE_BUILD_TYPE}-${VERSION_BUILD}-${VCS_BRANCH}-${VCS_TAG}-${VCS_DATE}") -string(REGEX REPLACE "[-:+]" "_" GIT_VERSION ${GIT_VERSION}) -add_definitions(-DGIT_VERSION=${GIT_VERSION}) +string(REGEX REPLACE "[-:+/\\.]" "_" GIT_VERSION ${GIT_VERSION}) + +if(DEFINE_GIT_VERSION) + add_definitions(-DGIT_VERSION=${GIT_VERSION}) + option(DEFINE_GIT_VERSION "Set DEFINE_GIT_VERSION to OFF" ON) +endif() + +endif() diff --git a/cmake/changelog.sh b/cmake/changelog.sh new file mode 100644 index 0000000..7d8bf7f --- /dev/null +++ b/cmake/changelog.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +branch=`git status | grep branch | awk '{print $NF}'` +git log --branches=$branch --no-merges --date=local --show-signature --pretty="* %ad %an %ae %nhash: %H%ncommit:%n%B" | awk -F"-" '{print "- "$0}' | sed 's/- \*/\*/g' | sed 's/- $//g' | sed 's/-/ -/g' | sed 's/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}//g' > changelog.txt diff --git a/src/dns.h b/include/dns.h index 2fc1930..ed7512e 100644 --- a/src/dns.h +++ b/include/dns.h @@ -1,6 +1,8 @@ #ifndef DNS_ANALYSE_H #define DNS_ANALYSE_H +#include <MESA/cJSON.h> + #ifndef u_char #define u_char unsigned char #endif @@ -30,15 +32,6 @@ #define DNS_HINFO_MAX_OS 40 #define DNS_MAX_NAME 255 -/* support reponse cfg type */ -#define DNS_CFG_TYPE_CNAME 0 -#define DNS_CFG_TYPE_MX 1 -#define DNS_CFG_TYPE_AUTH 2 -#define DNS_CFG_TYPE_ADDI 3 -#define DNS_CFG_TYPE_A 5 -#define DNS_CFG_TYPE_NS 6 -#define DNS_CFG_TYPE_AAAA 7 - /* RR type */ #define DNS_TYPE_A 1 #define DNS_TYPE_NS 2 @@ -344,6 +337,7 @@ extern "C" * * */ +int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec); int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int *dns_sec); int dns_save_raw_pkt(char *buf, int buflen, const struct streaminfo * a_stream); int build_cheat_pkt(unsigned char *payload, int payload_len, dns_query_question_t *query_question, cheat_pkt_opt_t *cheat_opt, int cheat_opt_num); diff --git a/src/dns.cpp b/src/dns.cpp index 81d5e7c..bfacbc9 100644 --- a/src/dns.cpp +++ b/src/dns.cpp @@ -24,13 +24,39 @@ #include <assert.h> #include <sys/time.h> #include <MESA/stream.h> + #include <MESA/field_stat2.h> #include <MESA/MESA_prof_load.h> #include <MESA/MESA_handle_logger.h> #include "dns.h" #include "dns_internal.h" -int DNS_PROTOCOL_VERSION_20191212; + +int DNS_PROTOCOL_VERSION_20200430; + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define GIT_VERSION_CATTER(v) __attribute__((__used__)) const char * GIT_VERSION_##v = NULL +#define GIT_VERSION_EXPEND(v) GIT_VERSION_CATTER(v) + +/* VERSION TAG */ +#ifdef GIT_VERSION +GIT_VERSION_EXPEND(GIT_VERSION); +#else +static __attribute__((__used__)) const char * GIT_VERSION_UNKNOWN = NULL; +#endif +#undef GIT_VERSION_CATTER +#undef GIT_VERSION_EXPEND + +#ifdef __cplusplus +} +#endif + +int DNS_PROTOCOL_VERSION_20191224; + unsigned long long dns_register_flag = 0; unsigned short dns_plugid = 0; static pthread_mutex_t dns_lock; @@ -81,6 +107,196 @@ const unsigned char PCAP_FILE_HEAD[24] = {0xD4, 0xC3, 0xB2, 0xA1, 0x02, 0x00, 0x 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}; +int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec) +{ + int i=0; + char ip_str[128]; + dns_rr_t *dns_rr=NULL; + cJSON *one_rr_object=NULL; + cJSON *dns_rr_array=NULL; + + if(object==NULL || dns_info==NULL || dns_sec==NULL) + { + return -1; + } + + dns_rr_array=cJSON_CreateArray(); + + for(i = 0; i < dns_info->rr_count; i++) + { + one_rr_object=cJSON_CreateObject(); + dns_rr = &(dns_info->rr[i]); + + if(dns_rr->type == DNS_TYPE_OPT) + { + cJSON_AddStringToObject(one_rr_object, "name", (const char *)(dns_rr->name)); + cJSON_AddNumberToObject(one_rr_object, "type", dns_rr->type); + cJSON_AddNumberToObject(one_rr_object, "udp_payload", dns_rr->rr_class); + cJSON_AddNumberToObject(one_rr_object, "rcode", (int)(dns_rr->ttl>>24)); + cJSON_AddNumberToObject(one_rr_object, "version", (int)((dns_rr->ttl>>16)&0xFF)); + cJSON_AddNumberToObject(one_rr_object, "Z", (int)(dns_rr->ttl&&0xFFFF)); + cJSON_AddNumberToObject(one_rr_object, "rdlength", dns_rr->rdlength); + } + else + { + cJSON_AddStringToObject(one_rr_object, "name", (const char *)(dns_rr->name)); + cJSON_AddNumberToObject(one_rr_object, "type", dns_rr->type); + cJSON_AddNumberToObject(one_rr_object, "class", dns_rr->rr_class); + cJSON_AddNumberToObject(one_rr_object, "ttl", dns_rr->ttl); + cJSON_AddNumberToObject(one_rr_object, "rdlength", dns_rr->rdlength); + } + + if(dns_rr->rdata.a==NULL) + { + cJSON_AddItemToArray(dns_rr_array, one_rr_object); + continue; + } + + switch(dns_rr->type) + { + case DNS_TYPE_A: + inet_ntop(AF_INET, (void *)(dns_rr->rdata.a), ip_str, sizeof(ip_str)); + cJSON_AddStringToObject(one_rr_object, "a", ip_str); + break; + case DNS_TYPE_NS: + cJSON_AddStringToObject(one_rr_object, "ns", (const char *)(dns_rr->rdata.ns)); + break; + case DNS_TYPE_MD: + cJSON_AddStringToObject(one_rr_object, "md", (const char *)(dns_rr->rdata.md)); + break; + case DNS_TYPE_MF: + cJSON_AddStringToObject(one_rr_object, "mf", (const char *)(dns_rr->rdata.mf)); + break; + case DNS_TYPE_CNAME: + cJSON_AddStringToObject(one_rr_object, "cname", (const char *)(dns_rr->rdata.cname)); + break; + case DNS_TYPE_SOA: + cJSON_AddStringToObject(one_rr_object, "mname", (const char *)(dns_rr->rdata.soa.mname)); + cJSON_AddStringToObject(one_rr_object, "rname", (const char *)(dns_rr->rdata.soa.rname)); + cJSON_AddNumberToObject(one_rr_object, "serial", dns_rr->rdata.soa.serial); + cJSON_AddNumberToObject(one_rr_object, "refresh", dns_rr->rdata.soa.refresh); + cJSON_AddNumberToObject(one_rr_object, "retry", dns_rr->rdata.soa.retry); + cJSON_AddNumberToObject(one_rr_object, "cname", dns_rr->rdata.soa.expire); + cJSON_AddNumberToObject(one_rr_object, "minimum", dns_rr->rdata.soa.minimum); + break; + case DNS_TYPE_MB: + cJSON_AddStringToObject(one_rr_object, "mb", (const char *)(dns_rr->rdata.mb)); + break; + case DNS_TYPE_MG: + cJSON_AddStringToObject(one_rr_object, "mg", (const char *)(dns_rr->rdata.mg)); + break; + case DNS_TYPE_MR: + cJSON_AddStringToObject(one_rr_object, "mr", (const char *)(dns_rr->rdata.mr)); + break; + case DNS_TYPE_NULL: + cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.null.size); + cJSON_AddStringToObject(one_rr_object, "null", (const char *)(dns_rr->rdata.null.null)); + break; + case DNS_TYPE_WKS: + cJSON_AddStringToObject(one_rr_object, "addr", ip_str); + cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.wks.protocol); + cJSON_AddStringToObject(one_rr_object, "bitmap", (const char *)(dns_rr->rdata.wks.bitmap)); + cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.wks.size); + break; + case DNS_TYPE_PTR: + cJSON_AddStringToObject(one_rr_object, "ptr", (const char *)(dns_rr->rdata.ptr)); + break; + case DNS_TYPE_HINFO: + cJSON_AddStringToObject(one_rr_object, "cpu", (const char *)(dns_rr->rdata.hinfo.cpu)); + cJSON_AddStringToObject(one_rr_object, "os", (const char *)(dns_rr->rdata.hinfo.os)); + break; + case DNS_TYPE_MINFO: + cJSON_AddStringToObject(one_rr_object, "rmailbx", (const char *)(dns_rr->rdata.minfo.rmailbx)); + cJSON_AddStringToObject(one_rr_object, "emailbx", (const char *)(dns_rr->rdata.minfo.emailbx)); + break; + case DNS_TYPE_MX: + cJSON_AddStringToObject(one_rr_object, "exchange", (const char *)(dns_rr->rdata.mx.exchange)); + cJSON_AddNumberToObject(one_rr_object, "preference", dns_rr->rdata.mx.preference); + break; + case DNS_TYPE_TXT: + cJSON_AddStringToObject(one_rr_object, "txt", (char *)(dns_rr->rdata.txt.txt)); + cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.txt.size); + break; + case DNS_TYPE_RP: + cJSON_AddStringToObject(one_rr_object, "mailbox", (char *)(dns_rr->rdata.rp.mailbox)); + cJSON_AddStringToObject(one_rr_object, "txt_rr", (char *)(dns_rr->rdata.rp.txt_rr)); + break; + case DNS_TYPE_AAAA: + inet_ntop(AF_INET6, dns_rr->rdata.aaaa, ip_str, sizeof(ip_str)); + cJSON_AddStringToObject(one_rr_object, "aaaa", ip_str); + break; + case DNS_TYPE_OPT: + break; + case DNS_TYPE_DS: + *dns_sec = 2; + cJSON_AddNumberToObject(one_rr_object, "key_tag", dns_rr->rdata.ds.key_tag); + cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.ds.algo); + cJSON_AddNumberToObject(one_rr_object, "digest_type", dns_rr->rdata.ds.digest_type); + cJSON_AddStringToObject(one_rr_object, "digest", (char *)(dns_rr->rdata.ds.digest)); + break; + case DNS_TYPE_RRSIG: + *dns_sec = 2; + cJSON_AddNumberToObject(one_rr_object, "type_covered", dns_rr->rdata.rrsig.type_covered); + cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.rrsig.algo); + cJSON_AddNumberToObject(one_rr_object, "labels", dns_rr->rdata.rrsig.labels); + cJSON_AddNumberToObject(one_rr_object, "original_ttl", dns_rr->rdata.rrsig.original_ttl); + cJSON_AddNumberToObject(one_rr_object, "sig_expiration", dns_rr->rdata.rrsig.sig_expiration); + cJSON_AddNumberToObject(one_rr_object, "sig_inception", dns_rr->rdata.rrsig.sig_inception); + cJSON_AddNumberToObject(one_rr_object, "key_tag", dns_rr->rdata.rrsig.key_tag); + cJSON_AddStringToObject(one_rr_object, "signer_name", (const char *)(dns_rr->rdata.rrsig.signer_name)); + cJSON_AddStringToObject(one_rr_object, "signature", (char *)(dns_rr->rdata.rrsig.signature)); + break; + case DNS_TYPE_NSEC: + *dns_sec = 2; + cJSON_AddStringToObject(one_rr_object, "next_domain", (const char *)(dns_rr->rdata.nsec.next_domain)); + cJSON_AddStringToObject(one_rr_object, "type_bit_maps", (char *)(dns_rr->rdata.nsec.type_bit_maps)); + break; + case DNS_TYPE_DNSKEY: + *dns_sec = 2; + cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.dnskey.flags); + cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.dnskey.protocol); + cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.dnskey.algo); + cJSON_AddStringToObject(one_rr_object, "public_key", (char *)(dns_rr->rdata.dnskey.public_key)); + break; + case DNS_TYPE_NSEC3: + *dns_sec = 2; + cJSON_AddNumberToObject(one_rr_object, "hash_algo", dns_rr->rdata.nsec3.hash_algo); + cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.nsec3.flags); + cJSON_AddNumberToObject(one_rr_object, "iteration", dns_rr->rdata.nsec3.iteration); + cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3.salt_len); + cJSON_AddNumberToObject(one_rr_object, "hash_len", dns_rr->rdata.nsec3.hash_len); + cJSON_AddStringToObject(one_rr_object, "salt_value", (char *)(dns_rr->rdata.nsec3.salt_value)); + cJSON_AddStringToObject(one_rr_object, "next_hash_owner", (char *)(dns_rr->rdata.nsec3.next_hash_owner)); + cJSON_AddStringToObject(one_rr_object, "type_bit_maps", (char *)(dns_rr->rdata.nsec3.type_bit_maps)); + break; + case DNS_TYPE_NSEC3PARAM: + cJSON_AddNumberToObject(one_rr_object, "hash_algo", dns_rr->rdata.nsec3param.hash_algo); + cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.nsec3param.flags); + cJSON_AddNumberToObject(one_rr_object, "iteration", dns_rr->rdata.nsec3param.iteration); + cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3param.salt_len); + cJSON_AddStringToObject(one_rr_object, "salt_value", (char *)(dns_rr->rdata.nsec3param.salt_value)); + break; + case DNS_QTYPE_AXFR: + break; + case DNS_QTYPE_MAILB: + continue; + break; + case DNS_QTYPE_MAILA: + break; + case DNS_QTYPE_ANY: + break; + default: + break; + } + + cJSON_AddItemToArray(dns_rr_array, one_rr_object); + } + + cJSON_AddItemToObject(object, "rr", dns_rr_array); + + return 0; +} + int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int *dns_sec) { int i=0,j=0,tmp_len=0; @@ -1030,6 +1246,8 @@ int get_rr_common_field(char *msg, char **ptr, dns_rr_t *rr, char *end) int callback_dns_business_plug(struct streaminfo *a_stream, void **pme, void *info, int prot_flag, int session_state, int thread_seq, void *a_packet) { + char state=PROT_STATE_GIVEME; + char app_state=APP_STATE_GIVEME; stSessionInfo sessionInfo; save_dns_business_info_t *apme = (save_dns_business_info_t *)*pme; @@ -1039,9 +1257,31 @@ int callback_dns_business_plug(struct streaminfo *a_stream, void **pme, void *in sessionInfo.session_state = session_state; sessionInfo.prot_flag = prot_flag; sessionInfo.app_info = (void *)info; - PROT_PROCESS(&sessionInfo, &apme->business_pme, thread_seq, a_stream, a_packet); + state=PROT_PROCESS(&sessionInfo, &apme->business_pme, thread_seq, a_stream, a_packet); - return 0; + if(state&PROT_STATE_DROPPKT) + { + app_state=APP_STATE_DROPPKT; + } + + if(state&PROT_STATE_DROPME) + { + if(app_state&APP_STATE_DROPPKT) + { + app_state|=APP_STATE_DROPME; + } + else + { + app_state=APP_STATE_DROPME; + } + } + + if(state&PROT_STATE_GIVEME) + { + app_state=APP_STATE_GIVEME; + } + + return app_state; } int get_dns_query_question(char *msg, char **ptr, dns_query_question_t *q, char *end) @@ -1431,9 +1671,9 @@ int parse_resource_record(struct streaminfo *a_stream, dns_info_t *dns_info, cha int parse_dns_protocol(struct streaminfo *a_stream, unsigned char opstate, char *payload, int payload_len, void **pme, int thread_seq, void *a_packet) { - int i = 0; - int session_state = SESSION_STATE_PENDING; - int ret = APP_STATE_GIVEME; + int i=0; + int session_state=SESSION_STATE_PENDING; + int ret=APP_STATE_GIVEME; char *cur_pos = NULL; dns_info_t dns_info; unsigned long long register_flag = dns_register_flag; @@ -1499,7 +1739,11 @@ int parse_dns_protocol(struct streaminfo *a_stream, unsigned char opstate, char return APP_STATE_DROPME; } - callback_dns_business_plug(a_stream, pme, (void *)&dns_info, DNS_ALL, session_state, thread_seq, a_packet); + ret=callback_dns_business_plug(a_stream, pme, (void *)&dns_info, DNS_ALL, session_state, thread_seq, a_packet); + if(ret&APP_STATE_DROPME || ret&APP_STATE_DROPPKT) + { + return ret; + } } else if((register_flag&DNS_REQ_ALL) && (0 == dns_info.hdr_info.qr)) /* process query packet */ { @@ -1580,6 +1824,7 @@ int parse_dns_protocol(struct streaminfo *a_stream, unsigned char opstate, char char DNS_UDP_ENTRY(struct streaminfo *a_udp, void **pme, int thread_seq, void *a_packet) { + char state=APP_STATE_GIVEME; int payload_len = 0; char *payload = NULL; struct udpdetail *udp_detail = NULL; @@ -1619,16 +1864,16 @@ char DNS_UDP_ENTRY(struct streaminfo *a_udp, void **pme, int thread_seq, void *a break; } - parse_dns_protocol(a_udp, a_udp->opstate, payload, payload_len, pme, thread_seq, a_packet); + state=parse_dns_protocol(a_udp, a_udp->opstate, payload, payload_len, pme, thread_seq, a_packet); break; case OP_STATE_CLOSE: - callback_dns_business_plug(a_udp, pme, NULL, DNS_ALL, SESSION_STATE_CLOSE, thread_seq, a_packet); + state=callback_dns_business_plug(a_udp, pme, NULL, DNS_ALL, SESSION_STATE_CLOSE, thread_seq, a_packet); dictator_free(thread_seq, *pme); *pme = NULL; break; } - return APP_STATE_GIVEME; + return state; } @@ -1636,6 +1881,7 @@ char DNS_TCP_ENTRY(struct streaminfo *a_tcp, void **pme, int thread_seq, void *a { int payload_len = 0; char *payload = NULL; + char state=APP_STATE_GIVEME; struct tcpdetail* tcp_detail = (struct tcpdetail*)a_tcp->pdetail; save_dns_business_info_t *dns_pme=(save_dns_business_info_t*)*pme; @@ -1707,16 +1953,16 @@ char DNS_TCP_ENTRY(struct streaminfo *a_tcp, void **pme, int thread_seq, void *a return APP_STATE_GIVEME; } - parse_dns_protocol(a_tcp, a_tcp->opstate, payload, payload_len, pme, thread_seq, a_packet); + state=parse_dns_protocol(a_tcp, a_tcp->opstate, payload, payload_len, pme, thread_seq, a_packet); break; case OP_STATE_CLOSE: - callback_dns_business_plug(a_tcp, pme, NULL, DNS_UNKOWN, SESSION_STATE_CLOSE, thread_seq, a_packet); + state=callback_dns_business_plug(a_tcp, pme, NULL, DNS_UNKOWN, SESSION_STATE_CLOSE, thread_seq, a_packet); dictator_free(thread_seq, *pme); *pme = NULL; break; } - return APP_STATE_GIVEME; + return state; } diff --git a/src/dns_global.map b/src/dns_global.map index 8288e5b..35a5ff5 100644 --- a/src/dns_global.map +++ b/src/dns_global.map @@ -7,5 +7,8 @@ global: PROT_FUNSTAT; FLAG_CHANGE; GET_PLUGID; + get_rr_content2buf; + get_rr_str2json; + dns_save_raw_pkt; local:*; }; diff --git a/test/src/dns_test.c b/test/src/dns_test.c index aaabfd3..80a416e 100644 --- a/test/src/dns_test.c +++ b/test/src/dns_test.c @@ -6,9 +6,10 @@ #include <assert.h> #include <MESA/stream.h> -#include <MESA/dns.h> #include <MESA/cJSON.h> +#include "dns.h" + #define LOG_PATH "./log/dns/" #define DEBUG 1 |
