Skip to content
Snippets Groups Projects
Unverified Commit 7b839fb2 authored by Jonas Theis's avatar Jonas Theis Committed by GitHub
Browse files

Clean up PortCheck plugin and make it standalone #259 (#271)


Co-authored-by: default avatarHans Moog <hm@mkjc.net>
parent 6b7393c4
No related branches found
No related tags found
No related merge requests found
...@@ -38,12 +38,12 @@ func main() { ...@@ -38,12 +38,12 @@ func main() {
logger.PLUGIN, logger.PLUGIN,
cli.PLUGIN, cli.PLUGIN,
remotelog.PLUGIN, remotelog.PLUGIN,
gracefulshutdown.PLUGIN, portcheck.PLUGIN,
autopeering.PLUGIN, autopeering.PLUGIN,
tangle.PLUGIN, tangle.PLUGIN,
gossip.PLUGIN, gossip.PLUGIN,
portcheck.PLUGIN, gracefulshutdown.PLUGIN,
analysis.PLUGIN, analysis.PLUGIN,
metrics.PLUGIN, metrics.PLUGIN,
......
...@@ -19,7 +19,7 @@ import ( ...@@ -19,7 +19,7 @@ import (
var ( var (
log *logger.Logger log *logger.Logger
mgr *gp.Manager mgr *gp.Manager
Srv *server.TCP srv *server.TCP
) )
func configureGossip() { func configureGossip() {
...@@ -64,10 +64,10 @@ func start(shutdownSignal <-chan struct{}) { ...@@ -64,10 +64,10 @@ func start(shutdownSignal <-chan struct{}) {
} }
defer listener.Close() defer listener.Close()
Srv = server.ServeTCP(lPeer, listener, log) srv = server.ServeTCP(lPeer, listener, log)
defer Srv.Close() defer srv.Close()
mgr.Start(Srv) mgr.Start(srv)
defer mgr.Close() defer mgr.Close()
log.Infof("%s started: Address=%s/%s", name, gossipAddr.String(), gossipAddr.Network()) log.Infof("%s started: Address=%s/%s", name, gossipAddr.String(), gossipAddr.Network())
......
...@@ -6,84 +6,118 @@ import ( ...@@ -6,84 +6,118 @@ import (
"github.com/iotaledger/goshimmer/packages/gossip/server" "github.com/iotaledger/goshimmer/packages/gossip/server"
"github.com/iotaledger/goshimmer/packages/netutil" "github.com/iotaledger/goshimmer/packages/netutil"
"github.com/iotaledger/goshimmer/plugins/autopeering"
"github.com/iotaledger/goshimmer/plugins/autopeering/local" "github.com/iotaledger/goshimmer/plugins/autopeering/local"
"github.com/iotaledger/goshimmer/plugins/banner" "github.com/iotaledger/goshimmer/plugins/banner"
"github.com/iotaledger/goshimmer/plugins/config" "github.com/iotaledger/goshimmer/plugins/config"
"github.com/iotaledger/goshimmer/plugins/gossip" "github.com/iotaledger/goshimmer/plugins/gossip"
"github.com/iotaledger/hive.go/autopeering/peer"
"github.com/iotaledger/hive.go/autopeering/peer/service" "github.com/iotaledger/hive.go/autopeering/peer/service"
"github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/logger"
"github.com/iotaledger/hive.go/node" "github.com/iotaledger/hive.go/node"
) )
var PLUGIN = node.NewPlugin("Port Check", node.Enabled, run) const (
PLUGIN_NAME = "PortCheck"
)
var (
PLUGIN = node.NewPlugin(PLUGIN_NAME, node.Enabled, configure, run)
log *logger.Logger
)
var log *logger.Logger func configure(plugin *node.Plugin) {
log = logger.NewLogger(PLUGIN_NAME)
}
func run(ctx *node.Plugin) { func run(ctx *node.Plugin) {
log = logger.NewLogger("Tangle") if !node.IsSkipped(autopeering.PLUGIN) {
log.Info("Testing autopeering service ...")
checkAutopeeringConnection()
log.Info("Testing autopeering service ... done")
}
lPeer := local.GetInstance() if !node.IsSkipped(gossip.PLUGIN) {
log.Info("Testing gossip service ...")
checkGossipConnection()
log.Info("Testing gossip service ... done")
}
}
// check that discovery is working and the port is open
func checkAutopeeringConnection() {
peering := local.GetInstance().Services().Get(service.PeeringKey)
// use the port of the peering service // use the port of the peering service
peeringAddr := lPeer.Services().Get(service.PeeringKey) _, peeringPort, err := net.SplitHostPort(peering.String())
_, peeringPort, err := net.SplitHostPort(peeringAddr.String())
if err != nil { if err != nil {
panic(err) panic(err)
} }
// resolve the bind address // resolve the bind address
address := net.JoinHostPort(config.Node.GetString(local.CFG_BIND), peeringPort) address := net.JoinHostPort(config.Node.GetString(local.CFG_BIND), peeringPort)
localAddr, err := net.ResolveUDPAddr(peeringAddr.Network(), address) localAddr, err := net.ResolveUDPAddr(peering.Network(), address)
if err != nil { if err != nil {
log.Fatalf("Error resolving %s: %v", local.CFG_BIND, err) log.Fatalf("Error resolving %s: %v", local.CFG_BIND, err)
} }
// check that discovery is working and the port is open
log.Info("Testing service ...")
checkAutopeeringConnection(localAddr, &lPeer.Peer)
log.Info("Testing service ... done")
//check that the server is working and the port is open
log.Info("Testing service ...")
checkGossipConnection(gossip.Srv, &lPeer.Peer)
log.Info("Testing service ... done")
}
func checkAutopeeringConnection(localAddr *net.UDPAddr, self *peer.Peer) {
peering := self.Services().Get(service.PeeringKey)
remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String()) remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String())
if err != nil { if err != nil {
panic(err) panic(err)
} }
// do not check the address as a NAT may change them for local connections // do not check address and port as a NAT may change them for local connections
err = netutil.CheckUDP(localAddr, remoteAddr, false, true) err = netutil.CheckUDP(localAddr, remoteAddr, false, false)
if err != nil { if err != nil {
log.Errorf("Error testing service: %s", err) log.Errorf("Error testing autopeering service: %s", err)
log.Panicf("Please check that %s is publicly reachable at %s/%s", log.Panicf("Please check that %s is publicly reachable at %s/%s",
banner.AppName, peering.String(), peering.Network()) banner.AppName, peering.String(), peering.Network())
} }
} }
func checkGossipConnection(srv *server.TCP, self *peer.Peer) { // check that the gossip server is working and the port is open
func checkGossipConnection() {
// listen on TCP gossip port
lPeer := local.GetInstance()
// use the port of the gossip service
gossipAddr := lPeer.Services().Get(service.GossipKey)
_, gossipPort, err := net.SplitHostPort(gossipAddr.String())
if err != nil {
panic(err)
}
// resolve the bind address
address := net.JoinHostPort(config.Node.GetString(local.CFG_BIND), gossipPort)
localAddr, err := net.ResolveTCPAddr(gossipAddr.Network(), address)
if err != nil {
log.Fatalf("Error resolving %s: %v", local.CFG_BIND, err)
}
listener, err := net.ListenTCP(gossipAddr.Network(), localAddr)
if err != nil {
log.Fatalf("Error listening: %v", err)
}
defer listener.Close()
srv := server.ServeTCP(lPeer, listener, log)
defer srv.Close()
// do the actual check
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(1) wg.Add(1)
go func() { go func() {
defer wg.Done() defer wg.Done()
conn, err := srv.AcceptPeer(self) conn, acceptErr := srv.AcceptPeer(&lPeer.Peer)
if err != nil { if acceptErr != nil {
return return
} }
_ = conn.Close() _ = conn.Close()
}() }()
conn, err := srv.DialPeer(self) conn, err := srv.DialPeer(&lPeer.Peer)
if err != nil { if err != nil {
log.Errorf("Error testing: %s", err) log.Errorf("Error testing: %s", err)
addr := self.Services().Get(service.GossipKey)
log.Panicf("Please check that %s is publicly reachable at %s/%s", log.Panicf("Please check that %s is publicly reachable at %s/%s",
banner.AppName, addr.String(), addr.Network()) banner.AppName, gossipAddr.String(), gossipAddr.Network())
} }
_ = conn.Close() _ = conn.Close()
wg.Wait() wg.Wait()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment