| 286 | } |
| 287 | |
| 288 | func writeModelsCache(path string, models []string) error { |
| 289 | if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { |
| 290 | return err |
| 291 | } |
| 292 | entry := cacheEntry{Models: models, FetchedAt: time.Now()} |
| 293 | payload, err := json.MarshalIndent(entry, "", " ") |
| 294 | if err != nil { |
| 295 | return err |
| 296 | } |
| 297 | tmp := fmt.Sprintf("%s.tmp.%d", path, os.Getpid()) |
| 298 | if err := os.WriteFile(tmp, payload, 0o600); err != nil { |
| 299 | return err |
| 300 | } |
| 301 | return os.Rename(tmp, path) |
| 302 | } |
| 303 | |
| 304 | func discoveryShell(command string) (string, []string) { |
| 305 | if runtime.GOOS == "windows" { |