Skip to content

Instantly share code, notes, and snippets.

@sourceperl
Last active November 17, 2022 17:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sourceperl/548b7cfb35629eceee7163e877bb62d7 to your computer and use it in GitHub Desktop.
Save sourceperl/548b7cfb35629eceee7163e877bb62d7 to your computer and use it in GitHub Desktop.
Basic ACL test script tool.
"""
A basic ACL test script tool.
Test under Python 3.10 on Windows 10 Entreprise (64 bits)
home: https://gist.github.com/sourceperl/548b7cfb35629eceee7163e877bb62d7
"""
import logging
import socket
class HostTest:
class TCP_STATUS:
OPEN = 1
CLOSE = 2
TIMEOUT = 3
def __init__(self, name: str, host: str, open_tcp: list|tuple = None, close_tcp: list|tuple = None, timeout: float = 5.0) -> None:
# public
self.name = name
self.host = host
self.open_tcp = open_tcp
self.close_tcp = close_tcp
self.timeout = timeout
def _tcp_state(self, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self.timeout)
sock.connect((self.host, port))
sock.close()
return self.TCP_STATUS.OPEN
except socket.timeout:
return self.TCP_STATUS.TIMEOUT
except socket.error:
return self.TCP_STATUS.CLOSE
def run(self):
logging.info(f'run test(s) for "{self.name}"')
# test TCP open asserts
if self.open_tcp:
for port in self.open_tcp:
test_str = f'Assert TCP open on "{self.name}" (socket "{self.host}:{port}")'
tcp_status = self._tcp_state(port)
if tcp_status == self.TCP_STATUS.OPEN:
logging.info(f'{test_str} OK')
elif tcp_status == self.TCP_STATUS.TIMEOUT:
logging.error(f'{test_str} ERROR (filtered)')
else:
logging.error(f'{test_str} ERROR (closed)')
# test TCP close asserts
if self.close_tcp:
for port in self.close_tcp:
test_str = f'Assert TCP close on "{self.name}" (socket "{self.host}:{port}")'
tcp_status = self._tcp_state(port)
if tcp_status == self.TCP_STATUS.CLOSE or tcp_status == self.TCP_STATUS.TIMEOUT:
logging.info(f'{test_str} OK')
else:
logging.error(f'{test_str} ERROR (open)')
if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s %(levelname)-8s %(message)s', level=logging.INFO)
logging.info('start net-audit')
# host test list
HostTest('Example domain srv', host='www.example.com', open_tcp=(80, 443), close_tcp=(81, )).run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment