Files
podman/pkg/machine/connection/connection.go
Jason T. Greene 6272abbbb8 Resurrect auto-port reassignment, but for all providers
- Updates common to pull in new locked edit

[NO NEW TESTS NEEDED]

Signed-off-by: Jason T. Greene <jason.greene@redhat.com>
2024-03-04 23:55:36 -06:00

137 lines
3.3 KiB
Go

//go:build amd64 || arm64
package connection
import (
"errors"
"fmt"
"net"
"net/url"
"os"
"github.com/containers/common/pkg/config"
"github.com/sirupsen/logrus"
)
const LocalhostIP = "127.0.0.1"
type connection struct {
name string
uri *url.URL
}
func addConnection(cons []connection, identity string, isDefault bool) error {
if len(identity) < 1 {
return errors.New("identity must be defined")
}
return config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
for i, con := range cons {
if _, ok := cfg.Connection.Connections[con.name]; ok {
return fmt.Errorf("cannot overwrite connection %q", con.name)
}
dst := config.Destination{
URI: con.uri.String(),
IsMachine: true,
Identity: identity,
}
if isDefault && i == 0 {
cfg.Connection.Default = con.name
}
if cfg.Connection.Connections == nil {
cfg.Connection.Connections = map[string]config.Destination{
con.name: dst,
}
cfg.Connection.Default = con.name
} else {
cfg.Connection.Connections[con.name] = dst
}
}
return nil
})
}
func UpdateConnectionPairPort(name string, port, uid int, remoteUsername string, identityPath string) error {
cons := createConnections(name, uid, port, remoteUsername)
return config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
for _, con := range cons {
dst := config.Destination{
IsMachine: true,
URI: con.uri.String(),
Identity: identityPath,
}
cfg.Connection.Connections[name] = dst
}
return nil
})
}
// UpdateConnectionIfDefault updates the default connection to the rootful/rootless when depending
// on the bool but only if other rootful/less connection was already the default.
// Returns true if it modified the default
func UpdateConnectionIfDefault(rootful bool, name, rootfulName string) error {
return config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
if name == cfg.Connection.Default && rootful {
cfg.Connection.Default = rootfulName
} else if rootfulName == cfg.Connection.Default && !rootful {
cfg.Connection.Default = name
}
return nil
})
}
func RemoveConnections(names ...string) error {
return config.EditConnectionConfig(func(cfg *config.ConnectionsFile) error {
for _, name := range names {
if _, ok := cfg.Connection.Connections[name]; ok {
delete(cfg.Connection.Connections, name)
} else {
return fmt.Errorf("unable to find connection named %q", name)
}
if cfg.Connection.Default == name {
cfg.Connection.Default = ""
}
}
for service := range cfg.Connection.Connections {
cfg.Connection.Default = service
break
}
return nil
})
}
// removeFilesAndConnections removes any files and connections with the given names
func RemoveFilesAndConnections(files []string, names ...string) {
for _, f := range files {
if err := os.Remove(f); err != nil && !errors.Is(err, os.ErrNotExist) {
logrus.Error(err)
}
}
if err := RemoveConnections(names...); err != nil {
logrus.Error(err)
}
}
// makeSSHURL creates a URL from the given input
func makeSSHURL(host, path, port, userName string) *url.URL {
var hostname string
if len(port) > 0 {
hostname = net.JoinHostPort(host, port)
} else {
hostname = host
}
userInfo := url.User(userName)
return &url.URL{
Scheme: "ssh",
User: userInfo,
Host: hostname,
Path: path,
}
}