diff --git a/connector/docker.go b/connector/docker.go index 1979a0e..9832e2f 100644 --- a/connector/docker.go +++ b/connector/docker.go @@ -19,7 +19,7 @@ type Docker struct { lock sync.RWMutex } -func NewDocker() *Docker { +func NewDocker() Connector { // init docker client client, err := api.NewClientFromEnv() if err != nil { diff --git a/connector/main.go b/connector/main.go index 8f50e2e..562827c 100644 --- a/connector/main.go +++ b/connector/main.go @@ -7,7 +7,7 @@ import ( var log = logging.Init() -type ContainerSource interface { +type Connector interface { All() container.Containers Get(string) (*container.Container, bool) } diff --git a/connector/runc.go b/connector/runc.go index 0dea8c5..1245612 100644 --- a/connector/runc.go +++ b/connector/runc.go @@ -59,7 +59,7 @@ func getFactory(opts RuncOpts) (libcontainer.Factory, error) { return libcontainer.New(opts.root, cgroupManager, libcontainer.CriuPath("criu")) } -func NewRunc() *Runc { +func NewRunc() Connector { opts, err := readRuncOpts() runcFailOnErr(err) diff --git a/cursor.go b/cursor.go index 71d194f..40e87c8 100644 --- a/cursor.go +++ b/cursor.go @@ -8,16 +8,20 @@ import ( ui "github.com/gizak/termui" ) +var enabledConnectors = map[string]func() connector.Connector{ + "docker": connector.NewDocker, + "runc": connector.NewRunc, +} + type GridCursor struct { selectedID string // id of currently selected container filtered container.Containers - cSource connector.ContainerSource + cSource connector.Connector } -func NewGridCursor() *GridCursor { +func NewGridCursor(connector string) *GridCursor { return &GridCursor{ - cSource: connector.NewRunc(), - //cSource: connector.NewDocker(), + cSource: enabledConnectors[connector](), } } diff --git a/main.go b/main.go index 0a77ada..66d6f93 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "os" + "strings" "github.com/bcicen/ctop/config" "github.com/bcicen/ctop/container" @@ -37,8 +38,11 @@ func main() { var sortFieldFlag = flag.String("s", "", "select container sort field") var reverseSortFlag = flag.Bool("r", false, "reverse container sort order") var invertFlag = flag.Bool("i", false, "invert default colors") + var connectorFlag = flag.String("connector", "docker", "container connector to use") flag.Parse() + validConnector(*connectorFlag) + if *versionFlag { fmt.Println(versionStr) os.Exit(0) @@ -75,7 +79,7 @@ func main() { defer Shutdown() // init grid, cursor, header - cursor = NewGridCursor() + cursor = NewGridCursor(*connectorFlag) cGrid = compact.NewCompactGrid() header = widgets.NewCTopHeader() @@ -104,6 +108,18 @@ func Shutdown() { } } +func validConnector(s string) { + if _, ok := enabledConnectors[s]; !ok { + fmt.Printf("invalid connector type: %s", s) + var connectors []string + for k, _ := range enabledConnectors { + connectors = append(connectors, k) + } + fmt.Printf("connector must be one of: %s", strings.Join(connectors, ",")) + os.Exit(1) + } +} + // ensure a given sort field is valid func validSort(s string) { if _, ok := container.Sorters[s]; !ok {