Skip to content

Commit 46a3ace

Browse files
committed
Transformed netstat to netproc parser
1 parent e5b49ef commit 46a3ace

File tree

10 files changed

+350
-1098
lines changed

10 files changed

+350
-1098
lines changed

README.md

+29-59
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,48 @@
1-
### Usage:
1+
### Go-ProcNet
2+
A go parser for linux socket files, supporting:
3+
- /proc/net/tcp
4+
- /proc/net/tcp6
5+
- /proc/net/udp
6+
- /proc/net/udp6
7+
8+
Can also be used for socket files of a specific process under /proc/<PID>/net/
9+
10+
Based on the source code of https://github.com/cakturk/go-netstat
211

3-
```
4-
Usage of ./go-netstat:
5-
-4 display only IPv4 sockets
6-
-6 display only IPv6 sockets
7-
-all
8-
display both listening and non-listening sockets
9-
-help
10-
display this help screen
11-
-lis
12-
display only listening sockets
13-
-res
14-
lookup symbolic names for host addresses
15-
-tcp
16-
display TCP sockets
17-
-udp
18-
display UDP sockets
19-
```
2012
### Installation:
2113

2214
```
23-
$ go get github.com/cakturk/go-netstat
15+
$ go get github.com/amit7itz/go-procnet
2416
```
2517

26-
### Using as a library
27-
#### [Godoc](https://godoc.org/github.com/cakturk/go-netstat/netstat)
28-
#### Getting the package
29-
```
30-
$ go get github.com/cakturk/go-netstat/netstat
31-
```
3218

3319
```go
20+
package main
21+
3422
import (
3523
"fmt"
36-
37-
"github.com/cakturk/go-netstat/netstat"
24+
"github.com/amit7itz/go-procnet/procnet"
3825
)
3926

40-
func displaySocks() error {
41-
// UDP sockets
42-
socks, err := netstat.UDPSocks(netstat.NoopFilter)
43-
if err != nil {
44-
return err
45-
}
46-
for _, e := range socks {
47-
fmt.Printf("%v\n", e)
48-
}
49-
50-
// TCP sockets
51-
socks, err = netstat.TCPSocks(netstat.NoopFilter)
52-
if err != nil {
53-
return err
54-
}
55-
for _, e := range socks {
56-
fmt.Printf("%v\n", e)
57-
}
58-
59-
// get only listening TCP sockets
60-
tabs, err := netstat.TCPSocks(func(s *netstat.SockTabEntry) bool {
61-
return s.State == netstat.Listen
62-
})
27+
func main() {
28+
// parsing the tcp sockets from /proc/net/tcp
29+
socks, err := procnet.TCPSocks()
6330
if err != nil {
64-
return err
31+
panic(err)
6532
}
66-
for _, e := range tabs {
67-
fmt.Printf("%v\n", e)
33+
for _, sock := range socks {
34+
fmt.Printf("local ip: %s local port: %d remote IP: %s remote port: %d state: %s",
35+
sock.LocalAddr.IP, sock.LocalAddr.Port, sock.RemoteAddr.IP, sock.RemoteAddr.Port, sock.State)
6836
}
6937

70-
// list all the TCP sockets in state FIN_WAIT_1 for your HTTP server
71-
tabs, err = netstat.TCPSocks(func(s *netstat.SockTabEntry) bool {
72-
return s.State == netstat.FinWait1 && s.LocalAddr.Port == 80
73-
})
74-
// error handling, etc.
38+
// for parsing the sockets from a custom path
39+
socks, err = procnet.SocksFromPath("/proc/1234/net/udp")
40+
// ...
7541

76-
return nil
42+
// for parsing the sockets from the textual content of a socket file
43+
socks, err = procnet.SocksFromText(` sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
44+
0: 00000000000000000000000000000000:1B58 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 854815644 1 0000000000000000 100 0 0 10 0
45+
1: 0000000000000000FFFF0000860EA8C0:1B58 0000000000000000FFFF0000E70FA8C0:87F6 01 00000000:00000000 00:00000000 00000000 0 0 854824433 1 0000000000000000 20 4 1 10 -1`)
46+
// ...
7747
}
7848
```

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
module github.com/cakturk/go-netstat
1+
module github.com/amit7itz/go-procnet
22

33
go 1.13
4+
5+
require github.com/stretchr/testify v1.8.0

go.sum

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
3+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
6+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
7+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
8+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
9+
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
10+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
11+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
12+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
13+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
14+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
15+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

main.go

+16-113
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,28 @@
11
package main
22

33
import (
4-
"flag"
54
"fmt"
6-
"net"
7-
"os"
8-
9-
"github.com/cakturk/go-netstat/netstat"
10-
)
11-
12-
var (
13-
udp = flag.Bool("udp", false, "display UDP sockets")
14-
tcp = flag.Bool("tcp", false, "display TCP sockets")
15-
listening = flag.Bool("lis", false, "display only listening sockets")
16-
all = flag.Bool("all", false, "display both listening and non-listening sockets")
17-
resolve = flag.Bool("res", false, "lookup symbolic names for host addresses")
18-
ipv4 = flag.Bool("4", false, "display only IPv4 sockets")
19-
ipv6 = flag.Bool("6", false, "display only IPv6 sockets")
20-
help = flag.Bool("help", false, "display this help screen")
21-
)
22-
23-
const (
24-
protoIPv4 = 0x01
25-
protoIPv6 = 0x02
5+
"github.com/amit7itz/go-procnet/procnet"
266
)
277

288
func main() {
29-
flag.Parse()
30-
31-
if *help {
32-
flag.Usage()
33-
os.Exit(0)
34-
}
35-
36-
var proto uint
37-
if *ipv4 {
38-
proto |= protoIPv4
39-
}
40-
if *ipv6 {
41-
proto |= protoIPv6
42-
}
43-
if proto == 0x00 {
44-
proto = protoIPv4 | protoIPv6
9+
// parsing the tcp sockets from /proc/net/tcp
10+
socks, err := procnet.TCPSocks()
11+
if err != nil {
12+
panic(err)
4513
}
46-
47-
if os.Geteuid() != 0 {
48-
fmt.Println("Not all processes could be identified, you would have to be root to see it all.")
49-
}
50-
fmt.Printf("Proto %-23s %-23s %-12s %-16s\n", "Local Addr", "Foreign Addr", "State", "PID/Program name")
51-
52-
if *udp {
53-
if proto&protoIPv4 == protoIPv4 {
54-
tabs, err := netstat.UDPSocks(netstat.NoopFilter)
55-
if err == nil {
56-
displaySockInfo("udp", tabs)
57-
}
58-
}
59-
if proto&protoIPv6 == protoIPv6 {
60-
tabs, err := netstat.UDP6Socks(netstat.NoopFilter)
61-
if err == nil {
62-
displaySockInfo("udp6", tabs)
63-
}
64-
}
65-
} else {
66-
*tcp = true
67-
}
68-
69-
if *tcp {
70-
var fn netstat.AcceptFn
71-
72-
switch {
73-
case *all:
74-
fn = func(*netstat.SockTabEntry) bool { return true }
75-
case *listening:
76-
fn = func(s *netstat.SockTabEntry) bool {
77-
return s.State == netstat.Listen
78-
}
79-
default:
80-
fn = func(s *netstat.SockTabEntry) bool {
81-
return s.State != netstat.Listen
82-
}
83-
}
84-
85-
if proto&protoIPv4 == protoIPv4 {
86-
tabs, err := netstat.TCPSocks(fn)
87-
if err == nil {
88-
displaySockInfo("tcp", tabs)
89-
}
90-
}
91-
if proto&protoIPv6 == protoIPv6 {
92-
tabs, err := netstat.TCP6Socks(fn)
93-
if err == nil {
94-
displaySockInfo("tcp6", tabs)
95-
}
96-
}
14+
for _, sock := range socks {
15+
fmt.Printf("local ip: %s local port: %d remote IP: %s remote port: %d state: %s",
16+
sock.LocalAddr.IP, sock.LocalAddr.Port, sock.RemoteAddr.IP, sock.RemoteAddr.Port, sock.State)
9717
}
98-
}
9918

100-
func displaySockInfo(proto string, s []netstat.SockTabEntry) {
101-
lookup := func(skaddr *netstat.SockAddr) string {
102-
const IPv4Strlen = 17
103-
addr := skaddr.IP.String()
104-
if *resolve {
105-
names, err := net.LookupAddr(addr)
106-
if err == nil && len(names) > 0 {
107-
addr = names[0]
108-
}
109-
}
110-
if len(addr) > IPv4Strlen {
111-
addr = addr[:IPv4Strlen]
112-
}
113-
return fmt.Sprintf("%s:%d", addr, skaddr.Port)
114-
}
19+
// for parsing the sockets from a custom path
20+
socks, err = procnet.SocksFromPath("/proc/1234/net/udp")
21+
// ...
11522

116-
for _, e := range s {
117-
p := ""
118-
if e.Process != nil {
119-
p = e.Process.String()
120-
}
121-
saddr := lookup(e.LocalAddr)
122-
daddr := lookup(e.RemoteAddr)
123-
fmt.Printf("%-5s %-23.23s %-23.23s %-12s %-16s\n", proto, saddr, daddr, e.State, p)
124-
}
23+
// for parsing the sockets from the textual content of a socket file
24+
socks, err = procnet.SocksFromText(` sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
25+
0: 00000000000000000000000000000000:1B58 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 854815644 1 0000000000000000 100 0 0 10 0
26+
1: 0000000000000000FFFF0000860EA8C0:1B58 0000000000000000FFFF0000E70FA8C0:87F6 01 00000000:00000000 00:00000000 00000000 0 0 854824433 1 0000000000000000 20 4 1 10 -1`)
27+
// ...
12528
}

netstat/netstat.go

-74
This file was deleted.

0 commit comments

Comments
 (0)