1
0
mirror of https://github.com/go-mqtt/mqtt.git synced 2025-08-07 11:42:52 +03:00

Await mqttc exit code, as all exits are defined.

This commit is contained in:
Pascal S. de Kloe
2021-03-17 13:26:53 +01:00
parent 135cb84e5c
commit 5393197e58

View File

@@ -113,19 +113,18 @@ func parseConfig() (clientID string, config *mqtt.Config) {
var exitStatus = make(chan int, 1) var exitStatus = make(chan int, 1)
func setExitStatus(code int) { func failMQTT(client *mqtt.Client, err error) {
log.Print(err)
select { select {
case exitStatus <- code: case exitStatus <- 1:
default: // exit status already defined default: // exit status already defined
} }
}
func getExitStatus() (code int) { err = client.Close()
select { if err != nil {
case code = <-exitStatus: log.Print(err)
default: // stays zero
} }
return
} }
func main() { func main() {
@@ -166,16 +165,10 @@ func main() {
case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown): case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown):
return return
case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned): case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned):
log.Printf("%s: publish timeout (%s)", name, err) failMQTT(client, fmt.Errorf("%s: publish timeout; %s", name, err))
setExitStatus(1)
if err := client.Close(); err != nil {
log.Print(err)
}
return return
default: default:
log.Print(err) failMQTT(client, err)
setExitStatus(1)
_ = client.Close()
return return
} }
} }
@@ -193,16 +186,10 @@ func main() {
case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown): case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown):
return return
case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned): case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned):
log.Printf("%s: subscribe timeout (%s)", name, err) failMQTT(client, fmt.Errorf("%s: subscribe timeout; %s", name, err))
setExitStatus(1)
if err := client.Close(); err != nil {
log.Print(err)
}
return return
default: default:
log.Print(err) failMQTT(client, err)
setExitStatus(1)
_ = client.Close()
return return
} }
} }
@@ -218,16 +205,10 @@ func main() {
case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown): case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown):
return return
case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned): case errors.Is(err, mqtt.ErrCanceled), errors.Is(err, mqtt.ErrAbandoned):
log.Printf("%s: ping timeout (%s)", name, err) failMQTT(client, fmt.Errorf("%s: ping timeout; %s", name, err))
setExitStatus(1)
if err := client.Close(); err != nil {
log.Print(err)
}
return return
default: default:
log.Print(err) failMQTT(client, err)
setExitStatus(1)
_ = client.Close()
return return
} }
} }
@@ -238,19 +219,20 @@ func main() {
defer cancel() defer cancel()
err := client.Disconnect(ctx.Done()) err := client.Disconnect(ctx.Done())
switch { switch {
case err == nil, errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown): case err == nil:
exitStatus <- 0
case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown):
// exit status defined by cause
break break
default: default:
log.Print(err) log.Print(err)
setExitStatus(1) exitStatus <- 1
return
} }
return
} }
}() }()
defer os.Exit(getExitStatus()) // Read routine runs until mqtt.Client Close or Disconnect.
// read routine
var big *mqtt.BigMessage var big *mqtt.BigMessage
for { for {
message, topic, err := client.ReadSlices() message, topic, err := client.ReadSlices()
@@ -259,19 +241,18 @@ func main() {
printMessage(message, topic) printMessage(message, topic)
case errors.Is(err, mqtt.ErrClosed): case errors.Is(err, mqtt.ErrClosed):
return os.Exit(<-exitStatus)
case errors.As(err, &big): case errors.As(err, &big):
message, err := big.ReadAll() message, err := big.ReadAll()
if err != nil { if err != nil {
log.Print(err) failMQTT(client, err)
setExitStatus(1) } else {
return printMessage(message, big.Topic)
} }
printMessage(message, big.Topic)
default: default:
log.Print(err) failMQTT(client, err)
switch { switch {
case errors.Is(err, mqtt.ErrProtocolLevel): case errors.Is(err, mqtt.ErrProtocolLevel):
@@ -285,9 +266,6 @@ func main() {
case errors.Is(err, mqtt.ErrAuth): case errors.Is(err, mqtt.ErrAuth):
os.Exit(9) os.Exit(9)
} }
setExitStatus(1)
return
} }
} }
} }
@@ -311,26 +289,30 @@ func applySignals(client *mqtt.Client) {
for sig := range signals { for sig := range signals {
switch sig { switch sig {
case syscall.SIGINT: case syscall.SIGINT:
log.Print(name, ": SIGINT received; closing connection…") log.Print(name, ": SIGINT received")
setExitStatus(130) select {
switch err := client.Close(); { case exitStatus <- 130:
case err == nil, errors.Is(err, mqtt.ErrDown): default: // exit status already defined
break }
default: err := client.Close()
if err != nil {
log.Print(err) log.Print(err)
} }
case syscall.SIGTERM: case syscall.SIGTERM:
log.Print(name, ": SIGTERM received; sending disconnect…") log.Print(name, ": SIGTERM received")
setExitStatus(143)
ctx, cancel := context.WithTimeout(context.Background(), *timeoutFlag) ctx, cancel := context.WithTimeout(context.Background(), *timeoutFlag)
defer cancel() defer cancel()
switch err := client.Disconnect(ctx.Done()); err != nil { err := client.Disconnect(ctx.Done())
case err == nil, errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown): switch {
case err == nil:
exitStatus <- 143
case errors.Is(err, mqtt.ErrClosed), errors.Is(err, mqtt.ErrDown):
// exit status defined by cause
break break
default: default:
log.Print(err) log.Print(err)
setExitStatus(1) exitStatus <- 1
} }
} }
} }