mirror of
				https://github.com/containers/podman.git
				synced 2025-10-30 09:25:59 +08:00 
			
		
		
		
	 bd09b7aa79
			
		
	
	bd09b7aa79
	
	
	
		
			
			Automated for .go files via gomove [1]: `gomove github.com/containers/podman/v3 github.com/containers/podman/v4` Remaining files via vgrep [2]: `vgrep github.com/containers/podman/v3` [1] https://github.com/KSubedi/gomove [2] https://github.com/vrothberg/vgrep Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package hooks
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	current "github.com/containers/podman/v4/pkg/hooks/1.0.0"
 | |
| 	"github.com/fsnotify/fsnotify"
 | |
| 	"github.com/sirupsen/logrus"
 | |
| )
 | |
| 
 | |
| // Monitor dynamically monitors hook directories for additions,
 | |
| // updates, and removals.
 | |
| //
 | |
| // This function writes two empty structs to the sync channel: the
 | |
| // first is written after the watchers are established and the second
 | |
| // when this function exits.  The expected usage is:
 | |
| //
 | |
| //   ctx, cancel := context.WithCancel(context.Background())
 | |
| //   sync := make(chan error, 2)
 | |
| //   go m.Monitor(ctx, sync)
 | |
| //   err := <-sync // block until writers are established
 | |
| //   if err != nil {
 | |
| //     return err // failed to establish watchers
 | |
| //   }
 | |
| //   // do stuff
 | |
| //   cancel()
 | |
| //   err = <-sync // block until monitor finishes
 | |
| func (m *Manager) Monitor(ctx context.Context, sync chan<- error) {
 | |
| 	watcher, err := fsnotify.NewWatcher()
 | |
| 	if err != nil {
 | |
| 		sync <- err
 | |
| 		return
 | |
| 	}
 | |
| 	defer watcher.Close()
 | |
| 
 | |
| 	for _, dir := range m.directories {
 | |
| 		err = watcher.Add(dir)
 | |
| 		if err != nil {
 | |
| 			logrus.Errorf("Failed to watch %q for hooks", dir)
 | |
| 			sync <- err
 | |
| 			return
 | |
| 		}
 | |
| 		logrus.Debugf("monitoring %q for hooks", dir)
 | |
| 	}
 | |
| 
 | |
| 	sync <- nil
 | |
| 
 | |
| 	for {
 | |
| 		select {
 | |
| 		case event := <-watcher.Events:
 | |
| 			m.hooks = make(map[string]*current.Hook)
 | |
| 			for _, dir := range m.directories {
 | |
| 				err = ReadDir(dir, m.extensionStages, m.hooks)
 | |
| 				if err != nil {
 | |
| 					logrus.Errorf("Failed loading hooks for %s: %v", event.Name, err)
 | |
| 				}
 | |
| 			}
 | |
| 		case <-ctx.Done():
 | |
| 			err = ctx.Err()
 | |
| 			logrus.Debugf("hook monitoring canceled: %v", err)
 | |
| 			sync <- err
 | |
| 			close(sync)
 | |
| 			return
 | |
| 		}
 | |
| 	}
 | |
| }
 |