Both utility and GO package to wait for port to open (TCP, UDP).
In dockerized applications usually we deploy several containers with the main program container.
We need to know if containers are started, so we can continue to execute our program or fail it after some deadline.
There are a lot of examples through the internet that advise us to use several bash commands like
nc
, timeout
, curl
.
But what if we have GO program minimal docker image
FROM scratch
that does not have bash? We could use this package as library in our program — just put couple lines of code to check if some ports are available.
But also this package can be donwloaded as utility and used from command line.
import "github.com/antelman107/net-wait-go/wait" if !wait.New().Do([]string{"postgres:5432"}) { logger.Error("db is not available") return }
import "github.com/antelman107/net-wait-go/wait" if !wait.New( wait.WithProto("tcp"), wait.WithWait(200*time.Millisecond), wait.WithBreak(50*time.Millisecond), wait.WithDeadline(15*time.Second), wait.WithDebug(true), ).Do([]string{"postgres:5432"}) { logger.Error("db is not available") return }
net-wait-go -addrs string address:port(,address:port,address:port,...) -deadline uint deadline in milliseconds (default 10000) -debug debug messages toggler -delay uint break between requests in milliseconds (default 50) -packet string UDP packet to be sent -proto string tcp (default "tcp") -wait uint delay of single request in milliseconds (default 100)
net-wait-go -addrs ya.ru:443 -debug true 2020/06/30 18:07:38 ya.ru:443 is OK return code is 0
net-wait-go -addrs ya.ru:443,yandex.ru:443 -debug true 2020/06/30 18:09:24 yandex.ru:443 is OK 2020/06/30 18:09:24 ya.ru:443 is OK return code is 0
net-wait-go -addrs ya.ru:445,yandex.ru:445 -debug true 2020/06/30 18:09:24 yandex.ru:445 is FAILED 2020/06/30 18:09:24 ya.ru:445 is is FAILED ... return code is 1
Since UDP as protocol does not provide connection between a server and clients, it is not supported in the most of popular utilities:
wait-for-it
(issue — https://github.com/vishnubob/wait-for-it/issues/29)netcat
(nc
) has following note in its manual page:
CAVEATS UDP port scans will always succeed (i.e. report the port as open)
net-wait-go
provides UDP support, working following way:
Counter Strike game server is accessible via UDP. Let's check random Counter Strike server by sending A2S_INFO packet (https://developer.valvesoftware.com/wiki/Server_queries#A2S_INFO)
net-wait-go -proto udp -addrs 46.174.53.245:27015,185.158.113.136:27015 -packet '/////1RTb3VyY2UgRW5naW5lIFF1ZXJ5AA==' -debug true 2020/07/12 15:13:25 udp 185.158.113.136:27015 is OK 2020/07/12 15:13:25 udp 46.174.53.245:27015 is OK # return code is 0
-packet
value here is the base64-encoded A2S_INFO packet, which is documented here —
https://github.com/wriley/steamserverinfo/blob/master/steamserverinfo.go#L133.
Available here — github.com/antelman107/net-wait-go.