summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author刘学利 <[email protected]>2020-04-30 13:11:26 +0800
committer刘学利 <[email protected]>2020-04-30 13:11:26 +0800
commitf654552b29bb2f5ac05bd309c0ba81004de0340e (patch)
treed3bbb1ca09dc57e6a8f92513f5b278e5e1f61fed
parent2eecdc81578aa43160799460612fc7020167f832 (diff)
parenta9c8dc1940ea802e792ed6f4eb39a1a5b73545a8 (diff)
Merge branch 'develop' into 'master'v2.0.1
Develop See merge request MESA_Platform/dns!1
-rw-r--r--.gitlab-ci.yml158
-rw-r--r--CMakeLists.txt13
-rw-r--r--ci/get-nprocessors.sh48
-rw-r--r--ci/perpare_pulp3_netrc.sh3
-rw-r--r--ci/travis.sh64
-rw-r--r--cmake/Package.cmake57
-rw-r--r--cmake/Version.cmake13
-rw-r--r--cmake/changelog.sh4
-rw-r--r--include/dns.h (renamed from src/dns.h)12
-rw-r--r--src/dns.cpp272
-rw-r--r--src/dns_global.map3
-rw-r--r--test/src/dns_test.c3
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