mirror of
				https://github.com/tobychui/zoraxy.git
				synced 2025-10-31 14:04:13 +01:00 
			
		
		
		
	refactored io stats
This commit is contained in:
		
							
								
								
									
										11
									
								
								src/go.mod
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/go.mod
									
									
									
									
									
								
							| @@ -16,8 +16,10 @@ require ( | ||||
| 	github.com/grandcat/zeroconf v1.0.0 | ||||
| 	github.com/likexian/whois v1.15.1 | ||||
| 	github.com/microcosm-cc/bluemonday v1.0.26 | ||||
| 	github.com/shirou/gopsutil/v4 v4.25.1 | ||||
| 	github.com/syndtr/goleveldb v1.0.0 | ||||
| 	golang.org/x/net v0.29.0 | ||||
| 	golang.org/x/sys v0.25.0 | ||||
| 	golang.org/x/sys v0.28.0 | ||||
| 	golang.org/x/text v0.18.0 | ||||
| ) | ||||
|  | ||||
| @@ -26,13 +28,15 @@ require ( | ||||
| 	cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect | ||||
| 	github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect | ||||
| 	github.com/benbjohnson/clock v1.3.0 // indirect | ||||
| 	github.com/ebitengine/purego v0.8.2 // indirect | ||||
| 	github.com/go-ole/go-ole v1.2.6 // indirect | ||||
| 	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect | ||||
| 	github.com/golang-jwt/jwt/v5 v5.2.1 // indirect | ||||
| 	github.com/golang/snappy v0.0.1 // indirect | ||||
| 	github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114 // indirect | ||||
| 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect | ||||
| 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | ||||
| 	github.com/shopspring/decimal v1.3.1 // indirect | ||||
| 	github.com/syndtr/goleveldb v1.0.0 // indirect | ||||
| 	github.com/tidwall/btree v0.0.0-20191029221954-400434d76274 // indirect | ||||
| 	github.com/tidwall/buntdb v1.1.2 // indirect | ||||
| 	github.com/tidwall/gjson v1.12.1 // indirect | ||||
| @@ -43,6 +47,7 @@ require ( | ||||
| 	github.com/tidwall/tinyqueue v0.0.0-20180302190814-1e39f5511563 // indirect | ||||
| 	github.com/tjfoc/gmsm v1.4.1 // indirect | ||||
| 	github.com/vultr/govultr/v3 v3.9.1 // indirect | ||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||
| 	go.mongodb.org/mongo-driver v1.12.0 // indirect | ||||
| ) | ||||
|  | ||||
| @@ -175,7 +180,7 @@ require ( | ||||
| 	github.com/softlayer/softlayer-go v1.1.5 // indirect | ||||
| 	github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect | ||||
| 	github.com/spf13/cast v1.6.0 // indirect | ||||
| 	github.com/stretchr/testify v1.9.0 // indirect | ||||
| 	github.com/stretchr/testify v1.10.0 // indirect | ||||
| 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1002 // indirect | ||||
| 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1002 // indirect | ||||
| 	github.com/transip/gotransip/v6 v6.26.0 // indirect | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/go.sum
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/go.sum
									
									
									
									
									
								
							| @@ -176,6 +176,8 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj | ||||
| github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= | ||||
| github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= | ||||
| github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I= | ||||
| github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= | ||||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||
| @@ -221,6 +223,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-oauth2/oauth2/v4 v4.5.2 h1:CuZhD3lhGuI6aNLyUbRHXsgG2RwGRBOuCBfd4WQKqBQ= | ||||
| github.com/go-oauth2/oauth2/v4 v4.5.2/go.mod h1:wk/2uLImWIa9VVQDgxz99H2GDbhmfi/9/Xr+GvkSUSQ= | ||||
| github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||
| github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw= | ||||
| github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= | ||||
| github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= | ||||
| @@ -570,6 +574,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/pquerna/otp v1.4.0 h1:wZvl1TIVxKRThZIBiwOOHOGP/1+nZyWBil9Y2XNEDzg= | ||||
| github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= | ||||
| github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| @@ -609,6 +615,8 @@ github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZ | ||||
| github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= | ||||
| github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= | ||||
| github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= | ||||
| github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= | ||||
| github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= | ||||
| github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= | ||||
| github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= | ||||
| github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | ||||
| @@ -663,6 +671,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= | ||||
| github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= | ||||
| @@ -737,6 +747,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
| github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | ||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||
| go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= | ||||
| go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= | ||||
| @@ -893,6 +905,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @@ -907,6 +920,7 @@ golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @@ -929,6 +943,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= | ||||
| golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= | ||||
| golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||||
|   | ||||
| @@ -4,14 +4,9 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"path/filepath" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/shirou/gopsutil/v4/net" | ||||
| 	"imuslab.com/zoraxy/mod/info/logger" | ||||
| 	"imuslab.com/zoraxy/mod/utils" | ||||
| ) | ||||
| @@ -202,144 +197,21 @@ func (n *NetStatBuffers) HandleGetNetworkInterfaceStats(w http.ResponseWriter, r | ||||
|  | ||||
| // Get network interface stats, return accumulated rx bits, tx bits and error if any | ||||
| func (n *NetStatBuffers) GetNetworkInterfaceStats() (int64, int64, error) { | ||||
| 	if runtime.GOOS == "windows" { | ||||
| 		//Windows wmic sometime freeze and not respond. | ||||
| 		//The safer way is to make a bypass mechanism | ||||
| 		//when timeout with channel | ||||
|  | ||||
| 		type wmicResult struct { | ||||
| 			RX  int64 | ||||
| 			TX  int64 | ||||
| 			Err error | ||||
| 		} | ||||
|  | ||||
| 		callbackChan := make(chan wmicResult) | ||||
| 		cmd := exec.Command("wmic", "path", "Win32_PerfRawData_Tcpip_NetworkInterface", "Get", "BytesReceivedPersec,BytesSentPersec,BytesTotalPersec") | ||||
| 		//Execute the cmd in goroutine | ||||
| 		go func() { | ||||
| 			out, err := cmd.Output() | ||||
| 			if err != nil { | ||||
| 				callbackChan <- wmicResult{0, 0, err} | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			//Filter out the first line | ||||
| 			lines := strings.Split(strings.ReplaceAll(string(out), "\r\n", "\n"), "\n") | ||||
| 			if len(lines) >= 2 && len(lines[1]) >= 0 { | ||||
| 				dataLine := lines[1] | ||||
| 				for strings.Contains(dataLine, "  ") { | ||||
| 					dataLine = strings.ReplaceAll(dataLine, "  ", " ") | ||||
| 				} | ||||
| 				dataLine = strings.TrimSpace(dataLine) | ||||
| 				info := strings.Split(dataLine, " ") | ||||
| 				if len(info) != 3 { | ||||
| 					callbackChan <- wmicResult{0, 0, errors.New("invalid wmic results length")} | ||||
| 				} | ||||
| 				rxString := info[0] | ||||
| 				txString := info[1] | ||||
|  | ||||
| 				rx := int64(0) | ||||
| 				tx := int64(0) | ||||
| 				if s, err := strconv.ParseInt(rxString, 10, 64); err == nil { | ||||
| 					rx = s | ||||
| 				} | ||||
|  | ||||
| 				if s, err := strconv.ParseInt(txString, 10, 64); err == nil { | ||||
| 					tx = s | ||||
| 				} | ||||
|  | ||||
| 				time.Sleep(100 * time.Millisecond) | ||||
| 				callbackChan <- wmicResult{rx * 4, tx * 4, nil} | ||||
| 			} else { | ||||
| 				//Invalid data | ||||
| 				callbackChan <- wmicResult{0, 0, errors.New("invalid wmic results")} | ||||
| 			} | ||||
|  | ||||
| 		}() | ||||
|  | ||||
| 		go func() { | ||||
| 			//Spawn a timer to terminate the cmd process if timeout | ||||
| 			time.Sleep(3 * time.Second) | ||||
| 			if cmd != nil && cmd.Process != nil { | ||||
| 				cmd.Process.Kill() | ||||
| 				callbackChan <- wmicResult{0, 0, errors.New("wmic execution timeout")} | ||||
| 			} | ||||
| 		}() | ||||
|  | ||||
| 		result := wmicResult{} | ||||
| 		result = <-callbackChan | ||||
| 		cmd = nil | ||||
| 		if result.Err != nil { | ||||
| 			n.logger.PrintAndLog("netstat", "Unable to extract NIC info from wmic", result.Err) | ||||
| 		} | ||||
| 		return result.RX, result.TX, result.Err | ||||
| 	} else if runtime.GOOS == "linux" { | ||||
| 		allIfaceRxByteFiles, err := filepath.Glob("/sys/class/net/*/statistics/rx_bytes") | ||||
| 		if err != nil { | ||||
| 			//Permission denied | ||||
| 			return 0, 0, errors.New("access denied") | ||||
| 		} | ||||
|  | ||||
| 		if len(allIfaceRxByteFiles) == 0 { | ||||
| 			return 0, 0, errors.New("no valid iface found") | ||||
| 		} | ||||
|  | ||||
| 		rxSum := int64(0) | ||||
| 		txSum := int64(0) | ||||
| 		for _, rxByteFile := range allIfaceRxByteFiles { | ||||
| 			rxBytes, err := os.ReadFile(rxByteFile) | ||||
| 			if err == nil { | ||||
| 				rxBytesInt, err := strconv.Atoi(strings.TrimSpace(string(rxBytes))) | ||||
| 				if err == nil { | ||||
| 					rxSum += int64(rxBytesInt) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			//Usually the tx_bytes file is nearby it. Read it as well | ||||
| 			txByteFile := filepath.Join(filepath.Dir(rxByteFile), "tx_bytes") | ||||
| 			txBytes, err := os.ReadFile(txByteFile) | ||||
| 			if err == nil { | ||||
| 				txBytesInt, err := strconv.Atoi(strings.TrimSpace(string(txBytes))) | ||||
| 				if err == nil { | ||||
| 					txSum += int64(txBytesInt) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		//Return value as bits | ||||
| 		return rxSum * 8, txSum * 8, nil | ||||
|  | ||||
| 	} else if runtime.GOOS == "darwin" { | ||||
| 		cmd := exec.Command("netstat", "-ib") //get data from netstat -ib | ||||
| 		out, err := cmd.Output() | ||||
| 		if err != nil { | ||||
| 			return 0, 0, err | ||||
| 		} | ||||
|  | ||||
| 		outStrs := string(out)                                                          //byte array to multi-line string | ||||
| 		for _, outStr := range strings.Split(strings.TrimSuffix(outStrs, "\n"), "\n") { //foreach multi-line string | ||||
| 			if strings.HasPrefix(outStr, "en") { //search for ethernet interface | ||||
| 				if strings.Contains(outStr, "<Link#") { //search for the link with <Link#?> | ||||
| 					outStrSplit := strings.Fields(outStr) //split by white-space | ||||
|  | ||||
| 					rxSum, errRX := strconv.Atoi(outStrSplit[6]) //received bytes sum | ||||
| 					if errRX != nil { | ||||
| 						return 0, 0, errRX | ||||
| 					} | ||||
|  | ||||
| 					txSum, errTX := strconv.Atoi(outStrSplit[9]) //transmitted bytes sum | ||||
| 					if errTX != nil { | ||||
| 						return 0, 0, errTX | ||||
| 					} | ||||
|  | ||||
| 					return int64(rxSum) * 8, int64(txSum) * 8, nil | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return 0, 0, nil //no ethernet adapters with en*/<Link#*> | ||||
| 	// Get aggregated network I/O stats for all interfaces | ||||
| 	counters, err := net.IOCounters(false) | ||||
| 	if err != nil { | ||||
| 		return 0, 0, err | ||||
| 	} | ||||
| 	if len(counters) == 0 { | ||||
| 		return 0, 0, errors.New("no network interfaces found") | ||||
| 	} | ||||
|  | ||||
| 	return 0, 0, errors.New("platform not supported") | ||||
| 	var totalRx, totalTx uint64 | ||||
| 	for _, counter := range counters { | ||||
| 		totalRx += counter.BytesRecv | ||||
| 		totalTx += counter.BytesSent | ||||
| 	} | ||||
|  | ||||
| 	// Convert bytes to bits | ||||
| 	return int64(totalRx * 8), int64(totalTx * 8), nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Tim Dreyer
					Tim Dreyer