File Coverage

blib/lib/Parse/Netstat.pm
Criterion Covered Total %
statement 25 26 96.1
branch 10 12 83.3
condition 7 8 87.5
subroutine 4 4 100.0
pod 1 1 100.0
total 47 51 92.1


line stmt bran cond sub pod time code
1             package Parse::Netstat;
2              
3             our $DATE = '2017-02-10'; # DATE
4             our $VERSION = '0.14'; # VERSION
5              
6 1     1   12534 use 5.010001;
  1         2  
7 1     1   3 use strict;
  1         2  
  1         14  
8 1     1   3 use warnings;
  1         2  
  1         363  
9              
10             require Exporter;
11             our @ISA = qw(Exporter);
12             our @EXPORT_OK = qw(parse_netstat);
13              
14             our %SPEC;
15              
16             $SPEC{parse_netstat} = {
17             v => 1.1,
18             summary => 'Parse the output of "netstat" command',
19             description => <<'_',
20              
21             This program support several flavors of netstat. The default flavor is `linux`.
22             Use `--flavor` to select which flavor you want.
23              
24             Since different flavors provide different fields and same-named fields might
25             contain data in different format, and also not all kinds of possible output from
26             a single flavor are supported, please see the sample parse output for each
27             flavor (in corresponding `Parse::Netstat::*` per-flavor module) you want to use
28             and adjust accordingly.
29              
30             _
31             args => {
32             output => {
33             summary => 'Output of netstat command',
34             description => <<'_',
35              
36             This function only parses program's output. You need to invoke "netstat" on your
37             own.
38              
39             _
40             schema => 'str*',
41             pos => 0,
42             req => 1,
43             cmdline_src => 'stdin_or_files',
44             },
45             flavor => {
46             summary => 'Flavor of netstat',
47             schema => ['str*', in => ['linux', 'solaris', 'freebsd', 'darwin', 'win32']],
48             default => 'linux',
49             },
50             tcp => {
51             summary => 'Parse TCP connections',
52             'summary.alt.bool.not' => 'Do not parse TCP connections',
53             schema => [bool => default => 1],
54             },
55             udp => {
56             summary => 'Parse UDP connections',
57             'summary.alt.bool.not' => 'Do not parse UDP connections',
58             schema => [bool => default => 1],
59             },
60             unix => {
61             summary => 'Parse Unix socket connections',
62             'summary.alt.bool.not' => 'Do not parse Unix socket connections',
63             schema => [bool => default => 1],
64             },
65             },
66             examples => [
67             {
68             src => 'netstat -anp | parse-netstat',
69             src_plang => 'bash',
70             },
71             ],
72             };
73             sub parse_netstat {
74 19     19 1 34530 my %args = @_;
75              
76 19 50       47 my $output = $args{output} or return [400, "Please specify output"];
77 19   100     58 my $tcp = $args{tcp} // 1;
78 19   100     60 my $udp = $args{udp} // 1;
79 19   100     44 my $unix = $args{unix} // 1;
80 19   50     31 my $flavor = $args{flavor} // 'linux';
81              
82 19 100       59 if ($flavor eq 'linux') {
    100          
    100          
    100          
    50          
83 4         576 require Parse::Netstat::linux;
84 4         10 Parse::Netstat::linux::parse_netstat(
85             output=>$output, tcp=>$tcp, udp=>$udp, unix=>$unix);
86             } elsif ($flavor eq 'freebsd') {
87 4         560 require Parse::Netstat::freebsd;
88 4         12 Parse::Netstat::freebsd::parse_netstat(
89             output=>$output, tcp=>$tcp, udp=>$udp, unix=>$unix);
90             } elsif ($flavor eq 'darwin') {
91 4         547 require Parse::Netstat::darwin;
92 4         14 Parse::Netstat::darwin::parse_netstat(
93             output=>$output, tcp=>$tcp, udp=>$udp, unix=>$unix);
94             } elsif ($flavor eq 'solaris') {
95 4         515 require Parse::Netstat::solaris;
96 4         12 Parse::Netstat::solaris::parse_netstat(
97             output=>$output, tcp=>$tcp, udp=>$udp, unix=>$unix);
98             } elsif ($flavor eq 'win32') {
99 3         489 require Parse::Netstat::win32;
100 3         11 Parse::Netstat::win32::parse_netstat(
101             output=>$output, tcp=>$tcp, udp=>$udp);
102             } else {
103 0           return [400, "Unknown flavor '$flavor', please see --help"];
104             }
105             }
106              
107             1;
108             # ABSTRACT: Parse the output of "netstat" command
109              
110             __END__