package importer import ( "context" "fmt" "log" "github.com/darroyo/nasctl/internal/db" "github.com/darroyo/nasctl/internal/modules/nfs" "github.com/darroyo/nasctl/internal/modules/samba" ) type ImportResult struct { SambaImported int NFSImported int SambaSkipped bool NFSSkipped bool SambaError string NFSError string } type ImporterDB interface { ListSambaShares() ([]db.SambaShare, error) ListNFSExports() ([]db.NFSExport, error) ReplaceSambaShares(shares []db.SambaShare) error ReplaceNFSExports(exports []db.NFSExport) error GetSetting(key string) (string, bool, error) SetSetting(key, value string) error MarkDirty(module string) error } func ImportOnBoot(ctx context.Context, database ImporterDB, smbPath, exportsPath string) ImportResult { result := ImportResult{} sambaDone, _, _ := database.GetSetting("import.samba.done") nfsDone, _, _ := database.GetSetting("import.nfs.done") if sambaDone == "true" && nfsDone == "true" { return result } if sambaDone != "true" { sr := importSamba(ctx, database, smbPath) result.SambaImported = sr.count result.SambaSkipped = sr.skipped result.SambaError = sr.err if sr.err == "" { _ = database.SetSetting("import.samba.done", "true") } } if nfsDone != "true" { nr := importNFS(ctx, database, exportsPath) result.NFSImported = nr.count result.NFSSkipped = nr.skipped result.NFSError = nr.err if nr.err == "" { _ = database.SetSetting("import.nfs.done", "true") } } if result.SambaImported > 0 || result.NFSImported > 0 { log.Printf("[importer] imported %d samba shares, %d nfs exports", result.SambaImported, result.NFSImported) } return result } func ResetImportFlags(ctx context.Context, database ImporterDB) error { _ = database.SetSetting("import.samba.done", "") _ = database.SetSetting("import.nfs.done", "") return nil } type importStep struct { count int skipped bool err string } func importSamba(ctx context.Context, database ImporterDB, path string) importStep { shares, err := ImportSambaShares(path) if err != nil { return importStep{err: err.Error()} } if shares == nil { return importStep{skipped: true} } existing, err := database.ListSambaShares() if err != nil { return importStep{err: err.Error()} } if len(existing) > 0 { return importStep{skipped: true} } if err := database.ReplaceSambaShares(shares); err != nil { return importStep{err: err.Error()} } if err := database.MarkDirty(samba.ModuleName); err != nil { return importStep{count: len(shares), err: fmt.Sprintf("imported but could not mark dirty: %v", err)} } return importStep{count: len(shares)} } func importNFS(ctx context.Context, database ImporterDB, path string) importStep { exports, err := ImportNFSExports(path) if err != nil { return importStep{err: err.Error()} } if exports == nil { return importStep{skipped: true} } existing, err := database.ListNFSExports() if err != nil { return importStep{err: err.Error()} } if len(existing) > 0 { return importStep{skipped: true} } if err := database.ReplaceNFSExports(exports); err != nil { return importStep{err: err.Error()} } if err := database.MarkDirty(nfs.ModuleName); err != nil { return importStep{count: len(exports), err: fmt.Sprintf("imported but could not mark dirty: %v", err)} } return importStep{count: len(exports)} }