mirror of
https://github.com/mailscope/kumomta.git
synced 2026-09-07 11:08:56 +00:00
62 lines
1.5 KiB
Markdown
62 lines
1.5 KiB
Markdown
# `kumo.cidr.make_map([{MAP}])`
|
|
|
|
Create a new *CIDR map*, optionally seeded with an initial set of
|
|
key/value pairs.
|
|
|
|
A CIDR map is a dictionary type that allows resolving the value
|
|
associated with an IP address key, supporting matches based on CIDR blocks
|
|
in the mapping.
|
|
|
|
For simple inputs, the mapping behaves as you might expect for a dictionary
|
|
type:
|
|
|
|
```lua
|
|
local cmap = kumo.cidr.make_map()
|
|
cmap['127.0.0.1'] = 'bar'
|
|
assert(cmap['127.0.0.1'] == 'bar')
|
|
assert(cmap['not.set'] == nil)
|
|
```
|
|
|
|
you can define keys based on net blocks using CIDR notation:
|
|
|
|
```lua
|
|
local cmap = kumo.cidr.make_map()
|
|
|
|
cmap['10.0.0.0/24'] = '10. block'
|
|
|
|
-- any address in that /24 will return the mapped value
|
|
assert(cmap['10.0.0.1'] == '10. block')
|
|
assert(cmap['10.0.0.42'] == '10. block')
|
|
|
|
-- other addresses won't
|
|
assert(cmap['100.0.0.100'] == nil)
|
|
```
|
|
|
|
You may seed an initial value from a pre-existing lua table:
|
|
|
|
```lua
|
|
local cmap = kumo.cidr.make_map {
|
|
['127.0.0.0/24'] = 'loopback',
|
|
['10.0.0.0/24'] = 'lan',
|
|
}
|
|
|
|
-- and mutate the table after is has been constructed:
|
|
cmap['4.2.4.2'] = 4242
|
|
```
|
|
|
|
Keys to the map are IPv4 or IPv6 addresses, but for convenience, domain
|
|
literals and IP and port number combinations such as `"127.0.0.1:25"`,
|
|
`"[127.0.0.1]"` `"[::1]:25"` are understood to facilitate more ergonomic use in
|
|
policy:
|
|
|
|
```lua
|
|
local SOURCE_CLASSIFICATION = kumo.cidr.make_map {
|
|
['127.0.0.0/24'] = 'loopback',
|
|
['10.0.0.0/24'] = 'lan',
|
|
}
|
|
|
|
kumo.on('smtp_server_message_received', function(msg)
|
|
local source_type = SOURCE_CLASSIFICATION[msg:get_meta 'received_from']
|
|
end)
|
|
```
|