mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package containerd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
systemdResolvConf = "/run/systemd/resolve/resolv.conf"
|
|
fallbackResolv = "nameserver 1.1.1.1\nnameserver 8.8.8.8\n"
|
|
)
|
|
|
|
// ResolveConfSource returns a host path to mount as /etc/resolv.conf.
|
|
// If systemd-resolved config is available, use it. Otherwise write a fallback
|
|
// resolv.conf under dataDir and return that path.
|
|
func ResolveConfSource(dataDir string) (string, error) {
|
|
if strings.TrimSpace(dataDir) == "" {
|
|
return "", ErrInvalidArgument
|
|
}
|
|
if runtime.GOOS == "darwin" {
|
|
if ok, err := limaFileExists(systemdResolvConf); err != nil {
|
|
return "", err
|
|
} else if ok {
|
|
return systemdResolvConf, nil
|
|
}
|
|
} else if _, err := os.Stat(systemdResolvConf); err == nil {
|
|
return systemdResolvConf, nil
|
|
}
|
|
|
|
if err := os.MkdirAll(dataDir, 0o755); err != nil {
|
|
return "", err
|
|
}
|
|
fallbackPath := filepath.Join(dataDir, "resolv.conf")
|
|
if _, err := os.Stat(fallbackPath); err == nil {
|
|
return fallbackPath, nil
|
|
} else if !os.IsNotExist(err) {
|
|
return "", err
|
|
}
|
|
if err := os.WriteFile(fallbackPath, []byte(fallbackResolv), 0o644); err != nil {
|
|
return "", err
|
|
}
|
|
return fallbackPath, nil
|
|
}
|
|
|
|
func limaFileExists(path string) (bool, error) {
|
|
if strings.TrimSpace(path) == "" {
|
|
return false, ErrInvalidArgument
|
|
}
|
|
cmd := exec.Command(
|
|
"limactl",
|
|
"shell",
|
|
"--tty=false",
|
|
"default",
|
|
"--",
|
|
"test",
|
|
"-f",
|
|
path,
|
|
)
|
|
if err := cmd.Run(); err == nil {
|
|
return true, nil
|
|
} else if exitErr, ok := err.(*exec.ExitError); ok {
|
|
if exitErr.ExitCode() == 1 {
|
|
return false, nil
|
|
}
|
|
return false, fmt.Errorf("lima test failed for %s: %w", path, err)
|
|
} else {
|
|
return false, fmt.Errorf("lima test failed for %s: %w", path, err)
|
|
}
|
|
}
|