|
|
|
|
@ -173,11 +173,14 @@ func tailscaleSet(ctx context.Context, cfg *settings) error { |
|
|
|
|
func watchTailscaledConfigChanges(ctx context.Context, path string, lc *local.Client, errCh chan<- error) { |
|
|
|
|
var ( |
|
|
|
|
tickChan <-chan time.Time |
|
|
|
|
eventChan <-chan fsnotify.Event |
|
|
|
|
errChan <-chan error |
|
|
|
|
tailscaledCfgDir = filepath.Dir(path) |
|
|
|
|
prevTailscaledCfg []byte |
|
|
|
|
) |
|
|
|
|
w, err := fsnotify.NewWatcher() |
|
|
|
|
if err != nil { |
|
|
|
|
if w, err := fsnotify.NewWatcher(); err != nil { |
|
|
|
|
// Creating a new fsnotify watcher would fail for example if inotify was not able to create a new file descriptor.
|
|
|
|
|
// See https://github.com/tailscale/tailscale/issues/15081
|
|
|
|
|
log.Printf("tailscaled config watch: failed to create fsnotify watcher, timer-only mode: %v", err) |
|
|
|
|
ticker := time.NewTicker(5 * time.Second) |
|
|
|
|
defer ticker.Stop() |
|
|
|
|
@ -188,6 +191,8 @@ func watchTailscaledConfigChanges(ctx context.Context, path string, lc *local.Cl |
|
|
|
|
errCh <- fmt.Errorf("failed to add fsnotify watch: %w", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
eventChan = w.Events |
|
|
|
|
errChan = w.Errors |
|
|
|
|
} |
|
|
|
|
b, err := os.ReadFile(path) |
|
|
|
|
if err != nil { |
|
|
|
|
@ -205,11 +210,11 @@ func watchTailscaledConfigChanges(ctx context.Context, path string, lc *local.Cl |
|
|
|
|
select { |
|
|
|
|
case <-ctx.Done(): |
|
|
|
|
return |
|
|
|
|
case err := <-w.Errors: |
|
|
|
|
case err := <-errChan: |
|
|
|
|
errCh <- fmt.Errorf("watcher error: %w", err) |
|
|
|
|
return |
|
|
|
|
case <-tickChan: |
|
|
|
|
case event := <-w.Events: |
|
|
|
|
case event := <-eventChan: |
|
|
|
|
if event.Name != toWatch { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|