diff --git a/netclient/functions/connection.go b/netclient/functions/connection.go index 5c1dee2d..f151a923 100644 --- a/netclient/functions/connection.go +++ b/netclient/functions/connection.go @@ -24,9 +24,14 @@ func Connect(network string) error { if err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, filePath); err != nil { return err } - err = config.ModNodeConfig(&cfg.Node) + if err := setupMQTTSingleton(cfg); err != nil { + return err + } + if err := PublishNodeUpdate(cfg); err != nil { + return err + } daemon.Restart() - return err + return nil } // Disconnect - attempts to disconnect a node on given network @@ -44,7 +49,12 @@ func Disconnect(network string) error { if err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, filePath); err != nil { return err } - err = config.ModNodeConfig(&cfg.Node) + if err := setupMQTTSingleton(cfg); err != nil { + return err + } + if err := PublishNodeUpdate(cfg); err != nil { + return err + } daemon.Restart() - return err + return nil } diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index d29c4fdf..993059be 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -232,6 +232,33 @@ func NewTLSConfig(server string) (*tls.Config, error) { } +// func setMQTTSingenton creates a connection to broker for single use (ie to publish a message) +// only to be called from cli (eg. connect/disconnect, join, leave) and not from daemon --- +func setupMQTTSingleton(cfg *config.ClientConfig) error { + opts := mqtt.NewClientOptions() + server := cfg.Server.Server + port := cfg.Server.MQPort + opts.AddBroker("ssl://" + server + ":" + port) + tlsConfig, err := NewTLSConfig(server) + if err != nil { + logger.Log(0, "failed to get TLS config for", server, err.Error()) + return err + } + opts.SetTLSConfig(tlsConfig) + mqclient = mqtt.NewClient(opts) + var connecterr error + opts.SetClientID(ncutils.MakeRandomString(23)) + if token := mqclient.Connect(); !token.WaitTimeout(30*time.Second) || token.Error() != nil { + logger.Log(0, "unable to connect to broker, retrying ...") + if token.Error() == nil { + connecterr = errors.New("connect timeout") + } else { + connecterr = token.Error() + } + } + return connecterr +} + // setupMQTT creates a connection to broker and returns client // this function is primarily used to create a connection to publish to the broker func setupMQTT(cfg *config.ClientConfig) error {