Parse:...freebsd(3pm)
๐ Parse::Netstat::freebsd ๐
okay so bestie, welcome to the manual page for Parse::Netstat::freebsd, which lives in the User Contributed Perl Documentation section and answers to Parse:...freebsd(3pm) if you're calling it by its man-page name. It's the FreeBSD-flavored parser in the family. Let's get into it ๐ซถ
โจ NAME โจ
Parse::Netstat::freebsd โ Parse the output of FreeBSD "netstat" command ๐
๐ธ VERSION ๐ธ
This document describes version 0.150 of Parse::Netstat::freebsd (from Perl distribution Parse-Netstat), released on 2022-12-04. โจ
๐ฆ SYNOPSIS ๐ฆ
The way you use it is literally this:
use Parse::Netstat qw(parse_netstat);
my $res = parse_netstat(output=>join("", `netstat -an`), flavor=>"freebsd");
Sample netstat -an output: ๐
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 192.168.1.33.780 192.168.1.10.2049 CLOSE_WAIT
tcp4 0 0 192.168.1.33.632 192.168.1.10.2049 CLOSED
tcp4 0 0 127.0.0.1.6012 *.* LISTEN
tcp6 0 0 ::1.6012 *.* LISTEN
tcp4 0 52 192.168.1.33.22 192.168.1.10.41487 ESTABLISHED
tcp4 0 0 127.0.0.1.6011 *.* LISTEN
tcp6 0 0 ::1.6011 *.* LISTEN
tcp4 0 0 192.168.1.33.22 192.168.1.10.61223 ESTABLISHED
tcp4 0 0 127.0.0.1.6010 *.* LISTEN
tcp6 0 0 ::1.6010 *.* LISTEN
tcp4 0 0 192.168.1.33.22 192.168.1.10.18499 ESTABLISHED
tcp4 0 0 192.168.1.33.22 192.168.1.10.30712 ESTABLISHED
tcp4 0 0 127.0.0.1.25 *.* LISTEN
tcp4 0 0 *.22 *.* LISTEN
tcp6 0 0 *.22 *.* LISTEN
tcp4 0 0 *.4949 *.* LISTEN
tcp6 0 0 *.4949 *.* LISTEN
tcp4 0 0 *.667 *.* LISTEN
tcp6 0 0 *.896 *.* LISTEN
tcp4 0 0 *.879 *.* LISTEN
tcp6 0 0 *.879 *.* LISTEN
tcp4 0 0 *.111 *.* LISTEN
tcp6 0 0 *.111 *.* LISTEN
udp4 0 0 *.682 *.*
udp6 0 0 *.726 *.*
udp6 0 0 *.948 *.*
udp4 0 0 *.* *.*
udp4 0 0 *.879 *.*
udp6 0 0 *.879 *.*
udp6 0 0 *.* *.*
udp4 0 0 *.755 *.*
udp4 0 0 *.111 *.*
udp6 0 0 *.932 *.*
udp6 0 0 *.111 *.*
udp4 0 0 *.514 *.*
udp6 0 0 *.514 *.*
Active UNIX domain sockets
Address Type Recv-Q Send-Q Inode Conn Refs Nextref Addr
fffff80057aa11e0 stream 0 0 0 0 0 0
fffff80057aa12d0 stream 0 0 0 0 0 0
fffff8001b0bc5a0 stream 0 0 fffff80011150938 0 0 0 /tmp/ssh-52dQiqRzC4/agent.35116
fffff8001b0bc780 stream 0 0 0 fffff8001b0bcc30 0 0
fffff8001b0bcc30 stream 0 0 0 fffff8001b0bc780 0 0
fffff80002ad85a0 stream 0 0 fffff80030dfd760 0 0 0 /tmp/ssh-ZPrtis6Qgb/agent.21969
fffff8001b0bc2d0 stream 0 0 0 fffff80057aa10f0 0 0
fffff80057aa10f0 stream 0 0 0 fffff8001b0bc2d0 0 0
fffff80002ad82d0 stream 0 0 0 fffff80002ad84b0 0 0
fffff80002ad84b0 stream 0 0 0 fffff80002ad82d0 0 0
fffff800028b3960 stream 0 0 fffff800354e3588 0 0 0 /var/run/dbus/system_bus_socket
fffff80002ad8a50 stream 0 0 0 fffff80002ad8c30 0 0
fffff80002ad8c30 stream 0 0 0 fffff80002ad8a50 0 0
fffff80002ad91e0 stream 0 0 fffff80002f5b1d8 0 0 0 /tmp/ssh-EXvnWwxbk4/agent.750
fffff80002ad93c0 stream 0 0 0 fffff80002ad90f0 0 0
fffff80002ad90f0 stream 0 0 0 fffff80002ad93c0 0 0
fffff80002ad9780 stream 0 0 fffff800029db000 0 0 0 /var/run/rpcbind.sock
fffff80002ad9b40 stream 0 0 fffff800029a4000 0 0 0 /var/run/devd.pipe
fffff80002ad80f0 dgram 0 0 0 fffff80002ad9960 0 fffff80002ad94b0
fffff80002ad9000 dgram 0 0 0 fffff80002ad9870 0 fffff80002ad92d0
fffff80002ad94b0 dgram 0 0 0 fffff80002ad9960 0 0
fffff80002ad92d0 dgram 0 0 0 fffff80002ad9870 0 fffff80002ad9690
fffff80002ad9690 dgram 0 0 0 fffff80002ad9870 0 fffff80002ad95a0
fffff80002ad95a0 dgram 0 0 0 fffff80002ad9870 0 0
fffff80002ad9870 dgram 0 0 fffff80002b3e938 0 fffff80002ad9000 0 /var/run/logpriv
fffff80002ad9960 dgram 0 0 fffff80002b3eb10 0 fffff80002ad80f0 0 /var/run/log
fffff80002ad9a50 seqpac 0 0 fffff80002947ce8 0 0 0 /var/run/devd.seqpacket.pipe
Sample result:
[
200,
"OK",
{
active_conns => [
{
foreign_host => "192.168.1.10",
foreign_port => 2049,
local_host => "192.168.1.33",
local_port => 780,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "CLOSE_WAIT",
},
{
foreign_host => "192.168.1.10",
foreign_port => 2049,
local_host => "192.168.1.33",
local_port => 632,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "CLOSED",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "127.0.0.1",
local_port => 6012,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "::1",
local_port => 6012,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "192.168.1.10",
foreign_port => 41487,
local_host => "192.168.1.33",
local_port => 22,
proto => "tcp4",
recvq => 0,
sendq => 52,
state => "ESTABLISHED",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "127.0.0.1",
local_port => 6011,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "::1",
local_port => 6011,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "192.168.1.10",
foreign_port => 61223,
local_host => "192.168.1.33",
local_port => 22,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "ESTABLISHED",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "127.0.0.1",
local_port => 6010,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "::1",
local_port => 6010,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "192.168.1.10",
foreign_port => 18499,
local_host => "192.168.1.33",
local_port => 22,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "ESTABLISHED",
},
{
foreign_host => "192.168.1.10",
foreign_port => 30712,
local_host => "192.168.1.33",
local_port => 22,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "ESTABLISHED",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "127.0.0.1",
local_port => 25,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 22,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 22,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 4949,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 4949,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 667,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 896,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 879,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 879,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 111,
proto => "tcp4",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 111,
proto => "tcp6",
recvq => 0,
sendq => 0,
state => "LISTEN",
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 682,
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 726,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 948,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => "*",
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 879,
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 879,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => "*",
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 755,
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 111,
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 932,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 111,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 514,
proto => "udp4",
recvq => 0,
sendq => 0,
},
{
foreign_host => "*",
foreign_port => "*",
local_host => "*",
local_port => 514,
proto => "udp6",
recvq => 0,
sendq => 0,
},
{},
{},
{
address => "fffff80057aa11e0",
conn => 0,
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80057aa12d0",
conn => 0,
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/tmp/ssh-52dQiqRzC4/agent.35116",
address => "fffff8001b0bc5a0",
conn => 0,
inode => "fffff80011150938",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff8001b0bc780",
conn => "fffff8001b0bcc30",
inode => 0,
nextref => 0,
proto => "unix",
okay so bestie, that right there? That's what a parsed connection table looks like when it falls out the other end ๐ โ and ngl it's kind of a lot, so let's vibe check what we're actually looking at ๐โจ
The whole thing is one big array ref, and the first two elements are 200 and "OK" โ a status code and a status string, sitting right up top like the little header of the whole operation ๐ Then the third element is a hashref, and inside that lives active_conns, which is where all the actual tea is โ
- Every TCP entry carries
foreign_host,foreign_port,local_host,local_port,proto,recvq,sendq, and astateโ so you get the full picture of who's talking to whom and how it's going ๐ซถ - The states you can spot in there:
"CLOSE_WAIT","CLOSED","LISTEN", and"ESTABLISHED"โ iconic lineup honestly ๐ - The UDP entries keep
foreign_host,foreign_port,local_host,local_port,proto,recvqandsendqโ but nostate, because UDP said "labels are a construct" ๐ - The
protovalues you'll see are"tcp4","tcp6","udp4","udp6", and"unix"โ full spectrum representation fr fr ๐ - The wildcards show up as
"*"for both hosts and ports, which is how you know something is just sitting there listening with main character energy ๐ - The
unixsocket entries switch up the whole field list โ they're working withaddress,conn,inode,nextref,proto,recvq,refs,sendq, andtypeinstead. Note thatinodeshows up as a plain0in some of them and as a string like"fffff80011150938"in another ๐ - One of the unix entries is extra special and brings an
addrkey too, with a path:"/tmp/ssh-52dQiqRzC4/agent.35116"โ she's got a whole name for herself, we stan ๐
and yes, there are a couple of straight-up empty hashrefs {} in the middle of the list just existing, and the dump keeps rolling past "fffff8001b0bc780" โ so hold that thought, we're not done yet ๐ฆ
{
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff8001b0bcc30",
conn => "fffff8001b0bc780",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/tmp/ssh-ZPrtis6Qgb/agent.21969",
address => "fffff80002ad85a0",
conn => 0,
inode => "fffff80030dfd760",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff8001b0bc2d0",
conn => "fffff80057aa10f0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80057aa10f0",
conn => "fffff8001b0bc2d0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad82d0",
conn => "fffff80002ad84b0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad84b0",
conn => "fffff80002ad82d0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/var/run/dbus/system_bus_socket",
address => "fffff800028b3960",
conn => 0,
inode => "fffff800354e3588",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad8a50",
conn => "fffff80002ad8c30",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad8c30",
conn => "fffff80002ad8a50",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/tmp/ssh-EXvnWwxbk4/agent.750",
address => "fffff80002ad91e0",
conn => 0,
inode => "fffff80002f5b1d8",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad93c0",
conn => "fffff80002ad90f0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad90f0",
conn => "fffff80002ad93c0",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/var/run/rpcbind.sock",
address => "fffff80002ad9780",
conn => 0,
inode => "fffff800029db000",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
addr => "/var/run/devd.pipe",
address => "fffff80002ad9b40",
conn => 0,
inode => "fffff800029a4000",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "stream",
},
{
address => "fffff80002ad80f0",
conn => "fffff80002ad9960",
inode => 0,
nextref => "fffff80002ad94b0",
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
address => "fffff80002ad9000",
conn => "fffff80002ad9870",
inode => 0,
nextref => "fffff80002ad92d0",
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
address => "fffff80002ad94b0",
conn => "fffff80002ad9960",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
address => "fffff80002ad92d0",
conn => "fffff80002ad9870",
inode => 0,
nextref => "fffff80002ad9690",
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
address => "fffff80002ad9690",
conn => "fffff80002ad9870",
inode => 0,
nextref => "fffff80002ad95a0",
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
address => "fffff80002ad95a0",
conn => "fffff80002ad9870",
inode => 0,
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "dgram",
},
{
addr => "/var/run/logpriv",
address => "fffff80002ad9870",
conn => 0,
inode => "fffff80002b3e938",
nextref => 0,
proto => "unix",
recvq => 0,
refs => "fffff80002ad9000",
sendq => 0,
type => "dgram",
},
{
addr => "/var/run/log",
address => "fffff80002ad9960",
conn => 0,
inode => "fffff80002b3eb10",
nextref => 0,
proto => "unix",
recvq => 0,
refs => "fffff80002ad80f0",
sendq => 0,
type => "dgram",
},
{
addr => "/var/run/devd.seqpacket.pipe",
address => "fffff80002ad9a50",
conn => 0,
inode => "fffff80002947ce8",
nextref => 0,
proto => "unix",
recvq => 0,
refs => 0,
sendq => 0,
type => "seqpac",
},
],
},
]
๐ FUNCTIONS ๐
๐ธ parse_netstat ๐ธ
Usage, bestie:
parse_netstat(%args) -> [$status_code, $reason, $payload, \%result_meta]
Okay so this one parses the output of the FreeBSD netstat command. Periodt.
Here's the tea on how netstat can get called: it can be called with -n (which shows raw IP addresses and port numbers instead of hostnames or port names) or without it. And it can be called with the -a option (which shows all listening and non-listening sockets) or without it. Either way, we got you. ๐ซถ
Tested with FreeBSD 10.1's netstat. iykyk
Heads up: this function is not exported by default, but it is exportable. ๐ซ
โจ Arguments โจ ('*' denotes required arguments):
output*=> str โ the output of thenetstatcommand. Yeah. You gotta hand it the actual text, it's not gonna go get it for you. ๐tcp=> bool (default: 1) โ whether to parse TCP (and TCP6) connections. Default is yes, on by default, we love that for us. ๐งฆudp=> bool (default: 1) โ whether to parse UDP (and UDP6) connections. Also default 1. ๐unix=> bool (default: 1) โ whether to parse Unix socket connections. Default 1 again. Consistent queen. ๐
๐ Returns ๐
It returns an enveloped result โ and yes it's an array, she's an array. ๐ฆ
- First element (
$status_code) is an integer holding an HTTP-like status code. So200means OK,4xxis a caller error, and5xxis a function error. Vibe check on the number fr. - Second element (
$reason) is a string with the error message โ or something like"OK"when the status is 200. ๐ฌ - Third element (
$payload) is the actual result, but usually it's not present when the enveloped result is an error response (like when$status_codeis not2xx). ๐ - Fourth element (
%result_meta) is called result metadata and it's optional โ a hash containing extra information, much like how HTTP response headers give you additional metadata. It's giving headers but make it Perl. ๐
Return value: (any)
๐ HOMEPAGE ๐
Please visit the project's homepage at <https://metacpan.org/release/Parse-Netstat>. Go on, click it, it's right there. โจ
๐ง SOURCE ๐ง
Source repository is at <https://github.com/perlancar/perl-Parse-Netstat>. Clone it, fork it, live your truth. ๐ป
๐ AUTHOR ๐
perlancar <perlancar@cpan.org> โ the literal icon who wrote all of this ๐
๐ซถ CONTRIBUTING ๐ซถ
To contribute, you can send patches by email/via RT, or send pull requests on GitHub. Pick your fighter, both are valid. ๐ฆ
Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:
% prove -l
If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, Pod::Weaver::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond that are considered a bug and can be reported to me. not a bug bestie, a BUG bug ๐ญ
๐ธ COPYRIGHT AND LICENSE ๐ธ
This software is copyright (c) 2022, 2017, 2015, 2014, 2012, 2011 by perlancar <perlancar@cpan.org>. ๐๏ธ
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Free as in go off, it's yours. ๐
๐ BUGS ๐
Please report any bugs or feature requests on the bugtracker website <https://rt.cpan.org/Public/Dist/Display.html?Name=Parse-Netstat>. ๐ฎ
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. Receipts or it didn't happen. ๐งพ
And that's the whole page, bestie โ you made it to the end, main character energy fr fr ๐
โจ This one was rendered from perl v5.36.0 and dated 2023-01-15, so yeah, it's a lil vintage but she still slays. Go parse some sockets, you got this. ๐๐ฆ๐
๐ฆ where this page comes from
- debian bookworm: libparse-netstat-perl 0.150-1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- debian trixie: libparse-netstat-perl 0.150-1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu noble: libparse-netstat-perl 0.150-1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu resolute: libparse-netstat-perl 0.150-1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- ubuntu stonking: libparse-netstat-perl 0.150-1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms