mirror of
https://github.com/containers/podman.git
synced 2025-08-24 18:12:25 +08:00

- Updates common to pull in new locked edit [NO NEW TESTS NEEDED] Signed-off-by: Jason T. Greene <jason.greene@redhat.com>
137 lines
3.3 KiB
Go
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,
|
|
}
|
|
}
|