//go:build !windows // +build !windows package rootless import ( "io" "path" "strings" "github.com/rootless-containers/rootlesskit/pkg/port" portbuiltin "github.com/rootless-containers/rootlesskit/pkg/port/builtin" portslirp4netns "github.com/rootless-containers/rootlesskit/pkg/port/slirp4netns" "github.com/sirupsen/logrus" ) type logrusDebugWriter struct { } func (w *logrusDebugWriter) Write(p []byte) (int, error) { s := strings.TrimSuffix(string(p), "\n") logrus.Debug(s) return len(p), nil } type portDriver interface { NewParentDriver() (port.ParentDriver, error) NewChildDriver() port.ChildDriver LogWriter() io.Writer SetStateDir(string) APISocketPath() string } type builtinDriver struct { logWriter io.Writer stateDir string } func (b *builtinDriver) NewParentDriver() (port.ParentDriver, error) { return portbuiltin.NewParentDriver(b.logWriter, b.stateDir) } func (b *builtinDriver) NewChildDriver() port.ChildDriver { return portbuiltin.NewChildDriver(b.logWriter) } func (b *builtinDriver) LogWriter() io.Writer { return b.logWriter } func (b *builtinDriver) SetStateDir(stateDir string) { b.stateDir = stateDir } func (b *builtinDriver) APISocketPath() string { return "" } type slirp4netnsDriver struct { logWriter io.Writer stateDir string } func (s *slirp4netnsDriver) NewParentDriver() (port.ParentDriver, error) { return portslirp4netns.NewParentDriver(s.logWriter, s.APISocketPath()) } func (s *slirp4netnsDriver) NewChildDriver() port.ChildDriver { return portslirp4netns.NewChildDriver() } func (s *slirp4netnsDriver) LogWriter() io.Writer { return s.logWriter } func (s *slirp4netnsDriver) SetStateDir(stateDir string) { s.stateDir = stateDir } func (s *slirp4netnsDriver) APISocketPath() string { if s.stateDir != "" { return path.Join(s.stateDir, ".s4nn.sock") } return "" } func getDriver(driverName string) portDriver { logWriter := &logrusDebugWriter{} if driverName == "slirp4netns" { return &slirp4netnsDriver{logWriter: logWriter} } if driverName != "" && driverName != "builtin" { logrus.Warnf("Unsupported port driver %s, using default builtin", driverName) } return &builtinDriver{logWriter: logWriter} }