#!/usr/bin/perl -wT use strict; use DBI qw(); my %service; open(SER,'<','/etc/services') || die "Unable to open file '/etc/services': $!"; while (local $_ = ) { next if /^\s*#/ || /^\s*$/; my $desc; if (/#\s*(.+)\s*$/) { $desc = $1; s/#.*$//; } my ($service,$port,@aliases) = split(/\s+/,$_); $service{$port} = { name => $service, aliases => \@aliases, desc => $desc, }; } close(SER) || die "Unable to close file '/etc/services': $!"; my $dbh = DBI->connect('DBI:mysql:machinedb:localhost','machinedb_update','a8fc0ebf41ed43eb2686fcec2291c071'); my $sth = $dbh->prepare(qq{ SELECT hostname,data FROM probe NATURAL JOIN machine NATURAL JOIN host WHERE probe = ? ORDER BY hostname }); $sth->execute('netstat'); my @cols = qw(proto recvq sendq local foreign state process); while (my ($hostname,$data) = $sth->fetchrow_array) { print "$hostname\n"; for (split(/\n/,$data)) { next unless /[:\*\d]/; my %data; @data{@cols} = split(/\s+/,$_); if ($data{proto} =~ /^tcp/ && $data{state} eq 'LISTEN') { ($data{port}) = $data{local} =~ /:([\d\*]+)$/; my $desc = ''; if (exists $service{"$data{port}/tcp"}) { $desc = $service{"$data{port}/tcp"}->{desc} || $service{"$data{port}/tcp"}->{name} || ''; } printf("\t%s\t%s\n",$data{port},$desc); } } print "\n"; } $sth->finish; $dbh->disconnect;