💻 netselect is an open source CLI tool as well as Go library to find the fastest host(s) based on the lowest ICMP latency.
It’s a handy tool to choose a mirror for apt, or just to compare sites to each other. Under the hood it’s just an ICMP ping.
Try it and let me know your thoughts. I would greatly appreciate any kind of feedback.
Repo: https://github.com/pgollangi/netselect
- Star if you find this tool useful.
- Open an Issue if you come accross any problem using tool.
- Submit a PR if you would like an improvement.
Features
- Finds the fastest host(s) in terms of network connectivity.
- Run desired concurent findings to get faster results. Use flag --concurrent.
- Customize no. of ping attempt to perform for each host to get accurate mean response time. Use flag --attempts.
- Display only top nresults on output. Use flag--output.
- Optionally, direct netselectto send “unprivileged” pings via UDP for non-sudo users. Use--privileged=false.
Usage
netselect available as Commnad-Line tool and Go library.
Command-Line
1
2
3
netselect [options] <host(s)>
netselect -v
netselect --help
 
For example:
1
2
3
4
5
$ netselect google.com google.in google.us
google.com       55 ms  100% ok         ( 3/ 3)
google.in        56 ms  100% ok         ( 3/ 3)
google.us        59 ms  100% ok         ( 3/ 3)
 
For more information on CLI usage, please refer dev.pgollangi.com/netselect.
Go Library
Here is a simple example that finds fastest host(s) using library:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hosts := []*netselect.Host{
    &netselect.Host{Address: "google.in"},
    &netselect.Host{Address: "google.com"},
}
netSelector, err :=netselect.NewNetSelector(hosts)
if err != nil {
    panic(err)
}
results, err := netSelector.Select()
if err != nil {
    panic(err)
}
fastestHosts := results // Fastest hosts in ASC order
 
For more information on library usage, please refer API documentation on pkg.go.dev
Installation
Scoop
1
2
scoop bucket add pgollangi-bucket https://github.com/pgollangi/scoop-bucket.git
scoop install netselect
 
Homebrew
1
brew install pgollangi/tap/netselect
 
Updating:
1
brew upgrade netselect
 
Go
1
2
go get github.com/pgollangi/netselect/cmd/netselect
netselect
 
Manual
- Download and install binary from the latest release.
- Recommended: add netselect executable to your $PATH.
Caveats
netelect implements ICMP ping using both raw socket and UDP. It needs to be run as a root user.
Alternatley, you can use setcap to allow netselect to bind to raw sockets
1
setcap cap_net_raw=+ep /bin/netselect
 
If you do not wish to do all this, you can use flag --privileged=false to send an “unprivileged” ping via UDP. This must be enabled by setting
1
sudo sysctl -w net.ipv4.ping_group_range="0   2147483647"
 
