4 个版本 (2 个重大更改)
0.3.2 | 2022年7月31日 |
---|---|
0.3.1 |
|
0.3.0 | 2019年12月22日 |
0.2.0 | 2018年12月25日 |
0.1.0 | 2018年11月27日 |
在 #compliance 中排名第 12
34KB
785 行
miss-demeanor
一个以插件接口设计的 webhook 驱动的执行器,用于审计合规性
为什么要用 miss-demeanor?
- 名字很聪明,Missy Elliott 也很好。
- miss-demeanor 高度并行化,并且由于它是用 Rust 编写的,因此类型系统为您处理了许多多线程相关的问题。它快速处理请求,无状态,并且专门设计来避免死锁。
- miss-demeanor 是可插拔的,因此您在这里是自己的工作流程的制作者。
- 插件接口灵活且简单。
- 看第 1 点,这仍然是最有力的理由。
构建 miss-demeanor
安装 Rust 工具链。说明可以在 这里 找到。
导航到 miss-demeanor/
并运行 cargo build --release
。您的可执行文件将位于 ./target/release/miss-demeanor
。
使用 miss-demeanor 中的 TLS
目前 miss-demeanor 使用的 TLS 库仅支持 PCKS12/DER 身份格式。这不是我的选择,我希望最终能够支持服务器的 PEM 身份。
要轻松生成用于测试的自签名证书,请运行
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365
openssl pkcs12 -export -out identity.pfx -inkey key.pem -in cert.pem
调用非常简单:提供您的 PKCS12 身份文件的路径,并使用环境变量 PKCS12_PASSWORD
提供密码。
配置格式
配置文件是用 TOML 编写的。
以下是一个带有一些注释说明的示例配置文件
trigger_type = "c_abi" # Can also be "interpreted"
[server]
server_type = "webhook" # Can also be "unix_socket"
listen_addr = "127.0.0.1:8080" # Must be in the format IP:PORT
use_tls = false # You probably want this on unless you are running it over localhost - must pass -f on CLI when this is enabled
# One server endpoint
[[server.endpoints]]
path = "/pr" # URL path
trigger_name = "github-pr" # Unique name
# Another server endpoint
[[server.endpoints]]
path = "/merged"
trigger_name = "github-merged"
# Plugins
[[triggers]]
name = "github-merged" # Unique name
plugin_path = "./example-plugins/golang/github-merged.so" # Path to C ABI compatible shared object (.so)
目标是声明性地公开服务器配置。配置文件控制有关服务器的一切 - 端点、监听地址、传输层、与每个端点关联的插件等。
编写插件
您如何实际上编写 miss-demeanor 的插件?首先查看 miss-demeanor/example-plugins/
以获取代码示例。
更长的答案是:插件可以是两种格式之一。
- 它可以是定义为任何动态库 (.so 文件在 Linux 上为例) 导出与 C ABI 兼容的函数符号(C ABI 兼容意味着它遵循 C 调用约定等 - 在二进制级别它与 C 二进制文件不可区分)名为
trigger
。要使用此功能,请将触发器类型设置为c_abi
。
C 函数签名
int trigger(void *http_request);
Rust 函数签名
fn trigger(http_request: *const libc::c_void) -> libc::c_int;
C 示例
#include "trigger.h"
#include <stdio.h>
int trigger(void *http_request) {
printf("%s\n", request_get_method(http_request));
return 0;
}
Golang 示例
// #include "trigger.h"
// #cgo LDFLAGS: -lmissdemeanor -ldl
import "C"
import "unsafe"
import "fmt"
//export trigger
func trigger(http_request unsafe.Pointer) C.int {
fmt.Println(C.GoString(C.request_get_method(http_request)))
}
func main {}
Rust 示例
use missdemeanor::CRequest;
#[no_mangle]
pub fn trigger(http_request: *const CRequest) -> libc::c_int {
let method = match unsafe { request.as_ref() }.get_method() {
Ok(b) => b,
Err(e) => {
println!("{}", e);
return 1;
},
};
println!("{}", method);
}
- 它可以是定义为具有开头 shebang 的解释脚本。要使用此功能,请将触发器类型设置为
interpreted
。
Python 示例
#!/usr/bin/python
import sys
method = sys.argv[1]
print(method)
依赖项
~10–23MB
~333K SLoC