From 6f05222018cfa46a3302138d832f6d291029f2c6 Mon Sep 17 00:00:00 2001 From: Clayton Craft Date: Sat, 18 Feb 2023 11:24:14 -0800 Subject: [PATCH] filelist/modules: add support for directories in .modules files This is kinda janky, passing both a list of modules and a directory path is just because we support modules in deviceinfo and in directory file lists... Maybe one day we can move away from having modules in the deviceinfo... --- cmd/mkinitfs/main.go | 2 +- internal/filelist/modules/modules.go | 69 ++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/cmd/mkinitfs/main.go b/cmd/mkinitfs/main.go index 9910257..fa942d0 100644 --- a/cmd/mkinitfs/main.go +++ b/cmd/mkinitfs/main.go @@ -65,7 +65,7 @@ func main() { hookfiles.New("/etc/mkinitfs/files"), hookscripts.New("/usr/share/mkinitfs/hooks"), hookscripts.New("/etc/mkinitfs/hooks"), - modules.New(strings.Fields(devinfo.ModulesInitfs)), + modules.New(strings.Fields(devinfo.ModulesInitfs), "/usr/share/mkinitfs/modules"), }); err != nil { log.Fatalf("failed to generate %q: %s\n", "initramfs", err) } diff --git a/internal/filelist/modules/modules.go b/internal/filelist/modules/modules.go index ff8e95f..9a2e6ce 100644 --- a/internal/filelist/modules/modules.go +++ b/internal/filelist/modules/modules.go @@ -15,14 +15,16 @@ import ( ) type Modules struct { - modules []string + modulesList []string + modulesListPath string } -// New returns a new HookScripts that will use the given path to provide a list +// New returns a new Modules that will use the given moduleto provide a list // of script files. -func New(modules []string) *Modules { +func New(modulesList []string, modulesListPath string) *Modules { return &Modules{ - modules: modules, + modulesList: modulesList, + modulesListPath: modulesListPath, } } @@ -49,8 +51,8 @@ func (m *Modules) List() (*filelist.FileList, error) { files.Add(file, file) } - // deviceinfo modules - for _, module := range m.modules { + // slurp up given list of modules + for _, module := range m.modulesList { if modFilelist, err := getModule(module, modDir); err != nil { return nil, fmt.Errorf("getInitfsModules: unable to get modules from deviceinfo: %w", err) } else { @@ -60,27 +62,64 @@ func (m *Modules) List() (*filelist.FileList, error) { } } - // /*/mkinitfs/modules/*.modules - initfsModFiles, _ := filepath.Glob("/etc/mkinitfs/modules/*.modules") - for _, modFile := range initfsModFiles { - f, err := os.Open(modFile) + // slurp up modules from lists in modulesListPath + fileInfo, err := os.ReadDir(m.modulesListPath) + if err != nil { + log.Println("-- Unable to find dir, skipping...") + return files, nil + } + for _, file := range fileInfo { + path := filepath.Join(m.modulesListPath, file.Name()) + f, err := os.Open(path) if err != nil { - return nil, fmt.Errorf("getInitfsModules: unable to open mkinitfs modules file %q: %w", modFile, err) + return nil, fmt.Errorf("unable to open module list file %q: %w", path, err) } defer f.Close() - s := bufio.NewScanner(f) - for s.Scan() { + log.Printf("-- Including modules from: %s\n", path) + + if list, err := slurpModules(f, modDir); err != nil { + return nil, fmt.Errorf("unable to process module list file %q: %w", path, err) + } else { + files.Import(list) + } + } + return files, nil +} + +func slurpModules(fd io.Reader, modDir string) (*filelist.FileList, error) { + files := filelist.NewFileList() + s := bufio.NewScanner(fd) + for s.Scan() { + line := s.Text() + dir, file := filepath.Split(line) + if file == "" { + // item is a directory + dir = filepath.Join(modDir, dir) + dirs, _ := filepath.Glob(dir) + for _, d := range dirs { + if modFilelist, err := getModulesInDir(d); err != nil { + return nil, fmt.Errorf("unable to get modules dir %q: %w", d, err) + } else { + for _, file := range modFilelist { + files.Add(file, file) + } + } + } + } else if dir == "" { + // item is a module name if modFilelist, err := getModule(s.Text(), modDir); err != nil { - return nil, fmt.Errorf("getInitfsModules: unable to get module file %q: %w", s.Text(), err) + return nil, fmt.Errorf("unable to get module file %q: %w", s.Text(), err) } else { for _, file := range modFilelist { files.Add(file, file) } } + } else { + log.Printf("Unknown module entry: %q", line) } } - return files, nil + return files, s.Err() } func getModulesInDir(modPath string) (files []string, err error) {