2016-11-30 20:14:49 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
|
2017-06-30 19:10:57 +00:00
|
|
|
"github.com/containers/storage/pkg/reexec"
|
2017-08-05 11:40:46 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2016-11-30 20:14:49 +00:00
|
|
|
"github.com/urfave/cli"
|
|
|
|
)
|
|
|
|
|
2017-06-16 16:27:06 +00:00
|
|
|
//Version of kpod
|
|
|
|
const Version string = "0.0.1"
|
|
|
|
|
2016-11-30 20:14:49 +00:00
|
|
|
func main() {
|
2017-06-30 19:10:57 +00:00
|
|
|
if reexec.Init() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-11-30 20:14:49 +00:00
|
|
|
app := cli.NewApp()
|
|
|
|
app.Name = "kpod"
|
|
|
|
app.Usage = "manage pods and images"
|
2017-06-16 16:27:06 +00:00
|
|
|
app.Version = Version
|
2016-11-30 20:14:49 +00:00
|
|
|
|
|
|
|
app.Commands = []cli.Command{
|
2017-08-01 20:47:12 +00:00
|
|
|
diffCommand,
|
2017-08-07 14:30:10 +00:00
|
|
|
exportCommand,
|
2017-06-16 17:24:00 +00:00
|
|
|
historyCommand,
|
2017-06-16 17:24:00 +00:00
|
|
|
imagesCommand,
|
kpod: info subcommand
Design: The output of the `info` subcommand ought to be directly
consumable in a format like JSON or yaml.
The structure being a map of sorts.
Each subsection of information being an individual cluster under the
top-level, like platform info, debug, storage, etc.
Even if there are errors under the top level key, the value will be a
map with the key of "error" and the value as the message of the
`err.Error()`. In this way, the command always returns usable output.
Ideally there will be a means for anything that can register info to do
so independently from it being in the single info.go, so this approach
is having a typed signature for the function that gives info, but i'm
sure it could be better.
Current iteration of this outputs the following as a limited user:
```yaml
host:
MemFree: 711307264
MemTotal: 2096222208
SwapFree: 2147479552
SwapTotal: 2147479552
arch: amd64
cpus: 1
os: linux
store:
error: 'mkdir /var/run/containers/storage: permission denied'
```
and as root (`sudo kpod info -D`):
```yaml
debug:
compiler: gc
go version: go1.7.6
goroutines: 3
host:
MemFree: 717795328
MemTotal: 2096222208
SwapFree: 2147479552
SwapTotal: 2147479552
arch: amd64
cpus: 1
os: linux
store:
ContainerStore:
number: 1
GraphDriverName: overlay2
GraphRoot: /var/lib/containers/storage
ImageStore:
number: 1
```
And with the `--json --debug` flag:
```json
{
"debug": {
"compiler": "gc",
"go version": "go1.7.6",
"goroutines": 3
},
"host": {
"MemFree": 709402624,
"MemTotal": 2096222208,
"SwapFree": 2147479552,
"SwapTotal": 2147479552,
"arch": "amd64",
"cpus": 1,
"os": "linux"
},
"store": {
"ContainerStore": {
"number": 1
},
"GraphDriverName": "overlay2",
"GraphRoot": "/var/lib/containers/storage",
"ImageStore": {
"number": 1
}
}
}
```
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
2017-07-13 13:11:36 +00:00
|
|
|
infoCommand,
|
2017-06-29 19:16:06 +00:00
|
|
|
inspectCommand,
|
2017-08-10 17:58:29 +00:00
|
|
|
loadCommand,
|
2017-07-21 15:23:48 +00:00
|
|
|
logsCommand,
|
2017-07-31 19:35:14 +00:00
|
|
|
mountCommand,
|
2017-06-16 17:24:00 +00:00
|
|
|
pullCommand,
|
|
|
|
pushCommand,
|
2017-08-14 17:30:24 +00:00
|
|
|
renameCommand,
|
2017-06-16 17:24:00 +00:00
|
|
|
rmiCommand,
|
2017-08-10 17:58:29 +00:00
|
|
|
saveCommand,
|
2017-06-27 13:45:25 +00:00
|
|
|
tagCommand,
|
2017-07-31 19:35:14 +00:00
|
|
|
umountCommand,
|
2017-06-16 16:27:06 +00:00
|
|
|
versionCommand,
|
2017-07-25 13:56:23 +00:00
|
|
|
saveCommand,
|
|
|
|
statsCommand,
|
|
|
|
loadCommand,
|
2017-06-30 19:10:57 +00:00
|
|
|
}
|
2017-08-17 15:13:00 +00:00
|
|
|
app.Before = func(c *cli.Context) error {
|
|
|
|
logrus.SetLevel(logrus.ErrorLevel)
|
|
|
|
if c.GlobalBool("debug") {
|
|
|
|
logrus.SetLevel(logrus.DebugLevel)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2017-08-17 14:23:54 +00:00
|
|
|
app.After = func(*cli.Context) error {
|
|
|
|
// called by Run() when the command handler succeeds
|
|
|
|
shutdownStores()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
cli.OsExiter = func(code int) {
|
|
|
|
// called by Run() when the command fails, bypassing After()
|
|
|
|
shutdownStores()
|
|
|
|
os.Exit(code)
|
|
|
|
}
|
2017-06-30 19:10:57 +00:00
|
|
|
app.Flags = []cli.Flag{
|
2017-08-10 17:58:29 +00:00
|
|
|
cli.StringFlag{
|
|
|
|
Name: "config, c",
|
|
|
|
Usage: "path of a config file detailing container server configuration options",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "debug",
|
|
|
|
Usage: "print debugging information",
|
|
|
|
},
|
2017-06-30 19:10:57 +00:00
|
|
|
cli.StringFlag{
|
|
|
|
Name: "root",
|
2017-08-10 17:58:29 +00:00
|
|
|
Usage: "path to the root directory in which data, including images, is stored",
|
2017-06-30 19:10:57 +00:00
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "runroot",
|
|
|
|
Usage: "path to the 'run directory' where all state information is stored",
|
|
|
|
},
|
2017-08-14 17:30:24 +00:00
|
|
|
cli.StringFlag{
|
|
|
|
Name: "runtime",
|
|
|
|
Usage: "path to the OCI-compatible binary used to run containers, default is /usr/bin/runc",
|
|
|
|
},
|
2017-06-30 19:10:57 +00:00
|
|
|
cli.StringFlag{
|
|
|
|
Name: "storage-driver, s",
|
|
|
|
Usage: "select which storage driver is used to manage storage of images and containers (default is overlay2)",
|
|
|
|
},
|
|
|
|
cli.StringSliceFlag{
|
|
|
|
Name: "storage-opt",
|
|
|
|
Usage: "used to pass an option to the storage driver",
|
|
|
|
},
|
2016-11-30 20:14:49 +00:00
|
|
|
}
|
|
|
|
if err := app.Run(os.Args); err != nil {
|
2017-08-10 17:58:29 +00:00
|
|
|
logrus.Errorf(err.Error())
|
2017-08-17 14:23:54 +00:00
|
|
|
cli.OsExiter(1)
|
2016-11-30 20:14:49 +00:00
|
|
|
}
|
|
|
|
}
|