Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
108 lines
4.1 KiB
Markdown
108 lines
4.1 KiB
Markdown
ZeroConf: Service Discovery with mDNS
|
|
=====================================
|
|
ZeroConf is a pure Golang library that employs Multicast DNS-SD for
|
|
|
|
* browsing and resolving services in your network
|
|
* registering own services
|
|
|
|
in the local network.
|
|
|
|
It basically implements aspects of the standards
|
|
[RFC 6762](https://tools.ietf.org/html/rfc6762) (mDNS) and
|
|
[RFC 6763](https://tools.ietf.org/html/rfc6763) (DNS-SD).
|
|
Though it does not support all requirements yet, the aim is to provide a compliant solution in the long-term with the community.
|
|
|
|
By now, it should be compatible to [Avahi](http://avahi.org/) (tested) and Apple's Bonjour (untested).
|
|
Target environments: private LAN/Wifi, small or isolated networks.
|
|
|
|
[](https://godoc.org/github.com/libp2p/zeroconf)
|
|
[](https://goreportcard.com/report/github.com/libp2p/zeroconf)
|
|
[](https://github.com/libp2p/zeroconf/actions/workflows/go-test.yml)
|
|
|
|
## Install
|
|
Nothing is as easy as that:
|
|
```bash
|
|
$ go get -u github.com/libp2p/zeroconf/v2
|
|
```
|
|
|
|
## Browse for services in your local network
|
|
|
|
```go
|
|
entries := make(chan *zeroconf.ServiceEntry)
|
|
go func(results <-chan *zeroconf.ServiceEntry) {
|
|
for entry := range results {
|
|
log.Println(entry)
|
|
}
|
|
log.Println("No more entries.")
|
|
}(entries)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
|
|
defer cancel()
|
|
// Discover all services on the network (e.g. _workstation._tcp)
|
|
err = zeroconf.Browse(ctx, "_workstation._tcp", "local.", entries)
|
|
if err != nil {
|
|
log.Fatalln("Failed to browse:", err.Error())
|
|
}
|
|
|
|
<-ctx.Done()
|
|
```
|
|
A subtype may added to service name to narrow the set of results. E.g. to browse `_workstation._tcp` with subtype `_windows`, use`_workstation._tcp,_windows`.
|
|
|
|
See https://github.com/libp2p/zeroconf/blob/master/examples/resolv/client.go.
|
|
|
|
## Lookup a specific service instance
|
|
|
|
```go
|
|
// Example filled soon.
|
|
```
|
|
|
|
## Register a service
|
|
|
|
```go
|
|
server, err := zeroconf.Register("GoZeroconf", "_workstation._tcp", "local.", 42424, []string{"txtv=0", "lo=1", "la=2"}, nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer server.Shutdown()
|
|
|
|
// Clean exit.
|
|
sig := make(chan os.Signal, 1)
|
|
signal.Notify(sig, os.Interrupt, syscall.SIGTERM)
|
|
select {
|
|
case <-sig:
|
|
// Exit by user
|
|
case <-time.After(time.Second * 120):
|
|
// Exit by timeout
|
|
}
|
|
|
|
log.Println("Shutting down.")
|
|
```
|
|
Multiple subtypes may be added to service name, separated by commas. E.g `_workstation._tcp,_windows` has subtype `_windows`.
|
|
|
|
See https://github.com/libp2p/zeroconf/blob/master/examples/register/server.go.
|
|
|
|
## Features and ToDo's
|
|
This list gives a quick impression about the state of this library.
|
|
See what needs to be done and submit a pull request :)
|
|
|
|
* [x] Browse / Lookup / Register services
|
|
* [x] Multiple IPv6 / IPv4 addresses support
|
|
* [x] Send multiple probes (exp. back-off) if no service answers (*)
|
|
* [x] Timestamp entries for TTL checks
|
|
* [ ] Compare new multicasts with already received services
|
|
|
|
_Notes:_
|
|
|
|
(*) The denoted features might not be perfectly standards compliant, but shouldn't cause any problems.
|
|
Some tests showed improvements in overall robustness and performance with the features enabled.
|
|
|
|
## Credits
|
|
Great thanks to [hashicorp](https://github.com/hashicorp/mdns) and to [oleksandr](https://github.com/oleksandr/bonjour) and all contributing authors for the code this projects bases upon.
|
|
Large parts of the code are still the same.
|
|
|
|
However, there are several reasons why I decided to create a fork of the original project:
|
|
The previous project seems to be unmaintained. There are several useful pull requests waiting. I merged most of them in this project.
|
|
Still, the implementation has some bugs and lacks some other features that make it quite unreliable in real LAN environments when running continously.
|
|
Last but not least, the aim for this project is to build a solution that targets standard conformance in the long term with the support of the community.
|
|
Though, resiliency should remain a top goal.
|