From 5f53de0c25de4b23d40661f7c4288f68874852cc Mon Sep 17 00:00:00 2001 From: Christian Manivong Date: Thu, 8 Oct 2026 09:26:21 +0200 Subject: [PATCH] feat: report listening sockets get_listening_sockets() in the shape of napalm-device-types' ListeningSocketsMixin, whose ss/cgroup reading is Linux's, and with its rule: read as root first, and without root when that brings nothing back, which the reading reports as `attributed: False`. - FreeBSD: `sockstat -46lq -P tcp,udp`, which sees every socket either way. - OpenBSD: `fstat -n` as root (the sockets nothing is connected to; port 0 is unbound), `netstat -an` without root, as fstat shows a user only their own processes; those sockets come without a process. - Addresses as ss prints them: `*` becomes 0.0.0.0 or :: by family, IPv6 without brackets, a zone (`fe80::1%lo0`) becomes the interface. One entry per socket, the first process holding it. No get_kernel_facts on purpose: KernelFactsMixin reports a Linux kernel's modules and CONFIG_ options, which a BSD kernel does not have. Fixtures recorded on the FreeBSD 15.1 and OpenBSD 7.9 VMs with test listeners on 127.0.0.1 and ::1 (NetOrk/netork#798). --- CHANGELOG.md | 3 + README.md | 12 + napalm_bsd/base.py | 32 ++ napalm_bsd/freebsd.py | 6 + napalm_bsd/openbsd.py | 8 + napalm_bsd/parse.py | 90 +++++ tests/fixtures/freebsd-vm/COMMANDS.txt | 2 + .../freebsd-vm/sockstat_46lq_P_tcp_udp.txt | 7 + .../sudo_sockstat_46lq_P_tcp_udp.txt | 7 + tests/fixtures/openbsd-vm/COMMANDS.txt | 3 + tests/fixtures/openbsd-vm/fstat_n.txt | 358 +++++++++++++++++ tests/fixtures/openbsd-vm/netstat_an.txt | 27 ++ tests/fixtures/openbsd-vm/sudo_fstat_n.txt | 367 ++++++++++++++++++ tests/test_drivers.py | 31 ++ tests/test_parse.py | 56 +++ 15 files changed, 1009 insertions(+) create mode 100644 tests/fixtures/freebsd-vm/sockstat_46lq_P_tcp_udp.txt create mode 100644 tests/fixtures/freebsd-vm/sudo_sockstat_46lq_P_tcp_udp.txt create mode 100644 tests/fixtures/openbsd-vm/fstat_n.txt create mode 100644 tests/fixtures/openbsd-vm/netstat_an.txt create mode 100644 tests/fixtures/openbsd-vm/sudo_fstat_n.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index b5ebf98..525184e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- `get_listening_sockets()` in the shape of `ListeningSocketsMixin`: FreeBSD + through `sockstat`, OpenBSD through `fstat` as root and `netstat -an` + without, which the reading reports as `attributed: False`. - `FreeBSDDriver` (`freebsd`) and `OpenBSDDriver` (`openbsd`) on a shared `BsdDriver`: SSH over exec channels (no PTY, real exit codes), root through `sudo -S` with the password on stdin. diff --git a/README.md b/README.md index 7c8f24a..be3fb9d 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,18 @@ over SSH, built on [napalm-device-types](https://git.netork.io/NAPALM/napalm-dev | `get_arp_table` | ✓ | ✓ | `arp -an` | | `get_lldp_neighbors` | `{}` | `{}` | no LLDP daemon in either base system | | `get_users`, `get_processes`, `get_cron_jobs` | ✓ | ✓ | `/etc/passwd`+`/etc/group`, `ps … lstart`, system crontab + `crontab -l` | +| `get_listening_sockets` | ✓ | ✓ | `sockstat -46lq` / `fstat -n` as root, `netstat -an` without | + +`get_listening_sockets` has the shape of napalm-device-types' +`ListeningSocketsMixin` (whose `ss`/cgroup reading is Linux's) and its rule: +read as root first, without root when that brings nothing back +(`attributed: False`). FreeBSD's `sockstat` sees every socket either way; +OpenBSD's `fstat` shows a user only their own processes, so without root the +sockets come from `netstat -an`, unnamed. + +There is deliberately no `get_kernel_facts`: `KernelFactsMixin` reports a +Linux kernel's modules and `CONFIG_*` options, which a BSD kernel does not +have, and `hasattr(driver, "get_kernel_facts")` has to stay truthful. Packages, services, updates (#799) and SNMP (#800) follow. diff --git a/napalm_bsd/base.py b/napalm_bsd/base.py index f6237ff..8b9c1a3 100644 --- a/napalm_bsd/base.py +++ b/napalm_bsd/base.py @@ -42,6 +42,10 @@ class BsdDriver(OSDriver): #: Prints ``key=value`` lines; see :meth:`_platform`. PLATFORM_COMMAND = "" ROUTES_COMMAND = "netstat -rn" + #: Lists listening sockets with their processes; as root it names them all. + LISTENING_COMMAND = "" + #: Lists them without root, if the command above needs it to see them all. + LISTENING_FALLBACK_COMMAND = "" #: lstart is five words; :func:`parse.processes` reads it as one field. PS_COMMAND = "ps -axww -o user,pid,ppid,%cpu,%mem,vsz,rss,stat,lstart,command" @@ -245,6 +249,34 @@ class BsdDriver(OSDriver): """Neither BSD ships an LLDP daemon in its base system.""" return {} + # -- listening sockets ------------------------------------------------------- + + def _parse_listening(self, output: str, *, attributed: bool) -> list[dict[str, Any]]: + """Parse :attr:`LISTENING_COMMAND` (*attributed*) or its fallback.""" + raise NotImplementedError + + def get_listening_sockets(self) -> dict[str, Any]: + """Every listening TCP and bound UDP socket, with the process holding it. + + Same shape as napalm-device-types' ``ListeningSocketsMixin`` -- whose + ``ss``/cgroup reading is Linux's -- and the same rule: read as root + first, and without root when that brings nothing back, which the + reading then says (``attributed: False``). BSD has no systemd units or + container IDs to name. + """ + privileged = self.run_command(self.LISTENING_COMMAND, privileged=True) + if privileged.exit_code == 0 and privileged.stdout.strip(): + return { + "attributed": True, + "sockets": self._parse_listening(privileged.stdout, attributed=True), + } + command = self.LISTENING_FALLBACK_COMMAND or self.LISTENING_COMMAND + plain = self.run_command(command, privileged=False) + return { + "attributed": False, + "sockets": self._parse_listening(plain.stdout, attributed=False), + } + # -- accounts, processes, cron ----------------------------------------------- def get_users(self) -> list[dict[str, Any]]: diff --git a/napalm_bsd/freebsd.py b/napalm_bsd/freebsd.py index f7b5db4..fbe4245 100644 --- a/napalm_bsd/freebsd.py +++ b/napalm_bsd/freebsd.py @@ -4,6 +4,7 @@ from __future__ import annotations from napalm_device_types import FingerprintRule +from napalm_bsd import parse from napalm_bsd.base import BsdDriver @@ -28,6 +29,11 @@ class FreeBSDDriver(BsdDriver): ) # -W: FreeBSD cuts long destinations to the column width otherwise. ROUTES_COMMAND = "netstat -rnW" + # sockstat names the process of every socket it can see; root sees them all. + LISTENING_COMMAND = "sockstat -46lq -P tcp,udp" + + def _parse_listening(self, output: str, *, attributed: bool) -> list[dict]: + return parse.sockstat(output) def _os_version(self) -> str: version = super()._os_version() diff --git a/napalm_bsd/openbsd.py b/napalm_bsd/openbsd.py index 5a69e90..831ec66 100644 --- a/napalm_bsd/openbsd.py +++ b/napalm_bsd/openbsd.py @@ -4,6 +4,7 @@ from __future__ import annotations from napalm_device_types import FingerprintRule +from napalm_bsd import parse from napalm_bsd.base import BsdDriver @@ -25,6 +26,13 @@ class OpenBSDDriver(BsdDriver): 'printf "%s=%s\\n" "$k" "$(sysctl -n hw.$k 2>/dev/null)"; done' ) + # fstat shows a user only their own processes; netstat shows every socket, unnamed. + LISTENING_COMMAND = "fstat -n" + LISTENING_FALLBACK_COMMAND = "netstat -an -f inet; netstat -an -f inet6" + + def _parse_listening(self, output: str, *, attributed: bool) -> list[dict]: + return parse.fstat_sockets(output) if attributed else parse.netstat_listening(output) + def _hardware(self) -> tuple[str, str, str]: hw = self._platform() return hw.get("vendor", ""), hw.get("product", ""), hw.get("serialno", "") diff --git a/napalm_bsd/parse.py b/napalm_bsd/parse.py index 154c6e3..261ce72 100644 --- a/napalm_bsd/parse.py +++ b/napalm_bsd/parse.py @@ -257,3 +257,93 @@ def boottime(text: str) -> Optional[int]: """``sysctl -n kern.boottime``: FreeBSD ``{ sec = N, … }``, OpenBSD ``N``.""" match = re.search(r"sec = (\d+)", text) or re.fullmatch(r"\s*(\d+)\s*", text) return int(match[1]) if match else None + + +def _socket( + proto: str, local: str, family: str, process: Optional[str], pid: Optional[int] +) -> Optional[dict[str, Any]]: + """A ListeningSocketDict from a local endpoint: ``*:22``, ``[::1]:25``, + ``127.0.0.1:25``, ``[fe80::1%lo0]:25`` (sockstat, fstat) or ``*.22``, + ``::1.25``, ``fe80::1%lo0.25`` (netstat).""" + if local.startswith("["): + address, _, port = local[1:].partition("]:") + elif local.count(":") == 1 or local.startswith("*:"): + address, _, port = local.rpartition(":") + else: + address, _, port = local.rpartition(".") + if not port.isdigit() or int(port) == 0: + return None + address, _, zone = address.partition("%") + if address == "*": + address = "0.0.0.0" if family == "4" else "::" + return { + "proto": proto, + "address": address, + "port": int(port), + "interface": zone or None, + "process": process, + "pid": pid, + "unit": None, + "container_id": None, + } + + +def _unique(sockets: list[Optional[dict[str, Any]]]) -> list[dict[str, Any]]: + """One entry per socket, the first process holding it, as ss reports it.""" + seen: set[tuple] = set() + result = [] + for s in sockets: + if s is None: + continue + key = (s["proto"], s["address"], s["port"], s["interface"]) + if key not in seen: + seen.add(key) + result.append(s) + return result + + +def sockstat(text: str) -> list[dict[str, Any]]: + """FreeBSD ``sockstat -46lq -P tcp,udp``: USER COMMAND PID FD PROTO LOCAL FOREIGN.""" + sockets = [] + for line in text.splitlines(): + words = line.split() + if len(words) < 7 or not words[2].isdigit() or words[4][:3] not in ("tcp", "udp"): + continue + proto, family = words[4][:3], words[4][3:] + sockets.append(_socket(proto, words[5], family, words[1], int(words[2]))) + return _unique(sockets) + + +def fstat_sockets(text: str) -> list[dict[str, Any]]: + """OpenBSD ``fstat -n``: the internet sockets nothing is connected to. + + ``USER CMD PID FD internet[6] stream|dgram tcp|udp [0xPCB] LOCAL [ARROW REMOTE]``; + a socket with an arrow is connected, one bound to port 0 is not bound. + """ + sockets = [] + for line in text.splitlines(): + words = line.split() + if len(words) < 8 or words[4] not in ("internet", "internet6"): + continue + if any(arrow in words for arrow in ("<--", "-->", "<->")): + continue + family = "6" if words[4] == "internet6" else "4" + sockets.append(_socket(words[6], words[-1], family, words[1], int(words[2]))) + return _unique(sockets) + + +def netstat_listening(text: str) -> list[dict[str, Any]]: + """``netstat -an``: listening TCP and bound UDP sockets, without their process.""" + sockets = [] + for line in text.splitlines(): + words = line.split() + if len(words) < 5 or words[0][:3] not in ("tcp", "udp"): + continue + proto, family = words[0][:3], "6" if words[0].endswith("6") else "4" + local, foreign = words[3], words[4] + if proto == "tcp" and words[-1] != "LISTEN": + continue + if proto == "udp" and foreign != "*.*": + continue + sockets.append(_socket(proto, local, family, None, None)) + return _unique(sockets) diff --git a/tests/fixtures/freebsd-vm/COMMANDS.txt b/tests/fixtures/freebsd-vm/COMMANDS.txt index 7ee60cf..4f0e81f 100644 --- a/tests/fixtures/freebsd-vm/COMMANDS.txt +++ b/tests/fixtures/freebsd-vm/COMMANDS.txt @@ -33,3 +33,5 @@ sysctl -n vm.loadavg which snmpd bsnmpd freebsd-update -h id +sockstat -46lq -P tcp,udp +sudo sockstat -46lq -P tcp,udp diff --git a/tests/fixtures/freebsd-vm/sockstat_46lq_P_tcp_udp.txt b/tests/fixtures/freebsd-vm/sockstat_46lq_P_tcp_udp.txt new file mode 100644 index 0000000..69ae207 --- /dev/null +++ b/tests/fixtures/freebsd-vm/sockstat_46lq_P_tcp_udp.txt @@ -0,0 +1,7 @@ +netork-user nc 1331 3 udp4 127.0.0.1:7779 *:* +netork-user nc 1329 3 tcp6 [::1]:7777 *:* +netork-user nc 1327 3 tcp4 127.0.0.1:7778 *:* +root sshd 1282 6 tcp6 *:22 *:* +root sshd 1282 7 tcp4 *:22 *:* +root syslogd 1052 6 udp6 *:514 *:* +root syslogd 1052 7 udp4 *:514 *:* diff --git a/tests/fixtures/freebsd-vm/sudo_sockstat_46lq_P_tcp_udp.txt b/tests/fixtures/freebsd-vm/sudo_sockstat_46lq_P_tcp_udp.txt new file mode 100644 index 0000000..69ae207 --- /dev/null +++ b/tests/fixtures/freebsd-vm/sudo_sockstat_46lq_P_tcp_udp.txt @@ -0,0 +1,7 @@ +netork-user nc 1331 3 udp4 127.0.0.1:7779 *:* +netork-user nc 1329 3 tcp6 [::1]:7777 *:* +netork-user nc 1327 3 tcp4 127.0.0.1:7778 *:* +root sshd 1282 6 tcp6 *:22 *:* +root sshd 1282 7 tcp4 *:22 *:* +root syslogd 1052 6 udp6 *:514 *:* +root syslogd 1052 7 udp4 *:514 *:* diff --git a/tests/fixtures/openbsd-vm/COMMANDS.txt b/tests/fixtures/openbsd-vm/COMMANDS.txt index 42b6223..b112acc 100644 --- a/tests/fixtures/openbsd-vm/COMMANDS.txt +++ b/tests/fixtures/openbsd-vm/COMMANDS.txt @@ -30,3 +30,6 @@ sysctl -n vm.loadavg which snmpd cat /etc/rc.conf.local id +sudo fstat -n +fstat -n +netstat -an -f inet; netstat -an -f inet6 diff --git a/tests/fixtures/openbsd-vm/fstat_n.txt b/tests/fixtures/openbsd-vm/fstat_n.txt new file mode 100644 index 0000000..c98b68f --- /dev/null +++ b/tests/fixtures/openbsd-vm/fstat_n.txt @@ -0,0 +1,358 @@ +USER CMD PID FD DEV INUM MODE R/W SZ|DV +netork-u fstat 91367 text 4,3 77827 100555 r 22504 +netork-u fstat 91367 wd 4,10 259200 40755 r 512 +netork-u fstat 91367 0 pipe 0x0 state: E +netork-u fstat 91367 1 pipe 0x0 state: +netork-u fstat 91367 2 pipe 0x0 state: +netork-u ksh 30507 text 4,0 9621 100555 r 810120 +netork-u ksh 30507 wd 4,10 259200 40755 r 512 +netork-u ksh 30507 0 pipe 0x0 state: E +netork-u ksh 30507 1 pipe 0x0 state: +netork-u ksh 30507 2 pipe 0x0 state: +netork-u sshd-session 50639 text 4,3 181663 100511 r 1037592 +netork-u sshd-session 50639 wd 4,0 2 40755 r 512 +netork-u sshd-session 50639 0 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 1 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 2 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 3 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 4 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 5 4,0 15794 20666 rw 2,2 +netork-u sshd-session 50639 6* unix stream 0x0 +netork-u sshd-session 50639 7* internet stream tcp 0x0 10.0.2.15:22 <-- 10.0.2.2:53400 +netork-u sshd-session 50639 9* unix stream 0x0 +netork-u sshd-session 50639 11 pipe 0x0 state: +netork-u sshd-session 50639 13 pipe 0x0 state: +root sshd-session 61474 text 4,3 181663 100511 r 1037592 +root sshd-session 61474 wd 4,0 2 40755 r 512 +root sshd-session 61474 0 4,0 15794 20666 rw 2,2 +root sshd-session 61474 1 4,0 15794 20666 rw 2,2 +root sshd-session 61474 2 4,0 15794 20666 rw 2,2 +root sshd-session 61474 3 4,0 15794 20666 rw 2,2 +root sshd-session 61474 4 4,0 15794 20666 rw 2,2 +root sshd-session 61474 5 4,0 15794 20666 rw 2,2 +root sshd-session 61474 7* internet stream tcp 0x0 10.0.2.15:22 <-- 10.0.2.2:53400 +root sshd-session 61474 8* unix stream 0x0 +root sshd-session 61474 9* unix stream 0x0 +netork-u nc 21021 text 4,3 77889 100555 r 46928 +netork-u nc 21021 wd 4,10 259200 40755 r 512 +netork-u nc 21021 0 4,0 15794 20666 r 2,2 +netork-u nc 21021 1 4,0 15794 20666 w 2,2 +netork-u nc 21021 2 4,0 15794 20666 w 2,2 +netork-u nc 21021 3* internet dgram udp 127.0.0.1:7779 +netork-u nc 28038 text 4,3 77889 100555 r 46928 +netork-u nc 28038 wd 4,10 259200 40755 r 512 +netork-u nc 28038 0 4,0 15794 20666 r 2,2 +netork-u nc 28038 1 4,0 15794 20666 w 2,2 +netork-u nc 28038 2 4,0 15794 20666 w 2,2 +netork-u nc 28038 3* internet6 stream tcp 0x0 [::1]:7777 +netork-u nc 55785 text 4,3 77889 100555 r 46928 +netork-u nc 55785 wd 4,10 259200 40755 r 512 +netork-u nc 55785 0 4,0 15794 20666 r 2,2 +netork-u nc 55785 1 4,0 15794 20666 w 2,2 +netork-u nc 55785 2 4,0 15794 20666 w 2,2 +netork-u nc 55785 3* internet stream tcp 0x0 127.0.0.1:7778 +root ctfconv 1042 text 4,3 77798 100555 r 74384 +root ctfconv 1042 wd 4,3 26000 40755 r 57344 +root ctfconv 1042 0 4,0 15794 20666 r 2,2 +root ctfconv 1042 1 4,3 28486 100644 w 281 +root ctfconv 1042 2 4,0 15794 20666 w 2,2 +root ctfconv 1042 3 4,3 28485 100770 rp 246442808 +root sh 19667 text 4,0 9621 100555 r 810120 +root sh 19667 wd 4,3 26000 40755 r 57344 +root sh 19667 0 4,0 15794 20666 r 2,2 +root sh 19667 1 4,3 28486 100644 w 281 +root sh 19667 2 4,0 15794 20666 wp 2,2 +root sh 19667 10 4,3 77799 100555 rep 1895 +root sh 19667 11 4,3 28486 100644 we 281 +root sh 63450 text 4,0 9621 100555 r 810120 +root sh 63450 wd 4,3 26000 40755 r 57344 +root sh 63450 0 4,0 15794 20666 r 2,2 +root sh 63450 1 4,3 28486 100644 w 281 +root sh 63450 2 4,3 28486 100644 w 281 +root make 70417 text 4,3 77880 100555 r 149416 +root make 70417 wd 4,3 26000 40755 r 57344 +root make 70417 0 4,0 15794 20666 r 2,2 +root make 70417 1 4,3 28486 100644 w 281 +root make 70417 2 4,3 28486 100644 w 281 +root getty 51429 text 4,3 181471 100555 r 27864 +root getty 51429 wd 4,0 2 40755 r 512 +root getty 51429 0 4,0 15618 20600 rw 8,0 +root getty 51429 1 4,0 15618 20600 rw 8,0 +root getty 51429 2 4,0 15618 20600 rw 8,0 +root ksh 80571 text 4,0 9621 100555 r 810120 +root ksh 80571 wd 4,3 26000 40755 r 57344 +root ksh 80571 0 4,0 15794 20666 r 2,2 +root ksh 80571 1 4,3 28486 100644 wp 281 +root ksh 80571 2 4,3 28486 100644 wp 281 +root ksh 80571 10 4,3 181493 100555 rep 2252 +root cron 92217 text 4,3 129625 100555 r 42888 +root cron 92217 wd 4,0 2 40755 r 512 +root cron 92217 0 4,0 15794 20666 rwp 2,2 +root cron 92217 1 4,0 15794 20666 rwp 2,2 +root cron 92217 2 4,0 15794 20666 rwp 2,2 +root cron 92217 3* unix stream 0x0 /var/run/cron.sock +root qemu-ga 31480 text 4,7 77866 100755 r 1025656 +root qemu-ga 31480 wd 4,0 2 40755 r 512 +root qemu-ga 31480 0 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 1 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 2 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 3 pipe 0x0 state: +root qemu-ga 31480 4 pipe 0x0 state: +root qemu-ga 31480 5 4,0 15621 20660 rwe 8,129 +root qemu-ga 31480 6 4,5 103717 100600 we 6 +_sndio sndiod 83428 text 4,3 77957 100555 r 124144 +_sndio sndiod 83428 wd 4,5 51840 40755 r 512 +_sndio sndiod 83428 root 4,5 51840 40755 r 512 +_sndio sndiod 83428 0 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 1 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 2 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 3* unix stream 0x0 +_sndio sndiod 83428 4* unix stream 0x0 /tmp/sndio/sock0 +_sndiop sndiod 41459 text 4,3 77957 100555 r 124144 +_sndiop sndiod 41459 wd 4,0 2 40755 r 512 +_sndiop sndiod 41459 0 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 1 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 2 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 4* unix stream 0x0 +_smtpd smtpd 25046 text 4,3 129738 100555 r 509536 +_smtpd smtpd 25046 wd 4,5 51840 40755 r 512 +_smtpd smtpd 25046 root 4,5 51840 40755 r 512 +_smtpd smtpd 25046 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 3* unix stream 0x0 +_smtpd smtpd 25046 4* unix stream 0x0 +_smtpd smtpd 25046 5* unix stream 0x0 +_smtpd smtpd 25046 6 kqueue 0x0 0 state: W +_smtpq smtpd 68285 text 4,3 129738 100555 r 509536 +_smtpq smtpd 68285 wd 4,5 233289 40711 r 512 +_smtpq smtpd 68285 root 4,5 233289 40711 r 512 +_smtpq smtpd 68285 0 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 1 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 2 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 3* unix stream 0x0 +_smtpq smtpd 68285 4* unix stream 0x0 +_smtpq smtpd 68285 5* unix stream 0x0 +_smtpq smtpd 68285 6* unix stream 0x0 +_smtpq smtpd 68285 7* unix stream 0x0 +_smtpq smtpd 68285 8 kqueue 0x0 0 state: W +_smtpd smtpd 69044 text 4,3 129738 100555 r 509536 +_smtpd smtpd 69044 wd 4,5 51840 40755 r 512 +_smtpd smtpd 69044 root 4,5 51840 40755 r 512 +_smtpd smtpd 69044 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 3* unix stream 0x0 +_smtpd smtpd 69044 4* unix stream 0x0 +_smtpd smtpd 69044 5* unix stream 0x0 +_smtpd smtpd 69044 6* unix stream 0x0 +_smtpd smtpd 69044 7* unix stream 0x0 +_smtpd smtpd 69044 8* internet6 stream tcp 0x0 [::1]:25 +_smtpd smtpd 69044 9* internet6 stream tcp 0x0 [fe80::1%lo0]:25 +_smtpd smtpd 69044 10* internet stream tcp 0x0 127.0.0.1:25 +_smtpd smtpd 69044 11 kqueue 0x0 0 state: W +_smtpd smtpd 21897 text 4,3 129738 100555 r 509536 +_smtpd smtpd 21897 wd 4,0 2 40755 r 512 +_smtpd smtpd 21897 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 3* unix stream 0x0 +_smtpd smtpd 21897 4* unix stream 0x0 +_smtpd smtpd 21897 5* unix stream 0x0 +_smtpd smtpd 21897 6* unix stream 0x0 +_smtpd smtpd 21897 7 kqueue 0x0 0 state: W +_smtpd smtpd 87615 text 4,3 129738 100555 r 509536 +_smtpd smtpd 87615 wd 4,5 51840 40755 r 512 +_smtpd smtpd 87615 root 4,5 51840 40755 r 512 +_smtpd smtpd 87615 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 3* unix stream 0x0 +_smtpd smtpd 87615 4* unix stream 0x0 +_smtpd smtpd 87615 5* unix stream 0x0 +_smtpd smtpd 87615 6* unix stream 0x0 +_smtpd smtpd 87615 7* unix stream 0x0 +_smtpd smtpd 87615 8* unix stream 0x0 +_smtpd smtpd 87615 9* unix stream 0x0 /var/run/smtpd.sock +_smtpd smtpd 87615 10 kqueue 0x0 0 state: W +_smtpd smtpd 15055 text 4,3 129738 100555 r 509536 +_smtpd smtpd 15055 wd 4,5 51840 40755 r 512 +_smtpd smtpd 15055 root 4,5 51840 40755 r 512 +_smtpd smtpd 15055 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 3* unix stream 0x0 +_smtpd smtpd 15055 4* unix stream 0x0 +_smtpd smtpd 15055 5* unix stream 0x0 +_smtpd smtpd 15055 6 kqueue 0x0 0 state: W +root smtpd 73945 text 4,3 129738 100555 r 509536 +root smtpd 73945 wd 4,0 2 40755 r 512 +root smtpd 73945 0 4,0 15794 20666 rw 2,2 +root smtpd 73945 1 4,0 15794 20666 rw 2,2 +root smtpd 73945 2 4,0 15794 20666 rw 2,2 +root smtpd 73945 3 kqueue 0x0 0 state: W +root smtpd 73945 4* unix stream 0x0 +root smtpd 73945 5* unix stream 0x0 +root smtpd 73945 6* unix stream 0x0 +root smtpd 73945 7* unix stream 0x0 +root smtpd 73945 8* unix stream 0x0 +root smtpd 73945 9* unix stream 0x0 +root sshd 91757 text 4,3 129784 100511 r 434816 +root sshd 91757 wd 4,0 2 40755 r 512 +root sshd 91757 0 4,0 15794 20666 rw 2,2 +root sshd 91757 1 4,0 15794 20666 rw 2,2 +root sshd 91757 2 4,0 15794 20666 rw 2,2 +root sshd 91757 3 4,0 15794 20666 rw 2,2 +root sshd 91757 4 4,0 15794 20666 rw 2,2 +root sshd 91757 5 4,0 15794 20666 rw 2,2 +root sshd 91757 6* internet stream tcp 0x0 *:22 +root sshd 91757 7* internet6 stream tcp 0x0 *:22 +root ntpd 60716 text 4,3 129691 100555 r 98648 +root ntpd 60716 wd 4,0 2 40755 r 512 +root ntpd 60716 0 4,0 15794 20666 rwp 2,2 +root ntpd 60716 1 4,0 15794 20666 rwp 2,2 +root ntpd 60716 2 4,0 15794 20666 rwp 2,2 +root ntpd 60716 3* unix stream 0x0 +root ntpd 60716 4 4,5 207754 100644 rw 0 +root ntpd 60716 7* unix dgram 0x0 +root ntpd 60716 10* unix dgram 0x0 +root ntpd 60716 12* unix dgram 0x0 +_ntp ntpd 7474 text 4,3 129691 100555 r 98648 +_ntp ntpd 7474 wd 4,0 2 40755 r 512 +_ntp ntpd 7474 0 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 1 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 2 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 3* unix stream 0x0 +_ntp ntpd 48073 text 4,3 129691 100555 r 98648 +_ntp ntpd 48073 wd 4,5 51840 40755 r 512 +_ntp ntpd 48073 root 4,5 51840 40755 r 512 +_ntp ntpd 48073 0 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 1 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 2 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 3* unix stream 0x0 +_ntp ntpd 48073 4* unix stream 0x0 +_ntp ntpd 48073 5* unix stream 0x0 /var/run/ntpd.sock +_ntp ntpd 48073 6* internet dgram udp 10.0.2.15:28171 <-> 162.159.200.123:123 +_ntp ntpd 48073 7* internet dgram udp 10.0.2.15:3242 <-> 94.16.122.152:123 +_ntp ntpd 48073 8* internet dgram udp 10.0.2.15:34016 <-> 212.95.49.48:123 +_ntp ntpd 48073 9* internet dgram udp 10.0.2.15:23647 <-> 176.9.8.206:123 +_ntp ntpd 48073 10* internet dgram udp 10.0.2.15:46142 <-> 162.159.200.1:123 +_pflogd pflogd 94336 text 4,0 14531 100555 r 27384 +_pflogd pflogd 94336 wd 4,5 51840 40755 r 512 +_pflogd pflogd 94336 root 4,5 51840 40755 r 512 +_pflogd pflogd 94336 0 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 1 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 2 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 3* unix stream 0x0 +_pflogd pflogd 94336 4 4,0 15384 20600 r 23,0 +_pflogd pflogd 94336 5 4,5 77776 100600 rw 24 +root pflogd 2105 text 4,0 14531 100555 r 27384 +root pflogd 2105 wd 4,0 2 40755 r 512 +root pflogd 2105 0 4,0 15794 20666 rw 2,2 +root pflogd 2105 1 4,0 15794 20666 rw 2,2 +root pflogd 2105 2 4,0 15794 20666 rw 2,2 +root pflogd 2105 3* unix stream 0x0 +root pflogd 2105 4 4,0 15384 20600 r 23,0 +root pflogd 2105 5 4,5 77776 100600 rw 24 +_syslogd syslogd 9953 text 4,3 129744 100555 r 96280 +_syslogd syslogd 9953 wd 4,5 51840 40755 r 512 +_syslogd syslogd 9953 root 4,5 51840 40755 r 512 +_syslogd syslogd 9953 0 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 1 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 2 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 4 - - bad - +_syslogd syslogd 9953 7* unix dgram 0x0 /dev/log +_syslogd syslogd 9953 8* unix dgram 0x0 +_syslogd syslogd 9953 9 kqueue 0x0 0 state: W +_syslogd syslogd 9953 10 4,0 15800 20600 r 7,0 +_syslogd syslogd 9953 12* unix stream 0x0 +_syslogd syslogd 9953 14 4,5 77770 100644 wp 24319 +_syslogd syslogd 9953 15 4,5 77763 100640 wp 20963 +_syslogd syslogd 9953 16 4,5 77771 100600 wp 688 +_syslogd syslogd 9953 17 4,5 181445 100600 wp 254 +_syslogd syslogd 9953 18 4,5 77764 100640 wp 4175 +_syslogd syslogd 9953 19 4,5 77773 100640 wp 0 +_syslogd syslogd 9953 20 4,5 77768 100640 wp 0 +_syslogd syslogd 9953 21 4,5 77769 100640 wp 2253 +root syslogd 53846 text 4,3 129744 100555 r 96280 +root syslogd 53846 wd 4,0 2 40755 r 512 +root syslogd 53846 0 4,0 15794 20666 rw 2,2 +root syslogd 53846 1 4,0 15794 20666 rw 2,2 +root syslogd 53846 2 4,0 15794 20666 rw 2,2 +root syslogd 53846 3* unix stream 0x0 +root resolvd 6948 text 4,0 14534 100555 r 20288 +root resolvd 6948 wd 4,0 2 40755 r 512 +root resolvd 6948 0 4,0 15794 20666 rw 2,2 +root resolvd 6948 1 4,0 15794 20666 rw 2,2 +root resolvd 6948 2 4,0 15794 20666 rw 2,2 +root resolvd 6948 3 4,0 15953 100600 rw 0 +root resolvd 6948 4* route raw 0 0x0 +root resolvd 6948 5 kqueue 0x0 0 state: W +root resolvd 6948 7 4,0 15964 100644 rwp 36 +_dhcp dhcpleased 69874 text 4,0 14490 100555 r 89872 +_dhcp dhcpleased 69874 wd 4,0 2 40755 r 512 +_dhcp dhcpleased 69874 0 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 1 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 2 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 3* unix stream 0x0 +_dhcp dhcpleased 69874 4* internet dgram udp *:0 +_dhcp dhcpleased 69874 5 kqueue 0x0 0 state: W +_dhcp dhcpleased 69874 6* unix stream 0x0 +_dhcp dhcpleased 69874 7* route raw 0 0x0 +_dhcp dhcpleased 69874 8* unix stream 0x0 /dev/dhcpleased.sock +_dhcp dhcpleased 69874 9 4,0 15384 20600 rw 23,0 +_dhcp dhcpleased 69874 10* internet dgram udp 10.0.2.15:68 +_dhcp dhcpleased 194 text 4,0 14490 100555 r 89872 +_dhcp dhcpleased 194 wd 4,0 2 40755 r 512 +_dhcp dhcpleased 194 0 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 1 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 2 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 3* unix stream 0x0 +_dhcp dhcpleased 194 4 kqueue 0x0 0 state: W +_dhcp dhcpleased 194 5* unix stream 0x0 +root dhcpleased 45126 text 4,0 14490 100555 r 89872 +root dhcpleased 45126 wd 4,0 2 40755 r 512 +root dhcpleased 45126 0 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 1 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 2 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 3 4,0 15951 100600 rw 0 +root dhcpleased 45126 4* unix stream 0x0 +root dhcpleased 45126 5* route raw 0 0x0 +root dhcpleased 45126 6* unix stream 0x0 +root dhcpleased 45126 7 kqueue 0x0 0 state: W +root dhcpleased 45126 8* internet dgram udp *:0 +_slaacd slaacd 52336 text 4,0 14541 100555 r 77528 +_slaacd slaacd 52336 wd 4,0 2 40755 r 512 +_slaacd slaacd 52336 0 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 1 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 2 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 3* unix stream 0x0 +_slaacd slaacd 52336 4* internet6 dgram udp *:0 +_slaacd slaacd 52336 5 kqueue 0x0 0 state: W +_slaacd slaacd 52336 6* unix stream 0x0 +_slaacd slaacd 52336 7* route raw 0 0x0 +_slaacd slaacd 52336 8* unix stream 0x0 /dev/slaacd.sock +_slaacd slaacd 33677 text 4,0 14541 100555 r 77528 +_slaacd slaacd 33677 wd 4,0 2 40755 r 512 +_slaacd slaacd 33677 0 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 1 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 2 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 3* unix stream 0x0 +_slaacd slaacd 33677 4 kqueue 0x0 0 state: W +_slaacd slaacd 33677 5* unix stream 0x0 +root slaacd 29861 text 4,0 14541 100555 r 77528 +root slaacd 29861 wd 4,0 2 40755 r 512 +root slaacd 29861 0 4,0 15794 20666 rw 2,2 +root slaacd 29861 1 4,0 15794 20666 rw 2,2 +root slaacd 29861 2 4,0 15794 20666 rw 2,2 +root slaacd 29861 3 4,0 15949 100600 rw 0 +root slaacd 29861 4* unix stream 0x0 +root slaacd 29861 5* route raw 0 0x0 +root slaacd 29861 6* unix stream 0x0 +root slaacd 29861 7 kqueue 0x0 0 state: W +root slaacd 29861 8* internet6 dgram udp *:0 +root init 1 text 4,0 14506 100555 r 383784 +root init 1 wd 4,0 2 40755 r 512 +root init 1 0 4,0 15794 20666 rw 2,2 +root init 1 1 4,0 15794 20666 rw 2,2 +root init 1 2 4,0 15794 20666 rw 2,2 diff --git a/tests/fixtures/openbsd-vm/netstat_an.txt b/tests/fixtures/openbsd-vm/netstat_an.txt new file mode 100644 index 0000000..705a0ff --- /dev/null +++ b/tests/fixtures/openbsd-vm/netstat_an.txt @@ -0,0 +1,27 @@ +Active Internet connections (including servers) +Proto Recv-Q Send-Q Local Address Foreign Address TCP-State +tcp 0 0 10.0.2.15.22 10.0.2.2.53414 ESTABLISHED +tcp 0 0 127.0.0.1.7778 *.* LISTEN +tcp 0 0 127.0.0.1.25 *.* LISTEN +tcp 0 0 *.22 *.* LISTEN +Active Internet connections (including servers) +Proto Recv-Q Send-Q Local Address Foreign Address +udp 0 0 10.0.2.15.34016 212.95.49.48.123 +udp 0 0 10.0.2.15.46142 162.159.200.1.123 +udp 0 0 10.0.2.15.28171 162.159.200.123.123 +udp 0 0 10.0.2.15.3242 94.16.122.152.123 +udp 0 0 10.0.2.15.23647 176.9.8.206.123 +udp 0 0 127.0.0.1.7779 *.* +udp 0 0 *.* *.* +udp 0 0 10.0.2.15.68 *.* +udp 0 0 *.* *.* +Active Internet connections (including servers) +Proto Recv-Q Send-Q Local Address Foreign Address TCP-State +tcp6 0 0 fe80::1%lo0.25 *.* LISTEN +tcp6 0 0 ::1.7777 *.* LISTEN +tcp6 0 0 *.22 *.* LISTEN +tcp6 0 0 ::1.25 *.* LISTEN +Active Internet connections (including servers) +Proto Recv-Q Send-Q Local Address Foreign Address +udp6 0 0 *.* *.* +udp6 0 0 *.* *.* diff --git a/tests/fixtures/openbsd-vm/sudo_fstat_n.txt b/tests/fixtures/openbsd-vm/sudo_fstat_n.txt new file mode 100644 index 0000000..f95825f --- /dev/null +++ b/tests/fixtures/openbsd-vm/sudo_fstat_n.txt @@ -0,0 +1,367 @@ +USER CMD PID FD DEV INUM MODE R/W SZ|DV +root fstat 68826 text 4,3 77827 100555 r 22504 +root fstat 68826 wd 4,10 259200 40755 r 512 +root fstat 68826 0 pipe 0xfffffd8070255418 state: E +root fstat 68826 1 pipe 0xfffffd8070255c68 state: +root fstat 68826 2 pipe 0xfffffd8070255a08 state: +root sudo 69356 text 4,7 77835 104555 r 280424 +root sudo 69356 wd 4,10 259200 40755 r 512 +root sudo 69356 0 pipe 0xfffffd8070255418 state: E +root sudo 69356 1 pipe 0xfffffd8070255c68 state: +root sudo 69356 2 pipe 0xfffffd8070255a08 state: +root sudo 69356 4 4,0 14624 100644 re 40960 +root sudo 69356 5 pipe 0xfffffd8070255088 state: +root sudo 69356 6 pipe 0xfffffd8070255088 state: +root sudo 69356 7 4,0 15887 100440 re 1600 +netork-u ksh 1767 text 4,0 9621 100555 r 810120 +netork-u ksh 1767 wd 4,10 259200 40755 r 512 +netork-u ksh 1767 1 pipe 0xfffffd8070255c68 state: +netork-u ksh 1767 2 pipe 0xfffffd8070255a08 state: +netork-u ksh 1767 10 pipe 0xfffffd80702558d8 state: E +netork-u sshd-session 82104 text 4,3 181663 100511 r 1037592 +netork-u sshd-session 82104 wd 4,0 2 40755 r 512 +netork-u sshd-session 82104 0 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 1 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 2 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 3 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 4 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 5 4,0 15794 20666 rw 2,2 +netork-u sshd-session 82104 6* unix stream 0xfffffd806229f400 <-> 0xfffffd806229f1c0 +netork-u sshd-session 82104 7* internet stream tcp 0xffff800000aef8a0 10.0.2.15:22 <-- 10.0.2.2:53394 +netork-u sshd-session 82104 9* unix stream 0xfffffd806229f490 +netork-u sshd-session 82104 11 pipe 0xfffffd8070255c68 state: +netork-u sshd-session 82104 13 pipe 0xfffffd8070255a08 state: +root sshd-session 27940 text 4,3 181663 100511 r 1037592 +root sshd-session 27940 wd 4,0 2 40755 r 512 +root sshd-session 27940 0 4,0 15794 20666 rw 2,2 +root sshd-session 27940 1 4,0 15794 20666 rw 2,2 +root sshd-session 27940 2 4,0 15794 20666 rw 2,2 +root sshd-session 27940 3 4,0 15794 20666 rw 2,2 +root sshd-session 27940 4 4,0 15794 20666 rw 2,2 +root sshd-session 27940 5 4,0 15794 20666 rw 2,2 +root sshd-session 27940 7* internet stream tcp 0xffff800000aef8a0 10.0.2.15:22 <-- 10.0.2.2:53394 +root sshd-session 27940 8* unix stream 0xfffffd806229f1c0 <-> 0xfffffd806229f400 +root sshd-session 27940 9* unix stream 0xfffffd806229f490 +netork-u nc 21021 text 4,3 77889 100555 r 46928 +netork-u nc 21021 wd 4,10 259200 40755 r 512 +netork-u nc 21021 0 4,0 15794 20666 r 2,2 +netork-u nc 21021 1 4,0 15794 20666 w 2,2 +netork-u nc 21021 2 4,0 15794 20666 w 2,2 +netork-u nc 21021 3* internet dgram udp 127.0.0.1:7779 +netork-u nc 28038 text 4,3 77889 100555 r 46928 +netork-u nc 28038 wd 4,10 259200 40755 r 512 +netork-u nc 28038 0 4,0 15794 20666 r 2,2 +netork-u nc 28038 1 4,0 15794 20666 w 2,2 +netork-u nc 28038 2 4,0 15794 20666 w 2,2 +netork-u nc 28038 3* internet6 stream tcp 0xffff800000aefb80 [::1]:7777 +netork-u nc 55785 text 4,3 77889 100555 r 46928 +netork-u nc 55785 wd 4,10 259200 40755 r 512 +netork-u nc 55785 0 4,0 15794 20666 r 2,2 +netork-u nc 55785 1 4,0 15794 20666 w 2,2 +netork-u nc 55785 2 4,0 15794 20666 w 2,2 +netork-u nc 55785 3* internet stream tcp 0xffff800000af0140 127.0.0.1:7778 +root ctfconv 1042 text 4,3 77798 100555 r 74384 +root ctfconv 1042 wd 4,3 26000 40755 r 57344 +root ctfconv 1042 0 4,0 15794 20666 r 2,2 +root ctfconv 1042 1 4,3 28486 100644 w 281 +root ctfconv 1042 2 4,0 15794 20666 w 2,2 +root ctfconv 1042 3 4,3 28485 100770 rp 246442808 +root sh 19667 text 4,0 9621 100555 r 810120 +root sh 19667 wd 4,3 26000 40755 r 57344 +root sh 19667 0 4,0 15794 20666 r 2,2 +root sh 19667 1 4,3 28486 100644 w 281 +root sh 19667 2 4,0 15794 20666 wp 2,2 +root sh 19667 10 4,3 77799 100555 rep 1895 +root sh 19667 11 4,3 28486 100644 we 281 +root sh 63450 text 4,0 9621 100555 r 810120 +root sh 63450 wd 4,3 26000 40755 r 57344 +root sh 63450 0 4,0 15794 20666 r 2,2 +root sh 63450 1 4,3 28486 100644 w 281 +root sh 63450 2 4,3 28486 100644 w 281 +root make 70417 text 4,3 77880 100555 r 149416 +root make 70417 wd 4,3 26000 40755 r 57344 +root make 70417 0 4,0 15794 20666 r 2,2 +root make 70417 1 4,3 28486 100644 w 281 +root make 70417 2 4,3 28486 100644 w 281 +root getty 51429 text 4,3 181471 100555 r 27864 +root getty 51429 wd 4,0 2 40755 r 512 +root getty 51429 0 4,0 15618 20600 rw 8,0 +root getty 51429 1 4,0 15618 20600 rw 8,0 +root getty 51429 2 4,0 15618 20600 rw 8,0 +root ksh 80571 text 4,0 9621 100555 r 810120 +root ksh 80571 wd 4,3 26000 40755 r 57344 +root ksh 80571 0 4,0 15794 20666 r 2,2 +root ksh 80571 1 4,3 28486 100644 wp 281 +root ksh 80571 2 4,3 28486 100644 wp 281 +root ksh 80571 10 4,3 181493 100555 rep 2252 +root cron 92217 text 4,3 129625 100555 r 42888 +root cron 92217 wd 4,0 2 40755 r 512 +root cron 92217 0 4,0 15794 20666 rwp 2,2 +root cron 92217 1 4,0 15794 20666 rwp 2,2 +root cron 92217 2 4,0 15794 20666 rwp 2,2 +root cron 92217 3* unix stream 0xfffffd806229f760 /var/run/cron.sock +root qemu-ga 31480 text 4,7 77866 100755 r 1025656 +root qemu-ga 31480 wd 4,0 2 40755 r 512 +root qemu-ga 31480 0 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 1 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 2 4,0 15794 20666 rw 2,2 +root qemu-ga 31480 3 pipe 0xfffffd80702552e8 state: +root qemu-ga 31480 4 pipe 0xfffffd80702552e8 state: +root qemu-ga 31480 5 4,0 15621 20660 rwe 8,129 +root qemu-ga 31480 6 4,5 103717 100600 we 6 +_sndio sndiod 83428 text 4,3 77957 100555 r 124144 +_sndio sndiod 83428 wd 4,5 51840 40755 r 512 +_sndio sndiod 83428 root 4,5 51840 40755 r 512 +_sndio sndiod 83428 0 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 1 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 2 4,0 15794 20666 rw 2,2 +_sndio sndiod 83428 3* unix stream 0xfffffd806229f130 <-> 0xfffffd806229f010 +_sndio sndiod 83428 4* unix stream 0xfffffd806229f0a0 /tmp/sndio/sock0 +_sndiop sndiod 41459 text 4,3 77957 100555 r 124144 +_sndiop sndiod 41459 wd 4,0 2 40755 r 512 +_sndiop sndiod 41459 0 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 1 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 2 4,0 15794 20666 rw 2,2 +_sndiop sndiod 41459 4* unix stream 0xfffffd806229f010 <-> 0xfffffd806229f130 +_smtpd smtpd 25046 text 4,3 129738 100555 r 509536 +_smtpd smtpd 25046 wd 4,5 51840 40755 r 512 +_smtpd smtpd 25046 root 4,5 51840 40755 r 512 +_smtpd smtpd 25046 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 25046 3* unix stream 0xfffffd80611a9bd8 <-> 0xfffffd80611a9098 +_smtpd smtpd 25046 4* unix stream 0xfffffd80611a9908 <-> 0xfffffd80611a97e8 +_smtpd smtpd 25046 5* unix stream 0xfffffd806229f2e0 <-> 0xfffffd806229f370 +_smtpd smtpd 25046 6 kqueue 0xfffffd806549a2e8 0 state: W +_smtpq smtpd 68285 text 4,3 129738 100555 r 509536 +_smtpq smtpd 68285 wd 4,5 233289 40711 r 512 +_smtpq smtpd 68285 root 4,5 233289 40711 r 512 +_smtpq smtpd 68285 0 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 1 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 2 4,0 15794 20666 rw 2,2 +_smtpq smtpd 68285 3* unix stream 0xfffffd80611a9368 <-> 0xfffffd80611a9d88 +_smtpq smtpd 68285 4* unix stream 0xfffffd80611a9638 <-> 0xfffffd80611a95a8 +_smtpq smtpd 68285 5* unix stream 0xfffffd806229f640 <-> 0xfffffd806229f6d0 +_smtpq smtpd 68285 6* unix stream 0xfffffd806229f5b0 <-> 0xfffffd806229f520 +_smtpq smtpd 68285 7* unix stream 0xfffffd806229f370 <-> 0xfffffd806229f2e0 +_smtpq smtpd 68285 8 kqueue 0xfffffd806549ac40 0 state: W +_smtpd smtpd 69044 text 4,3 129738 100555 r 509536 +_smtpd smtpd 69044 wd 4,5 51840 40755 r 512 +_smtpd smtpd 69044 root 4,5 51840 40755 r 512 +_smtpd smtpd 69044 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 69044 3* unix stream 0xfffffd80611a9758 <-> 0xfffffd80611a92d8 +_smtpd smtpd 69044 4* unix stream 0xfffffd80611a9518 <-> 0xfffffd80611a9488 +_smtpd smtpd 69044 5* unix stream 0xfffffd80611a9c68 <-> 0xfffffd80611a9cf8 +_smtpd smtpd 69044 6* unix stream 0xfffffd806229fac0 <-> 0xfffffd806229f880 +_smtpd smtpd 69044 7* unix stream 0xfffffd806229f6d0 <-> 0xfffffd806229f640 +_smtpd smtpd 69044 8* internet6 stream tcp 0xffff800000aefe60 [::1]:25 +_smtpd smtpd 69044 9* internet6 stream tcp 0xffff800000aef5c0 [fe80::1%lo0]:25 +_smtpd smtpd 69044 10* internet stream tcp 0xffff800000aef000 127.0.0.1:25 +_smtpd smtpd 69044 11 kqueue 0xfffffd806549a510 0 state: W +_smtpd smtpd 21897 text 4,3 129738 100555 r 509536 +_smtpd smtpd 21897 wd 4,0 2 40755 r 512 +_smtpd smtpd 21897 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 21897 3* unix stream 0xfffffd80611a9998 <-> 0xfffffd80611a9878 +_smtpd smtpd 21897 4* unix stream 0xfffffd80611a93f8 <-> 0xfffffd80611a9e18 +_smtpd smtpd 21897 5* unix stream 0xfffffd806229f880 <-> 0xfffffd806229fac0 +_smtpd smtpd 21897 6* unix stream 0xfffffd806229f520 <-> 0xfffffd806229f5b0 +_smtpd smtpd 21897 7 kqueue 0xfffffd806549ae68 0 state: W +_smtpd smtpd 87615 text 4,3 129738 100555 r 509536 +_smtpd smtpd 87615 wd 4,5 51840 40755 r 512 +_smtpd smtpd 87615 root 4,5 51840 40755 r 512 +_smtpd smtpd 87615 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 87615 3* unix stream 0xfffffd80611a9248 <-> 0xfffffd80611a9a28 +_smtpd smtpd 87615 4* unix stream 0xfffffd80611a9128 <-> 0xfffffd80611a9ea8 +_smtpd smtpd 87615 5* unix stream 0xfffffd80611a9e18 <-> 0xfffffd80611a93f8 +_smtpd smtpd 87615 6* unix stream 0xfffffd80611a9488 <-> 0xfffffd80611a9518 +_smtpd smtpd 87615 7* unix stream 0xfffffd80611a95a8 <-> 0xfffffd80611a9638 +_smtpd smtpd 87615 8* unix stream 0xfffffd80611a97e8 <-> 0xfffffd80611a9908 +_smtpd smtpd 87615 9* unix stream 0xfffffd806229f250 /var/run/smtpd.sock +_smtpd smtpd 87615 10 kqueue 0xfffffd806fb33e60 0 state: W +_smtpd smtpd 15055 text 4,3 129738 100555 r 509536 +_smtpd smtpd 15055 wd 4,5 51840 40755 r 512 +_smtpd smtpd 15055 root 4,5 51840 40755 r 512 +_smtpd smtpd 15055 0 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 1 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 2 4,0 15794 20666 rw 2,2 +_smtpd smtpd 15055 3* unix stream 0xfffffd80611a9008 <-> 0xfffffd80611a9ab8 +_smtpd smtpd 15055 4* unix stream 0xfffffd80611a9ea8 <-> 0xfffffd80611a9128 +_smtpd smtpd 15055 5* unix stream 0xfffffd80611a9cf8 <-> 0xfffffd80611a9c68 +_smtpd smtpd 15055 6 kqueue 0xfffffd806549adb0 0 state: W +root smtpd 73945 text 4,3 129738 100555 r 509536 +root smtpd 73945 wd 4,0 2 40755 r 512 +root smtpd 73945 0 4,0 15794 20666 rw 2,2 +root smtpd 73945 1 4,0 15794 20666 rw 2,2 +root smtpd 73945 2 4,0 15794 20666 rw 2,2 +root smtpd 73945 3 kqueue 0xfffffd806549a3a0 0 state: W +root smtpd 73945 4* unix stream 0xfffffd80611a9ab8 <-> 0xfffffd80611a9008 +root smtpd 73945 5* unix stream 0xfffffd80611a9a28 <-> 0xfffffd80611a9248 +root smtpd 73945 6* unix stream 0xfffffd80611a9878 <-> 0xfffffd80611a9998 +root smtpd 73945 7* unix stream 0xfffffd80611a92d8 <-> 0xfffffd80611a9758 +root smtpd 73945 8* unix stream 0xfffffd80611a9d88 <-> 0xfffffd80611a9368 +root smtpd 73945 9* unix stream 0xfffffd80611a9098 <-> 0xfffffd80611a9bd8 +root sshd 91757 text 4,3 129784 100511 r 434816 +root sshd 91757 wd 4,0 2 40755 r 512 +root sshd 91757 0 4,0 15794 20666 rw 2,2 +root sshd 91757 1 4,0 15794 20666 rw 2,2 +root sshd 91757 2 4,0 15794 20666 rw 2,2 +root sshd 91757 3 4,0 15794 20666 rw 2,2 +root sshd 91757 4 4,0 15794 20666 rw 2,2 +root sshd 91757 5 4,0 15794 20666 rw 2,2 +root sshd 91757 6* internet stream tcp 0xffff800000af0700 *:22 +root sshd 91757 7* internet6 stream tcp 0xffff800000aef2e0 *:22 +root ntpd 60716 text 4,3 129691 100555 r 98648 +root ntpd 60716 wd 4,0 2 40755 r 512 +root ntpd 60716 0 4,0 15794 20666 rwp 2,2 +root ntpd 60716 1 4,0 15794 20666 rwp 2,2 +root ntpd 60716 2 4,0 15794 20666 rwp 2,2 +root ntpd 60716 3* unix stream 0xfffffd806f42bbd0 <-> 0xfffffd806f42bc60 +root ntpd 60716 4 4,5 207754 100644 rw 0 +root ntpd 60716 7* unix dgram 0xfffffd80611a9b48 +root ntpd 60716 10* unix dgram 0xfffffd80611a96c8 +root ntpd 60716 12* unix dgram 0xfffffd80611a91b8 +_ntp ntpd 7474 text 4,3 129691 100555 r 98648 +_ntp ntpd 7474 wd 4,0 2 40755 r 512 +_ntp ntpd 7474 0 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 1 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 2 4,0 15794 20666 rw 2,2 +_ntp ntpd 7474 3* unix stream 0xfffffd806f42be10 <-> 0xfffffd806f42bd80 +_ntp ntpd 48073 text 4,3 129691 100555 r 98648 +_ntp ntpd 48073 wd 4,5 51840 40755 r 512 +_ntp ntpd 48073 root 4,5 51840 40755 r 512 +_ntp ntpd 48073 0 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 1 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 2 4,0 15794 20666 rw 2,2 +_ntp ntpd 48073 3* unix stream 0xfffffd806f42bc60 <-> 0xfffffd806f42bbd0 +_ntp ntpd 48073 4* unix stream 0xfffffd806f42bd80 <-> 0xfffffd806f42be10 +_ntp ntpd 48073 5* unix stream 0xfffffd806f42bea0 /var/run/ntpd.sock +_ntp ntpd 48073 6* internet dgram udp 10.0.2.15:28171 <-> 162.159.200.123:123 +_ntp ntpd 48073 7* internet dgram udp 10.0.2.15:3242 <-> 94.16.122.152:123 +_ntp ntpd 48073 8* internet dgram udp 10.0.2.15:34016 <-> 212.95.49.48:123 +_ntp ntpd 48073 9* internet dgram udp 10.0.2.15:23647 <-> 176.9.8.206:123 +_ntp ntpd 48073 10* internet dgram udp 10.0.2.15:46142 <-> 162.159.200.1:123 +_pflogd pflogd 94336 text 4,0 14531 100555 r 27384 +_pflogd pflogd 94336 wd 4,5 51840 40755 r 512 +_pflogd pflogd 94336 root 4,5 51840 40755 r 512 +_pflogd pflogd 94336 0 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 1 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 2 4,0 15794 20666 rw 2,2 +_pflogd pflogd 94336 3* unix stream 0xfffffd806f42bab0 <-> 0xfffffd806f42ba20 +_pflogd pflogd 94336 4 4,0 15384 20600 r 23,0 +_pflogd pflogd 94336 5 4,5 77776 100600 rw 24 +root pflogd 2105 text 4,0 14531 100555 r 27384 +root pflogd 2105 wd 4,0 2 40755 r 512 +root pflogd 2105 0 4,0 15794 20666 rw 2,2 +root pflogd 2105 1 4,0 15794 20666 rw 2,2 +root pflogd 2105 2 4,0 15794 20666 rw 2,2 +root pflogd 2105 3* unix stream 0xfffffd806f42ba20 <-> 0xfffffd806f42bab0 +root pflogd 2105 4 4,0 15384 20600 r 23,0 +root pflogd 2105 5 4,5 77776 100600 rw 24 +_syslogd syslogd 9953 text 4,3 129744 100555 r 96280 +_syslogd syslogd 9953 wd 4,5 51840 40755 r 512 +_syslogd syslogd 9953 root 4,5 51840 40755 r 512 +_syslogd syslogd 9953 0 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 1 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 2 4,0 15794 20666 rw 2,2 +_syslogd syslogd 9953 4 - - bad - +_syslogd syslogd 9953 7* unix dgram 0xfffffd806f42b5a0 /dev/log +_syslogd syslogd 9953 8* unix dgram 0xfffffd806f42b630 <-> 0xfffffd806f42b750 +_syslogd syslogd 9953 9 kqueue 0xfffffd806fb33508 0 state: W +_syslogd syslogd 9953 10 4,0 15800 20600 r 7,0 +_syslogd syslogd 9953 12* unix stream 0xfffffd806f42b900 <-> 0xfffffd806f42b7e0 +_syslogd syslogd 9953 14 4,5 77770 100644 wp 24319 +_syslogd syslogd 9953 15 4,5 77763 100640 wp 20433 +_syslogd syslogd 9953 16 4,5 77771 100600 wp 688 +_syslogd syslogd 9953 17 4,5 181445 100600 wp 254 +_syslogd syslogd 9953 18 4,5 77764 100640 wp 4175 +_syslogd syslogd 9953 19 4,5 77773 100640 wp 0 +_syslogd syslogd 9953 20 4,5 77768 100640 wp 0 +_syslogd syslogd 9953 21 4,5 77769 100640 wp 2253 +root syslogd 53846 text 4,3 129744 100555 r 96280 +root syslogd 53846 wd 4,0 2 40755 r 512 +root syslogd 53846 0 4,0 15794 20666 rw 2,2 +root syslogd 53846 1 4,0 15794 20666 rw 2,2 +root syslogd 53846 2 4,0 15794 20666 rw 2,2 +root syslogd 53846 3* unix stream 0xfffffd806f42b7e0 <-> 0xfffffd806f42b900 +root resolvd 6948 text 4,0 14534 100555 r 20288 +root resolvd 6948 wd 4,0 2 40755 r 512 +root resolvd 6948 0 4,0 15794 20666 rw 2,2 +root resolvd 6948 1 4,0 15794 20666 rw 2,2 +root resolvd 6948 2 4,0 15794 20666 rw 2,2 +root resolvd 6948 3 4,0 15953 100600 rw 0 +root resolvd 6948 4* route raw 0 0xffff800010fe0458 +root resolvd 6948 5 kqueue 0xfffffd806fb33678 0 state: W +root resolvd 6948 7 4,0 15964 100644 rwp 36 +_dhcp dhcpleased 69874 text 4,0 14490 100555 r 89872 +_dhcp dhcpleased 69874 wd 4,0 2 40755 r 512 +_dhcp dhcpleased 69874 0 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 1 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 2 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 69874 3* unix stream 0xfffffd806f42b1b0 <-> 0xfffffd806f42b240 +_dhcp dhcpleased 69874 4* internet dgram udp *:0 +_dhcp dhcpleased 69874 5 kqueue 0xfffffd806fb33730 0 state: W +_dhcp dhcpleased 69874 6* unix stream 0xfffffd806f42b090 <-> 0xfffffd806f42b2d0 +_dhcp dhcpleased 69874 7* route raw 0 0xffff800010fe0680 +_dhcp dhcpleased 69874 8* unix stream 0xfffffd806f42b360 /dev/dhcpleased.sock +_dhcp dhcpleased 69874 9 4,0 15384 20600 rw 23,0 +_dhcp dhcpleased 69874 10* internet dgram udp 10.0.2.15:68 +_dhcp dhcpleased 194 text 4,0 14490 100555 r 89872 +_dhcp dhcpleased 194 wd 4,0 2 40755 r 512 +_dhcp dhcpleased 194 0 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 1 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 2 4,0 15794 20666 rw 2,2 +_dhcp dhcpleased 194 3* unix stream 0xfffffd806f42b000 <-> 0xfffffd806f42b120 +_dhcp dhcpleased 194 4 kqueue 0xfffffd806fb338a0 0 state: W +_dhcp dhcpleased 194 5* unix stream 0xfffffd806f42b2d0 <-> 0xfffffd806f42b090 +root dhcpleased 45126 text 4,0 14490 100555 r 89872 +root dhcpleased 45126 wd 4,0 2 40755 r 512 +root dhcpleased 45126 0 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 1 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 2 4,0 15794 20666 rw 2,2 +root dhcpleased 45126 3 4,0 15951 100600 rw 0 +root dhcpleased 45126 4* unix stream 0xfffffd806f42b240 <-> 0xfffffd806f42b1b0 +root dhcpleased 45126 5* route raw 0 0xffff800010fe19e8 +root dhcpleased 45126 6* unix stream 0xfffffd806f42b120 <-> 0xfffffd806f42b000 +root dhcpleased 45126 7 kqueue 0xfffffd806fb33958 0 state: W +root dhcpleased 45126 8* internet dgram udp *:0 +_slaacd slaacd 52336 text 4,0 14541 100555 r 77528 +_slaacd slaacd 52336 wd 4,0 2 40755 r 512 +_slaacd slaacd 52336 0 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 1 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 2 4,0 15794 20666 rw 2,2 +_slaacd slaacd 52336 3* unix stream 0xfffffd806f42bb40 <-> 0xfffffd806f42bcf0 +_slaacd slaacd 52336 4* internet6 dgram udp *:0 +_slaacd slaacd 52336 5 kqueue 0xfffffd806fb33b80 0 state: W +_slaacd slaacd 52336 6* unix stream 0xfffffd806f42b6c0 <-> 0xfffffd806f42b480 +_slaacd slaacd 52336 7* route raw 0 0xffff800000a84ac8 +_slaacd slaacd 52336 8* unix stream 0xfffffd806f42b3f0 /dev/slaacd.sock +_slaacd slaacd 33677 text 4,0 14541 100555 r 77528 +_slaacd slaacd 33677 wd 4,0 2 40755 r 512 +_slaacd slaacd 33677 0 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 1 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 2 4,0 15794 20666 rw 2,2 +_slaacd slaacd 33677 3* unix stream 0xfffffd806f42b870 <-> 0xfffffd806f42b990 +_slaacd slaacd 33677 4 kqueue 0xfffffd806fb33ac8 0 state: W +_slaacd slaacd 33677 5* unix stream 0xfffffd806f42b480 <-> 0xfffffd806f42b6c0 +root slaacd 29861 text 4,0 14541 100555 r 77528 +root slaacd 29861 wd 4,0 2 40755 r 512 +root slaacd 29861 0 4,0 15794 20666 rw 2,2 +root slaacd 29861 1 4,0 15794 20666 rw 2,2 +root slaacd 29861 2 4,0 15794 20666 rw 2,2 +root slaacd 29861 3 4,0 15949 100600 rw 0 +root slaacd 29861 4* unix stream 0xfffffd806f42bcf0 <-> 0xfffffd806f42bb40 +root slaacd 29861 5* route raw 0 0xffff800000a848a0 +root slaacd 29861 6* unix stream 0xfffffd806f42b990 <-> 0xfffffd806f42b870 +root slaacd 29861 7 kqueue 0xfffffd806fb33cf0 0 state: W +root slaacd 29861 8* internet6 dgram udp *:0 +root init 1 text 4,0 14506 100555 r 383784 +root init 1 wd 4,0 2 40755 r 512 +root init 1 0 4,0 15794 20666 rw 2,2 +root init 1 1 4,0 15794 20666 rw 2,2 +root init 1 2 4,0 15794 20666 rw 2,2 diff --git a/tests/test_drivers.py b/tests/test_drivers.py index 6a6e030..244d70f 100644 --- a/tests/test_drivers.py +++ b/tests/test_drivers.py @@ -193,3 +193,34 @@ class TestAccountsAndProcesses: "schedule": "0 4 * * *", "command": "/home/netork/backup.sh", } in jobs + + +class TestListeningSockets: + def test_freebsd_as_root_is_attributed(self): + driver = _driver(FreeBSDDriver, {}) + sockstat = _read("freebsd-vm", "sudo_sockstat_46lq_P_tcp_udp.txt") + driver.run_command = lambda command, privileged=False, timeout=60, stdin=None: ( # type: ignore[method-assign] + type("R", (), {"stdout": sockstat, "exit_code": 0})() + ) + result = driver.get_listening_sockets() + assert result["attributed"] is True + assert len(result["sockets"]) == 7 + + def test_openbsd_without_root_falls_back_to_netstat(self): + driver = _driver(OpenBSDDriver, {}) + netstat = _read("openbsd-vm", "netstat_an.txt") + calls = [] + + def run(command, privileged=False, timeout=60, stdin=None): + calls.append((command, privileged)) + if privileged: # sudo -n without a password: refused + return type("R", (), {"stdout": "", "exit_code": 1})() + return type("R", (), {"stdout": netstat, "exit_code": 0})() + + driver.run_command = run # type: ignore[method-assign] + result = driver.get_listening_sockets() + assert result["attributed"] is False + assert ("tcp", "0.0.0.0", 22) in { + (s["proto"], s["address"], s["port"]) for s in result["sockets"] + } + assert calls == [("fstat -n", True), (OpenBSDDriver.LISTENING_FALLBACK_COMMAND, False)] diff --git a/tests/test_parse.py b/tests/test_parse.py index 473b92e..5e3eaab 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -213,3 +213,59 @@ class TestBoottime: def test_garbage(self): assert parse.boottime("sysctl: unknown oid") is None + + +class TestListeningSockets: + """In the shape of napalm-device-types' ListeningSocketDict: ``0.0.0.0`` and + ``::`` are every address of their family, as ``ss`` prints them.""" + + @staticmethod + def _keys(sockets): + return {(s["proto"], s["address"], s["port"], s["interface"]) for s in sockets} + + def test_freebsd_sockstat(self): + sockets = parse.sockstat(fixture("freebsd-vm", "sudo_sockstat_46lq_P_tcp_udp.txt")) + assert self._keys(sockets) == { + ("udp", "127.0.0.1", 7779, None), + ("tcp", "::1", 7777, None), + ("tcp", "127.0.0.1", 7778, None), + ("tcp", "::", 22, None), + ("tcp", "0.0.0.0", 22, None), + ("udp", "::", 514, None), + ("udp", "0.0.0.0", 514, None), + } + sshd = next(s for s in sockets if s["port"] == 22 and s["address"] == "0.0.0.0") + assert (sshd["process"], sshd["pid"], sshd["unit"], sshd["container_id"]) == ( + "sshd", + 1282, + None, + None, + ) + + def test_openbsd_fstat_keeps_only_listening_and_bound_sockets(self): + sockets = parse.fstat_sockets(fixture("openbsd-vm", "sudo_fstat_n.txt")) + keys = self._keys(sockets) + assert ("tcp", "0.0.0.0", 22, None) in keys + assert ("tcp", "::", 22, None) in keys + assert ("tcp", "::1", 25, None) in keys + assert ("tcp", "fe80::1", 25, "lo0") in keys + assert ("udp", "10.0.2.15", 68, None) in keys + assert ("udp", "127.0.0.1", 7779, None) in keys + # connected (ntpd, ssh sessions) and unbound (*:0) sockets are not listening + assert not any(s["port"] in (0, 123) or s["process"] == "sshd-session" for s in sockets) + smtpd = next(s for s in sockets if s["port"] == 25 and s["address"] == "127.0.0.1") + assert (smtpd["process"], smtpd["pid"]) == ("smtpd", 69044) + + def test_openbsd_netstat_without_root_names_no_process(self): + sockets = parse.netstat_listening(fixture("openbsd-vm", "netstat_an.txt")) + keys = self._keys(sockets) + assert ("tcp", "0.0.0.0", 22, None) in keys + assert ("tcp", "::", 22, None) in keys + assert ("tcp", "fe80::1", 25, "lo0") in keys + assert ("udp", "127.0.0.1", 7779, None) in keys + assert all(s["process"] is None and s["pid"] is None for s in sockets) + assert not any(s["port"] == 123 for s in sockets) # ntpd's connected sockets + + def test_a_socket_held_by_two_processes_is_listed_once(self): + text = "www nginx 901 6 tcp4 *:80 *:*\nwww nginx 900 6 tcp4 *:80 *:*\n" + assert [(s["pid"]) for s in parse.sockstat(text)] == [901]