mirror of
https://github.com/go-mqtt/mqtt.git
synced 2025-08-06 00:35:45 +03:00
Await mqttc exit code, as all exits are defined.
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user