101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
//go:build amd64 || arm64
|
|
|
|
package os
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"os"
|
|
"strings"
|
|
|
|
machineconfig "github.com/containers/common/pkg/machine"
|
|
"github.com/containers/podman/v5/pkg/machine/define"
|
|
"github.com/containers/podman/v5/pkg/machine/env"
|
|
pkgOS "github.com/containers/podman/v5/pkg/machine/os"
|
|
"github.com/containers/podman/v5/pkg/machine/provider"
|
|
"github.com/containers/podman/v5/pkg/machine/vmconfigs"
|
|
)
|
|
|
|
type ManagerOpts struct {
|
|
VMName string
|
|
CLIArgs []string
|
|
Restart bool
|
|
}
|
|
|
|
// NewOSManager creates a new OSManager depending on the mode of the call
|
|
func NewOSManager(opts ManagerOpts, p vmconfigs.VMProvider) (pkgOS.Manager, error) {
|
|
// If a VM name is specified, then we know that we are not inside a
|
|
// Podman VM, but rather outside of it.
|
|
if machineconfig.IsPodmanMachine() && opts.VMName == "" {
|
|
return guestOSManager()
|
|
}
|
|
return machineOSManager(opts, p)
|
|
}
|
|
|
|
// guestOSManager returns an OSmanager for inside-VM operations
|
|
func guestOSManager() (pkgOS.Manager, error) {
|
|
dist := GetDistribution()
|
|
switch {
|
|
case dist.Name == "fedora" && dist.Variant == "coreos":
|
|
return &pkgOS.OSTree{}, nil
|
|
default:
|
|
return nil, errors.New("unsupported OS")
|
|
}
|
|
}
|
|
|
|
// machineOSManager returns an os manager that manages outside the VM.
|
|
func machineOSManager(opts ManagerOpts, _ vmconfigs.VMProvider) (pkgOS.Manager, error) {
|
|
vmName := opts.VMName
|
|
if opts.VMName == "" {
|
|
vmName = define.DefaultMachineName
|
|
}
|
|
p, err := provider.Get()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dirs, err := env.GetMachineDirs(p.VMType())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
mc, err := vmconfigs.LoadMachineByName(vmName, dirs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &pkgOS.MachineOS{
|
|
VM: mc,
|
|
Provider: p,
|
|
Args: opts.CLIArgs,
|
|
VMName: vmName,
|
|
Restart: opts.Restart,
|
|
}, nil
|
|
}
|
|
|
|
type Distribution struct {
|
|
Name string
|
|
Variant string
|
|
}
|
|
|
|
// GetDistribution checks the OS distribution
|
|
func GetDistribution() Distribution {
|
|
dist := Distribution{
|
|
Name: "unknown",
|
|
Variant: "unknown",
|
|
}
|
|
f, err := os.Open("/etc/os-release")
|
|
if err != nil {
|
|
return dist
|
|
}
|
|
defer f.Close()
|
|
|
|
l := bufio.NewScanner(f)
|
|
for l.Scan() {
|
|
if strings.HasPrefix(l.Text(), "ID=") {
|
|
dist.Name = strings.TrimPrefix(l.Text(), "ID=")
|
|
}
|
|
if strings.HasPrefix(l.Text(), "VARIANT_ID=") {
|
|
dist.Variant = strings.Trim(strings.TrimPrefix(l.Text(), "VARIANT_ID="), "\"")
|
|
}
|
|
}
|
|
return dist
|
|
}
|