mirror of https://github.com/docker/cli.git
Merge pull request #616 from thaJeztah/bump-moby
Bump moby to 1ffa10ee2630917e4f2a88f5e4daf34d700eaa1f
This commit is contained in:
commit
54a10d544c
|
@ -194,7 +194,7 @@ func createContainer(ctx context.Context, dockerCli command.Cli, containerConfig
|
||||||
|
|
||||||
//if image not found try to pull it
|
//if image not found try to pull it
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apiclient.IsErrImageNotFound(err) && namedRef != nil {
|
if apiclient.IsErrNotFound(err) && namedRef != nil {
|
||||||
fmt.Fprintf(stderr, "Unable to find image '%s' locally\n", reference.FamiliarString(namedRef))
|
fmt.Fprintf(stderr, "Unable to find image '%s' locally\n", reference.FamiliarString(namedRef))
|
||||||
|
|
||||||
// we don't want to write to stdout anything apart from container.ID
|
// we don't want to write to stdout anything apart from container.ID
|
||||||
|
|
|
@ -122,7 +122,10 @@ func interactiveExec(ctx context.Context, dockerCli command.Cli, execConfig *typ
|
||||||
}
|
}
|
||||||
|
|
||||||
client := dockerCli.Client()
|
client := dockerCli.Client()
|
||||||
resp, err := client.ContainerExecAttach(ctx, execID, *execConfig)
|
execStartCheck := types.ExecStartCheck{
|
||||||
|
Tty: execConfig.Tty,
|
||||||
|
}
|
||||||
|
resp, err := client.ContainerExecAttach(ctx, execID, execStartCheck)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error {
|
||||||
service, _, err := cli.ServiceInspectWithRaw(ctx, opts.target, types.ServiceInspectOptions{})
|
service, _, err := cli.ServiceInspectWithRaw(ctx, opts.target, types.ServiceInspectOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// if it's any error other than service not found, it's Real
|
// if it's any error other than service not found, it's Real
|
||||||
if !client.IsErrServiceNotFound(err) {
|
if !client.IsErrNotFound(err) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
task, _, err := cli.TaskInspectWithRaw(ctx, opts.target)
|
task, _, err := cli.TaskInspectWithRaw(ctx, opts.target)
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
github.com/agl/ed25519 d2b94fd789ea21d12fac1a4443dd3a3f79cda72c
|
github.com/agl/ed25519 d2b94fd789ea21d12fac1a4443dd3a3f79cda72c
|
||||||
github.com/Azure/go-ansiterm 19f72df4d05d31cbe1c56bfc8045c96babff6c7e
|
github.com/Azure/go-ansiterm d6e3b3328b783f23731bc4d058875b0371ff8109
|
||||||
github.com/containerd/continuity 22694c680ee48fb8f50015b44618517e2bde77e8
|
github.com/containerd/continuity 22694c680ee48fb8f50015b44618517e2bde77e8
|
||||||
github.com/coreos/etcd 824277cb3a577a0e8c829ca9ec557b973fe06d20
|
github.com/coreos/etcd 824277cb3a577a0e8c829ca9ec557b973fe06d20
|
||||||
github.com/cpuguy83/go-md2man a65d4d2de4d5f7c74868dfa9b202a3c8be315aaa
|
github.com/cpuguy83/go-md2man a65d4d2de4d5f7c74868dfa9b202a3c8be315aaa
|
||||||
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
||||||
github.com/docker/distribution edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c
|
github.com/docker/distribution edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c
|
||||||
github.com/docker/docker 14ce1f1cf48e9859223c6311de58aec4dc0f046c
|
github.com/docker/docker 1ffa10ee2630917e4f2a88f5e4daf34d700eaa1f
|
||||||
github.com/docker/docker-credential-helpers 3c90bd29a46b943b2a9842987b58fb91a7c1819b
|
github.com/docker/docker-credential-helpers 3c90bd29a46b943b2a9842987b58fb91a7c1819b
|
||||||
|
|
||||||
# the docker/go package contains a customized version of canonical/json
|
# the docker/go package contains a customized version of canonical/json
|
||||||
|
@ -15,7 +15,7 @@ github.com/docker/go-connections 3ede32e2033de7505e6500d6c868c2b9ed9f169d
|
||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||||
github.com/docker/go-units 9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1
|
github.com/docker/go-units 9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1
|
||||||
github.com/docker/notary 8a1de3cfc3f1408e54d6364fc949214a4883a9f3
|
github.com/docker/notary 8a1de3cfc3f1408e54d6364fc949214a4883a9f3
|
||||||
github.com/docker/swarmkit 941a01844b89c56aa61086fecb167ab3af1de22b
|
github.com/docker/swarmkit 872861d2ae46958af7ead1d5fffb092c73afbaf0
|
||||||
github.com/flynn-archive/go-shlex 3f9db97f856818214da2e1057f8ad84803971cff
|
github.com/flynn-archive/go-shlex 3f9db97f856818214da2e1057f8ad84803971cff
|
||||||
github.com/gogo/protobuf v0.4
|
github.com/gogo/protobuf v0.4
|
||||||
github.com/golang/protobuf 7a211bcf3bce0e3f1d74f9894916e6f116ae83b4
|
github.com/golang/protobuf 7a211bcf3bce0e3f1d74f9894916e6f116ae83b4
|
||||||
|
|
|
@ -5,7 +5,7 @@ type csiEntryState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (csiState csiEntryState) Handle(b byte) (s state, e error) {
|
func (csiState csiEntryState) Handle(b byte) (s state, e error) {
|
||||||
logger.Infof("CsiEntry::Handle %#x", b)
|
csiState.parser.logf("CsiEntry::Handle %#x", b)
|
||||||
|
|
||||||
nextState, err := csiState.baseState.Handle(b)
|
nextState, err := csiState.baseState.Handle(b)
|
||||||
if nextState != nil || err != nil {
|
if nextState != nil || err != nil {
|
||||||
|
@ -25,7 +25,7 @@ func (csiState csiEntryState) Handle(b byte) (s state, e error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (csiState csiEntryState) Transition(s state) error {
|
func (csiState csiEntryState) Transition(s state) error {
|
||||||
logger.Infof("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name())
|
csiState.parser.logf("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name())
|
||||||
csiState.baseState.Transition(s)
|
csiState.baseState.Transition(s)
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
|
|
|
@ -5,7 +5,7 @@ type csiParamState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (csiState csiParamState) Handle(b byte) (s state, e error) {
|
func (csiState csiParamState) Handle(b byte) (s state, e error) {
|
||||||
logger.Infof("CsiParam::Handle %#x", b)
|
csiState.parser.logf("CsiParam::Handle %#x", b)
|
||||||
|
|
||||||
nextState, err := csiState.baseState.Handle(b)
|
nextState, err := csiState.baseState.Handle(b)
|
||||||
if nextState != nil || err != nil {
|
if nextState != nil || err != nil {
|
||||||
|
@ -26,7 +26,7 @@ func (csiState csiParamState) Handle(b byte) (s state, e error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (csiState csiParamState) Transition(s state) error {
|
func (csiState csiParamState) Transition(s state) error {
|
||||||
logger.Infof("CsiParam::Transition %s --> %s", csiState.Name(), s.Name())
|
csiState.parser.logf("CsiParam::Transition %s --> %s", csiState.Name(), s.Name())
|
||||||
csiState.baseState.Transition(s)
|
csiState.baseState.Transition(s)
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
|
|
|
@ -5,7 +5,7 @@ type escapeIntermediateState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (escState escapeIntermediateState) Handle(b byte) (s state, e error) {
|
func (escState escapeIntermediateState) Handle(b byte) (s state, e error) {
|
||||||
logger.Infof("escapeIntermediateState::Handle %#x", b)
|
escState.parser.logf("escapeIntermediateState::Handle %#x", b)
|
||||||
nextState, err := escState.baseState.Handle(b)
|
nextState, err := escState.baseState.Handle(b)
|
||||||
if nextState != nil || err != nil {
|
if nextState != nil || err != nil {
|
||||||
return nextState, err
|
return nextState, err
|
||||||
|
@ -24,7 +24,7 @@ func (escState escapeIntermediateState) Handle(b byte) (s state, e error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (escState escapeIntermediateState) Transition(s state) error {
|
func (escState escapeIntermediateState) Transition(s state) error {
|
||||||
logger.Infof("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name())
|
escState.parser.logf("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name())
|
||||||
escState.baseState.Transition(s)
|
escState.baseState.Transition(s)
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
|
|
|
@ -5,7 +5,7 @@ type escapeState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (escState escapeState) Handle(b byte) (s state, e error) {
|
func (escState escapeState) Handle(b byte) (s state, e error) {
|
||||||
logger.Infof("escapeState::Handle %#x", b)
|
escState.parser.logf("escapeState::Handle %#x", b)
|
||||||
nextState, err := escState.baseState.Handle(b)
|
nextState, err := escState.baseState.Handle(b)
|
||||||
if nextState != nil || err != nil {
|
if nextState != nil || err != nil {
|
||||||
return nextState, err
|
return nextState, err
|
||||||
|
@ -28,7 +28,7 @@ func (escState escapeState) Handle(b byte) (s state, e error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (escState escapeState) Transition(s state) error {
|
func (escState escapeState) Transition(s state) error {
|
||||||
logger.Infof("Escape::Transition %s --> %s", escState.Name(), s.Name())
|
escState.parser.logf("Escape::Transition %s --> %s", escState.Name(), s.Name())
|
||||||
escState.baseState.Transition(s)
|
escState.baseState.Transition(s)
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
|
|
|
@ -5,7 +5,7 @@ type oscStringState struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (oscState oscStringState) Handle(b byte) (s state, e error) {
|
func (oscState oscStringState) Handle(b byte) (s state, e error) {
|
||||||
logger.Infof("OscString::Handle %#x", b)
|
oscState.parser.logf("OscString::Handle %#x", b)
|
||||||
nextState, err := oscState.baseState.Handle(b)
|
nextState, err := oscState.baseState.Handle(b)
|
||||||
if nextState != nil || err != nil {
|
if nextState != nil || err != nil {
|
||||||
return nextState, err
|
return nextState, err
|
||||||
|
|
|
@ -2,14 +2,10 @@ package ansiterm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"io/ioutil"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger *logrus.Logger
|
|
||||||
|
|
||||||
type AnsiParser struct {
|
type AnsiParser struct {
|
||||||
currState state
|
currState state
|
||||||
eventHandler AnsiEventHandler
|
eventHandler AnsiEventHandler
|
||||||
|
@ -23,50 +19,69 @@ type AnsiParser struct {
|
||||||
ground state
|
ground state
|
||||||
oscString state
|
oscString state
|
||||||
stateMap []state
|
stateMap []state
|
||||||
|
|
||||||
|
logf func(string, ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateParser(initialState string, evtHandler AnsiEventHandler) *AnsiParser {
|
type Option func(*AnsiParser)
|
||||||
logFile := ioutil.Discard
|
|
||||||
|
|
||||||
if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" {
|
func WithLogf(f func(string, ...interface{})) Option {
|
||||||
logFile, _ = os.Create("ansiParser.log")
|
return func(ap *AnsiParser) {
|
||||||
|
ap.logf = f
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger = &logrus.Logger{
|
func CreateParser(initialState string, evtHandler AnsiEventHandler, opts ...Option) *AnsiParser {
|
||||||
Out: logFile,
|
ap := &AnsiParser{
|
||||||
Formatter: new(logrus.TextFormatter),
|
|
||||||
Level: logrus.InfoLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
parser := &AnsiParser{
|
|
||||||
eventHandler: evtHandler,
|
eventHandler: evtHandler,
|
||||||
context: &ansiContext{},
|
context: &ansiContext{},
|
||||||
}
|
}
|
||||||
|
for _, o := range opts {
|
||||||
parser.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: parser}}
|
o(ap)
|
||||||
parser.csiParam = csiParamState{baseState{name: "CsiParam", parser: parser}}
|
|
||||||
parser.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: parser}}
|
|
||||||
parser.escape = escapeState{baseState{name: "Escape", parser: parser}}
|
|
||||||
parser.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: parser}}
|
|
||||||
parser.error = errorState{baseState{name: "Error", parser: parser}}
|
|
||||||
parser.ground = groundState{baseState{name: "Ground", parser: parser}}
|
|
||||||
parser.oscString = oscStringState{baseState{name: "OscString", parser: parser}}
|
|
||||||
|
|
||||||
parser.stateMap = []state{
|
|
||||||
parser.csiEntry,
|
|
||||||
parser.csiParam,
|
|
||||||
parser.dcsEntry,
|
|
||||||
parser.escape,
|
|
||||||
parser.escapeIntermediate,
|
|
||||||
parser.error,
|
|
||||||
parser.ground,
|
|
||||||
parser.oscString,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.currState = getState(initialState, parser.stateMap)
|
if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" {
|
||||||
|
logFile, _ := os.Create("ansiParser.log")
|
||||||
|
logger := log.New(logFile, "", log.LstdFlags)
|
||||||
|
if ap.logf != nil {
|
||||||
|
l := ap.logf
|
||||||
|
ap.logf = func(s string, v ...interface{}) {
|
||||||
|
l(s, v...)
|
||||||
|
logger.Printf(s, v...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ap.logf = logger.Printf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logger.Infof("CreateParser: parser %p", parser)
|
if ap.logf == nil {
|
||||||
return parser
|
ap.logf = func(string, ...interface{}) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
ap.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: ap}}
|
||||||
|
ap.csiParam = csiParamState{baseState{name: "CsiParam", parser: ap}}
|
||||||
|
ap.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: ap}}
|
||||||
|
ap.escape = escapeState{baseState{name: "Escape", parser: ap}}
|
||||||
|
ap.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: ap}}
|
||||||
|
ap.error = errorState{baseState{name: "Error", parser: ap}}
|
||||||
|
ap.ground = groundState{baseState{name: "Ground", parser: ap}}
|
||||||
|
ap.oscString = oscStringState{baseState{name: "OscString", parser: ap}}
|
||||||
|
|
||||||
|
ap.stateMap = []state{
|
||||||
|
ap.csiEntry,
|
||||||
|
ap.csiParam,
|
||||||
|
ap.dcsEntry,
|
||||||
|
ap.escape,
|
||||||
|
ap.escapeIntermediate,
|
||||||
|
ap.error,
|
||||||
|
ap.ground,
|
||||||
|
ap.oscString,
|
||||||
|
}
|
||||||
|
|
||||||
|
ap.currState = getState(initialState, ap.stateMap)
|
||||||
|
|
||||||
|
ap.logf("CreateParser: parser %p", ap)
|
||||||
|
return ap
|
||||||
}
|
}
|
||||||
|
|
||||||
func getState(name string, states []state) state {
|
func getState(name string, states []state) state {
|
||||||
|
@ -97,7 +112,7 @@ func (ap *AnsiParser) handle(b byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if newState == nil {
|
if newState == nil {
|
||||||
logger.Warning("newState is nil")
|
ap.logf("WARNING: newState is nil")
|
||||||
return errors.New("New state of 'nil' is invalid.")
|
return errors.New("New state of 'nil' is invalid.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,23 +126,23 @@ func (ap *AnsiParser) handle(b byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ap *AnsiParser) changeState(newState state) error {
|
func (ap *AnsiParser) changeState(newState state) error {
|
||||||
logger.Infof("ChangeState %s --> %s", ap.currState.Name(), newState.Name())
|
ap.logf("ChangeState %s --> %s", ap.currState.Name(), newState.Name())
|
||||||
|
|
||||||
// Exit old state
|
// Exit old state
|
||||||
if err := ap.currState.Exit(); err != nil {
|
if err := ap.currState.Exit(); err != nil {
|
||||||
logger.Infof("Exit state '%s' failed with : '%v'", ap.currState.Name(), err)
|
ap.logf("Exit state '%s' failed with : '%v'", ap.currState.Name(), err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform transition action
|
// Perform transition action
|
||||||
if err := ap.currState.Transition(newState); err != nil {
|
if err := ap.currState.Transition(newState); err != nil {
|
||||||
logger.Infof("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err)
|
ap.logf("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enter new state
|
// Enter new state
|
||||||
if err := newState.Enter(); err != nil {
|
if err := newState.Enter(); err != nil {
|
||||||
logger.Infof("Enter state '%s' failed with: '%v'", newState.Name(), err)
|
ap.logf("Enter state '%s' failed with: '%v'", newState.Name(), err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ func parseParams(bytes []byte) ([]string, error) {
|
||||||
params = append(params, s)
|
params = append(params, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Infof("Parsed params: %v with length: %d", params, len(params))
|
|
||||||
return params, nil
|
return params, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +36,6 @@ func parseCmd(context ansiContext) (string, error) {
|
||||||
|
|
||||||
func getInt(params []string, dflt int) int {
|
func getInt(params []string, dflt int) int {
|
||||||
i := getInts(params, 1, dflt)[0]
|
i := getInts(params, 1, dflt)[0]
|
||||||
logger.Infof("getInt: %v", i)
|
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +58,6 @@ func getInts(params []string, minCount int, dflt int) []int {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Infof("getInts: %v", ints)
|
|
||||||
|
|
||||||
return ints
|
return ints
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,15 @@
|
||||||
package ansiterm
|
package ansiterm
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ap *AnsiParser) collectParam() error {
|
func (ap *AnsiParser) collectParam() error {
|
||||||
currChar := ap.context.currentChar
|
currChar := ap.context.currentChar
|
||||||
logger.Infof("collectParam %#x", currChar)
|
ap.logf("collectParam %#x", currChar)
|
||||||
ap.context.paramBuffer = append(ap.context.paramBuffer, currChar)
|
ap.context.paramBuffer = append(ap.context.paramBuffer, currChar)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ap *AnsiParser) collectInter() error {
|
func (ap *AnsiParser) collectInter() error {
|
||||||
currChar := ap.context.currentChar
|
currChar := ap.context.currentChar
|
||||||
logger.Infof("collectInter %#x", currChar)
|
ap.logf("collectInter %#x", currChar)
|
||||||
ap.context.paramBuffer = append(ap.context.interBuffer, currChar)
|
ap.context.paramBuffer = append(ap.context.interBuffer, currChar)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -21,8 +17,8 @@ func (ap *AnsiParser) collectInter() error {
|
||||||
func (ap *AnsiParser) escDispatch() error {
|
func (ap *AnsiParser) escDispatch() error {
|
||||||
cmd, _ := parseCmd(*ap.context)
|
cmd, _ := parseCmd(*ap.context)
|
||||||
intermeds := ap.context.interBuffer
|
intermeds := ap.context.interBuffer
|
||||||
logger.Infof("escDispatch currentChar: %#x", ap.context.currentChar)
|
ap.logf("escDispatch currentChar: %#x", ap.context.currentChar)
|
||||||
logger.Infof("escDispatch: %v(%v)", cmd, intermeds)
|
ap.logf("escDispatch: %v(%v)", cmd, intermeds)
|
||||||
|
|
||||||
switch cmd {
|
switch cmd {
|
||||||
case "D": // IND
|
case "D": // IND
|
||||||
|
@ -43,8 +39,9 @@ func (ap *AnsiParser) escDispatch() error {
|
||||||
func (ap *AnsiParser) csiDispatch() error {
|
func (ap *AnsiParser) csiDispatch() error {
|
||||||
cmd, _ := parseCmd(*ap.context)
|
cmd, _ := parseCmd(*ap.context)
|
||||||
params, _ := parseParams(ap.context.paramBuffer)
|
params, _ := parseParams(ap.context.paramBuffer)
|
||||||
|
ap.logf("Parsed params: %v with length: %d", params, len(params))
|
||||||
|
|
||||||
logger.Infof("csiDispatch: %v(%v)", cmd, params)
|
ap.logf("csiDispatch: %v(%v)", cmd, params)
|
||||||
|
|
||||||
switch cmd {
|
switch cmd {
|
||||||
case "@":
|
case "@":
|
||||||
|
@ -102,7 +99,7 @@ func (ap *AnsiParser) csiDispatch() error {
|
||||||
top, bottom := ints[0], ints[1]
|
top, bottom := ints[0], ints[1]
|
||||||
return ap.eventHandler.DECSTBM(top, bottom)
|
return ap.eventHandler.DECSTBM(top, bottom)
|
||||||
default:
|
default:
|
||||||
logger.Errorf(fmt.Sprintf("Unsupported CSI command: '%s', with full context: %v", cmd, ap.context))
|
ap.logf("ERROR: Unsupported CSI command: '%s', with full context: %v", cmd, ap.context)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ func GetStdFile(nFile int) (*os.File, uintptr) {
|
||||||
|
|
||||||
fd, err := syscall.GetStdHandle(nFile)
|
fd, err := syscall.GetStdHandle(nFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("Invalid standard handle indentifier: %v -- %v", nFile, err))
|
panic(fmt.Errorf("Invalid standard handle identifier: %v -- %v", nFile, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
return file, uintptr(fd)
|
return file, uintptr(fd)
|
||||||
|
|
|
@ -57,9 +57,14 @@ const (
|
||||||
ENABLE_INSERT_MODE = 0x0020
|
ENABLE_INSERT_MODE = 0x0020
|
||||||
ENABLE_QUICK_EDIT_MODE = 0x0040
|
ENABLE_QUICK_EDIT_MODE = 0x0040
|
||||||
ENABLE_EXTENDED_FLAGS = 0x0080
|
ENABLE_EXTENDED_FLAGS = 0x0080
|
||||||
|
ENABLE_AUTO_POSITION = 0x0100
|
||||||
|
ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200
|
||||||
|
|
||||||
ENABLE_PROCESSED_OUTPUT = 0x0001
|
ENABLE_PROCESSED_OUTPUT = 0x0001
|
||||||
ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
|
ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
|
||||||
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
|
||||||
|
DISABLE_NEWLINE_AUTO_RETURN = 0x0008
|
||||||
|
ENABLE_LVB_GRID_WORLDWIDE = 0x0010
|
||||||
|
|
||||||
// Character attributes
|
// Character attributes
|
||||||
// Note:
|
// Note:
|
||||||
|
|
|
@ -34,7 +34,7 @@ func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("Cursor position set: (%d, %d)", position.X, position.Y)
|
h.logf("Cursor position set: (%d, %d)", position.X, position.Y)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,8 @@ func (h *windowsAnsiEventHandler) insertLines(param int) error {
|
||||||
|
|
||||||
// scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates.
|
// scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates.
|
||||||
func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error {
|
func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error {
|
||||||
logger.Infof("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom)
|
h.logf("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom)
|
||||||
logger.Infof("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom)
|
h.logf("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom)
|
||||||
|
|
||||||
// Copy from and clip to the scroll region (full buffer width)
|
// Copy from and clip to the scroll region (full buffer width)
|
||||||
scrollRect := SMALL_RECT{
|
scrollRect := SMALL_RECT{
|
||||||
|
|
|
@ -4,16 +4,13 @@ package winterm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io/ioutil"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/Azure/go-ansiterm"
|
"github.com/Azure/go-ansiterm"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger *logrus.Logger
|
|
||||||
|
|
||||||
type windowsAnsiEventHandler struct {
|
type windowsAnsiEventHandler struct {
|
||||||
fd uintptr
|
fd uintptr
|
||||||
file *os.File
|
file *os.File
|
||||||
|
@ -28,32 +25,52 @@ type windowsAnsiEventHandler struct {
|
||||||
marginByte byte
|
marginByte byte
|
||||||
curInfo *CONSOLE_SCREEN_BUFFER_INFO
|
curInfo *CONSOLE_SCREEN_BUFFER_INFO
|
||||||
curPos COORD
|
curPos COORD
|
||||||
|
logf func(string, ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateWinEventHandler(fd uintptr, file *os.File) ansiterm.AnsiEventHandler {
|
type Option func(*windowsAnsiEventHandler)
|
||||||
logFile := ioutil.Discard
|
|
||||||
|
|
||||||
if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" {
|
func WithLogf(f func(string, ...interface{})) Option {
|
||||||
logFile, _ = os.Create("winEventHandler.log")
|
return func(w *windowsAnsiEventHandler) {
|
||||||
}
|
w.logf = f
|
||||||
|
}
|
||||||
logger = &logrus.Logger{
|
|
||||||
Out: logFile,
|
|
||||||
Formatter: new(logrus.TextFormatter),
|
|
||||||
Level: logrus.DebugLevel,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) ansiterm.AnsiEventHandler {
|
||||||
infoReset, err := GetConsoleScreenBufferInfo(fd)
|
infoReset, err := GetConsoleScreenBufferInfo(fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return &windowsAnsiEventHandler{
|
h := &windowsAnsiEventHandler{
|
||||||
fd: fd,
|
fd: fd,
|
||||||
file: file,
|
file: file,
|
||||||
infoReset: infoReset,
|
infoReset: infoReset,
|
||||||
attributes: infoReset.Attributes,
|
attributes: infoReset.Attributes,
|
||||||
}
|
}
|
||||||
|
for _, o := range opts {
|
||||||
|
o(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" {
|
||||||
|
logFile, _ := os.Create("winEventHandler.log")
|
||||||
|
logger := log.New(logFile, "", log.LstdFlags)
|
||||||
|
if h.logf != nil {
|
||||||
|
l := h.logf
|
||||||
|
h.logf = func(s string, v ...interface{}) {
|
||||||
|
l(s, v...)
|
||||||
|
logger.Printf(s, v...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
h.logf = logger.Printf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.logf == nil {
|
||||||
|
h.logf = func(string, ...interface{}) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
type scrollRegion struct {
|
type scrollRegion struct {
|
||||||
|
@ -96,7 +113,7 @@ func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
logger.Info("Simulating LF inside scroll region")
|
h.logf("Simulating LF inside scroll region")
|
||||||
if err := h.scrollUp(1); err != nil {
|
if err := h.scrollUp(1); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -119,7 +136,7 @@ func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) {
|
||||||
} else {
|
} else {
|
||||||
// The cursor is at the bottom of the screen but outside the scroll
|
// The cursor is at the bottom of the screen but outside the scroll
|
||||||
// region. Skip the LF.
|
// region. Skip the LF.
|
||||||
logger.Info("Simulating LF outside scroll region")
|
h.logf("Simulating LF outside scroll region")
|
||||||
if includeCR {
|
if includeCR {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -151,7 +168,7 @@ func (h *windowsAnsiEventHandler) executeLF() error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Info("Resetting cursor position for LF without CR")
|
h.logf("Resetting cursor position for LF without CR")
|
||||||
if err := SetConsoleCursorPosition(h.fd, pos); err != nil {
|
if err := SetConsoleCursorPosition(h.fd, pos); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -186,7 +203,7 @@ func (h *windowsAnsiEventHandler) Print(b byte) error {
|
||||||
func (h *windowsAnsiEventHandler) Execute(b byte) error {
|
func (h *windowsAnsiEventHandler) Execute(b byte) error {
|
||||||
switch b {
|
switch b {
|
||||||
case ansiterm.ANSI_TAB:
|
case ansiterm.ANSI_TAB:
|
||||||
logger.Info("Execute(TAB)")
|
h.logf("Execute(TAB)")
|
||||||
// Move to the next tab stop, but preserve auto-wrap if already set.
|
// Move to the next tab stop, but preserve auto-wrap if already set.
|
||||||
if !h.wrapNext {
|
if !h.wrapNext {
|
||||||
pos, info, err := h.getCurrentInfo()
|
pos, info, err := h.getCurrentInfo()
|
||||||
|
@ -269,7 +286,7 @@ func (h *windowsAnsiEventHandler) CUU(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CUU: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CUU: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorVertical(-param)
|
return h.moveCursorVertical(-param)
|
||||||
}
|
}
|
||||||
|
@ -278,7 +295,7 @@ func (h *windowsAnsiEventHandler) CUD(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CUD: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CUD: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorVertical(param)
|
return h.moveCursorVertical(param)
|
||||||
}
|
}
|
||||||
|
@ -287,7 +304,7 @@ func (h *windowsAnsiEventHandler) CUF(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CUF: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CUF: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorHorizontal(param)
|
return h.moveCursorHorizontal(param)
|
||||||
}
|
}
|
||||||
|
@ -296,7 +313,7 @@ func (h *windowsAnsiEventHandler) CUB(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CUB: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CUB: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorHorizontal(-param)
|
return h.moveCursorHorizontal(-param)
|
||||||
}
|
}
|
||||||
|
@ -305,7 +322,7 @@ func (h *windowsAnsiEventHandler) CNL(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CNL: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CNL: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorLine(param)
|
return h.moveCursorLine(param)
|
||||||
}
|
}
|
||||||
|
@ -314,7 +331,7 @@ func (h *windowsAnsiEventHandler) CPL(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CPL: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CPL: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorLine(-param)
|
return h.moveCursorLine(-param)
|
||||||
}
|
}
|
||||||
|
@ -323,7 +340,7 @@ func (h *windowsAnsiEventHandler) CHA(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CHA: [%v]", []string{strconv.Itoa(param)})
|
h.logf("CHA: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.moveCursorColumn(param)
|
return h.moveCursorColumn(param)
|
||||||
}
|
}
|
||||||
|
@ -332,7 +349,7 @@ func (h *windowsAnsiEventHandler) VPA(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("VPA: [[%d]]", param)
|
h.logf("VPA: [[%d]]", param)
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
info, err := GetConsoleScreenBufferInfo(h.fd)
|
info, err := GetConsoleScreenBufferInfo(h.fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -348,7 +365,7 @@ func (h *windowsAnsiEventHandler) CUP(row int, col int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("CUP: [[%d %d]]", row, col)
|
h.logf("CUP: [[%d %d]]", row, col)
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
info, err := GetConsoleScreenBufferInfo(h.fd)
|
info, err := GetConsoleScreenBufferInfo(h.fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -364,7 +381,7 @@ func (h *windowsAnsiEventHandler) HVP(row int, col int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("HVP: [[%d %d]]", row, col)
|
h.logf("HVP: [[%d %d]]", row, col)
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.CUP(row, col)
|
return h.CUP(row, col)
|
||||||
}
|
}
|
||||||
|
@ -373,7 +390,7 @@ func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DECTCEM: [%v]", []string{strconv.FormatBool(visible)})
|
h.logf("DECTCEM: [%v]", []string{strconv.FormatBool(visible)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -382,7 +399,7 @@ func (h *windowsAnsiEventHandler) DECOM(enable bool) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DECOM: [%v]", []string{strconv.FormatBool(enable)})
|
h.logf("DECOM: [%v]", []string{strconv.FormatBool(enable)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
h.originMode = enable
|
h.originMode = enable
|
||||||
return h.CUP(1, 1)
|
return h.CUP(1, 1)
|
||||||
|
@ -392,7 +409,7 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DECCOLM: [%v]", []string{strconv.FormatBool(use132)})
|
h.logf("DECCOLM: [%v]", []string{strconv.FormatBool(use132)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
if err := h.ED(2); err != nil {
|
if err := h.ED(2); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -407,7 +424,7 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {
|
||||||
}
|
}
|
||||||
if info.Size.X < targetWidth {
|
if info.Size.X < targetWidth {
|
||||||
if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {
|
if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {
|
||||||
logger.Info("set buffer failed:", err)
|
h.logf("set buffer failed: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,12 +432,12 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {
|
||||||
window.Left = 0
|
window.Left = 0
|
||||||
window.Right = targetWidth - 1
|
window.Right = targetWidth - 1
|
||||||
if err := SetConsoleWindowInfo(h.fd, true, window); err != nil {
|
if err := SetConsoleWindowInfo(h.fd, true, window); err != nil {
|
||||||
logger.Info("set window failed:", err)
|
h.logf("set window failed: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if info.Size.X > targetWidth {
|
if info.Size.X > targetWidth {
|
||||||
if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {
|
if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {
|
||||||
logger.Info("set buffer failed:", err)
|
h.logf("set buffer failed: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -431,7 +448,7 @@ func (h *windowsAnsiEventHandler) ED(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("ED: [%v]", []string{strconv.Itoa(param)})
|
h.logf("ED: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
|
|
||||||
// [J -- Erases from the cursor to the end of the screen, including the cursor position.
|
// [J -- Erases from the cursor to the end of the screen, including the cursor position.
|
||||||
|
@ -490,7 +507,7 @@ func (h *windowsAnsiEventHandler) EL(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("EL: [%v]", strconv.Itoa(param))
|
h.logf("EL: [%v]", strconv.Itoa(param))
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
|
|
||||||
// [K -- Erases from the cursor to the end of the line, including the cursor position.
|
// [K -- Erases from the cursor to the end of the line, including the cursor position.
|
||||||
|
@ -531,7 +548,7 @@ func (h *windowsAnsiEventHandler) IL(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("IL: [%v]", strconv.Itoa(param))
|
h.logf("IL: [%v]", strconv.Itoa(param))
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.insertLines(param)
|
return h.insertLines(param)
|
||||||
}
|
}
|
||||||
|
@ -540,7 +557,7 @@ func (h *windowsAnsiEventHandler) DL(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DL: [%v]", strconv.Itoa(param))
|
h.logf("DL: [%v]", strconv.Itoa(param))
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.deleteLines(param)
|
return h.deleteLines(param)
|
||||||
}
|
}
|
||||||
|
@ -549,7 +566,7 @@ func (h *windowsAnsiEventHandler) ICH(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("ICH: [%v]", strconv.Itoa(param))
|
h.logf("ICH: [%v]", strconv.Itoa(param))
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.insertCharacters(param)
|
return h.insertCharacters(param)
|
||||||
}
|
}
|
||||||
|
@ -558,7 +575,7 @@ func (h *windowsAnsiEventHandler) DCH(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DCH: [%v]", strconv.Itoa(param))
|
h.logf("DCH: [%v]", strconv.Itoa(param))
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.deleteCharacters(param)
|
return h.deleteCharacters(param)
|
||||||
}
|
}
|
||||||
|
@ -572,7 +589,7 @@ func (h *windowsAnsiEventHandler) SGR(params []int) error {
|
||||||
strings = append(strings, strconv.Itoa(v))
|
strings = append(strings, strconv.Itoa(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Infof("SGR: [%v]", strings)
|
h.logf("SGR: [%v]", strings)
|
||||||
|
|
||||||
if len(params) <= 0 {
|
if len(params) <= 0 {
|
||||||
h.attributes = h.infoReset.Attributes
|
h.attributes = h.infoReset.Attributes
|
||||||
|
@ -606,7 +623,7 @@ func (h *windowsAnsiEventHandler) SU(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("SU: [%v]", []string{strconv.Itoa(param)})
|
h.logf("SU: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.scrollUp(param)
|
return h.scrollUp(param)
|
||||||
}
|
}
|
||||||
|
@ -615,13 +632,13 @@ func (h *windowsAnsiEventHandler) SD(param int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("SD: [%v]", []string{strconv.Itoa(param)})
|
h.logf("SD: [%v]", []string{strconv.Itoa(param)})
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
return h.scrollDown(param)
|
return h.scrollDown(param)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *windowsAnsiEventHandler) DA(params []string) error {
|
func (h *windowsAnsiEventHandler) DA(params []string) error {
|
||||||
logger.Infof("DA: [%v]", params)
|
h.logf("DA: [%v]", params)
|
||||||
// DA cannot be implemented because it must send data on the VT100 input stream,
|
// DA cannot be implemented because it must send data on the VT100 input stream,
|
||||||
// which is not available to go-ansiterm.
|
// which is not available to go-ansiterm.
|
||||||
return nil
|
return nil
|
||||||
|
@ -631,7 +648,7 @@ func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Infof("DECSTBM: [%d, %d]", top, bottom)
|
h.logf("DECSTBM: [%d, %d]", top, bottom)
|
||||||
|
|
||||||
// Windows is 0 indexed, Linux is 1 indexed
|
// Windows is 0 indexed, Linux is 1 indexed
|
||||||
h.sr.top = int16(top - 1)
|
h.sr.top = int16(top - 1)
|
||||||
|
@ -646,7 +663,7 @@ func (h *windowsAnsiEventHandler) RI() error {
|
||||||
if err := h.Flush(); err != nil {
|
if err := h.Flush(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
logger.Info("RI: []")
|
h.logf("RI: []")
|
||||||
h.clearWrap()
|
h.clearWrap()
|
||||||
|
|
||||||
info, err := GetConsoleScreenBufferInfo(h.fd)
|
info, err := GetConsoleScreenBufferInfo(h.fd)
|
||||||
|
@ -663,21 +680,21 @@ func (h *windowsAnsiEventHandler) RI() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *windowsAnsiEventHandler) IND() error {
|
func (h *windowsAnsiEventHandler) IND() error {
|
||||||
logger.Info("IND: []")
|
h.logf("IND: []")
|
||||||
return h.executeLF()
|
return h.executeLF()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *windowsAnsiEventHandler) Flush() error {
|
func (h *windowsAnsiEventHandler) Flush() error {
|
||||||
h.curInfo = nil
|
h.curInfo = nil
|
||||||
if h.buffer.Len() > 0 {
|
if h.buffer.Len() > 0 {
|
||||||
logger.Infof("Flush: [%s]", h.buffer.Bytes())
|
h.logf("Flush: [%s]", h.buffer.Bytes())
|
||||||
if _, err := h.buffer.WriteTo(h.file); err != nil {
|
if _, err := h.buffer.WriteTo(h.file); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.wrapNext && !h.drewMarginByte {
|
if h.wrapNext && !h.drewMarginByte {
|
||||||
logger.Infof("Flush: drawing margin byte '%c'", h.marginByte)
|
h.logf("Flush: drawing margin byte '%c'", h.marginByte)
|
||||||
|
|
||||||
info, err := GetConsoleScreenBufferInfo(h.fd)
|
info, err := GetConsoleScreenBufferInfo(h.fd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,70 +1,38 @@
|
||||||
### Docker users, see [Moby and Docker](https://mobyproject.org/#moby-and-docker) to clarify the relationship between the projects
|
|
||||||
|
|
||||||
### Docker maintainers and contributors, see [Transitioning to Moby](#transitioning-to-moby) for more details
|
|
||||||
|
|
||||||
The Moby Project
|
The Moby Project
|
||||||
================
|
================
|
||||||
|
|
||||||
![Moby Project logo](docs/static_files/moby-project-logo.png "The Moby Project")
|
![Moby Project logo](docs/static_files/moby-project-logo.png "The Moby Project")
|
||||||
|
|
||||||
Moby is an open-source project created by Docker to advance the software containerization movement.
|
Moby is an open-source project created by Docker to enable and accelerate software containerization.
|
||||||
It provides a “Lego set” of dozens of components, the framework for assembling them into custom container-based systems, and a place for all container enthusiasts to experiment and exchange ideas.
|
|
||||||
|
|
||||||
# Moby
|
It provides a "Lego set" of toolkit components, the framework for assembling them into custom container-based systems, and a place for all container enthusiasts and professionals to experiment and exchange ideas.
|
||||||
|
Components include container build tools, a container registry, orchestration tools, a runtime and more, and these can be used as building blocks in conjunction with other tools and projects.
|
||||||
## Overview
|
|
||||||
|
|
||||||
At the core of Moby is a framework to assemble specialized container systems.
|
|
||||||
It provides:
|
|
||||||
|
|
||||||
- A library of containerized components for all vital aspects of a container system: OS, container runtime, orchestration, infrastructure management, networking, storage, security, build, image distribution, etc.
|
|
||||||
- Tools to assemble the components into runnable artifacts for a variety of platforms and architectures: bare metal (both x86 and Arm); executables for Linux, Mac and Windows; VM images for popular cloud and virtualization providers.
|
|
||||||
- A set of reference assemblies which can be used as-is, modified, or used as inspiration to create your own.
|
|
||||||
|
|
||||||
All Moby components are containers, so creating new components is as easy as building a new OCI-compatible container.
|
|
||||||
|
|
||||||
## Principles
|
## Principles
|
||||||
|
|
||||||
Moby is an open project guided by strong principles, but modular, flexible and without too strong an opinion on user experience, so it is open to the community to help set its direction.
|
Moby is an open project guided by strong principles, aiming to be modular, flexible and without too strong an opinion on user experience.
|
||||||
The guiding principles are:
|
It is open to the community to help set its direction.
|
||||||
|
|
||||||
|
- Modular: the project includes lots of components that have well-defined functions and APIs that work together.
|
||||||
- Batteries included but swappable: Moby includes enough components to build fully featured container system, but its modular architecture ensures that most of the components can be swapped by different implementations.
|
- Batteries included but swappable: Moby includes enough components to build fully featured container system, but its modular architecture ensures that most of the components can be swapped by different implementations.
|
||||||
- Usable security: Moby will provide secure defaults without compromising usability.
|
- Usable security: Moby provides secure defaults without compromising usability.
|
||||||
- Container centric: Moby is built with containers, for running containers.
|
- Developer focused: The APIs are intended to be functional and useful to build powerful tools.
|
||||||
|
They are not necessarily intended as end user tools but as components aimed at developers.
|
||||||
With Moby, you should be able to describe all the components of your distributed application, from the high-level configuration files down to the kernel you would like to use and build and deploy it easily.
|
Documentation and UX is aimed at developers not end users.
|
||||||
|
|
||||||
Moby uses [containerd](https://github.com/containerd/containerd) as the default container runtime.
|
|
||||||
|
|
||||||
## Audience
|
## Audience
|
||||||
|
|
||||||
Moby is recommended for anyone who wants to assemble a container-based system. This includes:
|
The Moby Project is intended for engineers, integrators and enthusiasts looking to modify, hack, fix, experiment, invent and build systems based on containers.
|
||||||
|
It is not for people looking for a commercially supported system, but for people who want to work and learn with open source code.
|
||||||
|
|
||||||
- Hackers who want to customize or patch their Docker build
|
## Relationship with Docker
|
||||||
- System engineers or integrators building a container system
|
|
||||||
- Infrastructure providers looking to adapt existing container systems to their environment
|
|
||||||
- Container enthusiasts who want to experiment with the latest container tech
|
|
||||||
- Open-source developers looking to test their project in a variety of different systems
|
|
||||||
- Anyone curious about Docker internals and how it’s built
|
|
||||||
|
|
||||||
Moby is NOT recommended for:
|
The components and tools in the Moby Project are initially the open source components that Docker and the community have built for the Docker Project.
|
||||||
|
New projects can be added if they fit with the community goals. Docker is committed to using Moby as the upstream for the Docker Product.
|
||||||
|
However, other projects are also encouraged to use Moby as an upstream, and to reuse the components in diverse ways, and all these uses will be treated in the same way. External maintainers and contributors are welcomed.
|
||||||
|
|
||||||
- Application developers looking for an easy way to run their applications in containers. We recommend Docker CE instead.
|
The Moby project is not intended as a location for support or feature requests for Docker products, but as a place for contributors to work on open source code, fix bugs, and make the code more useful.
|
||||||
- Enterprise IT and development teams looking for a ready-to-use, commercially supported container platform. We recommend Docker EE instead.
|
The releases are supported by the maintainers, community and users, on a best efforts basis only, and are not intended for customers who want enterprise or commercial support; Docker EE is the appropriate product for these use cases.
|
||||||
- Anyone curious about containers and looking for an easy way to learn. We recommend the [docker.com](https://www.docker.com/) website instead.
|
|
||||||
|
|
||||||
# Transitioning to Moby
|
|
||||||
|
|
||||||
Docker is transitioning all of its open source collaborations to the Moby project going forward.
|
|
||||||
During the transition, all open source activity should continue as usual.
|
|
||||||
|
|
||||||
We are proposing the following list of changes:
|
|
||||||
|
|
||||||
- splitting up the engine into more open components
|
|
||||||
- removing the docker UI, SDK etc to keep them in the Docker org
|
|
||||||
- clarifying that the project is not limited to the engine, but to the assembly of all the individual components of the Docker platform
|
|
||||||
- open-source new tools & components which we currently use to assemble the Docker product, but could benefit the community
|
|
||||||
- defining an open, community-centric governance inspired by the Fedora project (a very successful example of balancing the needs of the community with the constraints of the primary corporate sponsor)
|
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -82,7 +50,6 @@ violate applicable laws.
|
||||||
|
|
||||||
For more information, please see https://www.bis.doc.gov
|
For more information, please see https://www.bis.doc.gov
|
||||||
|
|
||||||
|
|
||||||
Licensing
|
Licensing
|
||||||
=========
|
=========
|
||||||
Moby is licensed under the Apache License, Version 2.0. See
|
Moby is licensed under the Apache License, Version 2.0. See
|
||||||
|
|
|
@ -10,7 +10,7 @@ It consists of various components in this repository:
|
||||||
- `client/` The Go client used by the command-line client. It can also be used by third-party Go programs.
|
- `client/` The Go client used by the command-line client. It can also be used by third-party Go programs.
|
||||||
- `daemon/` The daemon, which serves the API.
|
- `daemon/` The daemon, which serves the API.
|
||||||
|
|
||||||
## Swagger definition
|
## Swagger definition
|
||||||
|
|
||||||
The API is defined by the [Swagger](http://swagger.io/specification/) definition in `api/swagger.yaml`. This definition can be used to:
|
The API is defined by the [Swagger](http://swagger.io/specification/) definition in `api/swagger.yaml`. This definition can be used to:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ The API is defined by the [Swagger](http://swagger.io/specification/) definition
|
||||||
|
|
||||||
## Updating the API documentation
|
## Updating the API documentation
|
||||||
|
|
||||||
The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, you'll need to edit this file to represent the change in the documentation.
|
The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, edit this file to represent the change in the documentation.
|
||||||
|
|
||||||
The file is split into two main sections:
|
The file is split into two main sections:
|
||||||
|
|
||||||
|
@ -29,9 +29,9 @@ The file is split into two main sections:
|
||||||
|
|
||||||
To make an edit, first look for the endpoint you want to edit under `paths`, then make the required edits. Endpoints may reference reusable objects with `$ref`, which can be found in the `definitions` section.
|
To make an edit, first look for the endpoint you want to edit under `paths`, then make the required edits. Endpoints may reference reusable objects with `$ref`, which can be found in the `definitions` section.
|
||||||
|
|
||||||
There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919)
|
There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919).
|
||||||
|
|
||||||
`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful for when you are making edits to ensure you are doing the right thing.
|
`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful when making edits to ensure you are doing the right thing.
|
||||||
|
|
||||||
## Viewing the API documentation
|
## Viewing the API documentation
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package api
|
||||||
// Common constants for daemon and client.
|
// Common constants for daemon and client.
|
||||||
const (
|
const (
|
||||||
// DefaultVersion of Current REST API
|
// DefaultVersion of Current REST API
|
||||||
DefaultVersion string = "1.33"
|
DefaultVersion string = "1.34"
|
||||||
|
|
||||||
// NoBaseImageSpecifier is the symbol used by the FROM
|
// NoBaseImageSpecifier is the symbol used by the FROM
|
||||||
// command to specify that no base image is to be used.
|
// command to specify that no base image is to be used.
|
||||||
|
|
|
@ -179,10 +179,7 @@ type ImageBuildOptions struct {
|
||||||
ExtraHosts []string // List of extra hosts
|
ExtraHosts []string // List of extra hosts
|
||||||
Target string
|
Target string
|
||||||
SessionID string
|
SessionID string
|
||||||
|
Platform string
|
||||||
// TODO @jhowardmsft LCOW Support: This will require extending to include
|
|
||||||
// `Platform string`, but is omitted for now as it's hard-coded temporarily
|
|
||||||
// to avoid API changes.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageBuildResponse holds information
|
// ImageBuildResponse holds information
|
||||||
|
@ -195,7 +192,8 @@ type ImageBuildResponse struct {
|
||||||
|
|
||||||
// ImageCreateOptions holds information to create images.
|
// ImageCreateOptions holds information to create images.
|
||||||
type ImageCreateOptions struct {
|
type ImageCreateOptions struct {
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry.
|
||||||
|
Platform string // Platform is the target platform of the image if it needs to be pulled from the registry.
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageImportSource holds source information for ImageImport
|
// ImageImportSource holds source information for ImageImport
|
||||||
|
@ -209,6 +207,7 @@ type ImageImportOptions struct {
|
||||||
Tag string // Tag is the name to tag this image with. This attribute is deprecated.
|
Tag string // Tag is the name to tag this image with. This attribute is deprecated.
|
||||||
Message string // Message is the message to tag the image with
|
Message string // Message is the message to tag the image with
|
||||||
Changes []string // Changes are the raw changes to apply to this image
|
Changes []string // Changes are the raw changes to apply to this image
|
||||||
|
Platform string // Platform is the target platform of the image
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageListOptions holds parameters to filter the list of images with.
|
// ImageListOptions holds parameters to filter the list of images with.
|
||||||
|
@ -229,6 +228,7 @@ type ImagePullOptions struct {
|
||||||
All bool
|
All bool
|
||||||
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry
|
||||||
PrivilegeFunc RequestPrivilegeFunc
|
PrivilegeFunc RequestPrivilegeFunc
|
||||||
|
Platform string
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestPrivilegeFunc is a function interface that
|
// RequestPrivilegeFunc is a function interface that
|
||||||
|
|
|
@ -16,7 +16,6 @@ type ContainerCreateConfig struct {
|
||||||
HostConfig *container.HostConfig
|
HostConfig *container.HostConfig
|
||||||
NetworkingConfig *network.NetworkingConfig
|
NetworkingConfig *network.NetworkingConfig
|
||||||
AdjustCPUShares bool
|
AdjustCPUShares bool
|
||||||
Platform string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerRmConfig holds arguments for the container remove
|
// ContainerRmConfig holds arguments for the container remove
|
||||||
|
|
|
@ -35,7 +35,7 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config
|
||||||
// It returns a types.HijackedConnection with the hijacked connection
|
// It returns a types.HijackedConnection with the hijacked connection
|
||||||
// and the a reader to get output. It's up to the called to close
|
// and the a reader to get output. It's up to the called to close
|
||||||
// the hijacked connection by calling types.HijackedResponse.Close.
|
// the hijacked connection by calling types.HijackedResponse.Close.
|
||||||
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) {
|
func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) {
|
||||||
headers := map[string][]string{"Content-Type": {"application/json"}}
|
headers := map[string][]string{"Content-Type": {"application/json"}}
|
||||||
return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers)
|
return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers)
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,38 +71,6 @@ func wrapResponseError(err error, resp serverResponse, object, id string) error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrImageNotFound returns true if the error is caused
|
|
||||||
// when an image is not found in the docker host.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrImageNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrContainerNotFound returns true if the error is caused
|
|
||||||
// when a container is not found in the docker host.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrContainerNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrNetworkNotFound returns true if the error is caused
|
|
||||||
// when a network is not found in the docker host.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrNetworkNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrVolumeNotFound returns true if the error is caused
|
|
||||||
// when a volume is not found in the docker host.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrVolumeNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// unauthorizedError represents an authorization error in a remote registry.
|
// unauthorizedError represents an authorization error in a remote registry.
|
||||||
type unauthorizedError struct {
|
type unauthorizedError struct {
|
||||||
cause error
|
cause error
|
||||||
|
@ -120,30 +88,6 @@ func IsErrUnauthorized(err error) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrNodeNotFound returns true if the error is caused
|
|
||||||
// when a node is not found.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrNodeNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrServiceNotFound returns true if the error is caused
|
|
||||||
// when a service is not found.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrServiceNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrTaskNotFound returns true if the error is caused
|
|
||||||
// when a task is not found.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrTaskNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
type pluginPermissionDenied struct {
|
type pluginPermissionDenied struct {
|
||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
|
@ -187,27 +131,3 @@ func (cli *Client) NewVersionError(APIrequired, feature string) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrSecretNotFound returns true if the error is caused
|
|
||||||
// when a secret is not found.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrSecretNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrConfigNotFound returns true if the error is caused
|
|
||||||
// when a config is not found.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrConfigNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsErrPluginNotFound returns true if the error is caused
|
|
||||||
// when a plugin is not found in the docker host.
|
|
||||||
//
|
|
||||||
// Deprecated: Use IsErrNotFound
|
|
||||||
func IsErrPluginNotFound(err error) bool {
|
|
||||||
return IsErrNotFound(err)
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -29,6 +30,13 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio
|
||||||
return types.ImageBuildResponse{}, err
|
return types.ImageBuildResponse{}, err
|
||||||
}
|
}
|
||||||
headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
|
headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))
|
||||||
|
|
||||||
|
if options.Platform != "" {
|
||||||
|
if err := cli.NewVersionError("1.32", "platform"); err != nil {
|
||||||
|
return types.ImageBuildResponse{}, err
|
||||||
|
}
|
||||||
|
query.Set("platform", options.Platform)
|
||||||
|
}
|
||||||
headers.Set("Content-Type", "application/x-tar")
|
headers.Set("Content-Type", "application/x-tar")
|
||||||
|
|
||||||
serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers)
|
serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers)
|
||||||
|
@ -123,6 +131,8 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur
|
||||||
if options.SessionID != "" {
|
if options.SessionID != "" {
|
||||||
query.Set("session", options.SessionID)
|
query.Set("session", options.SessionID)
|
||||||
}
|
}
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
return query, nil
|
return query, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package client
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -21,6 +22,9 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti
|
||||||
query := url.Values{}
|
query := url.Values{}
|
||||||
query.Set("fromImage", reference.FamiliarName(ref))
|
query.Set("fromImage", reference.FamiliarName(ref))
|
||||||
query.Set("tag", getAPITagFromNamedRef(ref))
|
query.Set("tag", getAPITagFromNamedRef(ref))
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -3,6 +3,7 @@ package client
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -25,6 +26,9 @@ func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSour
|
||||||
query.Set("repo", ref)
|
query.Set("repo", ref)
|
||||||
query.Set("tag", options.Tag)
|
query.Set("tag", options.Tag)
|
||||||
query.Set("message", options.Message)
|
query.Set("message", options.Message)
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
for _, change := range options.Changes {
|
for _, change := range options.Changes {
|
||||||
query.Add("changes", change)
|
query.Add("changes", change)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
@ -30,6 +31,9 @@ func (cli *Client) ImagePull(ctx context.Context, refStr string, options types.I
|
||||||
if !options.All {
|
if !options.All {
|
||||||
query.Set("tag", getAPITagFromNamedRef(ref))
|
query.Set("tag", getAPITagFromNamedRef(ref))
|
||||||
}
|
}
|
||||||
|
if options.Platform != "" {
|
||||||
|
query.Set("platform", strings.ToLower(options.Platform))
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth)
|
||||||
if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil {
|
if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil {
|
||||||
|
|
|
@ -45,7 +45,7 @@ type ContainerAPIClient interface {
|
||||||
ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error)
|
ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error)
|
||||||
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error)
|
ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error)
|
||||||
ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error)
|
ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error)
|
||||||
ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error)
|
ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error)
|
||||||
ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error)
|
ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error)
|
||||||
ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error)
|
ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error)
|
||||||
ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error
|
ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error
|
||||||
|
|
|
@ -2,17 +2,16 @@ package system
|
||||||
|
|
||||||
import "os"
|
import "os"
|
||||||
|
|
||||||
// LCOWSupported determines if Linux Containers on Windows are supported.
|
// lcowSupported determines if Linux Containers on Windows are supported.
|
||||||
// Note: This feature is in development (06/17) and enabled through an
|
|
||||||
// environment variable. At a future time, it will be enabled based
|
|
||||||
// on build number. @jhowardmsft
|
|
||||||
var lcowSupported = false
|
var lcowSupported = false
|
||||||
|
|
||||||
// InitLCOW sets whether LCOW is supported or not
|
// InitLCOW sets whether LCOW is supported or not
|
||||||
|
// TODO @jhowardmsft.
|
||||||
|
// 1. Replace with RS3 RTM build number.
|
||||||
|
// 2. Remove the getenv check when image-store is coalesced as shouldn't be needed anymore.
|
||||||
func InitLCOW(experimental bool) {
|
func InitLCOW(experimental bool) {
|
||||||
// LCOW initialization
|
v := GetOSVersion()
|
||||||
if experimental && os.Getenv("LCOW_SUPPORTED") != "" {
|
if experimental && v.Build > 16270 && os.Getenv("LCOW_SUPPORTED") != "" {
|
||||||
lcowSupported = true
|
lcowSupported = true
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValidatePlatform determines if a platform structure is valid.
|
||||||
|
// TODO This is a temporary function - can be replaced by parsing from
|
||||||
|
// https://github.com/containerd/containerd/pull/1403/files at a later date.
|
||||||
|
// @jhowardmsft
|
||||||
|
func ValidatePlatform(platform *specs.Platform) error {
|
||||||
|
platform.Architecture = strings.ToLower(platform.Architecture)
|
||||||
|
platform.OS = strings.ToLower(platform.OS)
|
||||||
|
// Based on https://github.com/moby/moby/pull/34642#issuecomment-330375350, do
|
||||||
|
// not support anything except operating system.
|
||||||
|
if platform.Architecture != "" {
|
||||||
|
return fmt.Errorf("invalid platform architecture %q", platform.Architecture)
|
||||||
|
}
|
||||||
|
if platform.OS != "" {
|
||||||
|
if !(platform.OS == runtime.GOOS || (LCOWSupported() && platform.OS == "linux")) {
|
||||||
|
return fmt.Errorf("invalid platform os %q", platform.OS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(platform.OSFeatures) != 0 {
|
||||||
|
return fmt.Errorf("invalid platform osfeatures %q", platform.OSFeatures)
|
||||||
|
}
|
||||||
|
if platform.OSVersion != "" {
|
||||||
|
return fmt.Errorf("invalid platform osversion %q", platform.OSVersion)
|
||||||
|
}
|
||||||
|
if platform.Variant != "" {
|
||||||
|
return fmt.Errorf("invalid platform variant %q", platform.Variant)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParsePlatform parses a platform string in the format os[/arch[/variant]
|
||||||
|
// into an OCI image-spec platform structure.
|
||||||
|
// TODO This is a temporary function - can be replaced by parsing from
|
||||||
|
// https://github.com/containerd/containerd/pull/1403/files at a later date.
|
||||||
|
// @jhowardmsft
|
||||||
|
func ParsePlatform(in string) *specs.Platform {
|
||||||
|
p := &specs.Platform{}
|
||||||
|
elements := strings.SplitN(strings.ToLower(in), "/", 3)
|
||||||
|
if len(elements) == 3 {
|
||||||
|
p.Variant = elements[2]
|
||||||
|
}
|
||||||
|
if len(elements) >= 2 {
|
||||||
|
p.Architecture = elements[1]
|
||||||
|
}
|
||||||
|
if len(elements) >= 1 {
|
||||||
|
p.OS = elements[0]
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
|
@ -14,9 +14,9 @@ const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/s
|
||||||
// DefaultPathEnv is unix style list of directories to search for
|
// DefaultPathEnv is unix style list of directories to search for
|
||||||
// executables. Each directory is separated from the next by a colon
|
// executables. Each directory is separated from the next by a colon
|
||||||
// ':' character .
|
// ':' character .
|
||||||
func DefaultPathEnv(platform string) string {
|
func DefaultPathEnv(os string) string {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
if platform != runtime.GOOS && LCOWSupported() {
|
if os != runtime.GOOS {
|
||||||
return defaultUnixPathEnv
|
return defaultUnixPathEnv
|
||||||
}
|
}
|
||||||
// Deliberately empty on Windows containers on Windows as the default path will be set by
|
// Deliberately empty on Windows containers on Windows as the default path will be set by
|
||||||
|
|
|
@ -23,14 +23,7 @@ type Winsize struct {
|
||||||
Width uint16
|
Width uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
// vtInputSupported is true if winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported by the console
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
|
|
||||||
enableVirtualTerminalInput = 0x0200
|
|
||||||
enableVirtualTerminalProcessing = 0x0004
|
|
||||||
disableNewlineAutoReturn = 0x0008
|
|
||||||
)
|
|
||||||
|
|
||||||
// vtInputSupported is true if enableVirtualTerminalInput is supported by the console
|
|
||||||
var vtInputSupported bool
|
var vtInputSupported bool
|
||||||
|
|
||||||
// StdStreams returns the standard streams (stdin, stdout, stderr).
|
// StdStreams returns the standard streams (stdin, stdout, stderr).
|
||||||
|
@ -40,8 +33,8 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
|
||||||
var emulateStdin, emulateStdout, emulateStderr bool
|
var emulateStdin, emulateStdout, emulateStderr bool
|
||||||
fd := os.Stdin.Fd()
|
fd := os.Stdin.Fd()
|
||||||
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
||||||
// Validate that enableVirtualTerminalInput is supported, but do not set it.
|
// Validate that winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it.
|
||||||
if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalInput); err != nil {
|
if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil {
|
||||||
emulateStdin = true
|
emulateStdin = true
|
||||||
} else {
|
} else {
|
||||||
vtInputSupported = true
|
vtInputSupported = true
|
||||||
|
@ -53,21 +46,21 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
|
||||||
|
|
||||||
fd = os.Stdout.Fd()
|
fd = os.Stdout.Fd()
|
||||||
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
||||||
// Validate disableNewlineAutoReturn is supported, but do not set it.
|
// Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it.
|
||||||
if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil {
|
if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil {
|
||||||
emulateStdout = true
|
emulateStdout = true
|
||||||
} else {
|
} else {
|
||||||
winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing)
|
winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = os.Stderr.Fd()
|
fd = os.Stderr.Fd()
|
||||||
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
if mode, err := winterm.GetConsoleMode(fd); err == nil {
|
||||||
// Validate disableNewlineAutoReturn is supported, but do not set it.
|
// Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it.
|
||||||
if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil {
|
if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil {
|
||||||
emulateStderr = true
|
emulateStderr = true
|
||||||
} else {
|
} else {
|
||||||
winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing)
|
winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,9 +176,9 @@ func SetRawTerminalOutput(fd uintptr) (*State, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore failures, since disableNewlineAutoReturn might not be supported on this
|
// Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this
|
||||||
// version of Windows.
|
// version of Windows.
|
||||||
winterm.SetConsoleMode(fd, state.mode|disableNewlineAutoReturn)
|
winterm.SetConsoleMode(fd, state.mode|winterm.DISABLE_NEWLINE_AUTO_RETURN)
|
||||||
return state, err
|
return state, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +208,7 @@ func MakeRaw(fd uintptr) (*State, error) {
|
||||||
mode |= winterm.ENABLE_INSERT_MODE
|
mode |= winterm.ENABLE_INSERT_MODE
|
||||||
mode |= winterm.ENABLE_QUICK_EDIT_MODE
|
mode |= winterm.ENABLE_QUICK_EDIT_MODE
|
||||||
if vtInputSupported {
|
if vtInputSupported {
|
||||||
mode |= enableVirtualTerminalInput
|
mode |= winterm.ENABLE_VIRTUAL_TERMINAL_INPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
err = winterm.SetConsoleMode(fd, mode)
|
err = winterm.SetConsoleMode(fd, mode)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# the following lines are in sorted order, FYI
|
# the following lines are in sorted order, FYI
|
||||||
github.com/Azure/go-ansiterm 19f72df4d05d31cbe1c56bfc8045c96babff6c7e
|
github.com/Azure/go-ansiterm d6e3b3328b783f23731bc4d058875b0371ff8109
|
||||||
github.com/Microsoft/hcsshim v0.6.5
|
github.com/Microsoft/hcsshim v0.6.5
|
||||||
github.com/Microsoft/go-winio v0.4.5
|
github.com/Microsoft/go-winio v0.4.5
|
||||||
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
|
||||||
|
@ -28,10 +28,10 @@ golang.org/x/sync de49d9dcd27d4f764488181bea099dfe6179bcf0
|
||||||
|
|
||||||
github.com/containerd/continuity 22694c680ee48fb8f50015b44618517e2bde77e8
|
github.com/containerd/continuity 22694c680ee48fb8f50015b44618517e2bde77e8
|
||||||
github.com/moby/buildkit aaff9d591ef128560018433fe61beb802e149de8
|
github.com/moby/buildkit aaff9d591ef128560018433fe61beb802e149de8
|
||||||
github.com/tonistiigi/fsutil 1dedf6e90084bd88c4c518a15e68a37ed1370203
|
github.com/tonistiigi/fsutil dea3a0da73aee887fc02142d995be764106ac5e2
|
||||||
|
|
||||||
#get libnetwork packages
|
#get libnetwork packages
|
||||||
github.com/docker/libnetwork 0f08d31bf0e640e0cdc6d5161227f87602d605c5
|
github.com/docker/libnetwork 68f1039f172434709a4550fe92e3e058406c74ce
|
||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||||
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80
|
||||||
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
||||||
|
@ -79,7 +79,7 @@ github.com/syndtr/gocapability 2c00daeb6c3b45114c80ac44119e7b8801fdd852
|
||||||
github.com/golang/protobuf 7a211bcf3bce0e3f1d74f9894916e6f116ae83b4
|
github.com/golang/protobuf 7a211bcf3bce0e3f1d74f9894916e6f116ae83b4
|
||||||
|
|
||||||
# gelf logging driver deps
|
# gelf logging driver deps
|
||||||
github.com/Graylog2/go-gelf 7029da823dad4ef3a876df61065156acb703b2ea
|
github.com/Graylog2/go-gelf v2
|
||||||
|
|
||||||
github.com/fluent/fluent-logger-golang v1.2.1
|
github.com/fluent/fluent-logger-golang v1.2.1
|
||||||
# fluent-logger-golang deps
|
# fluent-logger-golang deps
|
||||||
|
@ -107,10 +107,9 @@ google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
||||||
# containerd
|
# containerd
|
||||||
github.com/containerd/containerd 06b9cb35161009dcb7123345749fef02f7cea8e0
|
github.com/containerd/containerd 06b9cb35161009dcb7123345749fef02f7cea8e0
|
||||||
github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
|
github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
|
||||||
github.com/stevvooe/continuity cd7a8e21e2b6f84799f5dd4b65faf49c8d3ee02d
|
|
||||||
|
|
||||||
# cluster
|
# cluster
|
||||||
github.com/docker/swarmkit 941a01844b89c56aa61086fecb167ab3af1de22b
|
github.com/docker/swarmkit 872861d2ae46958af7ead1d5fffb092c73afbaf0
|
||||||
github.com/gogo/protobuf v0.4
|
github.com/gogo/protobuf v0.4
|
||||||
github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
|
github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
|
||||||
github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
|
github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
|
||||||
|
|
|
@ -24,7 +24,7 @@ github.com/docker/go-connections 3ede32e2033de7505e6500d6c868c2b9ed9f169d
|
||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
|
||||||
github.com/docker/go-units 954fed01cc617c55d838fa2230073f2cb17386c8
|
github.com/docker/go-units 954fed01cc617c55d838fa2230073f2cb17386c8
|
||||||
github.com/docker/libkv 9fd56606e928ff1f309808f5d5a0b7a2ef73f9a8
|
github.com/docker/libkv 9fd56606e928ff1f309808f5d5a0b7a2ef73f9a8
|
||||||
github.com/docker/libnetwork 19ac3ea7f52bb46e0eb10669756cdae0c441a5b1
|
github.com/docker/libnetwork 21544598c53fa36a3c771a8725c643dd2340f845
|
||||||
github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
|
github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a
|
||||||
github.com/opencontainers/runc d40db12e72a40109dfcf28539f5ee0930d2f0277
|
github.com/opencontainers/runc d40db12e72a40109dfcf28539f5ee0930d2f0277
|
||||||
github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448
|
github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448
|
||||||
|
|
Loading…
Reference in New Issue