From f6d9d68ae79681e36ea4010f5ea4faaaf6b09cc1 Mon Sep 17 00:00:00 2001 From: 杨威 Date: Mon, 3 Aug 2020 19:18:42 +0800 Subject: 集成breakpad输出minidump 1、sapp增加-g参数,测试生成minidump功能,默认读取./etc/sapp.toml下配置 2、代码增加src/support/breakpad_mini目录,封装简单的in_process输出minidump方式 3、控制参数集成在sapp配置项中,可配置内容如下: [breakpad] disable_coredump=1 enable_breakpad=1 breakpad_minidump_dir=/tmp/crashreport enable_breakpad_upload=0 breakpad_upload_url=http://127.0.0.1/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、移除sapp原有的dump_backtrace函数(已废弃) 2、更新breakpad默认参数,默认打开coredump,关闭breakpad 移除breakpad上传时的-p与-v参数 Breakpad_mini update:上传时-p参数值使用basename函数从/proc/self/exe获取,默认为进程名 移除breakpad_mini中的install,避免影响sapp打包 platform_init结束后,调用sapp_init_breakpad_mini() 增加tools.signal_handler.signal,开启后将接管SIGUSR1 和SIGUSR2信号,预留给实现优雅退出 更新CI流程,增加从debuginfo中导出elf文件,上传至sentry 指定breakpad INSTALL_DIR 1、调整breakpad编译选项,增加头文件目录包含INSTALL_DIR下的breadpad目录 2、撤销对INSTALL_DIR设置至/usr/local/的操作,避免编译时需要提权 Bugfix:编译breakpad_mini时lib_name写错成.so 移除cmake中对/usr/local/include/breakpad的显示引用 1、移除sapp原有的dump_backtrace函数(已废弃) 2、更新breakpad默认参数,默认打开coredump,关闭breakpad Breakpad_mini update:上传时-p参数值使用basename函数从/proc/self/exe获取,默认为进程名 移除breakpad_mini中的install,避免影响sapp打包 platform_init结束后,调用sapp_init_breakpad_mini() 增加tools.signal_handler.signal,开启后将接管SIGUSR1 和SIGUSR2信号,预留给实现优雅退出 更新CI流程,增加从debuginfo中导出elf文件,上传至sentry 指定breakpad INSTALL_DIR Bugfix:编译breakpad_mini时lib_name写错成.so 移除cmake中对/usr/local/include/breakpad的显示引用 ci更新,默认编译CAPTURE_MODE =MARSIO的sapp 更新ci/travis.sh,指定CAPTURE_MODE 编译 修复笔误 更新ci/travis.sh,增加安装mrzcpd依赖rpm包 调整sapp_init_breakpad_mini初始化位置,提至MESA_platform_init之前 更新sapp.toml,增加breakpad配置模板 更新ci文件,默认编译PLATFORM_MODE=INLINE --- .gitlab-ci.yml | 13 +- bin/etc/sapp.toml | 7 + ci/travis.sh | 7 + include/private/sapp_declaration.h | 2 + include/private/sapp_global_val.h | 6 + src/config/CMakeLists.txt | 1 + src/config/cmd_args.c | 12 +- src/config/config_parse.cpp | 35 +- src/entry/CMakeLists.txt | 3 +- src/entry/sapp_main.c | 44 +- src/support/CMakeLists.txt | 1 + src/support/breakpad_mini/CMakeLists.txt | 46 + src/support/breakpad_mini/autorelease.sh | 33 + src/support/breakpad_mini/autorevision.sh | 1268 ++++++++++++++++++++ src/support/breakpad_mini/cmake/Package.cmake | 55 + src/support/breakpad_mini/cmake/PreInstall.sh | 15 + src/support/breakpad_mini/cmake/PreUninstall.sh | 12 + src/support/breakpad_mini/cmake/Version.cmake | 53 + src/support/breakpad_mini/cmake/changelog.sh | 4 + src/support/breakpad_mini/cmake/changelog.txt | 1083 +++++++++++++++++ src/support/breakpad_mini/demo/CMakeLists.txt | 7 + src/support/breakpad_mini/demo/breakpad.ini | 6 + src/support/breakpad_mini/demo/demo.cpp | 11 + src/support/breakpad_mini/inc/breakpad.h | 6 + src/support/breakpad_mini/src/CMakeLists.txt | 24 + src/support/breakpad_mini/src/breakpad.cpp | 246 ++++ src/support/breakpad_mini/vendor/CMakeLists.txt | 26 + .../vendor/breakpad-master-abfe08e.tar.gz | Bin 0 -> 13028225 bytes 28 files changed, 2984 insertions(+), 42 deletions(-) create mode 100644 src/support/breakpad_mini/CMakeLists.txt create mode 100644 src/support/breakpad_mini/autorelease.sh create mode 100644 src/support/breakpad_mini/autorevision.sh create mode 100644 src/support/breakpad_mini/cmake/Package.cmake create mode 100644 src/support/breakpad_mini/cmake/PreInstall.sh create mode 100644 src/support/breakpad_mini/cmake/PreUninstall.sh create mode 100644 src/support/breakpad_mini/cmake/Version.cmake create mode 100644 src/support/breakpad_mini/cmake/changelog.sh create mode 100644 src/support/breakpad_mini/cmake/changelog.txt create mode 100644 src/support/breakpad_mini/demo/CMakeLists.txt create mode 100644 src/support/breakpad_mini/demo/breakpad.ini create mode 100644 src/support/breakpad_mini/demo/demo.cpp create mode 100644 src/support/breakpad_mini/inc/breakpad.h create mode 100644 src/support/breakpad_mini/src/CMakeLists.txt create mode 100644 src/support/breakpad_mini/src/breakpad.cpp create mode 100644 src/support/breakpad_mini/vendor/CMakeLists.txt create mode 100644 src/support/breakpad_mini/vendor/breakpad-master-abfe08e.tar.gz diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 61db797..f7dd392 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,6 +25,8 @@ branch_build_debug: extends: .build_by_travis variables: BUILD_TYPE: Debug + CAPTURE_MODE: MARSIO + PLATFORM_MODE: INLINE except: - /^develop.*$/i - /^master.*$/i @@ -34,6 +36,8 @@ branch_build_release: stage: build variables: BUILD_TYPE: RelWithDebInfo + CAPTURE_MODE: MARSIO + PLATFORM_MODE: INLINE extends: .build_by_travis except: - /^develop.*$/i @@ -45,6 +49,8 @@ develop_build_debug: extends: .build_by_travis variables: BUILD_TYPE: Debug + CAPTURE_MODE: MARSIO + PLATFORM_MODE: INLINE PACKAGE: 1 artifacts: name: "sapp-$CI_COMMIT_REF_NAME-debug" @@ -59,6 +65,8 @@ develop_build_release: extends: .build_by_travis variables: BUILD_TYPE: RelWithDebInfo + CAPTURE_MODE: MARSIO + PLATFORM_MODE: INLINE PACKAGE: 1 artifacts: name: "sapp-$CI_COMMIT_REF_NAME-release" @@ -73,8 +81,11 @@ release_build_release: stage: build variables: BUILD_TYPE: RelWithDebInfo + CAPTURE_MODE: MARSIO + PLATFORM_MODE: INLINE PACKAGE: 1 UPLOAD: 1 + SYMBOL_TARGET: sapp PULP3_REPO_NAME: platform-stable-x86_64.el7 PULP3_DIST_NAME: platform-stable-x86_64.el7 extends: .build_by_travis @@ -83,4 +94,4 @@ release_build_release: paths: - build/*.rpm only: - - tags \ No newline at end of file + - tags diff --git a/bin/etc/sapp.toml b/bin/etc/sapp.toml index 62620cf..c676eb2 100644 --- a/bin/etc/sapp.toml +++ b/bin/etc/sapp.toml @@ -147,3 +147,10 @@ dictator_enable=1 entrylist_path="./etc/entrylist.conf" send_raw_pkt_path="./etc/send_raw_pkt.conf" vxlan_sport_service_map_path="./etc/vxlan_sport_service_map.conf" + +[breakpad] + disable_coredump=0 + enable_breakpad=0 + breakpad_minidump_dir="/tmp/crashreport" + enable_breakpad_upload=0 + breakpad_upload_url="http://127.0.0.1/" diff --git a/ci/travis.sh b/ci/travis.sh index c9d2f27..1880ed3 100644 --- a/ci/travis.sh +++ b/ci/travis.sh @@ -33,6 +33,7 @@ env | sort : "${COMPILER_IS_GNUCXX:=OFF}" # Install dependency from YUM +yum install -y mrzcpd numactl-devel zlib-devel librdkafka-devel systemd-devel yum install libMESA_htable-devel libMESA_prof_load-devel libcjson-devel libMESA_field_stat2-devel framework_env libwiredcfg-devel libWiredLB-devel libMESA_handle_logger-devel -y source /etc/profile.d/framework.sh @@ -40,6 +41,8 @@ mkdir build || true cd build cmake3 -DCMAKE_CXX_FLAGS=$CXX_FLAGS \ + -DCAPTURE_MODE=$CAPTURE_MODE \ + -DPLATFORM_MODE=$PLATFORM_MODE \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ -DENABLE_DEVEL=$ENABLE_DEVEL_SWITCH \ @@ -54,6 +57,10 @@ fi if [ -n "${UPLOAD}" ]; then cp ~/rpm_upload_tools.py ./ python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm + rpm -i $SYMBOL_TARGET*debuginfo*.rpm + _symbol_file=`find /usr/lib/debug/ -name "$SYMBOL_TARGET.debug"` + cp $_symbol_file ${_symbol_file}info.${CI_COMMIT_SHORT_SHA} + sentry-cli upload-dif -t elf ${_symbol_file}info.${CI_COMMIT_SHORT_SHA} fi #if [ -n "${UPLOAD_SYMBOL_FILES}" ]; then diff --git a/include/private/sapp_declaration.h b/include/private/sapp_declaration.h index a53f1fe..d03043e 100644 --- a/include/private/sapp_declaration.h +++ b/include/private/sapp_declaration.h @@ -67,6 +67,8 @@ extern void sapp_log(int level, int print_sw, int file_sw, const char *format, . int sapp_parse_cmd_args(int argc, char *argv[]); int sapp_parse_config(void); +void sapp_init_breakpad_mini(void); +void sapp_segv_generate(void); void sapp_generate_sample_config(void); void sapp_cla_override_cfg_file(void); void sapp_global_val_sanity_check(void); diff --git a/include/private/sapp_global_val.h b/include/private/sapp_global_val.h index d4e8f16..afc3685 100644 --- a/include/private/sapp_global_val.h +++ b/include/private/sapp_global_val.h @@ -38,8 +38,13 @@ typedef struct{ int pkt_dump_ratio; /* capture one packet every 'pkt_dump_ratio' packets */ }sapp_config_tools_pktdump_t; +typedef struct{ + int signal; +}sapp_config_tools_signal_handler_t; + typedef struct{ sapp_config_tools_pktdump_t pkt_dump; + sapp_config_tools_signal_handler_t signal_handler; }sapp_config_tools_t; @@ -219,6 +224,7 @@ typedef struct{ int packet_io_cap_level; sapp_gval_individual_fixed_fs_t field_stat2_para; pthread_t pkt_process_tid[SAPP_MAX_THREADS]; + void *breakpad; }sapp_gval_individual_fixed_t; typedef struct{ diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt index 87b83f9..80f5774 100644 --- a/src/config/CMakeLists.txt +++ b/src/config/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories(${CMAKE_SOURCE_DIR}/include/public) include_directories(${CMAKE_SOURCE_DIR}/include/support) include_directories(${MESA_SDK_PREFIX}/include) include_directories(${MESA_SDK_PREFIX}/include/MESA) +include_directories(${CMAKE_SOURCE_DIR}/src/support/breakpad_mini/inc/) if(CAPTURE_MODE MATCHES "MARSIO") diff --git a/src/config/cmd_args.c b/src/config/cmd_args.c index bb5a779..1b54ce9 100644 --- a/src/config/cmd_args.c +++ b/src/config/cmd_args.c @@ -30,6 +30,7 @@ static const sapp_cmd_args_usage_t cmd_args_usage[] = { {"-h", "help", NULL, "show help message"}, {"-v", "version", NULL, "show platform version"}, + {"-g", "coredump", NULL, "generate coredump for test"}, {"-c", "sample-config", NULL, "generate sample config file->sapp.toml"}, {"-d", "dumpfile", NULL, "running as pcap dumpfile mode"}, {"-r", "dumpfile-file", NULL, "read packets from which pcap file"}, @@ -38,7 +39,7 @@ static const sapp_cmd_args_usage_t cmd_args_usage[] = }; /* ֻ̬ȫֱԷκδ, sapp_global_val */ -static const char *sapp_cla_short_options = "cdhr:v"; +static const char *sapp_cla_short_options = "cdhr:vg"; /* ֻ̬ȫֱԷκδ, sapp_global_val */ static const struct option sapp_cla_long_options[] = @@ -49,6 +50,7 @@ static const struct option sapp_cla_long_options[] = {"dumpfile-file", required_argument, NULL, 'r'}, {"dumpfile-speed", required_argument, NULL, 0}, {"sample-config", no_argument, NULL, 'c'}, + {"coredump", no_argument, NULL, 'g'}, {NULL, 0, NULL, 0} }; @@ -239,7 +241,13 @@ int sapp_parse_cmd_args(int argc, char *argv[]) case 'd': store_cmd_args("dumpfile", NULL); continue; - break; + break; + + case 'g': + sapp_init_breakpad_mini(); + sapp_segv_generate(); + continue; + break; case 'r': store_cmd_args("dumpfile-file", optarg); diff --git a/src/config/config_parse.cpp b/src/config/config_parse.cpp index e5459f4..585691c 100644 --- a/src/config/config_parse.cpp +++ b/src/config/config_parse.cpp @@ -1,3 +1,5 @@ +#include "breakpad.h" + #ifdef __cplusplus extern "C" { #endif @@ -7,7 +9,6 @@ extern "C" { #include "support/tomlc99_wrap.h" #include "field_stat2.h" - /* ֻ̬ȫֱԷڴ, sapp_global_val */ static const char *default_config_file = "./etc/sapp.toml"; @@ -221,8 +222,13 @@ void sapp_cla_override_cfg_file(void) { char *cmd_args; sapp_config_t *pconfig = &sapp_global_val->config; + + if (sapp_get_cla_raw("coredump", &cmd_args) >= 0){ + breakpad_segv_generate(); + } - if(sapp_get_cla_raw("dumpfile", &cmd_args) >= 0){ /* dumpfileģʽԶinterface */ + if (sapp_get_cla_raw("dumpfile", &cmd_args) >= 0) + { /* dumpfileģʽԶinterface */ strcpy(pconfig->packet_io.depolyment_mode_str, "dumpfile"); pconfig->packet_io.depolyment_mode_bin = DEPOLYMENT_MODE_MIRROR; sapp_global_val->individual_fixed.depolyment_mode_private = NET_CONN_PARALLEL; @@ -230,13 +236,13 @@ void sapp_cla_override_cfg_file(void) pconfig->packet_io.internal.interface.type_bin = CAP_MODEL_PCAP_DUMPFILE; } - if(sapp_get_cla_raw("dumpfile-file", &cmd_args) >= 0){ + if (sapp_get_cla_raw("dumpfile-file", &cmd_args) >= 0) + { strncpy(sapp_global_val->config.packet_io.pcap_dumpfile_name, cmd_args, NAME_MAX); } - - return; -} + return; + } void sapp_generate_sample_config(void) { @@ -701,6 +707,8 @@ int sapp_parse_config(void) tomlc99_wrap_load_int_def(default_config_file, (char *)"PROTOCOL_FEATURE", (char *)"treat_vlan_as_mac_in_mac", (int *)&pconfig->protocol_feature.treat_vlan_as_mac_in_mac_enabled, 0); /******************************* TOOLS **********************************/ + tomlc99_wrap_load_int_def(default_config_file, (char *)"tools.signal_handler", (char *)"signal", (int *)&pconfig->tools.signal_handler.signal, 0); + tomlc99_wrap_load_int_def(default_config_file, (char *)"tools.pkt_dump", (char *)"enabled", (int *)&pconfig->tools.pkt_dump.enabled, 0); tomlc99_wrap_load_string_def(default_config_file, (char *)"tools.pkt_dump", (char *)"mode", pconfig->tools.pkt_dump.mode_str, NAME_MAX, "udp_socket"); tomlc99_wrap_load_string_def(default_config_file, (char *)"tools.pkt_dump", (char *)"BSD_packet_filter", str_tmp, ARG_MAX, ""); @@ -758,6 +766,21 @@ int sapp_parse_config(void) return 0; } +/* init breakpad_mini */ +void sapp_init_breakpad_mini(void) + +{ + struct breakpad_instance * g_breakpad = breakpad_init(default_config_file, "breakpad", sapp_global_val->individual_fixed.log_handle); + if(g_breakpad == NULL){exit(-1);} + sapp_global_val->individual_fixed.breakpad = g_breakpad; + return; +} + +void sapp_segv_generate() +{ + breakpad_segv_generate(); +} + #ifdef __cplusplus } #endif diff --git a/src/entry/CMakeLists.txt b/src/entry/CMakeLists.txt index 0ac3e5a..d8afdb2 100644 --- a/src/entry/CMakeLists.txt +++ b/src/entry/CMakeLists.txt @@ -8,6 +8,7 @@ include_directories(${MESA_SDK_PREFIX}/include) include_directories(${MESA_SDK_PREFIX}/include/MESA) + LINK_DIRECTORIES(/opt/MESA/lib) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/lib) @@ -27,7 +28,7 @@ target_link_libraries(sapp sapp_assistant gdev_assistant) #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin) -set(SAPP_MODULES iknow timestamp_record md5 symbol_check MESA_sleep MESA_socket_wrap packet_io dealpkt project plugctrl common config timer tomlc99_wrap libevent-static) +set(SAPP_MODULES breakpad_mini_static breakpad-client-static iknow timestamp_record md5 symbol_check MESA_sleep MESA_socket_wrap packet_io dealpkt project plugctrl common config timer tomlc99_wrap libevent-static) target_link_libraries(sapp -Wl,--whole-archive ${SAPP_MODULES} -Wl,--no-whole-archive ${SAPP_DEPEND_DYN_LIB}) diff --git a/src/entry/sapp_main.c b/src/entry/sapp_main.c index c23f9cd..72ba7a8 100644 --- a/src/entry/sapp_main.c +++ b/src/entry/sapp_main.c @@ -25,47 +25,25 @@ extern int sapp_args_v; int dpdk_init(int argc, char **argv); -static void dump_backtrace(int max_depth, const char *path) { - /* - NOTE: - ˴һҪʹջڴ, mallocܻ, - жϴе̳ܺ߳ͻ, !!!! - */ - static char stack_trace[65536]; - - int stack_depth = backtrace((void **)stack_trace, max_depth); - int fp = open(path, O_APPEND|O_RDWR|O_CREAT, 0444); - if(fp < 0)return; - time_t t = time(NULL); - char time_str[64]; - ctime_r(&t, time_str); - const char *spilt_str = "---------------------------------------------------"; - write(fp, spilt_str, strlen(spilt_str)); - write(fp, time_str, strlen(time_str)); - backtrace_symbols_fd((void **)stack_trace, stack_depth, fp); - close(fp); - return; -} - static void signal_handler(int signo) { - time_t last_time = time(NULL); - - while(time(NULL) < last_time + 10); /* wait 10 second, for DPDK IO module detect this process is not running */ + //time_t last_time = time(NULL); + //while(time(NULL) < last_time + 10); /* wait 10 second, for DPDK IO module detect this process is not running */ signal(signo, SIG_DFL); - //dump_backtrace(128, "./sapp_bt.log"); kill(getpid(), signo); } static void signal_take_over(void) { - if(0 == sapp_global_single.signal_take_over_sw){ + sapp_config_t *pconfig = &sapp_global_val->config; + if (0 == sapp_global_single.signal_take_over_sw && 0 == pconfig->tools.signal_handler.signal) + { return; } - - signal(SIGABRT, signal_handler); - signal(SIGSEGV, signal_handler); - signal(SIGBUS, signal_handler); + + signal(SIGUSR1, signal_handler); + signal(SIGUSR2, signal_handler); + //signal(pconfig->tools.signal_handler.signal, signal_handler); } @@ -116,11 +94,13 @@ int main(int argc, char *argv[]) sleep(1); #endif + sapp_init_breakpad_mini(); + signal_take_over(); + if(MESA_platform_init(argc, argv) < 0){ exit(1); } - signal_take_over(); MESA_platform_run(); diff --git a/src/support/CMakeLists.txt b/src/support/CMakeLists.txt index 6a78029..3223475 100644 --- a/src/support/CMakeLists.txt +++ b/src/support/CMakeLists.txt @@ -8,6 +8,7 @@ add_subdirectory(md5) add_subdirectory(MESA_socket_wrap/src) add_subdirectory(dictator2/src) add_subdirectory(tomlc99_wrap) +add_subdirectory(breakpad_mini) #if(OPT_USE_DICTATOR) diff --git a/src/support/breakpad_mini/CMakeLists.txt b/src/support/breakpad_mini/CMakeLists.txt new file mode 100644 index 0000000..46c1b55 --- /dev/null +++ b/src/support/breakpad_mini/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required (VERSION 2.8) + +set(lib_name breakpad_mini) + +project (${lib_name}) + +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +include(Version) + +set(CMAKE_MACOSX_RPATH 0) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_C_STANDARD 11) + +option(ENABLE_SANITIZE_ADDRESS "Enable AddressSanitizer" FALSE) +option(ENABLE_SANITIZE_THREAD "Enable ThreadSanitizer" FALSE) + +if(ENABLE_SANITIZE_ADDRESS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") +elseif(ENABLE_SANITIZE_THREAD) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") +endif() + +include_directories(${PROJECT_SOURCE_DIR}/inc/) +include_directories(/opt/MESA/include/) +include_directories(/opt/MESA/include/MESA) + + +add_subdirectory(vendor) +add_subdirectory(src) +add_subdirectory(demo) + +set(DEPEND_DYN_LIB MESA_handle_logger MESA_prof_load) + +set(CMAKE_INSTALL_PREFIX /opt/MESA/) + +#install(TARGETS ${plugin_name} LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib COMPONENT LIBRARY) +#install(FILES inc/${plugin_name}.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MESA/ COMPONENT PROFILE) + +include(Package) diff --git a/src/support/breakpad_mini/autorelease.sh b/src/support/breakpad_mini/autorelease.sh new file mode 100644 index 0000000..fc69d66 --- /dev/null +++ b/src/support/breakpad_mini/autorelease.sh @@ -0,0 +1,33 @@ +#!/bin/sh +if [ $# -lt 6 ] ; then + echo "USAGE: ./autorelease.sh [API_V4_URL] [PROJECT_URL] + [PROJECT_ID] [TOKEN] + [COMMIT_TAG] [JOB] [PROJECT_NAME] [COMMIT_REF_PROTECTED] [COMMIT_SHORT_SHA]" +exit 1; +fi + +CI_API_V4_URL=$1 +CI_PROJECT_URL=$2 +CI_PROJECT_ID=$3 +CI_TOKEN=$4 +CI_COMMIT_TAG=$5 +ARTIFACTS_JOB=$6 +CI_PROJECT_NAME=$7 +CI_COMMIT_SHORT_SHA=$8 + +res=`echo -e "curl --header \"PRIVATE-TOKEN: $CI_TOKEN\" $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/$CI_COMMIT_TAG -o /dev/null -s -w %{http_code}"| /bin/bash` + +if [[ $res == "200" ]]; then + eval $(echo -e "curl --request POST --header \"PRIVATE-TOKEN: $CI_TOKEN\" \ + --data name=\"$CI_PROJECT_NAME-$CI_COMMIT_TAG-$CI_COMMIT_SHORT_SHA-artifacts.zip\" \ + --data url=\"$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=$ARTIFACTS_JOB\"\ + $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/$CI_COMMIT_TAG/assets/links") +else + eval $(echo -e "curl --header 'Content-Type: application/json' --header \ + \"PRIVATE-TOKEN: $CI_TOKEN\" --data '{ \"name\": \"$CI_COMMIT_TAG\", \ + \"tag_name\": \"$CI_COMMIT_TAG\", \"description\": \"auto_release\",\ + \"assets\": { \"links\": [{ \"name\": \ + \"$CI_PROJECT_NAME-$CI_COMMIT_TAG-$CI_COMMIT_SHORT_SHA-artifacts.zip\", \"url\": \ + \"$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=$ARTIFACTS_JOB\"\ + }] } }' --request POST $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/") +fi diff --git a/src/support/breakpad_mini/autorevision.sh b/src/support/breakpad_mini/autorevision.sh new file mode 100644 index 0000000..3baa179 --- /dev/null +++ b/src/support/breakpad_mini/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/src/support/breakpad_mini/cmake/Package.cmake b/src/support/breakpad_mini/cmake/Package.cmake new file mode 100644 index 0000000..8691311 --- /dev/null +++ b/src/support/breakpad_mini/cmake/Package.cmake @@ -0,0 +1,55 @@ +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(MY_RPM_NAME_PREFIX "${lib_name}-debug") +else() + set(MY_RPM_NAME_PREFIX "${lib_name}") +endif() + +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) + +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_PACKAGE_VENDOR "MESA") +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_RPM_HEADER_PACKAGE_CONFLICTS ${CPACK_RPM_HEADER_PACKAGE_NAME}) + +set(CPACK_COMPONENTS_ALL LIBRARY PROFILE) + +SET(CPACK_RPM_LIBRARY_PRE_INSTALL_SCRIPT_FILE "${PROJECT_SOURCE_DIR}/cmake/PreInstall.sh") +SET(CPACK_RPM_LIBRARY_PRE_UNINSTALL_SCRIPT_FILE "${PROJECT_SOURCE_DIR}/cmake/PreUninstall.sh") + +set(CPACK_BUILD_SOURCE_DIRS "${CMAKE_SOURCE_DIR}") + +# Must uninstall the debug package before install release package +set(CPACK_RPM_PACKAGE_CONFLICTS ${MY_RPM_NAME_PREFIX}) + +# set(CPACK_STRIP_FILES TRUE) +include(CPack) + diff --git a/src/support/breakpad_mini/cmake/PreInstall.sh b/src/support/breakpad_mini/cmake/PreInstall.sh new file mode 100644 index 0000000..0211cbd --- /dev/null +++ b/src/support/breakpad_mini/cmake/PreInstall.sh @@ -0,0 +1,15 @@ +#!/bin/sh +DST=${RPM_INSTALL_PREFIX} +mkdir -p ${DST}/plug/business/ +touch ${DST}/plug/conflist.inf +mkdir -p ${DST}/tsgconf/ +touch ${DST}/tsgconf/main.conf + +if [[ -z `grep -rn '\[business\]' ${DST}/plug/conflist.inf` ]];then + echo '[business\]' >> ${DST}/plug/conflist.inf +fi + +if [[ -z `grep -rn 'tsg_conn_sketch' ${DST}/plug/conflist.inf` ]];then + sed -i '/\[business\]/a\./plug/business/tsg_conn_sketch/tsg_conn_sketch.inf' ${DST}/plug/conflist.inf +fi + diff --git a/src/support/breakpad_mini/cmake/PreUninstall.sh b/src/support/breakpad_mini/cmake/PreUninstall.sh new file mode 100644 index 0000000..e00208b --- /dev/null +++ b/src/support/breakpad_mini/cmake/PreUninstall.sh @@ -0,0 +1,12 @@ +#!/bin/sh +if [ $1 == 0 ]; then + DST=${RPM_INSTALL_PREFIX} + + mkdir -p ${DST}/plug/business/ + touch ${DST}/plug/conflist.inf + mkdir -p ${DST}/tsgconf/ + touch ${DST}/tsgconf/main.conf + + sed -i '/tsg_conn_sketch/d' ${DST}/plug/conflist.inf +fi + diff --git a/src/support/breakpad_mini/cmake/Version.cmake b/src/support/breakpad_mini/cmake/Version.cmake new file mode 100644 index 0000000..752f20f --- /dev/null +++ b/src/support/breakpad_mini/cmake/Version.cmake @@ -0,0 +1,53 @@ + +# Using autorevision.sh to generate version information + +set(__SOURCE_AUTORESIVISION ${CMAKE_SOURCE_DIR}/autorevision.sh) +set(__AUTORESIVISION ${CMAKE_BINARY_DIR}/autorevision.sh) +set(__VERSION_CACHE ${CMAKE_SOURCE_DIR}/version.txt) +set(__VERSION_CONFIG ${CMAKE_BINARY_DIR}/version.cmake) + +file(COPY ${__SOURCE_AUTORESIVISION} DESTINATION ${CMAKE_BINARY_DIR} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + +# execute autorevision.sh to generate version information +execute_process(COMMAND ${__AUTORESIVISION} -t cmake -o ${__VERSION_CACHE} + OUTPUT_FILE ${__VERSION_CONFIG} ERROR_QUIET) +include(${__VERSION_CONFIG}) + +# extract major, minor, patch version from git tag +string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VCS_TAG}") +string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VCS_TAG}") +string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VCS_TAG}") + +if(NOT VERSION_MAJOR) + set(VERSION_MAJOR 1) +endif() + +if(NOT VERSION_MINOR) + set(VERSION_MINOR 0) +endif() + +if(NOT VERSION_PATCH) + set(VERSION_PATCH 0) +endif() + +set(VERSION "${VERSION_MAJOR}_${VERSION_MINOR}_${VERSION_PATCH}") +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}) + +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/src/support/breakpad_mini/cmake/changelog.sh b/src/support/breakpad_mini/cmake/changelog.sh new file mode 100644 index 0000000..7d8bf7f --- /dev/null +++ b/src/support/breakpad_mini/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/support/breakpad_mini/cmake/changelog.txt b/src/support/breakpad_mini/cmake/changelog.txt new file mode 100644 index 0000000..66a1de3 --- /dev/null +++ b/src/support/breakpad_mini/cmake/changelog.txt @@ -0,0 +1,1083 @@ +* Mon Jul 27 2020 lijia lijia01@iie.ac.cn + - hash: 292fdb61654b6e2e30b26ec6ed7999d890c06d62 + - commit: + - 修复关闭polling功能时, CPU占用率100%问题. + +* Wed Jul 1 2020 lijia lijia01@iie.ac.cn + - hash: d22950558954272a566c739a1c98da6772caddd6 + - commit: + - 无核心功能升级与修改, 修复rpm包安装会覆盖已有user file的BUG, 修复sapp -v无法显示版本信息的BUG. + +* Wed Jun 24 2020 liuxueli liuxueli@iie.ac.cn + - hash: 49ef917028f9b2518ce9c06050a320c59db07e3b + - commit: + - 修复update rpm时配置文件被覆盖的问题 + +* Fri Jun 19 2020 lijia lijia01@iie.ac.cn + - hash: df7b27baf8a84e51815cfe941d79ecfca1491cc4 + - commit: + - 增加debuginfo, devel RPM包后, user configfile noreplace功能失效, 导致升级sapp会覆盖运行环境的配置文件, 暂时关闭debuginfo,devel打包功能. + +* Fri Jun 19 2020 lijia lijia01@iie.ac.cn + - hash: 334092cf827c42892fc873e0b03f63bb074436b3 + - commit: + - 按虚链路ID发包功能, 改为使用接口marsio_buff_set_rehash_index()设置rehash, 而不是设置ctrlzone的变量. + +* Fri Jun 5 2020 lijia lijia01@iie.ac.cn + - hash: e30e056c54f59b1bfaf600ff76165d7d7680d4e0 + - commit: + - 按虚链路ID发包功能, 改为使用接口marsio_buff_set_rehash_index()设置rehash, 而不是设置ctrlzone的变量; + +* Wed Jun 3 2020 lijia lijia01@iie.ac.cn + - hash: 91cbc1bcfca41c99043ce73de4aa2add81dfcb26 + - commit: + - 修复INSECTICIDE DEBUG模式下, free内存错误. + +* Tue Jun 2 2020 lijia lijia01@iie.ac.cn + - hash: 382f6f5569834c3d1115722c160e126afd071841 + - commit: + - 1.修复DROP UDP流BUG; + - 2.增加MESA_dir_human_to_link(), 用于将逻辑发包方向转换成物理route_dir; + - 3.增加独立发包线程CPU绑定功能, 用于marsio模式下的高性能发包. + +* Wed May 27 2020 杨威 yangwei@iie.ac.cn + - hash: 8909c32e3697411a32778fc8384ca082de4b94e4 + - commit: + - g_device_plug更新,按RFC5880,收到DOWN消息时,回复INIT消息,并设置mydiscriminator为自身保活IP + +* Fri May 8 2020 lijia lijia01@iie.ac.cn + - hash: f8435d81830d2aead9736f96a84b4586b7cef2df + - commit: + - 1.修复插件同时返回KILL_OTHER和DROPME, pme没有清空的BUG; + - 2.修复marsio模式下, 调用VXLAN相关选项没报错的BUG. + +* Tue Apr 28 2020 lijia lijia01@iie.ac.cn + - hash: 916572de28235e5abc53bbd7fbe44b781182ff4f + - commit: + - 禁用rpm安装时对各种依赖库的检查, 避免: "error: Failed dependencies" 错误. + +* Mon Apr 27 2020 lijia lijia01@iie.ac.cn + - hash: f4d006b3971cb7d680367e1b70ae0489e7e4e499 + - commit: + - 恢复%config(noreplace), 避免配置文件被覆盖. + +* Fri Apr 24 2020 lijia lijia01@iie.ac.cn + - hash: 347f7b7a2c547908c6d1b7a7c6abb32738ee1abf + - commit: + - 修改deal_tcp.c:2118, 如果ret=stream_process_tcp返回值是DROP, tcp_deal_unorder()返回值是PASS, 当前包就是PASS, 结果就CT了 + +* Sun Apr 19 2020 lijia lijia01@iie.ac.cn + - hash: 991aadc7b3f71bc785bf6a809a9718f71b7f3283 + - commit: + - 修复插件挂载失败后, 没有调用plugin_call_flagstate()函数BUG, 导致所有插件注册的flag没生效. + +* Wed Apr 15 2020 liuxueli liuxueli@iie.ac.cn + - hash: bd5ad8405c491da47fc45af0fef3720b45714aba + - commit: + - 修复头文件安装路径笔误 + +* Wed Apr 15 2020 liuxueli liuxueli@iie.ac.cn + - hash: 77636fd4b9f30342202d15e7bf10243fbd23a92f + - commit: + - 安装sapp依赖库 + +* Tue Apr 14 2020 liuxueli liuxueli@iie.ac.cn + - hash: 15c65609d02662d9a728f450d5decfbeedfaf24f + - commit: + - 调整修改环境变量的位置 + +* Mon Apr 13 2020 liuxueli liuxueli@iie.ac.cn + - hash: 023dbf9cf372f83badc5b70c021f432abc64cddd + - commit: + - source /etc/profile.d/framework.sh;修改环境变量 + +* Mon Apr 13 2020 liuxueli liuxueli@iie.ac.cn + - hash: c528418d596b05895c2407c04bf9519730545150 + - commit: + - 安装framework -env.rpm; + +* Mon Apr 13 2020 liuxueli liuxueli@iie.ac.cn + - hash: add249b530b8bc447749f5775fa5027a2b21d251 + - commit: + - 安装依赖的公共库;修改默认安装路径 + +* Fri Apr 10 2020 liuxueli liuxueli@iie.ac.cn + - hash: 3c53e30eb92d4716c439c08c862d83eca4938968 + - commit: + - 修正默认安装目录 + +* Fri Apr 10 2020 liuxueli liuxueli@iie.ac.cn + - hash: 1ecfc564d8388fdd0cc1c6ec85f03423c90710c1 + - commit: + - 支持上传rpm到yum源 + +* Wed Mar 25 2020 lijia lijia01@iie.ac.cn + - hash: c43dbc185d7ef13b98fabc4c368fb33edafc3bb5 + - commit: + - 支持pcap模式下, 指定捕包方向[in, out, inout]; + - 支持ethernet跳过非ip层的协议,便于使用系统路由测试注入数据包功能. + +* Wed Mar 18 2020 lijia lijia01@iie.ac.cn + - hash: 2e6da7600c366f3ff36d4d4db3cabcd245b5c3ec + - commit: + - 1.packet_io_tun模式增加static NAT, 修改ip使kni, tfe收到的数据包与外部原始包不同,避免协议栈冲突; + - 2.更新tun_transparent初始化脚本; + - 3.修复packet_io_tun模式的tcpdump_mesa捕包流程. + +* Mon Mar 9 2020 lijia lijia01@iie.ac.cn + - hash: 1d23241d7bb60cb443a521c2ed5281190d3f096e + - commit: + - 更新tun串联模式启动脚本, 自动判断当前登录用户IP, 添加路由. + +* Thu Feb 27 2020 lijia lijia01@iie.ac.cn + - hash: cd127251503a63af25edf70d673b92103f66133e + - commit: + - 增加tun透明串联模式启动环境脚本. + +* Fri Feb 21 2020 lijia lijia01@iie.ac.cn + - hash: d4d89b42c3210eb98c1d016544114bc8c9b33188 + - commit: + - 增加基于tun虚设备的双卡串联模式, 用于在虚拟机单网卡环境下, 使用sapp串联模式. + +* Fri Jan 17 2020 lijia lijia01@iie.ac.cn + - hash: 7010e12cdb69f399c94b30d4e46b4b61ee1956bc + - commit: + - 修复service/CMAKElist.txt + +* Fri Jan 17 2020 lijia lijia01@iie.ac.cn + - hash: c34b4f0b8614f4d411bc57a4c73d7912b0f0d946 + - commit: + - 同步修复读包模式下, 插件destroy问题 + +* Fri Jan 17 2020 lijia lijia01@iie.ac.cn + - hash: 403d998ca3798ab437f880602b30d76c2ea02505 + - commit: + - merge from develop + +* Fri Jan 17 2020 lijia lijia01@iie.ac.cn + - hash: 3aa7a71814709801390ac1b2e6e71bcff5fce1f4 + - commit: + - 修复dumpfile读包模式下, 插件没有destroy函数会崩溃的bug. + +* Mon Jan 13 2020 lijia lijia01@iie.ac.cn + - hash: 033c0f1215363f735a1c28a23ab4a3ae8704fbff + - commit: + - delete version.txt. + +* Fri Jan 10 2020 lijia lijia01@iie.ac.cn + - hash: 381fadccd542a6c02eb42f8245975975b8183c23 + - commit: + - 修改CMakeList.txt, 解决RPM安装冲突问题. + +* Thu Jan 9 2020 lijia lijia01@iie.ac.cn + - hash: 6f793d36e120114bebc50d6aaeb3c235380bcd17 + - commit: + - rpm安装时自动注册系统服务. + +* Wed Jan 8 2020 lijia lijia01@iie.ac.cn + - hash: 864487444ee5dcf526d324c0befa0d1cf041df40 + - commit: + - arp entry只处理应答及ip类型. + +* Tue Jan 7 2020 李佳 lijia01@iie.ac.cn + - hash: fb5bce945c2218ebaef25946f7d7db1b025fa990 + - commit: + - Feature inbound outbound + +* Mon Jan 6 2020 lijia lijia01@iie.ac.cn + - hash: 2ae16e36bb4cf69dcefb45efb19779e310f9d6d2 + - commit: + - 修改包数、字节数变量名混淆手误. + +* Mon Jan 6 2020 lijia lijia01@iie.ac.cn + - hash: 84f22a178af223377fc084c127cdc94ac925d74d + - commit: + - support plug arp layer entry. + +* Fri Jan 3 2020 lijia lijia01@iie.ac.cn + - hash: b1be93eab82732af57ab8c9bd7fea6554085985b + - commit: + - 读包模式下, 退出先调用插件destroy()函数. + +* Tue Dec 31 2019 lijia lijia01@iie.ac.cn + - hash: 06731c3bb2818b398884990af62ab05a401d1f78 + - commit: + - 实现ethernet层inbound, outbound两个方向流量统计; 实现每个stream两个方向统计. + +* Thu Dec 26 2019 lijia lijia01@iie.ac.cn + - hash: 98228e4e577f0df244beb0e2702776fa39877670 + - commit: + - 增加串联模式下,inbound,outbound两个方向的统计计数. + +* Thu Dec 19 2019 lijia lijia01@iie.ac.cn + - hash: 86c5a186658644901d8ba049716f80ef890466a4 + - commit: + - 无功能性更新, 删除一些运行时printf刷屏告警, 改为写runtime_log. + +* Wed Dec 18 2019 lijia lijia01@iie.ac.cn + - hash: 422766471efa716d82f8d50f6041bb5944cd1d1a + - commit: + - 配置文件增加PROTOCOL_FEATURE, 用于指定某些协议解析细节选项; + - 增加sapp_platform_opt选项, 用于支持插件获取平台内部计数. + +* Wed Dec 11 2019 杨威 yangwei@iie.ac.cn + - hash: c3d16eed7e4ea689225cae69f3288b3918987570 + - commit: + - Add Dockerfile +* Wed Dec 11 2019 杨威 yangwei@iie.ac.cn + - hash: 8f6e570bc8c63ba520be09b9f543084c5c55e9de + - commit: + - Update .gitlab -ci.yml +* Tue Dec 10 2019 李佳 lijia01@iie.ac.cn + - hash: 01e0c7407938da5a9420a208d500fc82a85f9940 + - commit: + - 修复插件管理增加kill_other BUG. 增加全局流id. + - https://git.mesalab.cn/MESA_Platform/sapp/issues/29#note_5105 + +* Tue Dec 3 2019 lijia lijia01@iie.ac.cn + - hash: 74c83231a63405edb7b571a5ff9b34c67275896b + - commit: + - 增加sapp_platform_opt - ->SPO_DEPLOYMENT_MODE_STR,用于插件获取平台网络拓扑模式. + +* Wed Nov 27 2019 lijia lijia01@iie.ac.cn + - hash: 41b7f3445ed48e8654cdc365d88d51fe2b2def3f + - commit: + - 修复CI编译错误. + - MESA_rst_tcp()增加para_len参数. + +* Tue Nov 26 2019 lijia lijia01@iie.ac.cn + - hash: 14b09f2e53946547bea751af2e3472e2d8b2029e + - commit: + - 修改MESA_rst_tcp()定义, 恢复标准C接口, 使用结构体传输相关参数; + - 增加RPM安装包noreplace定义, 避免升级时覆盖已有用户配置. + +* Fri Nov 22 2019 lijia lijia01@iie.ac.cn + - hash: 3385992b9b872c736f0b502dd3258660c46f423b + - commit: + - 增加MESA_rst_tcp(), c++接口,便于调用者传入不同参数. + +* Wed Nov 20 2019 lijia lijia01@iie.ac.cn + - hash: 2c439fac7c4497481dcab6a4637f71b874396bb9 + - commit: + - 增加stream_inject_plus.h, 增加新接口: MESA_rst_tcp(). + - MESA_rst_tcp与MESA_kill_tcp区别: + - MESA_kill_tcp实际上是几个动作的集合: 发送RST包, 类似返回了(DROPME | KILL_OTHER), 及DROP当前流后续所有包; + - MESA_rst_tcp只专心做一件事情: 发送RST包! + +* Tue Nov 19 2019 lijia lijia01@iie.ac.cn + - hash: f3f8e06d8058a1d0ac6b7b7fb00bbc325d795bce + - commit: + - 修复kill_other后内存泄漏bug; + - 增加stream_id_decode tool. + +* Mon Nov 18 2019 lijia lijia01@iie.ac.cn + - hash: 128a25d1f8ff7e5d796abc68bebed63b9c03da22 + - commit: + - 修复插件管理增加kill_other BUG. 增加全局流id. + - https://git.mesalab.cn/MESA_Platform/sapp/issues/29#note_5105 + +* Fri Nov 15 2019 lijia lijia01@iie.ac.cn + - hash: fc00dc6bb95ad422e8e06ff46430ffa594583a06 + - commit: + - 增加插件返回值, KILL_FOLLOW, KILL_OTHER + +* Fri Oct 18 2019 lijia lijia01@iie.ac.cn + - hash: b4420ccbf6ffa1afcbb65db98327053f72e08215 + - commit: + - 修复tcp流被reset后,插件的调用顺序问题,先调tcpall后调用tcp. + +* Fri Oct 18 2019 李佳 lijia01@iie.ac.cn + - hash: bea9d3d03804c0e4b12d8dab4d6933e4a5804be4 + - commit: + - 1.修改tcp流reset之后逻辑,仍然先调用tcpall再调用tcp插件; 2.修复plugctrl模块在退出之前,调用插件destroy的错误 + +* Thu Sep 26 2019 lijia lijia01@iie.ac.cn + - hash: d31932a98211f2213913684af3a19d87a7a268ac + - commit: + - pcap_io_thread创建时, dir 方向传输是栈里的变量, 有概率不是传入的真实值, 已修复. + +* Fri Sep 20 2019 lijia lijia01@iie.ac.cn + - hash: be1157ca907b8a5c463856f396b1d24a5b6bf8b3 + - commit: + - 增加RPM包安装时, 自动安装sapp.service服务功能. + +* Wed Sep 18 2019 lijia lijia01@iie.ac.cn + - hash: c911f227fad1a9ab7b7dee7cf105a45a47c061df + - commit: + - 修复增加polling_entry发包功能时,误修改当前流的raw_pkt指针bug. + +* Wed Sep 18 2019 lijia lijia01@iie.ac.cn + - hash: 482d2234ae5e139f8d86ed3b1bbdfb4e44143f5d + - commit: + - add g_device_plug.inf + +* Thu Sep 12 2019 杨威 yangwei@iie.ac.cn + - hash: 1e7f21b77b60a019b79858c21edd10607aa4aa54 + - commit: + - 修复__do_inject_pkt调用packet_io_send时,没有使用调用者传入的route_dir + +* Wed Sep 11 2019 lijia lijia01@iie.ac.cn + - hash: c3224c5a7661a1affe54da0e286da9ac7e63e552 + - commit: + - 更新marsio模式CPU绑核代码, 增加配置文件错误校验. + +* Wed Sep 11 2019 杨威 yangwei@iie.ac.cn + - hash: 08cfa9e532efb3c13e8527342899f706d70be231 + - commit: + - Feature v4 update cmakelist + +* Wed Sep 11 2019 杨威 yangwei@iie.ac.cn + - hash: cacc811248bf4636fe0056221cc615cd31044f16 + - commit: + - 1、cmake文件更新,编译条件改为单一变量多选,如捕包模式 + + - 2、gitignore文件更新,增加vscode和version.txt + +* Sat Sep 7 2019 lijia lijia01@iie.ac.cn + - hash: 119b3a7677cab82c8c6cefe73284c947abd11ec9 + - commit: + - 修复sapp_inject_pkt在polling模式下, 没有当前streaminfo对应原始包的BUG; + - 修复sapp_inject_pkt在双臂模式下的BUG; + +* Fri Sep 6 2019 lijia lijia01@iie.ac.cn + - hash: d53dcc9a8c130565bec16eca3bc2b85110ef931e + - commit: + - 增加sapp_inject_pkt, 支持插件发送已构造好的ip报文, 自动填充底层隧道信息. + +* Thu Sep 5 2019 杨威 yangwei@iie.ac.cn + - hash: 5556e2f099e18bff4824aa48e73076149906bc57 + - commit: + - Update .gitlab -ci.yml + +* Thu Sep 5 2019 杨威 yangwei@iie.ac.cn + - hash: 7d6253191060b08892016831d982e1fbf18985cd + - commit: + - Update .gitlab -ci.yml + +* Tue Sep 3 2019 yangwei yangwei@iie.ac.cn + - hash: 834e7ef0790d7f51ff96fc893280ca71969ed78f + - commit: + - 设置默认捕包模式为pcap,保证CI成功 + +* Tue Sep 3 2019 yangwei yangwei@iie.ac.cn + - hash: ea2b8f427e67f5553be8c72badbb9c096957803f + - commit: + - 更新默认main.conf + +* Fri Aug 23 2019 lijia lijia01@iie.ac.cn + - hash: c85feeb44eef858cf53b8bc97082db25c0dcb3f7 + - commit: + - 增加新发包接口sapp_inject_pkt; 改polling_entry优先级; tcpdump_mesa配置文件修改 + +* Fri Aug 23 2019 yangwei yangwei@iie.ac.cn + - hash: 72794fc3c9b4d5f408db8cf6223974f356d9561b + - commit: + - 1、更新默认模式为marsio + + - 2、marsio模式支持设置cpu_set + +* Mon Aug 12 2019 杨威 yangwei@iie.ac.cn + - hash: ace638519716da065ae7ec3a1cb0e6fc884019ab + - commit: + - Pangu develop parallel + +* Mon Aug 5 2019 yangwei yangwei@iie.ac.cn + - hash: e414a07d077b7cd000e740565534e3ce9e1497a8 + - commit: + - 1、sysinfo link统计位置新增disposable计数,即pengding被调用后即被drop的流 + - 2、sysinfo pkt统计位置新增avg_len计数,包括累计平均包长和单位时间内平均包长 + +* Fri Aug 2 2019 李佳 lijia01@iie.ac.cn + - hash: 42245982d8a4cc3465d932a4f473ebe4dcec8dbc + - commit: + - 增加pcap dumpfile模式下, sapp退出之前调用插件的destroy函数. + +* Wed Jul 31 2019 yangwei yangwei@iie.ac.cn + - hash: 3f89bc26cd7efc3e30699fac0c0595fab483fd9d + - commit: + - 1、更新iknow默认参数,修正为从[ShowStatInfo]读取,默认关闭,移除多处注册时的assert + - 2、调整sapp_init.c中初始化顺序,将sapp_assist_init函数提前至plug_ctrl函数前 + - 3、增加threadnum读取出来小于0时的判断 + - 4、fs2输出增加plug初始化时间的统计,以status形式输出,不发往SERVER + - 5、更新g_plugin_plugid为g_plugin_proto_plugid,用于记录全局protocol插件id + - 6、新增g_plugin_other_plugid,用于记录全局非protocol插件编号 + - a.对于protocol插件,pluginfo中的plugid即对应的g_plugin_proto_plugid + - b.对于其他插件,pluginfo中的plugid=g_plugin_other_plugid+MAX_FUN_NUM(sapp定义的最大protocol插件个数) + +* Fri Jul 26 2019 lijia lijia01@iie.ac.cn + - hash: e3403925b9823bd4603825f7cc26701823d3d3c0 + - commit: + - 修改tcp stream统计信息入InfluxDB的错误. + +* Wed Jul 24 2019 yangwei yangwei@iie.ac.cn + - hash: 0972a436cadf55c89eef9f6924b7216e9f9c1492 + - commit: + - 1、更新CMakelist,使用下拉菜单选择相同类型的编译选项 + - 2、修复注册fs2中latency时,对NOT_SEND_METRIC_TO_SERVER错误的设置 + - 3、更新gitignore,增加vscode工程文件目录 + +* Fri Jul 12 2019 lijia lijia01@iie.ac.cn + - hash: a16840c9e611758d506488cef7b64817c38df0e2 + - commit: + - 修改cmake依赖关系, 导致make -j 并行编译错误问题. + +* Fri Jul 12 2019 lijia lijia01@iie.ac.cn + - hash: 6a19de45c60fb804f47af586c893d42ee61aa4bf + - commit: + - 删除libevent对openssl的依赖,目前仅用libevent的超时机制,禁用ssl部分功能;添加gtest_sapp.inf + +* Thu Jul 11 2019 lijia lijia01@iie.ac.cn + - hash: 1664ee6fbca0e142ea8ea89d7af0224a02645bab + - commit: + - 使用cmake的ExternalProject功能添加第三方依赖库:libevent,gtest. + +* Thu Jul 11 2019 lijia lijia01@iie.ac.cn + - hash: dec8ec060968b07f41cfff1f4d796e6289c124f5 + - commit: + - 增加submodule/benchmark_pcap, submodule/sapp_module_test. + +* Fri Jul 5 2019 lijia lijia01@iie.ac.cn + - hash: 44602c687abf4bdf84644f9438e2ea792c04818c + - commit: + - 增加line_protocol协议输出统计信息到telegraf. + +* Wed Jul 3 2019 yangwei yangwei@iie.ac.cn + - hash: f7ded172d2adf8178aacb0d08609934d9f3389b3 + - commit: + - 更新gitignore + +* Fri Jun 28 2019 杨威 yangwei@iie.ac.cn + - hash: 28010f0261e74732d143e182393dfce9d6bc0530 + - commit: + - Update .gitlab -ci.yml +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: fc75422f3d4327ed429b1e72d049e34b8f323a2c + - commit: + - Update Dockerfile +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: ce013b47ee2381d6451bb612eeb8406afaa1d0b3 + - commit: + - Update Dockerfile +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: 561c8e5e65887df450cf39865eec82c4e0e49101 + - commit: + - Update .gitlab -ci.yml +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: 886313510613996b260d13877ea46b6e53cae918 + - commit: + - Update autorelease.sh +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: a3c2786b020b931c5a96e45169bff3887dd7a3b5 + - commit: + - Update .gitlab -ci.yml +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: a1e91fdc3eb1c7bc2256127d56169752168539fa + - commit: + - Master + +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: 3b0f2122e5afee7f500857c78dc90aa57e022383 + - commit: + - Add autorelease.sh +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: a5909823016d0a326300273773f2713080c6f8f8 + - commit: + - Add Dockerfile +* Thu Jun 27 2019 杨威 yangwei@iie.ac.cn + - hash: cacded43c78b70dbc62c10434259723dacc0d15f + - commit: + - Add .gitlab -ci.yml +* Sun Jun 16 2019 lijia lijia01@iie.ac.cn + - hash: d14f20c62ff3838dfde60da07ae0019df0e9c5ad + - commit: + - 支持用配置文件指定fs2输出格式, default和json两种模式. + +* Thu Jun 6 2019 lijia lijia01@iie.ac.cn + - hash: e0fc7d67d95a9d6f2a59bbf648b4a7ba38a85ad7 + - commit: + - 1.增加废弃conflist_business.inf等文件的自动检测及错误提示;2.增加conflist.inf自动生成脚本. + +* Wed Jun 5 2019 lijia lijia01@iie.ac.cn + - hash: cb2152f52cdeb84c99d5ec53e018e5ac4a6fc301 + - commit: + - 1 -增加定时器, 基于Libevent实现, 依赖库静态链接到sapp; + - 2 -增加平台运行状态; + - 3 -插件配置文件合并, 避免经常打开多个.inf的情况, + - 将原来的三个:conflist_platform.inf, conflist_protocol.inf, conflist_business.inf改为一个conflist.inf, + +* Fri May 31 2019 李佳 lijia01@iie.ac.cn + - hash: abb4b9f9cf08b728a836234eb8d567bcdbe8def0 + - commit: + - 1.修复conflist, inf文件中有空格而导致的读取错误. + +* Fri May 31 2019 lijia lijia01@iie.ac.cn + - hash: 118a875c4cf320b1f1b2b223f5d0f60412500838 + - commit: + - 1.修复conflist, inf文件中有空格而导致的读取错误. + +* Wed May 29 2019 lijia lijia01@iie.ac.cn + - hash: 49996782de45cb78fcdc824c506a99f4d3b7126a + - commit: + - 1 -修复cmake 静态链接编译错误; 2 -修复ipv6串联发包bug; + +* Tue May 28 2019 lijia lijia01@iie.ac.cn + - hash: c4158eeee6b4a9f9198ee79369e3f24173c4fbb7 + - commit: + - 1 -静态链接模式下, pcap, marsio可以共存; + - 2 -修复mariso驱动串联模式, 主动发送数据包bug; + - 3 -增加命令行参数 - -dumpfile -file. + +* Mon May 27 2019 lijia lijia01@iie.ac.cn + - hash: ab2ca4f32203cf5d00d6810a220316fd74ce1007 + - commit: + - 测试串联模式收发包、回注功能, 修复一些问题. + +* Fri May 24 2019 lijia lijia01@iie.ac.cn + - hash: c708b41686b6026ec0cc4096bd5ef5f3eb5cff3e + - commit: + - google test与3.0对比测试, 修复错误. + +* Fri May 24 2019 yangwei yangwei@iie.ac.cn + - hash: 6987955ba3566f3856af043132444bfeb04846ca + - commit: + - 1、更新version.cmake文件,命名规范化,配套更新sapp_main.c中使用的版本宏定义至GIT_VERSION + - 2、新增package.cmake用于打包RPM + - 3、注释掉CMakeLists中无关的捕包模式,目前仅保留pcap,pag和marsio,其中pcap对应的packet_io一定会编译 + +* Fri May 24 2019 yangwei yangwei@iie.ac.cn + - hash: 35b6a9ca854efd2d1ee21c7e14080b53a513729d + - commit: + - 1、增加package.cmake,支持make package打包RPM + - 2、修改cmakelist,static_link开关打开的情况下完全静态链接sapp + +* Thu May 23 2019 lijia lijia01@iie.ac.cn + - hash: 13882d1563fd7a2dbef8abeca9e04fbd503bc36b + - commit: + - 1 -修改test插件, 禁止直接引用sapp中的全局变量; + - 2 -针对配置文件做错误提示, 防止v3.0和v4.0混用,导致不可预料的结果. + +* Thu May 23 2019 yangwei yangwei@iie.ac.cn + - hash: 42369563aaf1331c64651da326bccf066d3ed7b0 + - commit: + - 更新cmakelist,按4.0分支的目录结构修改install + +* Thu May 23 2019 lijia lijia01@iie.ac.cn + - hash: 832ff5b34c4e22236919654f9d6183d25f6ba053 + - commit: + - 更新统计计数,配置文件路径,增加错误提示. + +* Wed May 22 2019 lijia lijia01@iie.ac.cn + - hash: c1c1a1fe0784a9f3192f679f75575fc1fbb1f065 + - commit: + - 1 -隐藏全局变量; + - 2 -重新定义sysinfo.h中各种协议状态值. + +* Mon May 20 2019 lijia lijia01@iie.ac.cn + - hash: 7a9cfc9b234c5d7d6c697e6917104e77f1009736 + - commit: + - 1.增加toml解析库到support目录; + - 2.增加读取sapp.toml配置文件模块; + - 3.修改CMakelists文件, 解决编译问题. + +* Fri May 17 2019 lijia lijia01@iie.ac.cn + - hash: a24c12255ef2925beb22d5fb5f29b237a5842946 + - commit: + - sapp update to version 4.0. + +* Tue May 7 2019 lijia lijia01@iie.ac.cn + - hash: cbfa143e269631fb95815d8adb6b350efcc310af + - commit: + - 1.dumpfile模式增加按pcap包时间戳原速读取功能; + - 2.修复tcp流超时淘汰后, 配置文件指定按SYN建连接, 后续又来新包而不建流的BUG. + +* Tue Apr 23 2019 lijia lijia01@iie.ac.cn + - hash: 26f460ece0573418f0e2742ed34f93b18913e869 + - commit: + - 升级, kill_tcp之后, tcpall插件仍可获取后续流量. + +* Fri Mar 15 2019 lijia lijia01@iie.ac.cn + - hash: 5650705a2e58a64d0b83510e988cc2266ae8aa0a + - commit: + - 1 -修复无法获取SYN_ACK包选项; + - 2 -细化对tcp选项结构体的变量描述; + +* Thu Mar 14 2019 lijia lijia01@iie.ac.cn + - hash: 81a8d80b8cc08226980a1ca3a065a58a9eac1b5c + - commit: + - 修复: main.conf中CreatLinkMode设为按SYN建连接, 当有流超时后, 且当前包不是SYN包,仍旧建立连接的BUG. + +* Thu Mar 14 2019 lijia lijia01@iie.ac.cn + - hash: 3ec415252b7a540db17f9b570520905b3a2eeac1 + - commit: + - 修改tcpdump_mesa屏幕提示颜色. + +* Thu Mar 14 2019 lijia lijia01@iie.ac.cn + - hash: 5c1ad805c04194858761464b6a30d0e6ce6fd7e6 + - commit: + - 修改TCP最大乱序数错误返回值. + +* Thu Feb 14 2019 lijia lijia01@iie.ac.cn + - hash: a0352955e6f4f72740dc990de4c06445777442fc + - commit: + - UDP流可通过MESA_get_stream_opt() ->MSO_STREAM_CLOSE_REASON选项,获取流结束原因, 超时淘汰or超过最大流表数淘汰. + +* Thu Feb 14 2019 lijia lijia01@iie.ac.cn + - hash: 4dec5e34a55df42b624140c8c04a0cebfadf1a75 + - commit: + - UDP流可通过MESA_get_stream_opt() ->MSO_STREAM_CLOSE_REASON选项,获取流结束原因, 超时淘汰or超过最大流表数淘汰. + +* Mon Jan 28 2019 dump2file dump2file@gmail.com + - hash: 3eedc1dd97091da48feabaf67831ed77de263219 + - commit: + - 1、修复包处理延迟日志拼写错误,以及更新时间单位 + +* Mon Jan 28 2019 dump2file dump2file@gmail.com + - hash: 3724cd48d701f1c056005d406c283a9ab7bf2c6d + - commit: + - 1、main.conf增加默认配置 + +* Mon Jan 28 2019 dump2file dump2file@gmail.com + - hash: 36522fc62e72e29ae469c72f7b682fa35342324e + - commit: + - 1、sysinfo增加对单独设置timeout的流计数 + - 2、取消初始化时将最大timeout流限制计数赋值的操作 + +* Mon Jan 28 2019 dump2file dump2file@gmail.com + - hash: a67c349306be4ba5c87d19cbcb3068b5c7fc029c + - commit: + - 1、main.conf中FS输出增加FS_app_name和FS_send_histogram选项控制是否输出histogram和设置输出的APP_NAME,默认分别为关闭和sapp + +* Sun Jan 27 2019 yangwei yangwei@iie.ac.cn + - hash: 83bc243317e3442d5f9b918ae1359b1270fdf9bc + - commit: + - 1、更新自动版本脚本输出内容 + +* Sun Jan 27 2019 dump2file dump2file@gmail.com + - hash: 17e535f258382e16cf37e44dfaac0590d721a259 + - commit: + - 1、sysinfo增加对单独设置timeout的流计数 + - 2、取消初始化时将最大timeout流限制计数赋值的操作 + +* Sun Jan 27 2019 dump2file dump2file@gmail.com + - hash: f66e91e5fdf65f35fe2470c83985b76304fdc754 + - commit: + - 1、调整cmake编译版本参数 + +* Sun Jan 27 2019 yangwei yangwei@iie.ac.cn + - hash: 61a179fb86ddd849c6843ac5af43e444c2dd65f2 + - commit: + - 1、调整cmake编译版本参数 + +* Fri Jan 25 2019 dump2file dump2file@gmail.com + - hash: 164ab05fcac87f9499bdd5be36f75ad38ec7e8c7 + - commit: + - 1、使用g_timestamp_record_sw控制是否输出包处理延迟至fs2 + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: 730eea98d54e88b55a0346876ab7631598b59054 + - commit: + - 1、makefile增加自动生成版本号和stream系列头文件md5值 + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: 899f7b665d71e6d695f1fd9fe1c6a49b49b0e3ae + - commit: + - 1、cmake增加对编译头文件md5值的计算并自动生成宏定义 + - 2、更改cmake -makefile命名 + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: 6a98a954765cf68feb989109753b489760a4745b + - commit: + - 关闭pkt_runtime_output输出 + - 包延迟histogram命名增加时间单位 + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: 0a18167a712a70a1eb216db318cd20c728778f5b + - commit: + - 修正:使用clock_gettime计算包延迟,输出单位为ns + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: fd84494d72a8e860a3874c602b27912cd041f3af + - commit: + - 使用clock_gettime计算包延迟,输出单位为ns + +* Thu Jan 24 2019 dump2file dump2file@gmail.com + - hash: 06697315fdb7bfa26b040dab431bc50f00ed73d3 + - commit: + - 1、调整CMAKE文件,在CMAKE_BUILD_TYPE为Debug时,CFLAGS增加DEBUG宏定义 + +* Wed Jan 23 2019 dump2file dump2file@gmail.com + - hash: 0bd0a96b752103c3b6588cb5730e7c13d613f6d6 + - commit: + - 1、调整g_app_instance_name为全局变量,用于在marsio模式设置instance_name和设置fs2的app_name + - 2、调整fs2中histogram的类型为SPEED + +* Wed Jan 23 2019 dump2file dump2file@gmail.com + - hash: b06c4c8b1f9ef7d81014fee17e41a30ba9424210 + - commit: + - 1、fs2输出增加每个线程的包处理延迟统计,使用histogram输出 + +* Tue Jan 22 2019 dump2file dump2file@gmail.com + - hash: 1f0d43e7830059ebd724a4a579efad48bd2f32e9 + - commit: + - 1、调整静态链接inner_plug插件的编译逻辑 + +* Tue Jan 22 2019 dump2file dump2file@gmail.com + - hash: 73ecdcc9f22c8edda0badfccddf4346abffdf322 + - commit: + - 1、修复USE_DICTATOR开关开启后,CMake文件链接的问题 + +* Mon Jan 21 2019 yangwei yangwei@iie.ac.cn + - hash: de3200da6972fb0f5918ddce374bcd035a070599 + - commit: + - 1、 + +* Sat Jan 19 2019 dump2file dump2file@gmail.com + - hash: 47a9ec9a14a0d9bc620df6a55cee13203e159419 + - commit: + - 1、对应多层MAC地址情况,读取vxlan_info时,跳转到最外层进行读取 + +* Thu Jan 17 2019 dump2file dump2file@gmail.com + - hash: b54a04f5f92b1daa9e448e910adb1977382db6c9 + - commit: + - 1、更新本地捕包文件最大限制为1TB + - 2、CMakelist增加tcmalloc和jemalloc的编译开关 + +* Sun Jan 13 2019 dump2file dump2file@gmail.com + - hash: fd10070960627ec74825e74392a1d7ea61684dfd + - commit: + - 1、sysinfo新增TCP链接方向记录,记录时机为链接淘汰时,过滤条件为单链接包数>3且字节数>5 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: e61471d9cec87d0c73b2cc144fd2f80044612f66 + - commit: + - 1、自动版本号格式更新,包含sha1值 -分支名 -TAG -日期 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: a1642833ac064bf679d2ce991042c3d6364b04bf + - commit: + - 1、增加自动版本号脚本 + - 2、默认改成静态链接inner_plug中模块 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: 59c1bca36544ea265234bb19339287efbe5a7283 + - commit: + - 适配fs2新特性,Ethernet输出改为FS_STYLE_FIELD,与其他字段统一 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: 226432c31e4b4d980640f63d01bebdb12bcbc1df + - commit: + - 1、合并串联Cmakelist,针对sapp内置的插件进行管理 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: c716f4f357a581b7fe892739c1a4e99cf900890b + - commit: + - 1、GTP处理逻辑追加更新,由于出现GTP网关UDP层源目的IP和端口同时发生变化的情况,增加将源目的IP+源目的端口同时重置为0的操作,保证内层流能够汇聚识别 + +* Tue Jan 8 2019 dump2file dump2file@gmail.com + - hash: 4d6cc9f5a2eae5ceeaac20a92e197c7ac640c106 + - commit: + - 1、GTP处理逻辑追加更新,由于出现GTP网关UDP层源目的IP同时发生变化的情况,增加将源目的IP+源端口同时重置为0的操作,保证内层流能够汇聚识别 + +* Mon Jan 7 2019 dump2file dump2file@gmail.com + - hash: e87a55c374089e88aad2bd6c0c81a2a30b7e8e10 + - commit: + - 1、GTP处理逻辑更新,由于存在客户端切换导致同一个内层TCP流,GTP外层一侧的IP和Port变化的情况,导致sapp无法讲内侧的流识别为同一个,因此增加在gtp_entry中根据方向重置客户端IP和Port为0的操作,以保证上述情况能够识别为同一个流 + - 2、代码调整,适配gcc7 + - 3、cmakelist更新,增加pcap_packet_io.so命名的问题 + +* Sat Jan 5 2019 yangwei yangwei@iie.ac.cn + - hash: 1949772afa05a89a7d8cde6d7297416137f63cb1 + - commit: + - 修复layer_addr_ntop_r函数中将tmp_buf定义为static类型,导致多线程调用时地址转换错误的bug + +* Fri Jan 4 2019 dump2file dump2file@gmail.com + - hash: 29a017f1ba6fc428d7dc13cc70b79212a06dccf3 + - commit: + - deal_gprs_tunnel.c中增加对声明包长和剩余包长的校验,不一致的将视作错包,计算在unknown中 + +* Fri Jan 4 2019 dump2file dump2file@gmail.com + - hash: 75a4261494fd8dd4e5df9bb31801e05de8e64aa9 + - commit: + - 修复deal_mpls.c中对ipv4头部长度和剩余包长度比对逻辑错误的bug + +* Mon Dec 24 2018 dump2file dump2file@gmail.com + - hash: 7eb89751b484831704d747c01975befa2376a1d1 + - commit: + - 1.增强teredo判断逻辑,避免误识别 + +* Fri Dec 21 2018 dump2file dump2file@gmail.com + - hash: ac91e36f27860ad8995e2eda6c2e96d0ac56e153 + - commit: + - 1.增加静态连接inner_plug目录中模块的选项 + +* Fri Dec 21 2018 dump2file dump2file@gmail.com + - hash: 404c235d9c31a21434e0900cb170bc0f04c4a0b5 + - commit: + - 1.cmakelist 增加debug选项 + +* Fri Dec 21 2018 dump2file dump2file@gmail.com + - hash: 8ec0ad1bf0375234414ebeb91fd43780639c6086 + - commit: + - 1.MPLS增加内层内容解析逻辑,识别PW Ethernet Control标识,对于无法识别的下层内容,强行注入eth_entry进行处理,由eth层判断后续内容是否可识别 + - 2.IPv4内层将ESP和SCTP协议从unknown计数移除 + - 3. + +* Fri Dec 21 2018 dump2file dump2file@gmail.com + - hash: 79c05df8d6a22075fe45eacd6f99b6f627d2dd51 + - commit: + - 1.修复pptp_entry未按实际长度设置addrlen的bug,将造成addr拷贝时读写越界 + - 2.地址翻转函数addr_reverse_memcpy中增加pptp地址翻转的逻辑 + - 3.tcp_free_stream函数释放内存后将地址设置为NULL + - 4.修复乱序包列表中包含RST重置流时,未设置返回值为DROP导致的read_after_free内存错误,调用堆栈为tcp_deal_data ->tcp_deal_unorder ->tcp_change_stream_tonouse + - 5.cmakelist支持ASAN编译选项 + +* Sun Dec 16 2018 dump2file dump2file@gmail.com + - hash: 7217e44d66a0e39e2205c0f321c74e8aa14bde0c + - commit: + - 1.临时解决手动发送SYN ACK时内存写错的现象,未定位原因 + +* Mon Dec 10 2018 dump2file dump2file@gmail.com + - hash: 58253f857d9e21db4ce1d2ddf24e2d5d41a1b414 + - commit: + - 修复inject_pkt和kill_tcp_synack时未设置streaminfo至send_handle的user_arg的问题 + +* Sun Dec 9 2018 dump2file dump2file@gmail.com + - hash: 8443f8b38b380ac4f48c877799c10d3a791a9151 + - commit: + - packet_io,run目录增加gitignore, 忽略.so文件 + +* Sat Dec 8 2018 dump2file dump2file@gmail.com + - hash: a6439e2d7afcab67c593e4880d5b33396550a6bf + - commit: + - 1.修复sapp设置reverse_ethernet_addr开关后s2c建流时未同步更新MAC地址的bug + - 2.更新test_app_sapp.c,在print_vxlan_info函数增加链接close时的vxinfo输出,用于测试syn包丢失时TCP流单向变双向时mac地址方向的正确性 + +* Fri Dec 7 2018 yangwei yangwei@iie.ac.cn + - hash: 507b105a1edd4912cbad0d1018cd3530b30b37cd + - commit: + - UPDATE: + - 1.main.conf新增reverse_ethernet_addr开关,默认不跟随流方向翻转MAC地址 + +* Thu Dec 6 2018 yangwei yangwei@iie.ac.cn + - hash: fb6258ce9626cb660b90b467e6fa39011e32a974 + - commit: + - UPDATE: + - 1.sapp更新teredo识别和跳层逻辑 + - 2.cmakelist更新,规范化install操作 + - 3.marsio模式下捕包线程命名为sapp_marsio_[id]的形式 + - 4.plugctl修复插件名称比对时内存读越界的问题 + +* Wed Dec 5 2018 yangwei yangwei@iie.ac.cn + - hash: 1e3f5b4561f7ead712dfad0cc93d1cf3d56fd947 + - commit: + - UPDATE: + - 1.sapp配合tcpdump_mesa支持带auth和indication头部的teredo隧道 + +* Tue Dec 4 2018 yangwei yangwei@iie.ac.cn + - hash: cc84a01af6a25af9cc54d41c6e9454fa564f5b8b + - commit: + - UPDATE: + - 1.packet_io_marsio增加线程命名,同时调整cmakelist和makefile支持marsio模式 + +* Fri Nov 30 2018 yangwei yangwei@iie.ac.cn + - hash: 177c80416fc7062002613ed18a1d1e8e01cc9b25 + - commit: + - UPDATE: + - 1.main.conf新增FS_cycle参数,设置输出fs2的周期 + +* Thu Nov 22 2018 liuxueli liuxueli@iie.ac.cn + - hash: cdcb2ff4bcc90a0fe6c38a1f48bd7d4db3a98237 + - commit: + - 支持sapp打rpm包 + +* Thu Nov 22 2018 yangwei yangwei@iie.ac.cn + - hash: 448c2ed33f3f54ac263d80ff33e706a6ef10ecdb + - commit: + - UPDATE: + - 1.默认开启支持CYCLE_PKT_DUMP + - 2.修复cycle_pkt_dump_through_write_offset中greedy_seek_flag开关==0时,MAC包计算后bpf_filter参数未赋值的bug + + - TODO: + - 1.mpls信息缓存待实现 + - 2.GTP信息缓存待实现 + - 3.当前发包构造双向包时,预计算发送buf长度,无法支持MPLS不对称标签发包构造buf时双侧包长不一致的情况,TODO 3 + +* Wed Nov 21 2018 yangwei yangwei@iie.ac.cn + - hash: 08852e30046edabf8b2d9049c923ebb3d8507ac4 + - commit: + - UPDATE: + - 1.main.conf开关send_fake_pkt_by_gdev改为send_fake_pkt_mode,支持按协议栈三层发包,二层单网关发包,二层多网关发包和GDEV注入发包四种模式 + - 2.二层路由发包绑定MAC地址实现完成,多网关发包时支持从配置文件加载映射关系,提供parse_send_route_conf函数支持外部插件调用更新映射表,默认读取send_route.conf + - 3.GDEV注入支持从配置文件加载映射关系,提供parse_send_gdev_ip_conf函数支持外部插件更新映射表,默认读取send_gdev.conf + + - TODO: + - 1.mpls信息缓存待实现 + - 2.GTP信息缓存待实现 + - 3.当前发包构造双向包时,预计算发送buf长度,无法支持MPLS不对称标签发包构造buf时双侧包长不一致的情况,TODO 3 + +* Wed Nov 21 2018 yangwei yangwei@iie.ac.cn + - hash: d199180972f0889acde829096773a7d2b5cb1981 + - commit: + - UPDATE: + - 1.main.conf开关send_fake_pkt_by_gdev改为send_fake_pkt_mode,支持按协议栈三层发包,二层单网关发包,二层多网关发包和GDEV注入发包四种模式 + - 2.二层路由发包绑定MAC地址实现完成,多网关发包时支持从配置文件加载映射关系,提供parse_send_route_conf函数支持外部插件调用更新映射表,默认读取send_route.conf + - 3.GDEV注入支持从配置文件加载映射关系,提供parse_send_gdev_ip_conf函数支持外部插件更新映射表,默认读取send_gdev.conf + + - TODO: + - 1.mpls信息缓存待实现 + - 2.GTP信息缓存待实现 + - 3.当前发包构造双向包时,预计算发送buf长度,无法支持MPLS不对称标签发包构造buf时双侧包长不一致的情况,TODO 3 + +* Fri Nov 16 2018 lijia lijia01@iie.ac.cn + - hash: 4565fddb458aad94132ea24972832027f52ad12a + - commit: + - 修复MPLS update_opposite_addr BUG. + +* Fri Nov 16 2018 lijia lijia01@iie.ac.cn + - hash: 3a22eda3c562f52a5822486b1039ed221a2a1c05 + - commit: + - 修复tcpdump_mesa跳转内层IP, 对畸形数据包的处理BUG. + +* Fri Nov 16 2018 lijia lijia01@iie.ac.cn + - hash: 3f457cf5b34a2a955d18ba5c8ad4db076aead2c0 + - commit: + - 修复tcpdump_mesa内层IP跳转BUG. + +* Fri Nov 16 2018 lijia lijia01@iie.ac.cn + - hash: 24a972f2e019e5d38004c40059eca414797ed059 + - commit: + - 完善按最内层数据包过滤逻辑. + +* Fri Nov 16 2018 yangwei yangwei@iie.ac.cn + - hash: e2edb98522131c56fda7ef90ada44c02f6f3ca19 + - commit: + - UPDATE: + - 1.main.conf新增create_mpls_anyway开关,用于在MPLS处理非对称MPLS标签情况(一侧有一侧没有) + - 2.sendpacket.c新增g_mpls_cache_key和g_mpls_info_hash用于缓存二元组MPLS信息,个)mpls_register_addr用于在线程栈上存储二元组地址用于查询hash + + - TODO: + - 1.mpls信息缓存待实现 + - 2.GTP信息缓存待实现 + - 3.二层路由发包绑定MAC地址待实现 + - 4.当前发包构造双向包时,预计算发送buf长度,无法支持MPLS不对称标签发包构造buf时双侧包长不一致的情况,TODO 3 + +* Thu Nov 15 2018 lijia lijia01@iie.ac.cn + - hash: d7e2c63f9281dd32a994d33d3c0dcc156540f9db + - commit: + - 增加错误包sysinflo.log计数, 并记录日志. + +* Thu Nov 15 2018 lijia lijia01@iie.ac.cn + - hash: 0cc7fa652a7e2fd4a54c6b329c64207d0a88d31d + - commit: + - 修改cycle_pkt_dump, 支持tcpdump_mesa过滤最内层ip,port,便于debug. + +* Tue Nov 13 2018 yangwei yangwei@iie.ac.cn + - hash: 7df582d69209e1cbe3ef5c17f7c796e0fcd38dd4 + - commit: + - 1.更新GTP发包逻辑,对侧无包时查询GTP信息缓存,此种情况无法支持带SEQ的情况(TODO:单独开发插件缓存GTP信息) + +* Tue Nov 13 2018 yangwei yangwei@iie.ac.cn + - hash: 2771cc4626300c3efb6717a74662887f37906d89 + - commit: + - 1.更新GTP地址处理逻辑,实现GTP地址的双向存储和发包(TODO:后续支持带SEQ的GTP隧道) + +* Mon Nov 12 2018 lijia lijia01@iie.ac.cn + - hash: 38383fb6791f7dd27788d276bdbf14d46c2887f1 + - commit: + - 更新GTP处理逻辑, 增加对端地址(TEID,SEQ等)更新逻辑。 + +* Mon Nov 12 2018 yangwei yangwei@iie.ac.cn + - hash: e13480aee812aed6a2660cf14c55b0eb314199cd + - commit: + - 1.更新GTP地址处理逻辑,未完成 + +* Fri Nov 9 2018 yangwei yangwei@iie.ac.cn + - hash: fa8a73da6a456b015dab67931cb5efd09144efa2 + - commit: + - 1.更新GTP处理逻辑,增加对带seq消息的处理并保存在地址中 + +* Fri Nov 9 2018 yangwei yangwei@iie.ac.cn + - hash: 6a191a32c48961d7933b9034700b4f0c5b4c7b11 + - commit: + - 1.移除run目录下的log文件 + +* Fri Nov 9 2018 yangwei yangwei@iie.ac.cn + - hash: ae53f77dd27f580d282eb2fa1d61155f907b9c43 + - commit: + - 1.整理TODO,按重要程度分级 + +* Thu Nov 8 2018 yangwei yangwei@iie.ac.cn + - hash: 3eb2f540a26d16bcba085f8ff9218a73b787dd88 + - commit: + - 1.main.conf新增send_fake_pkt_gdev_sport,用于指定注入发包时的源端口 + - 2.更新packet_io_send_fake_pkt_gdev函数逻辑,正确的计算偏移填写发包内容时的data和datalen + - 3.更新packet_io_send_fake_pkt,对于注入发包,直接调用packet_io_send_fake_pkt_by_gdev + - 4.MESA_send_handle新增raw_udp_fd用于从udp负载开始发送注入包 + +* Thu Nov 8 2018 yangwei yangwei@iie.ac.cn + - hash: da54112c628e2a339fdcee533f8ecabe7fa598cd + - commit: + - 1.更新gprs tunnel协议识别逻辑,使用identify_gtp函数,取代原有的仅识别端口的逻辑 + +* Wed Nov 7 2018 dump2file dump2file@gmail.com + - hash: 229eb61a06a3b900e5ed1f76c87c3b93077e62c2 + - commit: + - 1.修复stream_addr_ntop不识别GTP层地址导致返回报错的问题 + +* Wed Nov 7 2018 dump2file dump2file@gmail.com + - hash: faf647da1351e39dc9f18023a03b13f1a2635ec1 + - commit: + - 1.更新dealpkt目录下的Makefile,保证兼容make命令 + - 2.移除stream_addr_inet.c:23行无用代码 + - 3.更新stream_base.h中大小头宏定义 + +* Tue Nov 6 2018 dump2file dump2file@gmail.com + - hash: d4b51724e23bff593151461c7ba52a24d3334e57 + - commit: + - 1.适配cmake 3.0以上版本,更新CMakeList + - 2.MPLS处理逻辑更新,将多个MPLS标签合并成一层layer_addr,目前支持的最大标签层数是4层,超过4层丢弃 + - 3.增加GTP协议处理entry,目前仅支持在UDP协议上按端口识别,仅支持T -PDU消息,GTP识别的地址方向根据上层的UDP方向确定,后续进行发包时需要注意 + +* Mon Nov 5 2018 lijia lijia01@iie.ac.cn + - hash: fad959665c247b66fdc187fb2ed1e1bde6a54e4e + - commit: + - 修改标准makefile编译错误 + +* Mon Nov 5 2018 yangwei yangwei@iie.ac.cn + - hash: 8a0efc5d9926afdc5b2688c995b3c3a703c1275c + - commit: + - 1.适配cmake,pcap模式编译通过 + - 2.TODO:PAG和MARSIO模式测试 + +* Mon Nov 5 2018 lijia lijia01@iie.ac.cn + - hash: 96c35b45a1d3ce9ccfc04df1b4105423a2371800 + - commit: + - 1)修改mpls_hdr头部定义错误; + - 2)解析多层嵌套MPLS数据包. + +* Fri Nov 2 2018 lijia lijia01@iie.ac.cn + - hash: e8dd50cb222dfdc1aa4d9e1b1cef77ae32c591ff + - commit: + - rename source file. + +* Fri Nov 2 2018 lijia lijia01@iie.ac.cn + - hash: 19e878f155820780bef136f878f6b380cc92517c + - commit: + - 1)修改mpls_hdr头部定义错误; + - 2)解析多层嵌套MPLS数据包. + +* Thu Oct 25 2018 lijia lijia01@iie.ac.cn + - hash: 169cf88ebd93f07244b929a576bf9b35f4ea3d6e + - commit: + - for pangu develop parallen version + +* Thu Oct 25 2018 lijia lijia01@iie.ac.cn + - hash: 76acb369882087188f4fc08018ba59d9faa15827 + - commit: + - sapp_develop_ntc_parallel + +* Thu Oct 25 2018 lijia lijia01@iie.ac.cn + - hash: efa070923d8398b49f41acda82b839d11eb75230 + - commit: + - add new branch for pangu ntc. + diff --git a/src/support/breakpad_mini/demo/CMakeLists.txt b/src/support/breakpad_mini/demo/CMakeLists.txt new file mode 100644 index 0000000..c922480 --- /dev/null +++ b/src/support/breakpad_mini/demo/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB DEMO + "*.cpp" +) + +add_executable(${lib_name}_demo ${DEMO}) +target_link_libraries(${lib_name}_demo ${lib_name}_static breakpad-client-static MESA_prof_load MESA_handle_logger) + diff --git a/src/support/breakpad_mini/demo/breakpad.ini b/src/support/breakpad_mini/demo/breakpad.ini new file mode 100644 index 0000000..cab51ef --- /dev/null +++ b/src/support/breakpad_mini/demo/breakpad.ini @@ -0,0 +1,6 @@ +[breakpad] +disable_coredump=1 +enable_breakpad=1 +breakpad_minidump_dir=/tmp/crashreport +enable_breakpad_upload=0 +breakpad_upload_url=http://127.0.0.1/ diff --git a/src/support/breakpad_mini/demo/demo.cpp b/src/support/breakpad_mini/demo/demo.cpp new file mode 100644 index 0000000..d1f185c --- /dev/null +++ b/src/support/breakpad_mini/demo/demo.cpp @@ -0,0 +1,11 @@ +#include "breakpad.h" + +#include + +int main() +{ + void *logger = MESA_create_runtime_log_handle("./log/breakpad_log", 10); + struct breakpad_instance *g_breakpad = breakpad_init("./breakpad.ini", "breakpad", logger); + breakpad_segv_generate(); + return 0; +} diff --git a/src/support/breakpad_mini/inc/breakpad.h b/src/support/breakpad_mini/inc/breakpad.h new file mode 100644 index 0000000..916db38 --- /dev/null +++ b/src/support/breakpad_mini/inc/breakpad.h @@ -0,0 +1,6 @@ + +struct breakpad_instance; + +void breakpad_segv_generate(); + +struct breakpad_instance *breakpad_init(const char *profile, const char *module, void *logger); diff --git a/src/support/breakpad_mini/src/CMakeLists.txt b/src/support/breakpad_mini/src/CMakeLists.txt new file mode 100644 index 0000000..f454c2e --- /dev/null +++ b/src/support/breakpad_mini/src/CMakeLists.txt @@ -0,0 +1,24 @@ +set(DEPEND_DYN_LIB MESA_handle_logger MESA_prof_load) + +# Shared Library Output +add_library(${lib_name} SHARED breakpad.cpp) +#add_dependencies(${lib_name} breakpad-client-static) + +target_link_libraries(${lib_name} breakpad-client-static) +target_link_libraries(${lib_name} ${DEPEND_DYN_LIB}) +set_target_properties(${lib_name} PROPERTIES PREFIX "") + +# static Library Output +add_library(${lib_name}_static STATIC breakpad.cpp) +#add_dependencies(${lib_name}_static breakpad-client-static) + +target_link_libraries(${lib_name}_static breakpad-client-static) +target_link_libraries(${lib_name}_static ${DEPEND_DYN_LIB}) +set_target_properties(${lib_name}_static PROPERTIES OUTPUT_NAME ${lib_name}) + +set(CMAKE_INSTALL_PREFIX /opt/MESA/) + +#install(TARGETS ${plugin_name} LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib COMPONENT LIBRARY) +#install(FILES inc/${plugin_name}.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MESA/ COMPONENT PROFILE) + +include(Package) diff --git a/src/support/breakpad_mini/src/breakpad.cpp b/src/support/breakpad_mini/src/breakpad.cpp new file mode 100644 index 0000000..c5cbb0c --- /dev/null +++ b/src/support/breakpad_mini/src/breakpad.cpp @@ -0,0 +1,246 @@ +#include "breakpad.h" + +#include +#include + +/* Breakpad */ +#include +#include + +#include +#include + +#define likely(expr) __builtin_expect((expr), 1) +#define unlikely(expr) __builtin_expect((expr), 0) + +#define LOGGER_MODULE "breakpad" + +struct breakpad_instance +{ + unsigned int en_breakpad; + char minidump_dir_prefix[4096]; + google_breakpad::ExceptionHandler *exceptionHandler; + + /* Upload to crash server */ + unsigned int en_breakpad_upload; + char minidump_sentry_upload_url[4096]; + + /* Upload tools name */ + char upload_tools_filename[4096]; + + /* Upload tools exec command */ + char *upload_tools_exec_argv[64]; + char *minidump_filename; +}; + +void breakpad_segv_generate() +{ + volatile char *_NULLPTR = nullptr; + (*_NULLPTR) = 0; +} + +static void _mkdir(const char *dir) +{ + char tmp[PATH_MAX]; + char *p = NULL; + size_t len; + + snprintf(tmp, sizeof(tmp), "%s", dir); + len = strlen(tmp); + if (tmp[len - 1] == '/') + tmp[len - 1] = 0; + for (p = tmp + 1; *p; p++) + { + if (*p == '/') + { + *p = 0; + mkdir(tmp, S_IRWXU); + *p = '/'; + } + } + mkdir(tmp, S_IRWXU); +} + +static bool breakpad_dump_to_file(const google_breakpad::MinidumpDescriptor &descriptor, + void *context, bool succeeded) +{ + fprintf(stderr, "Crash happened, minidump path: %s\n", descriptor.path()); + return succeeded; +} + +static bool breakpad_dump_and_report(const google_breakpad::MinidumpDescriptor &descriptor, + void *context, bool succeeded) +{ + struct breakpad_instance *instance = (struct breakpad_instance *)context; + int ret = 0; + + strncpy(instance->minidump_filename, descriptor.path(), PATH_MAX - 1); + fprintf(stderr, "Crash happened, prepare upload the minidump file: %s\n", descriptor.path()); + + ret = access(instance->minidump_filename, F_OK | R_OK); + if (ret < 0) + { + fprintf(stderr, "minidump file is not existed, cannot upload minidump file"); + return succeeded; + } + + /* Firstly, fork an child process */ + pid_t exec_child_pid = fork(); + if (exec_child_pid == 0) + { + /* As a child, exec minidump upload tools */ + ret = execv(instance->upload_tools_filename, instance->upload_tools_exec_argv); + if (ret < 0) + { + fprintf(stderr, "Failed at exec the upload program %s: %s\n", + instance->upload_tools_filename, strerror(errno)); + } + + exit(EXIT_FAILURE); + } + else if (exec_child_pid > 0) + { + fprintf(stderr, "Starting upload minidump, PID = %d. \n", exec_child_pid); + return succeeded; + } + else + { + /* failed at fork, cannot upload the minidump */ + fprintf(stderr, "Failed at fork(), cannot upload minidump file. : %s\n", strerror(errno)); + return succeeded; + } +} + +//functioned as strdup, for dictator compatible. +static char *_strdup(const char *s) +{ + char *d = NULL; + if (s == NULL) + { + return NULL; + } + + d = (char *)malloc(strlen(s) + 1); + memcpy(d, s, strlen(s) + 1); + return d; +} + +static int breakpad_init_minidump_upload(struct breakpad_instance *instance, const char *profile, const char *module, void *logger) +{ + int ret = 0; + char execpath[PATH_MAX] = {}; + char *execdirname = NULL; + char *execname = NULL; + + ret = MESA_load_profile_string_nodef(profile, module, "breakpad_upload_url", + instance->minidump_sentry_upload_url, sizeof(instance->minidump_sentry_upload_url)); + + if (unlikely(ret < 0)) + { + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "breakpad_upload_url is necessary, failed. "); + goto errout; + } + + ret = readlink("/proc/self/exe", execpath, sizeof(execpath)); + if (unlikely(ret < 0)) + { + printf("Failed at readlink /proc/self/exec: %s", strerror(errno)); + goto errout; + } + + execdirname = dirname(execpath); + snprintf(instance->upload_tools_filename, sizeof(instance->upload_tools_filename) - 1, + "%s/%s", execdirname, "minidump_upload"); + + /* Execfile */ + instance->upload_tools_exec_argv[0] = _strdup(instance->upload_tools_filename); + + execname = basename(execpath); + + /* Firstly, Product Name and Product Version */ + instance->upload_tools_exec_argv[1] = _strdup("-p"); + instance->upload_tools_exec_argv[2] = _strdup(execname); + instance->upload_tools_exec_argv[3] = _strdup("-v"); + instance->upload_tools_exec_argv[4] = _strdup("v1"); + + /* Minidump file location, now we don't know it */ + instance->minidump_filename = (char *)calloc(sizeof(char), PATH_MAX); + instance->upload_tools_exec_argv[5] = instance->minidump_filename; + + /* Minidup upload url */ + instance->upload_tools_exec_argv[6] = _strdup(instance->minidump_sentry_upload_url); + instance->upload_tools_exec_argv[7] = NULL; + return 0; + +errout: + return -1; +} + +struct breakpad_instance *breakpad_init(const char *profile, const char *module, void *logger) +{ + struct breakpad_instance *instance = (struct breakpad_instance *)calloc(sizeof(struct breakpad_instance), 1); + assert(instance != nullptr); + + int ret = 0; + unsigned int disable_coredump = 1; + MESA_load_profile_uint_def(profile, module, "disable_coredump", &disable_coredump, 1); + + if (disable_coredump > 0) + { + const struct rlimit __rlimit_vars = {.rlim_cur = 0, .rlim_max = 0}; + ret = setrlimit(RLIMIT_CORE, &__rlimit_vars); + if (ret < 0) + { + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "setrlimit(RLIMIT_CORE, 0) failed: %s", strerror(errno)); + } + } + + MESA_load_profile_uint_def(profile, module, "enable_breakpad", &instance->en_breakpad, 1); + if (instance->en_breakpad <= 0) + { + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "Breakpad Crash Reporting System is disabled. "); + return instance; + } + MESA_load_profile_string_def(profile, module, "breakpad_minidump_dir", + instance->minidump_dir_prefix, sizeof(instance->minidump_dir_prefix), "/tmp/crashreport"); + + /* Create the minidump dir if it is not existed */ + _mkdir(instance->minidump_dir_prefix); + + MESA_load_profile_uint_def(profile, module, "enable_breakpad_upload",&instance->en_breakpad_upload, 0); + if (instance->en_breakpad_upload) + { + /* Try to init the breakpad upload */ + ret = breakpad_init_minidump_upload(instance, profile, module,logger); + if (ret < 0) + { + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "Breakpad upload init failed, using local breakpad dumpfile"); + instance->en_breakpad_upload = 0; + } + + /* When we use breakpad, do not generate any coredump file */ + const struct rlimit __rlimit_vars = {.rlim_cur = 0, .rlim_max = 0}; + ret = setrlimit(RLIMIT_CORE, &__rlimit_vars); + if (ret < 0) + { + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "setrlimit(RLIMIT_CORE, 0) failed: %s", strerror(errno)); + } + } + + if (instance->en_breakpad_upload) + { + instance->exceptionHandler = new google_breakpad::ExceptionHandler( + google_breakpad::MinidumpDescriptor(instance->minidump_dir_prefix), NULL, + breakpad_dump_and_report, instance, true, -1); + } + else + { + instance->exceptionHandler = new google_breakpad::ExceptionHandler( + google_breakpad::MinidumpDescriptor(instance->minidump_dir_prefix), NULL, + breakpad_dump_to_file, NULL, true, -1); + } + + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "Breakpad Crash Report is enable. "); + MESA_handle_runtime_log(logger, RLOG_LV_INFO, LOGGER_MODULE, "Minidump Dir: %s", instance->minidump_dir_prefix); + return instance; +} diff --git a/src/support/breakpad_mini/vendor/CMakeLists.txt b/src/support/breakpad_mini/vendor/CMakeLists.txt new file mode 100644 index 0000000..8b3d0aa --- /dev/null +++ b/src/support/breakpad_mini/vendor/CMakeLists.txt @@ -0,0 +1,26 @@ +include(ExternalProject) +### Google Breakpad Binary +### Caution: This package is a pre-compiled binary package, only used in x86_64 servers. +ExternalProject_Add(breakpad + PREFIX breakpad + URL ${CMAKE_CURRENT_SOURCE_DIR}/breakpad-master-abfe08e.tar.gz + URL_MD5 96fb25a9d96cc55db71a7f374ad363b4 + CONFIGURE_COMMAND ./configure --prefix= + INSTALL_DIR /usr/local/ + BUILD_IN_SOURCE 1) + +ExternalProject_Get_Property(breakpad INSTALL_DIR) +file(MAKE_DIRECTORY ${INSTALL_DIR}/include/breakpad) + +add_library(breakpad-client-static STATIC IMPORTED GLOBAL) +add_dependencies(breakpad-client-static breakpad) +set_property(TARGET breakpad-client-static PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libbreakpad_client.a) +set_property(TARGET breakpad-client-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include/breakpad) +target_link_libraries(breakpad-client-static INTERFACE pthread) + +# install the minidump tools to target binary dir +install(PROGRAMS ${INSTALL_DIR}/bin/minidump-2-core DESTINATION bin COMPONENT Program) +install(PROGRAMS ${INSTALL_DIR}/bin/minidump_dump DESTINATION bin COMPONENT Program) +install(PROGRAMS ${INSTALL_DIR}/bin/minidump_stackwalk DESTINATION bin COMPONENT Program) +install(PROGRAMS ${INSTALL_DIR}/bin/minidump_upload DESTINATION bin COMPONENT Program) + diff --git a/src/support/breakpad_mini/vendor/breakpad-master-abfe08e.tar.gz b/src/support/breakpad_mini/vendor/breakpad-master-abfe08e.tar.gz new file mode 100644 index 0000000..fd75aad Binary files /dev/null and b/src/support/breakpad_mini/vendor/breakpad-master-abfe08e.tar.gz differ -- cgit v1.2.3