From 66877c92d9132eb900321c24aeace14f980291b9 Mon Sep 17 00:00:00 2001 From: Eugene Burkov Date: Mon, 17 Jun 2024 19:34:46 +0300 Subject: [PATCH] Pull request 2239: 7076 Empty FSWatcher Updates #7076. Squashed commit of the following: commit 6d99de9bcd1a4882f96639cf7e54fe0f33cfbfd3 Merge: c545152fa 1c82be295 Author: Eugene Burkov Date: Mon Jun 17 18:41:49 2024 +0300 Merge branch 'master' into 7076-empty-fswatcher commit c545152fa157e52f9ac5ebf2e58fdc1a254faf91 Author: Eugene Burkov Date: Fri Jun 14 14:57:01 2024 +0300 all: imp code commit e033558d7027a40a6996c08b5125e45141192071 Author: Eugene Burkov Date: Fri Jun 14 14:39:58 2024 +0300 all: add & use empty fswatcher --- CHANGELOG.md | 5 +++++ internal/aghnet/hostscontainer.go | 3 ++- internal/aghos/fswatcher.go | 31 +++++++++++++++++++++++++++++++ internal/home/home.go | 4 +++- 4 files changed, 41 insertions(+), 2 deletions(-) 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()