mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 10:00:01 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package env
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/containers/podman/v5/pkg/machine/define"
 | |
| 	"github.com/containers/storage/pkg/fileutils"
 | |
| 	"github.com/containers/storage/pkg/homedir"
 | |
| )
 | |
| 
 | |
| // GetCacheDir returns the dir where VM images are downloaded into when pulled
 | |
| func GetCacheDir(vmType define.VMType) (string, error) {
 | |
| 	dataDir, err := GetDataDir(vmType)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	cacheDir := filepath.Join(dataDir, "cache")
 | |
| 	if err := fileutils.Exists(cacheDir); !errors.Is(err, os.ErrNotExist) {
 | |
| 		return cacheDir, nil
 | |
| 	}
 | |
| 	return cacheDir, os.MkdirAll(cacheDir, 0755)
 | |
| }
 | |
| 
 | |
| // GetDataDir returns the filepath where vm images should
 | |
| // live for podman-machine.
 | |
| func GetDataDir(vmType define.VMType) (string, error) {
 | |
| 	dataDirPrefix, err := DataDirPrefix()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	dataDir := filepath.Join(dataDirPrefix, vmType.String())
 | |
| 	if err := fileutils.Exists(dataDir); !errors.Is(err, os.ErrNotExist) {
 | |
| 		return dataDir, nil
 | |
| 	}
 | |
| 	mkdirErr := os.MkdirAll(dataDir, 0755)
 | |
| 	return dataDir, mkdirErr
 | |
| }
 | |
| 
 | |
| // GetGlobalDataDir returns the root of all backends
 | |
| // for shared machine data.
 | |
| func GetGlobalDataDir() (string, error) {
 | |
| 	dataDir, err := DataDirPrefix()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	return dataDir, os.MkdirAll(dataDir, 0755)
 | |
| }
 | |
| 
 | |
| func GetMachineDirs(vmType define.VMType) (*define.MachineDirs, error) {
 | |
| 	rtDir, err := getRuntimeDir()
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	rtDir = filepath.Join(rtDir, "podman")
 | |
| 	configDir, err := GetConfDir(vmType)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	configDirFile, err := define.NewMachineFile(configDir, nil)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	dataDir, err := GetDataDir(vmType)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	dataDirFile, err := define.NewMachineFile(dataDir, nil)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	imageCacheDir, err := dataDirFile.AppendToNewVMFile("cache", nil)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	rtDirFile, err := define.NewMachineFile(rtDir, nil)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	dirs := define.MachineDirs{
 | |
| 		ConfigDir:     configDirFile,
 | |
| 		DataDir:       dataDirFile,
 | |
| 		ImageCacheDir: imageCacheDir,
 | |
| 		RuntimeDir:    rtDirFile,
 | |
| 	}
 | |
| 
 | |
| 	// make sure all machine dirs are present
 | |
| 	if err := os.MkdirAll(rtDir, 0755); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	if err := os.MkdirAll(configDir, 0755); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	// Because this is a mkdirall, we make the image cache dir
 | |
| 	// which is a subdir of datadir (so the datadir is made anyway)
 | |
| 	err = os.MkdirAll(imageCacheDir.GetPath(), 0755)
 | |
| 
 | |
| 	return &dirs, err
 | |
| }
 | |
| 
 | |
| // DataDirPrefix returns the path prefix for all machine data files
 | |
| func DataDirPrefix() (string, error) {
 | |
| 	data, err := homedir.GetDataHome()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	dataDir := filepath.Join(data, "containers", "podman", "machine")
 | |
| 	return dataDir, nil
 | |
| }
 | |
| 
 | |
| // GetConfigDir returns the filepath to where configuration
 | |
| // files for podman-machine should live
 | |
| func GetConfDir(vmType define.VMType) (string, error) {
 | |
| 	confDirPrefix, err := ConfDirPrefix()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	confDir := filepath.Join(confDirPrefix, vmType.String())
 | |
| 	if err := fileutils.Exists(confDir); !errors.Is(err, os.ErrNotExist) {
 | |
| 		return confDir, nil
 | |
| 	}
 | |
| 	mkdirErr := os.MkdirAll(confDir, 0755)
 | |
| 	return confDir, mkdirErr
 | |
| }
 | |
| 
 | |
| // ConfDirPrefix returns the path prefix for all machine config files
 | |
| func ConfDirPrefix() (string, error) {
 | |
| 	conf, err := homedir.GetConfigHome()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	confDir := filepath.Join(conf, "containers", "podman", "machine")
 | |
| 	return confDir, nil
 | |
| }
 | |
| 
 | |
| // GetSSHIdentityPath returns the path to the expected SSH private key
 | |
| func GetSSHIdentityPath(name string) (string, error) {
 | |
| 	datadir, err := GetGlobalDataDir()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	return filepath.Join(datadir, name), nil
 | |
| }
 | |
| 
 | |
| func WithPodmanPrefix(name string) string {
 | |
| 	if !strings.HasPrefix(name, "podman") {
 | |
| 		name = "podman-" + name
 | |
| 	}
 | |
| 	return name
 | |
| }
 | 
