2020-05-29 12:02:07 +02:00
package dockerclassic
import (
"context"
"fmt"
"os"
"os/exec"
2020-06-05 17:30:27 +02:00
"strings"
2020-05-29 12:02:07 +02:00
2020-05-29 17:07:48 +02:00
"github.com/spf13/cobra"
2020-05-29 12:02:07 +02:00
apicontext "github.com/docker/api/context"
"github.com/docker/api/context/store"
)
2020-06-05 17:30:27 +02:00
// ClassicCliName name of the classic cli binary
const ClassicCliName = "docker-classic"
2020-05-29 17:07:48 +02:00
// Exec delegates to docker-classic
2020-05-29 12:02:07 +02:00
func Exec ( ctx context . Context ) {
currentContext := apicontext . CurrentContext ( ctx )
s := store . ContextStore ( ctx )
_ , err := s . Get ( currentContext )
// Only run original docker command if the current context is not
// ours.
if err != nil {
2020-06-05 17:30:27 +02:00
cmd := exec . CommandContext ( ctx , ClassicCliName , os . Args [ 1 : ] ... )
2020-05-29 12:02:07 +02:00
cmd . Stdin = os . Stdin
cmd . Stdout = os . Stdout
cmd . Stderr = os . Stderr
if err := cmd . Run ( ) ; err != nil {
if exiterr , ok := err . ( * exec . ExitError ) ; ok {
os . Exit ( exiterr . ExitCode ( ) )
}
fmt . Fprintln ( os . Stderr , err )
os . Exit ( 1 )
}
os . Exit ( 0 )
}
}
2020-05-29 17:07:48 +02:00
// ExecCmd delegates the cli command to docker-classic. The error is never returned (process will exit with docker classic exit code), the return type is to make it easier to use with cobra commands
func ExecCmd ( command * cobra . Command ) error {
Exec ( command . Context ( ) )
return nil
}
2020-06-05 17:30:27 +02:00
// IsDefaultContextCommand checks if the command exists in the classic cli (issues a shellout --help)
func IsDefaultContextCommand ( dockerCommand string ) bool {
cmd := exec . Command ( ClassicCliName , dockerCommand , "--help" )
b , e := cmd . CombinedOutput ( )
if e != nil {
fmt . Println ( e )
}
output := string ( b )
contains := strings . Contains ( output , "Usage:\tdocker " + dockerCommand )
return contains
}