Merge pull request #6023 from xiangfangyang-tech/main-v4.3
chore(autotest): add mysql&pgsql&http test flow in git_action flow
This commit is contained in:
commit
2a3d1fcb78
|
@ -0,0 +1,99 @@
|
||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
services:
|
||||||
|
haproxy:
|
||||||
|
container_name: haproxy
|
||||||
|
image: haproxy:2.3
|
||||||
|
depends_on:
|
||||||
|
- emqx1
|
||||||
|
- emqx2
|
||||||
|
volumes:
|
||||||
|
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
|
||||||
|
- ../../etc/certs:/usr/local/etc/haproxy/certs
|
||||||
|
ports:
|
||||||
|
- "18083:18083"
|
||||||
|
# - "1883:1883"
|
||||||
|
# - "8883:8883"
|
||||||
|
# - "8083:8083"
|
||||||
|
# - "5683:5683/udp"
|
||||||
|
# - "9999:9999"
|
||||||
|
# - "8084:8084"
|
||||||
|
networks:
|
||||||
|
- emqx_bridge
|
||||||
|
working_dir: /usr/local/etc/haproxy
|
||||||
|
command:
|
||||||
|
- bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
cat /usr/local/etc/haproxy/certs/cert.pem /usr/local/etc/haproxy/certs/key.pem > /usr/local/etc/haproxy/certs/emqx.pem
|
||||||
|
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
|
||||||
|
|
||||||
|
emqx1:
|
||||||
|
restart: always
|
||||||
|
container_name: node1.emqx.io
|
||||||
|
image: $TARGET:$EMQX_TAG
|
||||||
|
env_file:
|
||||||
|
- conf.cluster.env
|
||||||
|
volumes:
|
||||||
|
- etc:/opt/emqx/etc
|
||||||
|
environment:
|
||||||
|
- "EMQX_HOST=node1.emqx.io"
|
||||||
|
ports:
|
||||||
|
- "11881:18083"
|
||||||
|
# - "1883:1883"
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
sed -i "s 127.0.0.1 $$(ip route show |grep "link" |awk '{print $$1}') g" /opt/emqx/etc/acl.conf
|
||||||
|
sed -i '/emqx_telemetry/d' /opt/emqx/data/loaded_plugins
|
||||||
|
/opt/emqx/bin/emqx foreground
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 25s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
emqx_bridge:
|
||||||
|
aliases:
|
||||||
|
- node1.emqx.io
|
||||||
|
|
||||||
|
emqx2:
|
||||||
|
restart: always
|
||||||
|
container_name: node2.emqx.io
|
||||||
|
image: $TARGET:$EMQX_TAG
|
||||||
|
env_file:
|
||||||
|
- conf.cluster.env
|
||||||
|
volumes:
|
||||||
|
- etc:/opt/emqx/etc
|
||||||
|
environment:
|
||||||
|
- "EMQX_HOST=node2.emqx.io"
|
||||||
|
ports:
|
||||||
|
- "11882:18083"
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
sed -i "s 127.0.0.1 $$(ip route show |grep "link" |awk '{print $$1}') g" /opt/emqx/etc/acl.conf
|
||||||
|
sed -i '/emqx_telemetry/d' /opt/emqx/data/loaded_plugins
|
||||||
|
/opt/emqx/bin/emqx foreground
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "/opt/emqx/bin/emqx", "ping"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 25s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
emqx_bridge:
|
||||||
|
aliases:
|
||||||
|
- node2.emqx.io
|
||||||
|
volumes:
|
||||||
|
etc:
|
||||||
|
networks:
|
||||||
|
emqx_bridge:
|
||||||
|
driver: bridge
|
||||||
|
name: emqx_bridge
|
||||||
|
ipam:
|
||||||
|
driver: default
|
||||||
|
config:
|
||||||
|
- subnet: 172.100.239.0/24
|
||||||
|
gateway: 172.100.239.1
|
|
@ -27,6 +27,7 @@ services:
|
||||||
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
|
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
|
||||||
|
|
||||||
emqx1:
|
emqx1:
|
||||||
|
restart: always
|
||||||
container_name: node1.emqx.io
|
container_name: node1.emqx.io
|
||||||
image: $TARGET:$EMQX_TAG
|
image: $TARGET:$EMQX_TAG
|
||||||
env_file:
|
env_file:
|
||||||
|
@ -51,6 +52,7 @@ services:
|
||||||
- node1.emqx.io
|
- node1.emqx.io
|
||||||
|
|
||||||
emqx2:
|
emqx2:
|
||||||
|
restart: always
|
||||||
container_name: node2.emqx.io
|
container_name: node2.emqx.io
|
||||||
image: $TARGET:$EMQX_TAG
|
image: $TARGET:$EMQX_TAG
|
||||||
env_file:
|
env_file:
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
services:
|
||||||
|
web_server:
|
||||||
|
container_name: Tomcat
|
||||||
|
build:
|
||||||
|
context: ./http-service
|
||||||
|
image: web-server
|
||||||
|
networks:
|
||||||
|
- emqx_bridge
|
|
@ -0,0 +1,15 @@
|
||||||
|
FROM tomcat:10.0.5
|
||||||
|
|
||||||
|
RUN wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip \
|
||||||
|
&& unzip apache-maven-3.6.3-bin.zip \
|
||||||
|
&& mv apache-maven-3.6.3 /opt/apache-maven-3.6.3/ \
|
||||||
|
&& ln -s /opt/apache-maven-3.6.3/ /opt/maven
|
||||||
|
ENV M2_HOME=/opt/maven
|
||||||
|
ENV M2=$M2_HOME/bin
|
||||||
|
ENV PATH=$M2:$PATH
|
||||||
|
COPY ./web-server /code
|
||||||
|
WORKDIR /code
|
||||||
|
RUN mvn package -Dmaven.skip.test=true
|
||||||
|
RUN mv ./target/emqx-web-0.0.1.war /usr/local/tomcat/webapps/emqx-web.war
|
||||||
|
EXPOSE 8080
|
||||||
|
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
|
|
@ -0,0 +1,65 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>emqx-web</groupId>
|
||||||
|
<artifactId>emqx-web</artifactId>
|
||||||
|
<version>0.0.1</version>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>8.0.16</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-dbutils</groupId>
|
||||||
|
<artifactId>commons-dbutils</artifactId>
|
||||||
|
<version>1.7</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-dbcp</groupId>
|
||||||
|
<artifactId>commons-dbcp</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-pool</groupId>
|
||||||
|
<artifactId>commons-pool</artifactId>
|
||||||
|
<version>1.6</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.servlet</groupId>
|
||||||
|
<artifactId>jakarta.servlet-api</artifactId>
|
||||||
|
<version>5.0.0</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/reousrce</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
<version>3.2.3</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.emqx.dao;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import org.apache.commons.dbutils.QueryRunner;
|
||||||
|
import org.apache.commons.dbutils.handlers.ScalarHandler;
|
||||||
|
|
||||||
|
import com.emqx.util.EmqxDatabaseUtil;
|
||||||
|
|
||||||
|
public class AuthDAO {
|
||||||
|
|
||||||
|
public String getUserName(String userName) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select password from http_user where username='"+userName+"'";
|
||||||
|
String password =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClient(String clientid) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select password from http_user where clientid='"+clientid+"'";
|
||||||
|
String password =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserAccess(String userName) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select access from http_acl where username='"+userName+"'";
|
||||||
|
String access =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return access;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserTopic(String userName) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select topic from http_acl where username='"+userName+"'";
|
||||||
|
String topic =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return topic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClientAccess(String clientid) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select access from http_acl where clientid='"+clientid+"'";
|
||||||
|
String access =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return access;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClientTopic(String clientid) throws IOException, SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||||
|
String sql = "select topic from http_acl where clientid='"+clientid+"'";
|
||||||
|
String topic =runner.query(sql, new ScalarHandler<String>());
|
||||||
|
return topic;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.emqx.dao;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.apache.commons.dbcp.BasicDataSource;
|
||||||
|
import org.apache.commons.dbutils.QueryRunner;
|
||||||
|
import org.apache.commons.dbutils.handlers.ColumnListHandler;
|
||||||
|
import org.apache.commons.dbutils.handlers.ScalarHandler;
|
||||||
|
import org.apache.commons.dbutils.handlers.columns.StringColumnHandler;
|
||||||
|
|
||||||
|
|
||||||
|
public class DBUtilsTest {
|
||||||
|
|
||||||
|
public static void main(String args[]) throws FileNotFoundException, IOException, SQLException {
|
||||||
|
Properties property = new Properties();//流文件
|
||||||
|
|
||||||
|
property.load(DBUtilsTest.class.getClassLoader().getResourceAsStream("database.properties"));
|
||||||
|
|
||||||
|
BasicDataSource dataSource = new BasicDataSource();
|
||||||
|
dataSource.setDriverClassName(property.getProperty("jdbc.driver"));
|
||||||
|
dataSource.setUrl(property.getProperty("jdbc.url"));
|
||||||
|
dataSource.setUsername(property.getProperty("jdbc.username"));
|
||||||
|
dataSource.setPassword(property.getProperty("jdbc.password"));
|
||||||
|
|
||||||
|
// 初始化连接数 if(initialSize!=null)
|
||||||
|
//dataSource.setInitialSize(Integer.parseInt(initialSize));
|
||||||
|
|
||||||
|
// 最小空闲连接 if(minIdle!=null)
|
||||||
|
//dataSource.setMinIdle(Integer.parseInt(minIdle));
|
||||||
|
|
||||||
|
// 最大空闲连接 if(maxIdle!=null)
|
||||||
|
//dataSource.setMaxIdle(Integer.parseInt(maxIdle));
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner(dataSource);
|
||||||
|
String sql="select username from mqtt_user where id=1";
|
||||||
|
String result = runner.query(sql, new ScalarHandler<String>());
|
||||||
|
|
||||||
|
System.out.println(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
package com.emqx.servlet;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import com.emqx.dao.AuthDAO;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.http.HttpServlet;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
public class AclServlet extends HttpServlet {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
doPost(req, resp);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
String clientid = req.getParameter("clientid");
|
||||||
|
String username = req.getParameter("username");
|
||||||
|
String access = req.getParameter("access");
|
||||||
|
String topic = req.getParameter("topic");
|
||||||
|
//String password = req.getParameter("password");
|
||||||
|
|
||||||
|
//step0: password is not null, or not pass.
|
||||||
|
|
||||||
|
AuthDAO dao = new AuthDAO();
|
||||||
|
try {
|
||||||
|
//step1: check username access&topic
|
||||||
|
if(username != null) {
|
||||||
|
String access_1 = dao.getUserAccess(username);
|
||||||
|
String topic_1 = dao.getUserTopic(username);
|
||||||
|
|
||||||
|
if(access.equals(access_1)) {
|
||||||
|
if(topic.equals(topic_1)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(clientid != null){
|
||||||
|
String access_2 = dao.getClientAccess(clientid);
|
||||||
|
String topic_2 = dao.getClientTopic(clientid);
|
||||||
|
if(access.equals(access_2)) {
|
||||||
|
if(topic.equals(topic_2)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else {//step2.1: username password is not match, then check clientid password
|
||||||
|
if(clientid != null){
|
||||||
|
String access_3 = dao.getClientAccess(clientid);
|
||||||
|
String topic_3 = dao.getClientTopic(clientid);
|
||||||
|
if(access.equals(access_3)) {
|
||||||
|
if(topic.equals(topic_3)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else {//step2.2: username is null, then check clientid password
|
||||||
|
if(clientid != null){
|
||||||
|
String access_4 = dao.getClientAccess(clientid);
|
||||||
|
String topic_4 = dao.getClientTopic(clientid);
|
||||||
|
if(access.equals(access_4)) {
|
||||||
|
if(topic.equals(topic_4)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.emqx.servlet;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import com.emqx.dao.AuthDAO;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.http.HttpServlet;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
public class AuthServlet extends HttpServlet {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
doPost(req, resp);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
String clientid = req.getParameter("clientid");
|
||||||
|
String username =req.getParameter("username");
|
||||||
|
String password = req.getParameter("password");
|
||||||
|
|
||||||
|
//step0: password is not null, or not pass.
|
||||||
|
if(password == null) {
|
||||||
|
resp.setStatus(400);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AuthDAO dao = new AuthDAO();
|
||||||
|
try {
|
||||||
|
//step1: check username password
|
||||||
|
if(username != null) {
|
||||||
|
String password_d = dao.getUserName(username);
|
||||||
|
|
||||||
|
if(password.equals(password_d)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
//200
|
||||||
|
}else {//step2.1: username password is not match, then check clientid password
|
||||||
|
if(clientid != null){
|
||||||
|
String password_c = dao.getClient(clientid);
|
||||||
|
if(password.equals(password_c)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else {//step2.2: username is null, then check clientid password
|
||||||
|
if(clientid != null){
|
||||||
|
String password_c = dao.getClient(clientid);
|
||||||
|
if(password.equals(password_c)) {
|
||||||
|
resp.setStatus(200);
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
resp.setStatus(400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.emqx.util;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
import org.apache.commons.dbcp.BasicDataSource;
|
||||||
|
|
||||||
|
import com.emqx.dao.DBUtilsTest;
|
||||||
|
|
||||||
|
public class EmqxDatabaseUtil {
|
||||||
|
|
||||||
|
public static DataSource getDataSource() throws IOException {
|
||||||
|
Properties property = new Properties();// 流文件
|
||||||
|
|
||||||
|
property.load(EmqxDatabaseUtil.class.getClassLoader().getResourceAsStream("database.properties"));
|
||||||
|
|
||||||
|
BasicDataSource dataSource = new BasicDataSource();
|
||||||
|
dataSource.setDriverClassName(property.getProperty("jdbc.driver"));
|
||||||
|
dataSource.setUrl(property.getProperty("jdbc.url"));
|
||||||
|
dataSource.setUsername(property.getProperty("jdbc.username"));
|
||||||
|
dataSource.setPassword(property.getProperty("jdbc.password"));
|
||||||
|
|
||||||
|
return dataSource;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
jdbc.driver= com.mysql.jdbc.Driver
|
||||||
|
jdbc.url= jdbc:mysql://mysql_server:3306/mqtt
|
||||||
|
jdbc.username= root
|
||||||
|
jdbc.password= public
|
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Class-Path:
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://JAVA.sun.com/xml/ns/javaee"
|
||||||
|
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||||
|
id="WebApp_ID" version="2.5">
|
||||||
|
<display-name>emqx-web</display-name>
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>Auth</servlet-name>
|
||||||
|
<servlet-class>com.emqx.servlet.AuthServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>Acl</servlet-name>
|
||||||
|
<servlet-class>com.emqx.servlet.AclServlet</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>Auth</servlet-name>
|
||||||
|
<url-pattern>/auth</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>Acl</servlet-name>
|
||||||
|
<url-pattern>/acl</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
<welcome-file-list>
|
||||||
|
<welcome-file>index.html</welcome-file>
|
||||||
|
<welcome-file>index.htm</welcome-file>
|
||||||
|
<welcome-file>index.jsp</welcome-file>
|
||||||
|
<welcome-file>default.html</welcome-file>
|
||||||
|
<welcome-file>default.htm</welcome-file>
|
||||||
|
<welcome-file>default.jsp</welcome-file>
|
||||||
|
</welcome-file-list>
|
||||||
|
</web-app>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>love</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
It's lucky, jiabanxiang.
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -120,3 +120,302 @@ jobs:
|
||||||
with:
|
with:
|
||||||
name: jmeter_logs
|
name: jmeter_logs
|
||||||
path: ./jmeter_logs
|
path: ./jmeter_logs
|
||||||
|
|
||||||
|
mysql:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
mysql_tag:
|
||||||
|
- 5.7
|
||||||
|
- 8
|
||||||
|
mysql_type:
|
||||||
|
- mysql_auth_acl
|
||||||
|
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: emqx-docker-image-zip
|
||||||
|
path: /tmp
|
||||||
|
- name: load docker image
|
||||||
|
env:
|
||||||
|
version: ${{ needs.build.outputs.version }}
|
||||||
|
run: |
|
||||||
|
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||||
|
docker load < /tmp/emqx-docker-${version}
|
||||||
|
- name: docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
env:
|
||||||
|
TARGET: emqx/emqx
|
||||||
|
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||||
|
MYSQL_TAG: ${{ matrix.mysql_tag }}
|
||||||
|
run: |
|
||||||
|
docker-compose \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-mysql-tls.yaml \
|
||||||
|
up -d --build
|
||||||
|
- name: wait docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
run: |
|
||||||
|
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||||
|
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||||
|
sleep 5;
|
||||||
|
done
|
||||||
|
while [ $(docker ps -a --filter name=client --filter exited=0 | wc -l) \
|
||||||
|
!= $(docker ps -a --filter name=client | wc -l) ]; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
docker ps -a
|
||||||
|
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||||
|
echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql) >> $GITHUB_ENV
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: emqx/emqx-fvt
|
||||||
|
ref: integration_test_suites
|
||||||
|
path: scripts
|
||||||
|
- uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||||
|
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||||
|
architecture: x64 # (x64 or x86) - defaults to x64
|
||||||
|
- name: install jmeter
|
||||||
|
timeout-minutes: 10
|
||||||
|
env:
|
||||||
|
JMETER_VERSION: 5.3
|
||||||
|
run: |
|
||||||
|
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||||
|
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||||
|
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||||
|
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||||
|
- name: install jmeter plugin
|
||||||
|
run: |
|
||||||
|
wget --no-verbose -O "/opt/jmeter/lib/mysql-connector-java-8.0.16.jar" https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
|
||||||
|
- name: run jmeter
|
||||||
|
run: |
|
||||||
|
/opt/jmeter/bin/jmeter.sh \
|
||||||
|
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||||
|
-t scripts/.ci/automate-test-suite/${{ matrix.mysql_type }}.jmx \
|
||||||
|
-Droute="apps/emqx_auth_mysql/test/emqx_auth_mysql_SUITE_data" \
|
||||||
|
-Dmysql_ip=$MYSQL_IP \
|
||||||
|
-Demqx_ip=$HAPROXY_IP \
|
||||||
|
-Ddbname="mqtt" \
|
||||||
|
-Dmysql_user="ssluser" \
|
||||||
|
-Ddb_user="root" \
|
||||||
|
-Dmysql_pwd="public" \
|
||||||
|
-Dconfig_path="/tmp/etc" \
|
||||||
|
-Ddocker_path=".ci/docker-compose-file" \
|
||||||
|
-l jmeter_logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.jtl \
|
||||||
|
-j jmeter_logs/logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.log
|
||||||
|
- name: check logs
|
||||||
|
run: |
|
||||||
|
if cat jmeter_logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||||
|
echo "check logs filed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: jmeter_logs
|
||||||
|
path: ./jmeter_logs
|
||||||
|
|
||||||
|
|
||||||
|
postgresql:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
pgsql_type:
|
||||||
|
- pgsql_auth_acl
|
||||||
|
pgsql_tag:
|
||||||
|
- 9
|
||||||
|
- 10
|
||||||
|
- 11
|
||||||
|
- 12
|
||||||
|
- 13
|
||||||
|
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: emqx-docker-image-zip
|
||||||
|
path: /tmp
|
||||||
|
- name: load docker image
|
||||||
|
env:
|
||||||
|
version: ${{ needs.build.outputs.version }}
|
||||||
|
run: |
|
||||||
|
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||||
|
docker load < /tmp/emqx-docker-${version}
|
||||||
|
- name: docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
env:
|
||||||
|
TARGET: emqx/emqx
|
||||||
|
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||||
|
PGSQL_TAG: ${{ matrix.pgsql_tag }}
|
||||||
|
run: |
|
||||||
|
docker-compose \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-emqx-broker-cluster.yaml \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-pgsql-tls.yaml \
|
||||||
|
up -d --build
|
||||||
|
- name: wait docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
run: |
|
||||||
|
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||||
|
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||||
|
sleep 5;
|
||||||
|
done
|
||||||
|
docker ps -a
|
||||||
|
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||||
|
echo PGSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pgsql) >> $GITHUB_ENV
|
||||||
|
echo CONFIG_PATH=$(docker inspect -f '{{ range .Mounts }}{{ if eq .Name "docker-compose-file_etc" }}{{ .Source }}{{ end }}{{ end }}' node1.emqx.io) >> $GITHUB_ENV
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: emqx/emqx-fvt
|
||||||
|
ref: integration_test_suites
|
||||||
|
path: scripts
|
||||||
|
- uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||||
|
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||||
|
architecture: x64 # (x64 or x86) - defaults to x64
|
||||||
|
- name: install jmeter
|
||||||
|
timeout-minutes: 10
|
||||||
|
env:
|
||||||
|
JMETER_VERSION: 5.3
|
||||||
|
run: |
|
||||||
|
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||||
|
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||||
|
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||||
|
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||||
|
- name: install jmeter plugin
|
||||||
|
run: |
|
||||||
|
wget --no-verbose -O "/opt/jmeter/lib/postgresql-42.2.18.jar" https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.18/postgresql-42.2.18.jar
|
||||||
|
- name: run jmeter
|
||||||
|
run: |
|
||||||
|
sudo /opt/jmeter/bin/jmeter.sh \
|
||||||
|
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||||
|
-t scripts/.ci/automate-test-suite/${{ matrix.pgsql_type }}.jmx \
|
||||||
|
-Droute="apps/emqx_auth_pgsql/test/emqx_auth_pgsql_SUITE_data" \
|
||||||
|
-Dca_name="ca.pem" \
|
||||||
|
-Dkey_name="client-key.pem" \
|
||||||
|
-Dcert_name="client-cert.pem" \
|
||||||
|
-Ddb_ip=$PGSQL_IP \
|
||||||
|
-Dpgsql_ip=$PGSQL_IP \
|
||||||
|
-Demqx_ip=$HAPROXY_IP \
|
||||||
|
-Dpgsql_user="root" \
|
||||||
|
-Dpgsql_pwd="public" \
|
||||||
|
-Ddbname="mqtt" \
|
||||||
|
-Dpgsql_db="mqtt" \
|
||||||
|
-Dport="5432" \
|
||||||
|
-Dconfig_path=$CONFIG_PATH \
|
||||||
|
-Ddocker_path=".ci/docker-compose-file" \
|
||||||
|
-l jmeter_logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.jtl \
|
||||||
|
-j jmeter_logs/logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.log
|
||||||
|
- name: check logs
|
||||||
|
run: |
|
||||||
|
if cat jmeter_logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||||
|
echo "check logs filed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: jmeter_logs
|
||||||
|
path: ./jmeter_logs
|
||||||
|
|
||||||
|
http:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: emqx-docker-image-zip
|
||||||
|
path: /tmp
|
||||||
|
- name: load docker image
|
||||||
|
env:
|
||||||
|
version: ${{ needs.build.outputs.version }}
|
||||||
|
run: |
|
||||||
|
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||||
|
docker load < /tmp/emqx-docker-${version}
|
||||||
|
- name: docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
env:
|
||||||
|
TARGET: emqx/emqx
|
||||||
|
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||||
|
MYSQL_TAG: 8
|
||||||
|
run: |
|
||||||
|
docker-compose \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-emqx-broker-cluster.yaml \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-mysql-tcp.yaml \
|
||||||
|
-f .ci/docker-compose-file/docker-compose-enterprise-tomcat-tcp.yaml \
|
||||||
|
up -d --build
|
||||||
|
- name: wait docker compose up
|
||||||
|
timeout-minutes: 5
|
||||||
|
run: |
|
||||||
|
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||||
|
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||||
|
sleep 5;
|
||||||
|
done
|
||||||
|
docker ps -a
|
||||||
|
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||||
|
echo HTTP_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' Tomcat) >> $GITHUB_ENV
|
||||||
|
echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql) >> $GITHUB_ENV
|
||||||
|
echo CONFIG_PATH=$(docker inspect -f '{{ range .Mounts }}{{ if eq .Name "docker-compose-file_etc" }}{{ .Source }}{{ end }}{{ end }}' node1.emqx.io) >> $GITHUB_ENV
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
repository: emqx/emqx-fvt
|
||||||
|
ref: integration_test_suites
|
||||||
|
path: scripts
|
||||||
|
- uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||||
|
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||||
|
architecture: x64 # (x64 or x86) - defaults to x64
|
||||||
|
- name: install jmeter
|
||||||
|
timeout-minutes: 10
|
||||||
|
env:
|
||||||
|
JMETER_VERSION: 5.3
|
||||||
|
run: |
|
||||||
|
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||||
|
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||||
|
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||||
|
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||||
|
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||||
|
- name: install jmeter plugin
|
||||||
|
run: |
|
||||||
|
wget --no-verbose -O "/opt/jmeter/lib/mysql-connector-java-8.0.16.jar" https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
|
||||||
|
- name: run jmeter
|
||||||
|
run: |
|
||||||
|
sudo /opt/jmeter/bin/jmeter.sh \
|
||||||
|
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||||
|
-t scripts/.ci/automate-test-suite/http_auth_acl.jmx \
|
||||||
|
-Dmysql_ip=$MYSQL_IP \
|
||||||
|
-Demqx_ip=$HAPROXY_IP \
|
||||||
|
-Dweb_server_ip=$HTTP_IP \
|
||||||
|
-Dconfig_path=$CONFIG_PATH \
|
||||||
|
-Ddocker_path=".ci/docker-compose-file" \
|
||||||
|
-l jmeter_logs/http_auth_acl.jtl \
|
||||||
|
-j jmeter_logs/logs/http_auth_acl.log
|
||||||
|
- name: check logs
|
||||||
|
run: |
|
||||||
|
if cat jmeter_logs/http_auth_acl.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||||
|
echo "check logs filed"
|
||||||
|
sudo cat /var/lib/docker/volumes/docker-compose-file_etc/_data/emqx.conf
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: jmeter_logs
|
||||||
|
path: ./jmeter_logs
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIID1zCCAb8CCQC/+qKgZd+m/DANBgkqhkiG9w0BAQsFADA1MRMwEQYDVQQKDApS
|
MIID1zCCAb8CCQC/+qKgZd+m/jANBgkqhkiG9w0BAQsFADA1MRMwEQYDVQQKDApS
|
||||||
ZWRpcyBUZXN0MR4wHAYDVQQDDBVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjAx
|
ZWRpcyBUZXN0MR4wHAYDVQQDDBVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjEx
|
||||||
MDI5MDEzNDE2WhcNMjExMDI5MDEzNDE2WjAmMRMwEQYDVQQKDApSZWRpcyBUZXN0
|
MTAxMDgwMDU1WhcNMzExMDMwMDgwMDU1WjAmMRMwEQYDVQQKDApSZWRpcyBUZXN0
|
||||||
MQ8wDQYDVQQDDAZTZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
MQ8wDQYDVQQDDAZTZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||||
AQDSs3bQ9sYi2AhFuHU75Ryk1HHSgfzA6pQAJilmJdTy0s5vyiWe1HQJaWkMcS5V
|
AQDSs3bQ9sYi2AhFuHU75Ryk1HHSgfzA6pQAJilmJdTy0s5vyiWe1HQJaWkMcS5V
|
||||||
GVzGMK+c+OBqtXtDDninL3betg1YPMjSCOjPMOTC1H9K7+effwf7Iwpnw9Zro8mb
|
GVzGMK+c+OBqtXtDDninL3betg1YPMjSCOjPMOTC1H9K7+effwf7Iwpnw9Zro8mb
|
||||||
TEmMslIYhhcDedzT9Owli4QAgbgTn4l1BYuKX9CLrrKFtnr21miKu3ydViy9q7T1
|
TEmMslIYhhcDedzT9Owli4QAgbgTn4l1BYuKX9CLrrKFtnr21miKu3ydViy9q7T1
|
||||||
pib3eigvAyk7X2fadHFArGEttsXrD6cetPPkSF/1OLWNlqzUKXzhSyrBXzO44Kks
|
pib3eigvAyk7X2fadHFArGEttsXrD6cetPPkSF/1OLWNlqzUKXzhSyrBXzO44Kks
|
||||||
fwR/EpTiES9g4dNOL2wvKS/YE1fNKhiCENrNxTXQo1l0yOdm2+MeyOeHFzRuS0b/
|
fwR/EpTiES9g4dNOL2wvKS/YE1fNKhiCENrNxTXQo1l0yOdm2+MeyOeHFzRuS0b/
|
||||||
+uGDFOPPi04KXeO6dQ5olBCPAgMBAAEwDQYJKoZIhvcNAQELBQADggIBADn0E2vG
|
+uGDFOPPi04KXeO6dQ5olBCPAgMBAAEwDQYJKoZIhvcNAQELBQADggIBALRSylnk
|
||||||
iQWe8/I7VbBdPhPNupVNcLvew10eIHxY2g5vSruCSVRQTgk8itVMRmDQxbb7gdDW
|
JJhEFRniuQ+H1kbfZlVOqnSqGkm38r8X76dnYRZfkFlxVzU2q5HPnSdiL9D3JrrH
|
||||||
jnCRbxykxbLjM9iCRljnOCsIcTi7qO7JRl8niV8dtEpPOs9lZxEdNXjIV1iZoWf3
|
P7wIA5zjr76zK7GPJjkRExRZy5sTLSpsGp7YIGAZ19J3KsDVHSOvPTl38c6L217a
|
||||||
arBbPQSyQZvTQHG6qbFnyCdMMyyXGGvEPGQDaBiKH+Ko1qeAbCi0zupChYvxmtZ8
|
YzPeQL5IrrW55URmA5PZFu3lsm9z7CNguw1wn2pCNNB+r/cRl4iELehZJT891CQe
|
||||||
hSTPlMFezDT9bKoNY0pkJSELfokEPU/Pn6Lz/NVbdzmCMjVa/xmF3s31g+DGhz95
|
nV9a1YfHY/DkDoMnmrKqmeYdvje8n1uSqTnIV/wNiASU36ztxxD8ZmwprxxbjLSs
|
||||||
4AyOnCr6o0aydPVVV3pB/BCezNXPUxpp53BG0w/K2f2DnKYCvGvJbqDAaJ8bG/J1
|
aBjBvsR/eBHbWrz2W1dc5ppgGLuCkiEKmh6/IWX/ZQqyBCzZkmFNiTs8QiLtmoC4
|
||||||
EFSOmwobdwVxJz3KNubmo1qJ6xOl/YT7yyqPRQRM1SY8nZW+YcoJSZjOe8wJVlob
|
2bXkPVSyq5wT7eisGbRdcY9vGDtoW/WZOmFVA4XEDVx8M9fb4speHwoHRuTfWsA0
|
||||||
d0bOwN1C3HQwomyMWes187bEQP6Y36HuEbR1fK8yIOzGsGDKRFAFwQwMgw2M91lr
|
6Y8P9XpYjG2tQoPpxrZaRshZ+SiHWPov7cAvY34szFePfTWR8gzbL6SgpDz30ceh
|
||||||
EJIP5NRD3OZRuiYDiVfVhDZDaNahrAMZUcPCgeCAwc4YG6Gp2sDtdorOl4kIJYWE
|
XIuTArOMQMhfWHn3NaOc6hlkRsoviNhc5IXR9VjIdaNJCamEoLVNWZsvHJCUiP10
|
||||||
BbBZ0Jplq9+g6ciu5ChjAW8iFl0Ae5U24MxPGXnrxiRF4WWxLeZMVLXLDvlPqReD
|
yx+9/0a9vI6G+i8oKQ+eKJsfP8Ikoiolf7vU6M+/1kF+sSMxGjFwkMCxLgZB67+a
|
||||||
CHII5ifyvGEt5+RhqtZC/L+HimL+5wQgOlntqhUdLb6yWRz7YW37PFMnUXU3MXe9
|
m9kw83sVfykWLQ3eRwhdBz0/JiiYtDbbtyqgs3kPhJs9SGZUhDc/7R0lTWf4zxoJ
|
||||||
uY7m73ZLluXiLojcZxU2+cx89u5FOJxrYtrj
|
l3y7pn/3nJvYrGX7uCBbWPUuqWeHVM9Ip6AZ
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
Loading…
Reference in New Issue