| 
									
										
										
										
											2023-03-17 16:07:49 +00:00
										 |  |  | //go:build linux
 | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | // +build linux
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func getLinesNum(filename string) (int, error) { | 
					
						
							|  |  |  | 	file, err := os.Open(filename) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer file.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sum := 0 | 
					
						
							|  |  |  | 	buf := make([]byte, 8192) | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		n, err := file.Read(buf) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var buffPosition int | 
					
						
							|  |  |  | 		for { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 			i := bytes.IndexByte(buf[buffPosition:n], '\n') | 
					
						
							|  |  |  | 			if i < 0 { | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 				break | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			buffPosition += i + 1 | 
					
						
							|  |  |  | 			sum++ | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err == io.EOF { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 			break | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 		} else if err != nil { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 			return 0, err | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 	return sum, nil | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GetTCPCount() (int, error) { | 
					
						
							|  |  |  | 	root := HostProc() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-29 13:32:54 +00:00
										 |  |  | 	tcp4, err := safeGetLinesNum(fmt.Sprintf("%v/net/tcp", root)) | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 		return 0, err | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2025-04-29 13:32:54 +00:00
										 |  |  | 	tcp6, err := safeGetLinesNum(fmt.Sprintf("%v/net/tcp6", root)) | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 		return 0, err | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return tcp4 + tcp6, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func GetUDPCount() (int, error) { | 
					
						
							|  |  |  | 	root := HostProc() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-29 13:32:54 +00:00
										 |  |  | 	udp4, err := safeGetLinesNum(fmt.Sprintf("%v/net/udp", root)) | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 		return 0, err | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2025-04-29 13:32:54 +00:00
										 |  |  | 	udp6, err := safeGetLinesNum(fmt.Sprintf("%v/net/udp6", root)) | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-05-22 23:13:15 +00:00
										 |  |  | 		return 0, err | 
					
						
							| 
									
										
										
										
											2023-02-09 19:18:06 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return udp4 + udp6, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-04-29 13:32:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func safeGetLinesNum(path string) (int, error) { | 
					
						
							|  |  |  | 	if _, err := os.Stat(path); os.IsNotExist(err) { | 
					
						
							|  |  |  | 		return 0, nil | 
					
						
							|  |  |  | 	} else if err != nil { | 
					
						
							|  |  |  | 		return 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return getLinesNum(path) | 
					
						
							|  |  |  | } |