Files
kumomta/DEVELOPERS.md
T
2023-03-27 17:36:02 -07:00

109 lines
3.2 KiB
Markdown

# kumomta
## Debugging/Tracing
This will launch the server using the policy defined in [simple_policy.lua](simple_policy.lua):
```
KUMOD_LOG=kumod=trace cargo run -p kumod -- --policy simple_policy.lua
```
## Tokio Console
You may use
[tokio-console](https://docs.rs/tokio-console/latest/tokio_console/) to
introspect the system. You must first start the server with tokio tracing
enabled:
```
KUMOD_LOG=tokio=trace,runtime=trace,info cargo run -p kumod -- --policy simple_policy.lua 2>/dev/null
```
Note the `2>/dev/null`; that is to prevent tracing log spew from hitting the terminal.
Then, in another window, run `tokio-console`.
The following environment variables influence the tokio console server that is
embedded into kumod:
| **Environment Variable** | **Purpose** | **Default Value** |
|----------------------------------|--------------------------------------------------------------|-------------------|
| `TOKIO_CONSOLE_RETENTION` | The duration of seconds to accumulate completed tracing data | 3600s (1h) |
| `TOKIO_CONSOLE_BIND` | a HOST:PORT description, such as `localhost:1234` | `127.0.0.1:6669` |
| `TOKIO_CONSOLE_PUBLISH_INTERVAL` | The duration to wait between sending updates to the console | 1000ms (1s) |
| `TOKIO_CONSOLE_RECORD_PATH` | The file path to save a recording | None |
## Metrics
If the http listener is enabled, the `/metrics` endpoint will return a set of metrics
for prometheus to scrape.
You can manually review them with curl:
```
$ curl 'http://127.0.0.1:8000/metrics'
# HELP connection_count connection_count
# TYPE connection_count gauge
connection_count{service="esmtp_listener"} 1
connection_count{service="smtp_client:(alt1|alt2|alt3|alt4)?.gmail-smtp-in.l.google.com."} 0
# HELP delayed_count delayed_count
# TYPE delayed_count gauge
delayed_count{queue="gmail.com"} 1
```
## Contributing
Ensure that the code is formatted before submitting a PR.
You need to install [StyLua](https://github.com/JohnnyMorganz/StyLua) to
format lua:
```bash
$ cargo install stylua --features lua54
```
Then you can format both the rust and the lua code:
```bash
$ rustup toolchain install nightly
$ make fmt
```
### Docker build
To build a lightweight alpine-based docker image:
```
$ ./docker/kumod/build-docker-image.sh
...
$ docker image ls kumomta/kumod
REPOSITORY TAG IMAGE ID CREATED SIZE
kumomta/kumod latest bbced15ff4d1 3 minutes ago 116MB
```
You can then run that image; this invocation mounts the kumo
src dir at `/config` and then the `KUMO_POLICY` environment
variable is used to override the default `/config/policy.lua`
path to use the SMTP sink policy script [sink.lua](sink.lua),
which will accept and discard all mail:
```
$ sudo docker run --rm -p 2025:25 \
-v .:/config \
--name kumo-sink \
--env KUMO_POLICY="/config/sink.lua" \
kumomta/kumod
```
### Fuzzing
Some components have fuzzer coverage. To run it, follow the setup from [the
Rust Fuzz Book](https://rust-fuzz.github.io/book/cargo-fuzz/setup.html)
Then:
```bash
$ cd crates/rfc5321/
$ cargo +nightly fuzz run parser
```