├── .ci ├── build_packages │ ├── Dockerfile │ ├── tests.sh │ └── upload_github_release_asset.sh ├── deps_tests │ ├── boot.py │ ├── docker-compose.yaml │ ├── emqx-erlang │ │ └── Dockerfile │ ├── emqx-ldap │ │ ├── Dockerfile │ │ ├── schema │ │ │ ├── emqx.io.ldif │ │ │ └── emqx.schema │ │ └── slapd.conf │ ├── emqx-nginx │ │ ├── Dockerfile │ │ └── default.conf │ └── emqx-redis │ │ ├── Dockerfile │ │ └── redis.conf ├── nightly_build │ ├── http_server │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── rebar.config │ │ └── src │ │ │ ├── http_server.app.src │ │ │ └── http_server.erl │ └── relup.lux └── paho_tests │ ├── Makefile │ └── docker-compose.yaml ├── .github ├── ISSUE_TEMPLATE.md └── workflows │ ├── build_cross_packages.yaml │ ├── run_deps_tests.yaml │ ├── run_paho_tests.yaml │ └── run_relup_tests.yaml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── bin ├── emqx ├── emqx.cmd ├── emqx_ctl ├── emqx_ctl.cmd ├── emqx_env ├── install_upgrade.escript └── nodetool ├── data ├── emqx_vars ├── loaded_modules.tmpl └── loaded_plugins.tmpl ├── deploy ├── charts │ └── emqx │ │ ├── Chart.yaml │ │ ├── README.md │ │ ├── templates │ │ ├── StatefulSet.yaml │ │ ├── _helpers.tpl │ │ ├── configmap.yaml │ │ ├── configmap_for_acl.yaml │ │ ├── ingress.yaml │ │ ├── rbac.yaml │ │ └── service.yaml │ │ └── values.yaml ├── docker │ ├── Dockerfile │ ├── README.md │ ├── docker-entrypoint.sh │ └── start.sh └── packages │ ├── README.md │ ├── deb │ ├── Makefile │ └── debian │ │ ├── changelog │ │ ├── compat │ │ ├── control │ │ ├── copyright │ │ ├── init.script │ │ ├── postinst │ │ ├── postrm │ │ └── rules │ └── rpm │ ├── Makefile │ ├── emqx.service │ ├── emqx.spec │ └── init.script ├── docker.mk ├── ensure-rebar3.sh ├── get-lastest-tag.escript ├── inject-deps.escript ├── packages.mk ├── post-compile.cmd ├── post-compile.sh ├── rebar.config ├── rebar.config.script ├── rebar3.cmd ├── vars-bin.config ├── vars-cloud.config ├── vars-edge.config └── vars-pkg.config /.ci/build_packages/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BUILD_FROM=emqx/build-env:erl22.3-ubuntu20.04 2 | FROM ${BUILD_FROM} 3 | 4 | ARG EMQX_NAME=emqx 5 | 6 | COPY . /emqx-rel 7 | 8 | WORKDIR /emqx-rel 9 | 10 | RUN sed -i "/^export LC_ALL=.*$/d" Makefile && make ${EMQX_NAME}-pkg || cat rebar3.crashdump 11 | 12 | RUN /emqx-rel/.ci/build_packages/tests.sh 13 | -------------------------------------------------------------------------------- /.ci/build_packages/tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -x -e -u 3 | export EMQX_NAME=${EMQX_NAME:-"emqx"} 4 | export PACKAGE_PATH="/emqx-rel/_packages/${EMQX_NAME}" 5 | export RELUP_PACKAGE_PATH="/emqx-rel/relup_packages/${EMQX_NAME}" 6 | # export EMQX_NODE_NAME="emqx-on-$(uname -m)@127.0.0.1" 7 | # export EMQX_NODE_COOKIE=$(date +%s%N) 8 | 9 | emqx_prepare(){ 10 | mkdir -p ${PACKAGE_PATH} 11 | 12 | if [ ! -d "/paho-mqtt-testing" ]; then 13 | git clone -b develop-4.0 https://github.com/emqx/paho.mqtt.testing.git /paho-mqtt-testing 14 | fi 15 | pip3 install pytest 16 | } 17 | 18 | emqx_test(){ 19 | cd ${PACKAGE_PATH} 20 | 21 | for var in $(ls $PACKAGE_PATH/${EMQX_NAME}-*);do 22 | case ${var##*.} in 23 | "zip") 24 | packagename=`basename ${PACKAGE_PATH}/${EMQX_NAME}-*.zip` 25 | unzip -q ${PACKAGE_PATH}/$packagename 26 | sed -i "/zone.external.server_keepalive/c zone.external.server_keepalive = 60" ${PACKAGE_PATH}/emqx/etc/emqx.conf 27 | sed -i "/mqtt.max_topic_alias/c mqtt.max_topic_alias = 10" ${PACKAGE_PATH}/emqx/etc/emqx.conf 28 | 29 | if [ ! -z $(echo ${EMQX_DEPS_DEFAULT_VSN#v} | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?-(alpha|beta|rc)\.[0-9]") ]; then 30 | if [ ! -d ${PACKAGE_PATH}/emqx/lib/emqx-${EMQX_DEPS_DEFAULT_VSN#v} ] || [ ! -d ${PACKAGE_PATH}/emqx/releases/${EMQX_DEPS_DEFAULT_VSN#v} ] ;then 31 | echo "emqx zip version error" 32 | exit 1 33 | fi 34 | fi 35 | 36 | echo "running ${packagename} start" 37 | ${PACKAGE_PATH}/emqx/bin/emqx start || tail ${PACKAGE_PATH}/emqx/log/erlang.log.1 38 | IDLE_TIME=0 39 | while [ -z "$(${PACKAGE_PATH}/emqx/bin/emqx_ctl status |grep 'is running'|awk '{print $1}')" ] 40 | do 41 | if [ $IDLE_TIME -gt 10 ] 42 | then 43 | echo "emqx running error" 44 | exit 1 45 | fi 46 | sleep 10 47 | IDLE_TIME=$((IDLE_TIME+1)) 48 | done 49 | pytest -v /paho-mqtt-testing/interoperability/test_client/V5/test_connect.py::test_basic 50 | ${PACKAGE_PATH}/emqx/bin/emqx stop 51 | echo "running ${packagename} stop" 52 | rm -rf ${PACKAGE_PATH}/emqx 53 | ;; 54 | "deb") 55 | packagename=`basename ${PACKAGE_PATH}/${EMQX_NAME}-*.deb` 56 | dpkg -i ${PACKAGE_PATH}/$packagename 57 | if [ $(dpkg -l |grep emqx |awk '{print $1}') != "ii" ] 58 | then 59 | echo "package install error" 60 | exit 1 61 | fi 62 | 63 | echo "running ${packagename} start" 64 | running_test 65 | echo "running ${packagename} stop" 66 | 67 | dpkg -r ${EMQX_NAME} 68 | if [ $(dpkg -l |grep emqx |awk '{print $1}') != "rc" ] 69 | then 70 | echo "package remove error" 71 | exit 1 72 | fi 73 | 74 | dpkg -P ${EMQX_NAME} 75 | if [ ! -z "$(dpkg -l |grep emqx)" ] 76 | then 77 | echo "package uninstall error" 78 | exit 1 79 | fi 80 | ;; 81 | "rpm") 82 | packagename=`basename ${PACKAGE_PATH}/${EMQX_NAME}-*.rpm` 83 | rpm -ivh ${PACKAGE_PATH}/$packagename 84 | if [ -z $(rpm -q emqx | grep -o emqx) ];then 85 | echo "package install error" 86 | exit 1 87 | fi 88 | 89 | echo "running ${packagename} start" 90 | running_test 91 | echo "running ${packagename} stop" 92 | 93 | rpm -e ${EMQX_NAME} 94 | if [ "$(rpm -q emqx)" != "package emqx is not installed" ];then 95 | echo "package uninstall error" 96 | exit 1 97 | fi 98 | ;; 99 | 100 | esac 101 | done 102 | } 103 | 104 | running_test(){ 105 | if [ ! -z $(echo ${EMQX_DEPS_DEFAULT_VSN#v} | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?-(alpha|beta|rc)\.[0-9]") ]; then 106 | if [ ! -d /usr/lib/emqx/lib/emqx-${EMQX_DEPS_DEFAULT_VSN#v} ] || [ ! -d /usr/lib/emqx/releases/${EMQX_DEPS_DEFAULT_VSN#v} ];then 107 | echo "emqx package version error" 108 | exit 1 109 | fi 110 | fi 111 | 112 | sed -i "/zone.external.server_keepalive/c zone.external.server_keepalive = 60" /etc/emqx/emqx.conf 113 | sed -i "/mqtt.max_topic_alias/c mqtt.max_topic_alias = 10" /etc/emqx/emqx.conf 114 | 115 | emqx start || tail /var/log/emqx/erlang.log.1 116 | IDLE_TIME=0 117 | while [ -z "$(emqx_ctl status |grep 'is running'|awk '{print $1}')" ] 118 | do 119 | if [ $IDLE_TIME -gt 10 ] 120 | then 121 | echo "emqx running error" 122 | exit 1 123 | fi 124 | sleep 10 125 | IDLE_TIME=$((IDLE_TIME+1)) 126 | done 127 | pytest -v /paho-mqtt-testing/interoperability/test_client/V5/test_connect.py::test_basic 128 | emqx stop || kill $(ps -ef |grep emqx | grep beam.smp |awk '{print $2}') 129 | 130 | if [ $(sed -n '/^ID=/p' /etc/os-release | sed -r 's/ID=(.*)/\1/g' | sed 's/"//g') = ubuntu ] \ 131 | || [ $(sed -n '/^ID=/p' /etc/os-release | sed -r 's/ID=(.*)/\1/g' | sed 's/"//g') = debian ] \ 132 | || [ $(sed -n '/^ID=/p' /etc/os-release | sed -r 's/ID=(.*)/\1/g' | sed 's/"//g') = raspbian ];then 133 | service emqx start || tail /var/log/emqx/erlang.log.1 134 | IDLE_TIME=0 135 | while [ -z "$(emqx_ctl status |grep 'is running'|awk '{print $1}')" ] 136 | do 137 | if [ $IDLE_TIME -gt 10 ] 138 | then 139 | echo "emqx service error" 140 | exit 1 141 | fi 142 | sleep 10 143 | IDLE_TIME=$((IDLE_TIME+1)) 144 | done 145 | service emqx stop 146 | fi 147 | } 148 | 149 | relup_test(){ 150 | if [ -d ${RELUP_PACKAGE_PATH} ];then 151 | cd ${RELUP_PACKAGE_PATH } 152 | 153 | for var in $(ls ${EMQX_NAME}-*-$(uname -m).zip);do 154 | packagename=`basename ${var}` 155 | unzip $packagename 156 | ./emqx/bin/emqx start 157 | ./emqx/bin/emqx_ctl status 158 | ./emqx/bin/emqx versions 159 | cp ${PACKAGE_PATH}/${EMQX_NAME}-*-${EMQX_DEPS_DEFAULT_VSN#v}-$(uname -m).zip ./emqx/releases 160 | ./emqx/bin/emqx install ${EMQX_DEPS_DEFAULT_VSN#v} 161 | [ $(./emqx/bin/emqx versions |grep permanent | grep -oE "[0-9].[0-9].[0-9]") = ${EMQX_DEPS_DEFAULT_VSN#v} ] || exit 1 162 | ./emqx/bin/emqx_ctl status 163 | ./emqx/bin/emqx stop 164 | rm -rf emqx 165 | done 166 | fi 167 | } 168 | 169 | emqx_prepare 170 | emqx_test 171 | relup_test 172 | -------------------------------------------------------------------------------- /.ci/build_packages/upload_github_release_asset.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Author: Stefan Buck 4 | # License: MIT 5 | # https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447 6 | # 7 | # 8 | # This script accepts the following parameters: 9 | # 10 | # * owner 11 | # * repo 12 | # * tag 13 | # * filename 14 | # * github_api_token 15 | # 16 | # Script to upload a release asset using the GitHub API v3. 17 | # 18 | # Example: 19 | # 20 | # upload-github-release-asset.sh github_api_token=TOKEN owner=stefanbuck repo=playground tag=v0.1.0 filename=./build.zip 21 | # 22 | 23 | # Check dependencies. 24 | set -e 25 | xargs=$(which gxargs || which xargs) 26 | 27 | # Validate settings. 28 | [ "$TRACE" ] && set -x 29 | 30 | CONFIG=$@ 31 | 32 | for line in $CONFIG; do 33 | eval "$line" 34 | done 35 | 36 | # Define variables. 37 | GH_API="https://api.github.com" 38 | GH_REPO="$GH_API/repos/$owner/$repo" 39 | GH_TAGS="$GH_REPO/releases/tags/$tag" 40 | AUTH="Authorization: token $github_api_token" 41 | WGET_ARGS="--content-disposition --auth-no-challenge --no-cookie" 42 | CURL_ARGS="-LJO#" 43 | 44 | if [[ "$tag" == 'LATEST' ]]; then 45 | GH_TAGS="$GH_REPO/releases/latest" 46 | fi 47 | 48 | # Validate token. 49 | curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or network issue!"; exit 1; } 50 | 51 | # Read asset tags. 52 | response=$(curl -sH "$AUTH" $GH_TAGS) 53 | 54 | # Get ID of the asset based on given filename. 55 | eval $(echo "$response" | grep -m 1 "id.:" | grep -w id | tr : = | tr -cd '[[:alnum:]]=') 56 | [ "$id" ] || { echo "Error: Failed to get release id for tag: $tag"; echo "$response" | awk 'length($0)<100' >&2; exit 1; } 57 | 58 | # Upload asset 59 | # Construct url 60 | GH_ASSET="https://uploads.github.com/repos/$owner/$repo/releases/$id/assets?name=$(basename $filename)" 61 | 62 | curl "$GITHUB_OAUTH_BASIC" --data-binary @"$filename" -H "Authorization: token $github_api_token" -H "Content-Type: application/octet-stream" $GH_ASSET 63 | -------------------------------------------------------------------------------- /.ci/deps_tests/boot.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | ## 3 | import os 4 | import sys 5 | import re 6 | from bs4 import BeautifulSoup 7 | 8 | ## get all test catalog 9 | def get_test_all_catalog(name): 10 | CatalogList = [] 11 | PackageNameList = [] 12 | filepath = os.path.join(os.getcwd(), name) 13 | packagenames = os.listdir(name) 14 | for packagename in packagenames: 15 | tmp_path = os.path.join(filepath, packagename) 16 | if os.path.isdir(tmp_path): 17 | CatalogList.append(tmp_path) 18 | PackageNameList.append(packagename) 19 | return CatalogList, PackageNameList 20 | 21 | ## Start Galaxy Engine 22 | ## Save index. d by extracting important information from index.html. 23 | ## extract index.html and deal with path information in index.html 24 | def extract_core_content(path, filename, packagename): 25 | filepath = os.path.join(path, filename) 26 | if os.path.exists(filepath): 27 | fopen = open(filepath) 28 | filecontent = fopen.read() 29 | original_core_content = re.findall(r"<\s*body[^>]*>(.+?)