diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bbaa65f..794f1220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,11 @@ NOTE: Add new changes BELOW THIS COMMENT. - Node 18 support, Node 20 will be required in future releases. +### Fixed + +- Tracking `/etc/hosts` file changes causing panics within particular + filesystems on start ([#7076]). + [#7053]: https://github.com/AdguardTeam/AdGuardHome/issues/7053 [install-script]: https://github.com/AdguardTeam/AdGuardHome/?tab=readme-ov-file#automated-install-linux-and-mac diff --git a/internal/aghnet/hostscontainer.go b/internal/aghnet/hostscontainer.go index b8e86448..9390ac45 100644 --- a/internal/aghnet/hostscontainer.go +++ b/internal/aghnet/hostscontainer.go @@ -161,7 +161,8 @@ func (hc *HostsContainer) handleEvents() { defer close(hc.updates) - ok, eventsCh := true, hc.watcher.Events() + eventsCh := hc.watcher.Events() + ok := eventsCh != nil for ok { select { case _, ok = <-eventsCh: diff --git a/internal/aghos/fswatcher.go b/internal/aghos/fswatcher.go index 9f3a6570..de95e94c 100644 --- a/internal/aghos/fswatcher.go +++ b/internal/aghos/fswatcher.go @@ -160,3 +160,34 @@ func (w *osWatcher) handleErrors() { log.Error("%s: %s", osWatcherPref, err) } } + +// EmptyFSWatcher is a no-op implementation of the [FSWatcher] interface. It +// may be used on systems not supporting filesystem events. +type EmptyFSWatcher struct{} + +// type check +var _ FSWatcher = EmptyFSWatcher{} + +// Start implements the [FSWatcher] interface for EmptyFSWatcher. It always +// returns nil error. +func (EmptyFSWatcher) Start() (err error) { + return nil +} + +// Close implements the [FSWatcher] interface for EmptyFSWatcher. It always +// returns nil error. +func (EmptyFSWatcher) Close() (err error) { + return nil +} + +// Events implements the [FSWatcher] interface for EmptyFSWatcher. It always +// returns nil channel. +func (EmptyFSWatcher) Events() (e <-chan event) { + return nil +} + +// Add implements the [FSWatcher] interface for EmptyFSWatcher. It always +// returns nil error. +func (EmptyFSWatcher) Add(_ string) (err error) { + return nil +} diff --git a/internal/home/home.go b/internal/home/home.go index 93e8e09d..fc64f376 100644 --- a/internal/home/home.go +++ b/internal/home/home.go @@ -232,7 +232,9 @@ func configureOS(conf *configuration) (err error) { func setupHostsContainer() (err error) { hostsWatcher, err := aghos.NewOSWritesWatcher() if err != nil { - return fmt.Errorf("initing hosts watcher: %w", err) + log.Info("WARNING: initializing filesystem watcher: %s; not watching for changes", err) + + hostsWatcher = aghos.EmptyFSWatcher{} } paths, err := hostsfile.DefaultHostsPaths()