mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-10-14 18:07:43 +00:00
The following PR is the leading PR for refactoring podman machine with the following goals: * less duplication/more re-use * common configuration file between providers * more consistentency in how machines are handled by providers The goal of this PR is the rough refactor. There are still rough spots for sure, specifically around the podman socket and pipe. This implemention is only for Linux. All other providers are still present but will not compile or work. This is why tests for them have been temporarily suspended. The ready socket code is another area that needs to be smoothed over. Right now, the ready socket code is still in QEMU. Preferably it would be moved to a generic spot where all three approaches to readiness socket use can be defined. It should also be noted: * all machine related tests pass. * make validate for Linux passes * Apple QEMU was largely removed * More code pruning is possible; will become clearer when other providers are complete. the dir pkg/machine/p5 is not permanent. i had to seperate this from machine initially due to circular import problems. i think when all providers are done (or nearly done), it can be placed and named properly. Signed-off-by: Brent Baude <bbaude@redhat.com>
129 lines
3.1 KiB
Go
129 lines
3.1 KiB
Go
//go:build amd64 || arm64
|
|
|
|
package machine
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/containers/podman/v4/pkg/machine/connection"
|
|
"github.com/containers/storage/pkg/ioutils"
|
|
)
|
|
|
|
// GetDevNullFiles returns pointers to Read-only and Write-only DevNull files
|
|
func GetDevNullFiles() (*os.File, *os.File, error) {
|
|
dnr, err := os.OpenFile(os.DevNull, os.O_RDONLY, 0755)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
dnw, err := os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
|
|
if err != nil {
|
|
if e := dnr.Close(); e != nil {
|
|
err = e
|
|
}
|
|
return nil, nil, err
|
|
}
|
|
|
|
return dnr, dnw, nil
|
|
}
|
|
|
|
// WaitAPIAndPrintInfo prints info about the machine and does a ping test on the
|
|
// API socket
|
|
func WaitAPIAndPrintInfo(forwardState APIForwardingState, name, helper, forwardSock string, noInfo, rootful bool) {
|
|
suffix := ""
|
|
var fmtString string
|
|
|
|
if name != DefaultMachineName {
|
|
suffix = " " + name
|
|
}
|
|
|
|
if forwardState == NoForwarding {
|
|
return
|
|
}
|
|
|
|
WaitAndPingAPI(forwardSock)
|
|
|
|
if !noInfo {
|
|
if !rootful {
|
|
fmtString = `
|
|
This machine is currently configured in rootless mode. If your containers
|
|
require root permissions (e.g. ports < 1024), or if you run into compatibility
|
|
issues with non-podman clients, you can switch using the following command:
|
|
|
|
podman machine set --rootful%s
|
|
|
|
`
|
|
|
|
fmt.Printf(fmtString, suffix)
|
|
}
|
|
|
|
fmt.Printf("API forwarding listening on: %s\n", forwardSock)
|
|
if forwardState == DockerGlobal {
|
|
fmt.Printf("Docker API clients default to this address. You do not need to set DOCKER_HOST.\n\n")
|
|
} else {
|
|
stillString := "still "
|
|
switch forwardState {
|
|
case NotInstalled:
|
|
|
|
fmtString = `
|
|
The system helper service is not installed; the default Docker API socket
|
|
address can't be used by podman. `
|
|
|
|
if len(helper) < 1 {
|
|
fmt.Print(fmtString)
|
|
} else {
|
|
fmtString += `If you would like to install it, run the following commands:
|
|
|
|
sudo %s install
|
|
podman machine stop%[2]s; podman machine start%[2]s
|
|
|
|
`
|
|
fmt.Printf(fmtString, helper, suffix)
|
|
}
|
|
case MachineLocal:
|
|
fmt.Printf("\nAnother process was listening on the default Docker API socket address.\n")
|
|
case ClaimUnsupported:
|
|
fallthrough
|
|
default:
|
|
stillString = ""
|
|
}
|
|
|
|
fmtString = `You can %sconnect Docker API clients by setting DOCKER_HOST using the
|
|
following command in your terminal session:
|
|
|
|
export DOCKER_HOST='unix://%s'
|
|
|
|
`
|
|
|
|
fmt.Printf(fmtString, stillString, forwardSock)
|
|
}
|
|
}
|
|
}
|
|
|
|
// SetRootful modifies the machine's default connection to be either rootful or
|
|
// rootless
|
|
func SetRootful(rootful bool, name, rootfulName string) error {
|
|
return connection.UpdateConnectionIfDefault(rootful, name, rootfulName)
|
|
}
|
|
|
|
// WriteConfig writes the machine's JSON config file
|
|
func WriteConfig(configPath string, v VM) error {
|
|
opts := &ioutils.AtomicFileWriterOptions{ExplicitCommit: true}
|
|
w, err := ioutils.NewAtomicFileWriterWithOpts(configPath, 0644, opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer w.Close()
|
|
|
|
enc := json.NewEncoder(w)
|
|
enc.SetIndent("", " ")
|
|
|
|
if err := enc.Encode(v); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Commit the changes to disk if no errors
|
|
return w.Commit()
|
|
}
|