Parse:...::linux(3pm)

πŸ“¦
version 0.150 Β· 2 versions
  • 0.150 Β· debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking (latest)
  • 0.14 Β· ubuntu jammy
, in debian bookworm, debian trixie, ubuntu noble, ubuntu resolute, ubuntu stonking

πŸ’– NAME πŸ’–

Parse::Netstat::linux β€” bestie, this is the module that parses the output of the Linux netstat command. It reads that whole messy wall of text and hands you back a cute lil data structure instead. No cap. πŸ’…βœ¨


🌸 VERSION 🌸

This document describes version 0.150 of Parse::Netstat::linux (from Perl distribution Parse-Netstat), released on 2022-12-04. Iconic behavior, honestly. πŸŽ€


🫢 SYNOPSIS 🫢

okay so here's the vibe, watch this:

use Parse::Netstat qw(parse_netstat);
my $res = parse_netstat(output=>join("", `netstat -anp`), flavor=>"linux");

Sample netstat -anp output:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:1027              0.0.0.0:*                   LISTEN      -
tcp        0      0 builder.localdomain:1028    *:*                         LISTEN
tcp        0      0 127.0.0.1:58159             0.0.0.0:*                   LISTEN      -
tcp        0      0 127.0.0.1:58160             0.0.0.0:*                   LISTEN      -
tcp        0      0 127.0.0.1:7634              0.0.0.0:*                   LISTEN      -
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      -
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1234/program with space
tcp        0      0 192.168.0.103:44922         1.2.3.4:143                 ESTABLISHED 25820/thunderbird-b
tcp6       0      0 ::1:1028                    :::*                        LISTEN      -
udp        0      0 0.0.0.0:631                 0.0.0.0:*                               -
udp        0      0 192.168.0.103:56668         0.0.0.0:*                               -
udp        0      0 192.168.0.103:52753         0.0.0.0:*                               8888/opera
udp6       0      0 :::42069                    :::*                                    -
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ]         DGRAM                    6906   -                   /var/spool/postfix/dev/log
unix  2      [ ACC ]     STREAM     LISTENING     650654 -                   /tmp/orbit-t1/linc-76ff-0-3fc1dd3f2f2
unix  2      [ ACC ]     STREAM     LISTENING     1121541 16933/kate 123     /tmp/orbit-s1/linc-4225-0-267d23358095e

and then the sample result is this gorgeous thing right here:

[
  200,
  "OK",
  {
    active_conns => [
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "127.0.0.1",
        local_port => 1027,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "*",
        foreign_port => "*",
        local_host => "builder.localdomain",
        local_port => 1028,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "127.0.0.1",
        local_port => 58159,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "127.0.0.1",
        local_port => 58160,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "127.0.0.1",
        local_port => 7634,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "0.0.0.0",
        local_port => 22,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "0.0.0.0",
        local_port => 631,
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "127.0.0.1",
        local_port => 25,
        pid => 1234,
        program => "program with space",
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "1.2.3.4",
        foreign_port => 143,
        local_host => "192.168.0.103",
        local_port => 44922,
        pid => 25820,
        program => "thunderbird-b",
        proto => "tcp",
        recvq => 0,
        sendq => 0,
        state => "ESTABLISHED",
      },
      {
        foreign_host => "::",
        foreign_port => "*",
        local_host => "::1",
        local_port => 1028,
        proto => "tcp6",
        recvq => 0,
        sendq => 0,
        state => "LISTEN",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "0.0.0.0",
        local_port => 631,
        proto => "udp",
        recvq => 0,
        sendq => 0,
        state => "-",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "192.168.0.103",
        local_port => 56668,
        proto => "udp",
        recvq => 0,
        sendq => 0,
        state => "-",
      },
      {
        foreign_host => "0.0.0.0",
        foreign_port => "*",
        local_host => "192.168.0.103",
        local_port => 52753,
        proto => "udp",
        recvq => 0,
        sendq => 0,
        state => "8888/opera",
      },
      {
        foreign_host => "::",
        foreign_port => "*",
        local_host => "::",
        local_port => 42069,
        proto => "udp6",
        recvq => 0,
        sendq => 0,
        state => "-",
      },
      {
        flags  => "",
        inode  => 6906,
        path   => "/var/spool/postfix/dev/log",
        proto  => "unix",
        refcnt => 2,
        state  => " ",
        type   => "DGRAM",
      },
      {
        flags  => "ACC",
        inode  => 650654,
        path   => "/tmp/orbit-t1/linc-76ff-0-3fc1dd3f2f2",
        proto  => "unix",
        refcnt => 2,
        state  => "LISTENING",
        type   => "STREAM",
      },
      {
        flags   => "ACC",
        inode   => 1121541,
        path    => "123     /tmp/orbit-s1/linc-4225-0-267d23358095e",
        pid     => 16933,
        program => "kate",
        proto   => "unix",
        refcnt  => 2,
        state   => "LISTENING",
        type    => "STREAM",
      },
    ],
  },
]

like… look at that structure. she's organized. the vibes are immaculate. 🌈


πŸ”₯ FUNCTIONS πŸ”₯

parse_netstat

Usage, bestie:

parse_netstat(%args) -> [$status_code, $reason, $payload, \%result_meta]

Parse the output of Linux netstat command. 🧚

so netstat can be called with -n (which shows raw IP addresses and port numbers instead of hostnames or port names) or without it. It can be called with -a (which shows all listening and non-listening sockets) or without. And it can be called with -p (which shows PID/program names) or without. Whatever combo you throw at it, this module is not fazed. πŸ’…

This function is not exported by default, but it is exportable.

Arguments (* means required, so like, you literally have to):

  • output* => str β€” the output of the netstat command. That's the whole point, bestie, you gotta feed her the text. πŸ“
  • tcp => bool (default: 1) β€” whether to parse TCP (and TCP6) connections.
  • udp => bool (default: 1) β€” whether to parse UDP (and UDP6) connections.
  • unix => bool (default: 1) β€” whether to parse Unix socket connections.

Returns an enveloped result (an array). Yes, an array. Let's break her down:

  • First element ($status_code) is an integer holding an HTTP-like status code β€” 200 means OK, 4xx is a caller error, 5xx is a function error. iykyk.
  • Second element ($reason) is a string with the error message, or something like "OK" if the status is 200. 🫢
  • Third element ($payload) is the actual result β€” but it's usually not there when the enveloped result is an error response (aka when $status_code is not 2xx). πŸ™ˆ
  • Fourth element (%result_meta) is called result metadata and it's optional β€” a hash holding extra information, much like how HTTP response headers give you additional metadata. main character energy honestly.

Return value: (any)


πŸ¦‹ HOMEPAGE πŸ¦‹

pls go visit the project's homepage at <https://metacpan.org/release/Parse-Netstat>. she's cute, she's maintained, she's thriving. ⭐


πŸ’œ SOURCE πŸ’œ

The source repository lives at <https://github.com/perlancar/perl-Parse-Netstat>. go peek, go lurk, it's fine. πŸ‘‘


πŸŽ€ AUTHOR πŸŽ€

perlancar <perlancar@cpan.org> β€” the legend themself. πŸ’–


🌟 CONTRIBUTING 🌟

wanna contribute? say less. you can send patches by email/via RT, or send pull requests on GitHub. 🫢

Most of the time, you don't even need to build the distribution yourself. You can simply modify the code, then test via:

% prove -l

If you do want to build the distribution (like, say, 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. And listen β€” any additional steps required beyond that are considered a bug and can be reported to me. fr fr. πŸ›


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. slay. πŸ’…


😭 BUGS 😭

Please report any bugs or feature requests on the bugtracker website <https://rt.cpan.org/Public/Dist/Display.html?Name=Parse-Netstat>. don't be shy, bestie. 🫢

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, basically. no cap.


and that's the whole page, babe πŸ’– this was Parse:...::linux(3pm), and the doc you just read came off perl v5.36.0, dated 2023-01-15. periodt. πŸŽ€βœ¨

πŸ“¦ where this page comes from