Broadcast discovery with InfoAll, interface broadcast detection, clean output

This commit is contained in:
Ian Gulliver
2026-04-07 22:12:20 +09:00
parent 7034391d4d
commit e301c672a9
4 changed files with 115 additions and 84 deletions

View File

@@ -50,17 +50,6 @@ type deviceResult struct {
err error
}
func infoFromClient(dev string, c *client.Client) (*client.ResponseInfo, error) {
log := slog.With("dev", dev)
log.Info("requesting info")
info, err := c.Info()
if err != nil {
return nil, err
}
log.Info("got info", "firmware", info.FirmwareName)
return info, nil
}
func printInfo(dev string, info *client.ResponseInfo) {
slog.Info("device",
"dev", dev,
@@ -76,22 +65,30 @@ func cmdInfo(args []string) error {
iface := fs.String("iface", "", "bind to this network interface (for broadcast)")
fs.Parse(args)
if *udpAddr != "" {
log := slog.With("addr", *udpAddr)
if *iface != "" {
log = log.With("iface", *iface)
if *udpAddr == "" && *iface != "" {
bcast, err := client.InterfaceBroadcast(*iface)
if err != nil {
return err
}
log.Info("connecting via UDP")
c, err := client.NewUDP(*udpAddr, *iface, 2*time.Second)
*udpAddr = bcast
}
if *udpAddr != "" {
c, err := client.NewUDP(*udpAddr, *iface, 500*time.Millisecond)
if err != nil {
return err
}
defer c.Close()
info, err := infoFromClient(*udpAddr, c)
infos, err := c.InfoAll()
if err != nil {
return err
}
printInfo(*udpAddr, info)
if len(infos) == 0 {
return fmt.Errorf("no devices responded")
}
for _, info := range infos {
printInfo(net.IP(info.IP[:]).String(), info)
}
return nil
}
@@ -108,13 +105,12 @@ func cmdInfo(args []string) error {
for i, dev := range devs {
results[i].dev = dev
wg.Go(func() {
slog.Info("connecting", "dev", dev)
c, err := client.NewSerial(dev, 2*time.Second)
c, err := client.NewSerial(dev, 500*time.Millisecond)
if err != nil {
results[i].err = err
return
}
info, err := infoFromClient(dev, c)
info, err := c.Info()
c.Close()
if err != nil {
results[i].err = err
@@ -177,7 +173,7 @@ func cmdLog(_ []string) error {
}
for _, dev := range devs {
log := slog.With("dev", dev)
c, err := client.NewSerial(dev, 2*time.Second)
c, err := client.NewSerial(dev, 500*time.Millisecond)
if err != nil {
log.Error("connect error", "err", err)
continue
@@ -254,8 +250,7 @@ func cmdLoad(args []string) error {
for i := range targets {
log := slog.With("dev", devs[i])
wg.Go(func() {
log.Info("connecting for info")
c, err := client.NewSerial(devs[i], 2*time.Second)
c, err := client.NewSerial(devs[i], 500*time.Millisecond)
if err != nil {
errs[i] = err
return
@@ -286,7 +281,7 @@ func cmdLoad(args []string) error {
log := slog.With("serial", devices[i].serial)
wg.Go(func() {
log.Info("sending PICOBOOT")
c, err := client.NewSerial(devices[i].dev, 2*time.Second)
c, err := client.NewSerial(devices[i].dev, 500*time.Millisecond)
if err != nil {
errs[i] = err
return
@@ -347,8 +342,7 @@ func cmdTest(args []string) error {
var testDev string
for _, dev := range devs {
log := slog.With("dev", dev)
log.Info("connecting for info")
c, err := client.NewSerial(dev, 2*time.Second)
c, err := client.NewSerial(dev, 500*time.Millisecond)
if err != nil {
log.Warn("connect error", "err", err)
continue