parseIPVSStats performs the actual parsing of `ip_vs_stats`.
(r io.Reader)
| 76 | |
| 77 | // parseIPVSStats performs the actual parsing of `ip_vs_stats`. |
| 78 | func parseIPVSStats(r io.Reader) (IPVSStats, error) { |
| 79 | var ( |
| 80 | statContent []byte |
| 81 | statLines []string |
| 82 | statFields []string |
| 83 | stats IPVSStats |
| 84 | ) |
| 85 | |
| 86 | statContent, err := io.ReadAll(r) |
| 87 | if err != nil { |
| 88 | return IPVSStats{}, err |
| 89 | } |
| 90 | |
| 91 | statLines = strings.SplitN(string(statContent), "\n", 4) |
| 92 | if len(statLines) != 4 { |
| 93 | return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") |
| 94 | } |
| 95 | |
| 96 | statFields = strings.Fields(statLines[2]) |
| 97 | if len(statFields) != 5 { |
| 98 | return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") |
| 99 | } |
| 100 | |
| 101 | stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) |
| 102 | if err != nil { |
| 103 | return IPVSStats{}, err |
| 104 | } |
| 105 | stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) |
| 106 | if err != nil { |
| 107 | return IPVSStats{}, err |
| 108 | } |
| 109 | stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) |
| 110 | if err != nil { |
| 111 | return IPVSStats{}, err |
| 112 | } |
| 113 | stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) |
| 114 | if err != nil { |
| 115 | return IPVSStats{}, err |
| 116 | } |
| 117 | stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) |
| 118 | if err != nil { |
| 119 | return IPVSStats{}, err |
| 120 | } |
| 121 | |
| 122 | return stats, nil |
| 123 | } |
| 124 | |
| 125 | // IPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. |
| 126 | func (fs FS) IPVSBackendStatus() ([]IPVSBackendStatus, error) { |