94 lines
4.0 KiB
Python
94 lines
4.0 KiB
Python
# pyruse is intended as a replacement to both fail2ban and epylog
|
||
# Copyright © 2017–2018 Y. Gablin
|
||
# Full licensing information in the LICENSE file, or gnu.org/licences/gpl-3.0.txt if the file is missing.
|
||
from datetime import datetime
|
||
from pyruse import dnat
|
||
from pyruse.actions.action_dnatCapture import Action
|
||
|
||
def whenNoSaddrThenError():
|
||
try:
|
||
Action(dict(addr=1))
|
||
except Exception:
|
||
return
|
||
assert False, "An exception should be raised when saddr is absent"
|
||
|
||
def whenNoAddrNorAddrvalueThenError():
|
||
try:
|
||
Action(dict(saddr=1))
|
||
except Exception:
|
||
return
|
||
assert False, "An exception should be raised when addr and addrValue are absent"
|
||
|
||
def whenNoAddrButAddrvalueThenNoError():
|
||
Action(dict(saddr=1, addrValue=1))
|
||
|
||
def whenNoAddrvalueButAddrThenNoError():
|
||
Action(dict(saddr=1, addr=1))
|
||
|
||
def whenNoKeepsecondsThen6bits():
|
||
a = Action(dict(saddr=1, addr=1))
|
||
assert a.keepBits == 6, "Default keepSeconds (63) should be on 6 bits, not " + str(a.keepBits)
|
||
|
||
def whenKeepsecondsIs150Then8bits():
|
||
a = Action(dict(saddr=1, addr=1, keepSeconds=150))
|
||
assert a.keepBits == 8, "150 for keepSeconds should be on 8 bits, not " + str(a.keepBits)
|
||
|
||
def whenInsufficientEntryThenNoMapping():
|
||
dnat._mappings = []
|
||
Action({"saddr": "sa", "addrValue": "x"}).act({"__REALTIME_TIMESTAMP": datetime(2018,1,1)})
|
||
assert dnat._mappings == [], "Got:\n" + str(dnat._mappings) + "\ninstead of []"
|
||
|
||
def whenFieldAndOrValueThenCheckMapping(spec, entryWithAddr, entryWithDAddr, expect):
|
||
dnat._mappings = []
|
||
|
||
# specify the Action
|
||
spec.update({"saddr": "sa"})
|
||
|
||
# prepare the entry
|
||
entry = {
|
||
"__REALTIME_TIMESTAMP": datetime(2018,1,1),
|
||
"sa": "vsa", "sp": "vsp"}
|
||
if entryWithAddr:
|
||
entry.update({"a": "va", "p": "vp"})
|
||
if entryWithDAddr:
|
||
entry.update({"da": "vda", "dp": "vdp"})
|
||
|
||
# run
|
||
Action(spec).act(entry)
|
||
|
||
# check the result
|
||
expect.update({"bits": 6, "time": 23668144, "saddr": "vsa"})
|
||
assert dnat._mappings == [expect], "Got:\n" + str(dnat._mappings) + "\ninstead of:\n" + str([expect])
|
||
|
||
def unitTests():
|
||
whenNoSaddrThenError()
|
||
whenNoAddrNorAddrvalueThenError()
|
||
whenNoAddrButAddrvalueThenNoError()
|
||
whenNoAddrvalueButAddrThenNoError()
|
||
whenNoKeepsecondsThen6bits()
|
||
whenKeepsecondsIs150Then8bits()
|
||
whenInsufficientEntryThenNoMapping()
|
||
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": None, "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addrValue": "x"}, True, True,
|
||
{"sport": None, "addr": "x", "port": None, "daddr": None, "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "addrValue": "x"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": None, "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "addrValue": "x"}, False, True,
|
||
{"sport": None, "addr": "x", "port": None, "daddr": None, "dport": None})
|
||
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "daddr": "da"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": "vda", "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "daddrValue": "x"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": "x", "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "daddr": "da", "daddrValue": "x"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": "vda", "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "daddr": "da", "daddrValue": "x"}, True, False,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": "x", "dport": None})
|
||
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "port": "p"}, True, True,
|
||
{"sport": None, "addr": "va", "port": "vp", "daddr": None, "dport": None})
|
||
whenFieldAndOrValueThenCheckMapping({"addr": "a", "dport": "dp"}, True, True,
|
||
{"sport": None, "addr": "va", "port": None, "daddr": None, "dport": "vdp"})
|