ctop/main.go

156 lines
3.1 KiB
Go
Raw Permalink Normal View History

package main
import (
2017-03-10 19:39:06 +01:00
"flag"
2017-03-03 08:57:26 +01:00
"fmt"
"os"
2017-06-19 14:23:39 +02:00
"runtime"
"strings"
2017-03-03 08:57:26 +01:00
2017-02-07 04:33:09 +01:00
"github.com/bcicen/ctop/config"
2017-06-14 15:11:40 +02:00
"github.com/bcicen/ctop/connector"
"github.com/bcicen/ctop/container"
"github.com/bcicen/ctop/cwidgets/compact"
"github.com/bcicen/ctop/logging"
"github.com/bcicen/ctop/widgets"
ui "github.com/gizak/termui"
tm "github.com/nsf/termbox-go"
)
var (
2017-06-19 14:23:39 +02:00
build = "none"
version = "dev-build"
goVersion = runtime.Version()
2017-03-07 01:13:48 +01:00
log *logging.CTopLogger
cursor *GridCursor
cGrid *compact.CompactGrid
header *widgets.CTopHeader
status *widgets.StatusLine
errView *widgets.ErrorView
2017-06-19 14:23:39 +02:00
versionStr = fmt.Sprintf("ctop version %v, build %v %v", version, build, goVersion)
)
func main() {
2017-03-07 02:04:45 +01:00
defer panicExit()
2017-03-10 19:39:06 +01:00
// parse command line arguments
2017-11-29 04:03:46 +01:00
var (
versionFlag = flag.Bool("v", false, "output version information and exit")
helpFlag = flag.Bool("h", false, "display this help dialog")
filterFlag = flag.String("f", "", "filter containers")
activeOnlyFlag = flag.Bool("a", false, "show active containers only")
sortFieldFlag = flag.String("s", "", "select container sort field")
reverseSortFlag = flag.Bool("r", false, "reverse container sort order")
invertFlag = flag.Bool("i", false, "invert default colors")
connectorFlag = flag.String("connector", "docker", "container connector to use")
)
2017-03-10 19:39:06 +01:00
flag.Parse()
2017-03-15 01:06:52 +01:00
if *versionFlag {
fmt.Println(versionStr)
2017-03-10 19:39:06 +01:00
os.Exit(0)
}
2017-03-15 01:06:52 +01:00
if *helpFlag {
2017-03-10 19:39:06 +01:00
printHelp()
os.Exit(0)
}
// init logger
log = logging.Init()
// init global config and read config file if exists
config.Init()
if err := config.Read(); err != nil {
log.Warningf("reading config: %s", err)
}
2017-03-10 19:39:06 +01:00
// override default config values with command line flags
if *filterFlag != "" {
config.Update("filterStr", *filterFlag)
}
2017-03-15 01:06:52 +01:00
if *activeOnlyFlag {
2017-03-10 19:39:06 +01:00
config.Toggle("allContainers")
}
if *sortFieldFlag != "" {
2017-03-14 23:49:11 +01:00
validSort(*sortFieldFlag)
2017-03-10 19:39:06 +01:00
config.Update("sortField", *sortFieldFlag)
}
2017-03-15 01:06:52 +01:00
if *reverseSortFlag {
2017-03-10 19:39:06 +01:00
config.Toggle("sortReversed")
}
2017-03-14 23:49:11 +01:00
// init ui
2017-03-15 01:06:52 +01:00
if *invertFlag {
2017-03-15 01:02:46 +01:00
InvertColorMap()
}
2017-03-14 23:49:11 +01:00
ui.ColorMap = ColorMap // override default colormap
if err := ui.Init(); err != nil {
panic(err)
}
2018-05-10 11:44:57 +02:00
tm.SetInputMode(tm.InputAlt)
2017-03-14 23:49:11 +01:00
2017-06-13 22:25:58 +02:00
defer Shutdown()
// init grid, cursor, header
cSuper, err := connector.ByName(*connectorFlag)
2017-06-14 15:11:40 +02:00
if err != nil {
panic(err)
}
cursor = &GridCursor{cSuper: cSuper}
2017-06-13 22:25:58 +02:00
cGrid = compact.NewCompactGrid()
header = widgets.NewCTopHeader()
status = widgets.NewStatusLine()
errView = widgets.NewErrorView()
2017-06-13 22:25:58 +02:00
for {
exit := Display()
if exit {
return
}
}
}
2017-03-07 02:04:45 +01:00
func Shutdown() {
log.Notice("shutting down")
log.Exit()
if tm.IsInit {
ui.Close()
}
}
2017-03-14 23:49:11 +01:00
// ensure a given sort field is valid
func validSort(s string) {
if _, ok := container.Sorters[s]; !ok {
2017-03-14 23:49:11 +01:00
fmt.Printf("invalid sort field: %s\n", s)
os.Exit(1)
}
}
2017-03-07 02:04:45 +01:00
func panicExit() {
if r := recover(); r != nil {
Shutdown()
panic(r)
2017-06-14 15:11:40 +02:00
fmt.Printf("error: %s\n", r)
2017-03-07 02:04:45 +01:00
os.Exit(1)
}
}
var helpMsg = `ctop - interactive container viewer
2017-03-07 02:04:45 +01:00
usage: ctop [options]
options:
`
func printHelp() {
fmt.Println(helpMsg)
2017-03-10 19:39:06 +01:00
flag.PrintDefaults()
fmt.Printf("\navailable connectors: ")
fmt.Println(strings.Join(connector.Enabled(), ", "))
2017-03-07 02:04:45 +01:00
}