Merge pull request #526 from crosbymichael/no-bundles
Remove concept of bundles from API
This commit is contained in:
		
						commit
						8a4ad6e381
					
				
					 142 changed files with 11129 additions and 27653 deletions
				
			
		
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -3,116 +3,54 @@ syntax = "proto3"; | ||||||
| package containerd.v1.services; | package containerd.v1.services; | ||||||
| 
 | 
 | ||||||
| import "google/protobuf/empty.proto"; | import "google/protobuf/empty.proto"; | ||||||
|  | import "google/protobuf/any.proto"; | ||||||
| import "gogoproto/gogo.proto"; | import "gogoproto/gogo.proto"; | ||||||
|  | import "github.com/docker/containerd/api/types/mount/mount.proto"; | ||||||
| import "github.com/docker/containerd/api/types/container/container.proto"; | import "github.com/docker/containerd/api/types/container/container.proto"; | ||||||
| import "github.com/docker/containerd/api/types/process/process.proto"; |  | ||||||
| 
 | 
 | ||||||
| service ExecutionService { | service ContainerService { | ||||||
| 	rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse); | 	rpc Create(CreateRequest) returns (CreateResponse); | ||||||
| 	rpc StartContainer(StartContainerRequest) returns (google.protobuf.Empty); | 	rpc Start(StartRequest) returns (google.protobuf.Empty); | ||||||
| 	rpc UpdateContainer(UpdateContainerRequest) returns (google.protobuf.Empty); | 	rpc Delete(DeleteRequest) returns (google.protobuf.Empty); | ||||||
| 	rpc PauseContainer(PauseContainerRequest) returns (google.protobuf.Empty); | 	rpc List(ListRequest) returns (ListResponse); | ||||||
| 	rpc ResumeContainer(ResumeContainerRequest) returns (google.protobuf.Empty); | 	rpc Events(EventsRequest) returns (stream containerd.v1.types.Event); | ||||||
| 	rpc DeleteContainer(DeleteContainerRequest) returns (google.protobuf.Empty); |  | ||||||
| 	rpc GetContainer(GetContainerRequest) returns (GetContainerResponse); |  | ||||||
| 	rpc ListContainers(ListContainersRequest) returns (ListContainersResponse); |  | ||||||
| 
 |  | ||||||
| 	rpc StartProcess(StartProcessRequest) returns (StartProcessResponse); |  | ||||||
| 	rpc GetProcess(GetProcessRequest) returns (GetProcessResponse); |  | ||||||
| 	rpc SignalProcess(SignalProcessRequest) returns (google.protobuf.Empty); |  | ||||||
| 	rpc DeleteProcess(DeleteProcessRequest) returns (google.protobuf.Empty); |  | ||||||
| 	rpc ListProcesses(ListProcessesRequest) returns (ListProcessesResponse); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message StartContainerRequest { | message CreateRequest { | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
|  | 	google.protobuf.Any spec = 2;	 | ||||||
|  | 	repeated containerd.v1.types.Mount rootfs = 3; | ||||||
|  | 	string runtime = 4; | ||||||
|  | 	string stdin = 5; | ||||||
|  | 	string stdout = 6; | ||||||
|  | 	string stderr = 7; | ||||||
|  | 	bool terminal = 8; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | message CreateResponse { | ||||||
| message CreateContainerRequest { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| 	string bundle_path = 2; |  | ||||||
| 	bool console = 3; |  | ||||||
| 	string stdin = 4; |  | ||||||
| 	string stdout = 5; |  | ||||||
| 	string stderr = 6; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message CreateContainerResponse { |  | ||||||
| 	types.Container container = 1; |  | ||||||
| 	types.Process initProcess = 2; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message DeleteContainerRequest { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message ListContainersRequest { |  | ||||||
| 	repeated string owner = 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message ListContainersResponse { |  | ||||||
| 	repeated types.Container containers = 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message StartProcessRequest { |  | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; |  | ||||||
| 	types.Process process = 2; |  | ||||||
| 	bool console = 3; |  | ||||||
| 	string stdin = 4; |  | ||||||
| 	string stdout = 5; |  | ||||||
| 	string stderr = 6; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message StartProcessResponse { |  | ||||||
| 	types.Process process = 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message GetContainerRequest { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message GetContainerResponse { |  | ||||||
| 	types.Container container = 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message UpdateContainerRequest { |  | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; |  | ||||||
| 	string bundle_path = 2; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message PauseContainerRequest { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message ResumeContainerRequest { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message GetProcessRequest { |  | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; |  | ||||||
| 	uint32 pid = 2; | 	uint32 pid = 2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message GetProcessResponse { | message StartRequest { | ||||||
| 	types.Process process = 1; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message SignalProcessRequest { | message DeleteRequest { | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| 	uint32 pid = 2; |  | ||||||
| 	uint32 signal = 3; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message DeleteProcessRequest { | message DeleteResponse { | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| 	uint32 pid = 2; | 	uint32 exit_status = 2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message ListProcessesRequest { | message ListRequest { | ||||||
| 	string container_id = 1 [(gogoproto.customname) = "ContainerID"]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message ListProcessesResponse { | message ListResponse { | ||||||
| 	repeated types.Process processes = 1; | 	repeated containerd.v1.types.Container containers = 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | message EventsRequest { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -19,11 +19,11 @@ | ||||||
| 		ExecResponse | 		ExecResponse | ||||||
| 		PtyRequest | 		PtyRequest | ||||||
| 		EventsRequest | 		EventsRequest | ||||||
| 		Event |  | ||||||
| 		StateRequest | 		StateRequest | ||||||
| 		StateResponse | 		StateResponse | ||||||
| 		PauseRequest | 		PauseRequest | ||||||
| 		ResumeRequest | 		ResumeRequest | ||||||
|  | 		ExitRequest | ||||||
| */ | */ | ||||||
| package shim | package shim | ||||||
| 
 | 
 | ||||||
|  | @ -32,8 +32,8 @@ import fmt "fmt" | ||||||
| import math "math" | import math "math" | ||||||
| import google_protobuf "github.com/golang/protobuf/ptypes/empty" | import google_protobuf "github.com/golang/protobuf/ptypes/empty" | ||||||
| import _ "github.com/gogo/protobuf/gogoproto" | import _ "github.com/gogo/protobuf/gogoproto" | ||||||
| import containerd_v1_types2 "github.com/docker/containerd/api/types/process" | import containerd_v1_types "github.com/docker/containerd/api/types/mount" | ||||||
| import containerd_v1_types "github.com/docker/containerd/api/types/user" | import containerd_v1_types1 "github.com/docker/containerd/api/types/container" | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	context "golang.org/x/net/context" | 	context "golang.org/x/net/context" | ||||||
|  | @ -56,36 +56,6 @@ var _ = math.Inf | ||||||
| // proto package needs to be updated. | // proto package needs to be updated. | ||||||
| const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
| 
 | 
 | ||||||
| type EventType int32 |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	EventType_EXIT       EventType = 0 |  | ||||||
| 	EventType_OOM        EventType = 1 |  | ||||||
| 	EventType_CREATE     EventType = 2 |  | ||||||
| 	EventType_START      EventType = 3 |  | ||||||
| 	EventType_EXEC_ADDED EventType = 4 |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var EventType_name = map[int32]string{ |  | ||||||
| 	0: "EXIT", |  | ||||||
| 	1: "OOM", |  | ||||||
| 	2: "CREATE", |  | ||||||
| 	3: "START", |  | ||||||
| 	4: "EXEC_ADDED", |  | ||||||
| } |  | ||||||
| var EventType_value = map[string]int32{ |  | ||||||
| 	"EXIT":       0, |  | ||||||
| 	"OOM":        1, |  | ||||||
| 	"CREATE":     2, |  | ||||||
| 	"START":      3, |  | ||||||
| 	"EXEC_ADDED": 4, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (x EventType) String() string { |  | ||||||
| 	return proto.EnumName(EventType_name, int32(x)) |  | ||||||
| } |  | ||||||
| func (EventType) EnumDescriptor() ([]byte, []int) { return fileDescriptorShim, []int{0} } |  | ||||||
| 
 |  | ||||||
| type CreateRequest struct { | type CreateRequest struct { | ||||||
| 	ID       string                       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | 	ID       string                       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | ||||||
| 	Bundle   string                       `protobuf:"bytes,2,opt,name=bundle,proto3" json:"bundle,omitempty"` | 	Bundle   string                       `protobuf:"bytes,2,opt,name=bundle,proto3" json:"bundle,omitempty"` | ||||||
|  | @ -95,6 +65,7 @@ type CreateRequest struct { | ||||||
| 	Stdin    string                       `protobuf:"bytes,6,opt,name=stdin,proto3" json:"stdin,omitempty"` | 	Stdin    string                       `protobuf:"bytes,6,opt,name=stdin,proto3" json:"stdin,omitempty"` | ||||||
| 	Stdout   string                       `protobuf:"bytes,7,opt,name=stdout,proto3" json:"stdout,omitempty"` | 	Stdout   string                       `protobuf:"bytes,7,opt,name=stdout,proto3" json:"stdout,omitempty"` | ||||||
| 	Stderr   string                       `protobuf:"bytes,8,opt,name=stderr,proto3" json:"stderr,omitempty"` | 	Stderr   string                       `protobuf:"bytes,8,opt,name=stderr,proto3" json:"stderr,omitempty"` | ||||||
|  | 	Rootfs   []*containerd_v1_types.Mount `protobuf:"bytes,9,rep,name=rootfs" json:"rootfs,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *CreateRequest) Reset()                    { *m = CreateRequest{} } | func (m *CreateRequest) Reset()                    { *m = CreateRequest{} } | ||||||
|  | @ -138,7 +109,7 @@ type ExecRequest struct { | ||||||
| 	Stdout          string                     `protobuf:"bytes,3,opt,name=stdout,proto3" json:"stdout,omitempty"` | 	Stdout          string                     `protobuf:"bytes,3,opt,name=stdout,proto3" json:"stdout,omitempty"` | ||||||
| 	Stderr          string                     `protobuf:"bytes,4,opt,name=stderr,proto3" json:"stderr,omitempty"` | 	Stderr          string                     `protobuf:"bytes,4,opt,name=stderr,proto3" json:"stderr,omitempty"` | ||||||
| 	SelinuxLabel    string                     `protobuf:"bytes,5,opt,name=selinux_label,json=selinuxLabel,proto3" json:"selinux_label,omitempty"` | 	SelinuxLabel    string                     `protobuf:"bytes,5,opt,name=selinux_label,json=selinuxLabel,proto3" json:"selinux_label,omitempty"` | ||||||
| 	User            *containerd_v1_types.User `protobuf:"bytes,6,opt,name=user" json:"user,omitempty"` | 	User            *containerd_v1_types1.User `protobuf:"bytes,6,opt,name=user" json:"user,omitempty"` | ||||||
| 	Args            []string                   `protobuf:"bytes,7,rep,name=args" json:"args,omitempty"` | 	Args            []string                   `protobuf:"bytes,7,rep,name=args" json:"args,omitempty"` | ||||||
| 	Env             []string                   `protobuf:"bytes,8,rep,name=env" json:"env,omitempty"` | 	Env             []string                   `protobuf:"bytes,8,rep,name=env" json:"env,omitempty"` | ||||||
| 	Cwd             string                     `protobuf:"bytes,9,opt,name=cwd,proto3" json:"cwd,omitempty"` | 	Cwd             string                     `protobuf:"bytes,9,opt,name=cwd,proto3" json:"cwd,omitempty"` | ||||||
|  | @ -187,49 +158,44 @@ func (m *EventsRequest) Reset()                    { *m = EventsRequest{} } | ||||||
| func (*EventsRequest) ProtoMessage()               {} | func (*EventsRequest) ProtoMessage()               {} | ||||||
| func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{9} } | func (*EventsRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{9} } | ||||||
| 
 | 
 | ||||||
| // should be moved to api/types/event maybe |  | ||||||
| type Event struct { |  | ||||||
| 	ID         string    `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` |  | ||||||
| 	Type       EventType `protobuf:"varint,2,opt,name=type,proto3,enum=containerd.v1.services.EventType" json:"type,omitempty"` |  | ||||||
| 	Pid        uint32    `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` |  | ||||||
| 	ExitStatus uint32    `protobuf:"varint,4,opt,name=exit_status,json=exitStatus,proto3" json:"exit_status,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *Event) Reset()                    { *m = Event{} } |  | ||||||
| func (*Event) ProtoMessage()               {} |  | ||||||
| func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{10} } |  | ||||||
| 
 |  | ||||||
| type StateRequest struct { | type StateRequest struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *StateRequest) Reset()                    { *m = StateRequest{} } | func (m *StateRequest) Reset()                    { *m = StateRequest{} } | ||||||
| func (*StateRequest) ProtoMessage()               {} | func (*StateRequest) ProtoMessage()               {} | ||||||
| func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{11} } | func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{10} } | ||||||
| 
 | 
 | ||||||
| type StateResponse struct { | type StateResponse struct { | ||||||
| 	ID        string                          `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | 	ID        string                          `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | ||||||
| 	Bundle    string                          `protobuf:"bytes,2,opt,name=bundle,proto3" json:"bundle,omitempty"` | 	Bundle    string                          `protobuf:"bytes,2,opt,name=bundle,proto3" json:"bundle,omitempty"` | ||||||
| 	InitPid   uint32                          `protobuf:"varint,3,opt,name=initPid,proto3" json:"initPid,omitempty"` | 	Pid       uint32                          `protobuf:"varint,3,opt,name=pid,proto3" json:"pid,omitempty"` | ||||||
| 	Processes []*containerd_v1_types2.Process `protobuf:"bytes,4,rep,name=processes" json:"processes,omitempty"` | 	Processes []*containerd_v1_types1.Process `protobuf:"bytes,4,rep,name=processes" json:"processes,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *StateResponse) Reset()                    { *m = StateResponse{} } | func (m *StateResponse) Reset()                    { *m = StateResponse{} } | ||||||
| func (*StateResponse) ProtoMessage()               {} | func (*StateResponse) ProtoMessage()               {} | ||||||
| func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{12} } | func (*StateResponse) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{11} } | ||||||
| 
 | 
 | ||||||
| type PauseRequest struct { | type PauseRequest struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *PauseRequest) Reset()                    { *m = PauseRequest{} } | func (m *PauseRequest) Reset()                    { *m = PauseRequest{} } | ||||||
| func (*PauseRequest) ProtoMessage()               {} | func (*PauseRequest) ProtoMessage()               {} | ||||||
| func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{13} } | func (*PauseRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{12} } | ||||||
| 
 | 
 | ||||||
| type ResumeRequest struct { | type ResumeRequest struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *ResumeRequest) Reset()                    { *m = ResumeRequest{} } | func (m *ResumeRequest) Reset()                    { *m = ResumeRequest{} } | ||||||
| func (*ResumeRequest) ProtoMessage()               {} | func (*ResumeRequest) ProtoMessage()               {} | ||||||
| func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{14} } | func (*ResumeRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{13} } | ||||||
|  | 
 | ||||||
|  | type ExitRequest struct { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *ExitRequest) Reset()                    { *m = ExitRequest{} } | ||||||
|  | func (*ExitRequest) ProtoMessage()               {} | ||||||
|  | func (*ExitRequest) Descriptor() ([]byte, []int) { return fileDescriptorShim, []int{14} } | ||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
| 	proto.RegisterType((*CreateRequest)(nil), "containerd.v1.services.CreateRequest") | 	proto.RegisterType((*CreateRequest)(nil), "containerd.v1.services.CreateRequest") | ||||||
|  | @ -242,12 +208,11 @@ func init() { | ||||||
| 	proto.RegisterType((*ExecResponse)(nil), "containerd.v1.services.ExecResponse") | 	proto.RegisterType((*ExecResponse)(nil), "containerd.v1.services.ExecResponse") | ||||||
| 	proto.RegisterType((*PtyRequest)(nil), "containerd.v1.services.PtyRequest") | 	proto.RegisterType((*PtyRequest)(nil), "containerd.v1.services.PtyRequest") | ||||||
| 	proto.RegisterType((*EventsRequest)(nil), "containerd.v1.services.EventsRequest") | 	proto.RegisterType((*EventsRequest)(nil), "containerd.v1.services.EventsRequest") | ||||||
| 	proto.RegisterType((*Event)(nil), "containerd.v1.services.Event") |  | ||||||
| 	proto.RegisterType((*StateRequest)(nil), "containerd.v1.services.StateRequest") | 	proto.RegisterType((*StateRequest)(nil), "containerd.v1.services.StateRequest") | ||||||
| 	proto.RegisterType((*StateResponse)(nil), "containerd.v1.services.StateResponse") | 	proto.RegisterType((*StateResponse)(nil), "containerd.v1.services.StateResponse") | ||||||
| 	proto.RegisterType((*PauseRequest)(nil), "containerd.v1.services.PauseRequest") | 	proto.RegisterType((*PauseRequest)(nil), "containerd.v1.services.PauseRequest") | ||||||
| 	proto.RegisterType((*ResumeRequest)(nil), "containerd.v1.services.ResumeRequest") | 	proto.RegisterType((*ResumeRequest)(nil), "containerd.v1.services.ResumeRequest") | ||||||
| 	proto.RegisterEnum("containerd.v1.services.EventType", EventType_name, EventType_value) | 	proto.RegisterType((*ExitRequest)(nil), "containerd.v1.services.ExitRequest") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Reference imports to suppress errors if they are not otherwise used. | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | @ -270,6 +235,7 @@ type ShimClient interface { | ||||||
| 	State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error) | 	State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error) | ||||||
| 	Pause(ctx context.Context, in *PauseRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) | 	Pause(ctx context.Context, in *PauseRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) | ||||||
| 	Resume(ctx context.Context, in *ResumeRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) | 	Resume(ctx context.Context, in *ResumeRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) | ||||||
|  | 	Exit(ctx context.Context, in *ExitRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type shimClient struct { | type shimClient struct { | ||||||
|  | @ -341,7 +307,7 @@ func (c *shimClient) Events(ctx context.Context, in *EventsRequest, opts ...grpc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Shim_EventsClient interface { | type Shim_EventsClient interface { | ||||||
| 	Recv() (*Event, error) | 	Recv() (*containerd_v1_types1.Event, error) | ||||||
| 	grpc.ClientStream | 	grpc.ClientStream | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -349,8 +315,8 @@ type shimEventsClient struct { | ||||||
| 	grpc.ClientStream | 	grpc.ClientStream | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *shimEventsClient) Recv() (*Event, error) { | func (x *shimEventsClient) Recv() (*containerd_v1_types1.Event, error) { | ||||||
| 	m := new(Event) | 	m := new(containerd_v1_types1.Event) | ||||||
| 	if err := x.ClientStream.RecvMsg(m); err != nil { | 	if err := x.ClientStream.RecvMsg(m); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | @ -384,6 +350,15 @@ func (c *shimClient) Resume(ctx context.Context, in *ResumeRequest, opts ...grpc | ||||||
| 	return out, nil | 	return out, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *shimClient) Exit(ctx context.Context, in *ExitRequest, opts ...grpc.CallOption) (*google_protobuf.Empty, error) { | ||||||
|  | 	out := new(google_protobuf.Empty) | ||||||
|  | 	err := grpc.Invoke(ctx, "/containerd.v1.services.Shim/Exit", in, out, c.cc, opts...) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return out, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Server API for Shim service | // Server API for Shim service | ||||||
| 
 | 
 | ||||||
| type ShimServer interface { | type ShimServer interface { | ||||||
|  | @ -396,6 +371,7 @@ type ShimServer interface { | ||||||
| 	State(context.Context, *StateRequest) (*StateResponse, error) | 	State(context.Context, *StateRequest) (*StateResponse, error) | ||||||
| 	Pause(context.Context, *PauseRequest) (*google_protobuf.Empty, error) | 	Pause(context.Context, *PauseRequest) (*google_protobuf.Empty, error) | ||||||
| 	Resume(context.Context, *ResumeRequest) (*google_protobuf.Empty, error) | 	Resume(context.Context, *ResumeRequest) (*google_protobuf.Empty, error) | ||||||
|  | 	Exit(context.Context, *ExitRequest) (*google_protobuf.Empty, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func RegisterShimServer(s *grpc.Server, srv ShimServer) { | func RegisterShimServer(s *grpc.Server, srv ShimServer) { | ||||||
|  | @ -501,7 +477,7 @@ func _Shim_Events_Handler(srv interface{}, stream grpc.ServerStream) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Shim_EventsServer interface { | type Shim_EventsServer interface { | ||||||
| 	Send(*Event) error | 	Send(*containerd_v1_types1.Event) error | ||||||
| 	grpc.ServerStream | 	grpc.ServerStream | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -509,7 +485,7 @@ type shimEventsServer struct { | ||||||
| 	grpc.ServerStream | 	grpc.ServerStream | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *shimEventsServer) Send(m *Event) error { | func (x *shimEventsServer) Send(m *containerd_v1_types1.Event) error { | ||||||
| 	return x.ServerStream.SendMsg(m) | 	return x.ServerStream.SendMsg(m) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -567,6 +543,24 @@ func _Shim_Resume_Handler(srv interface{}, ctx context.Context, dec func(interfa | ||||||
| 	return interceptor(ctx, in, info, handler) | 	return interceptor(ctx, in, info, handler) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func _Shim_Exit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||||
|  | 	in := new(ExitRequest) | ||||||
|  | 	if err := dec(in); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if interceptor == nil { | ||||||
|  | 		return srv.(ShimServer).Exit(ctx, in) | ||||||
|  | 	} | ||||||
|  | 	info := &grpc.UnaryServerInfo{ | ||||||
|  | 		Server:     srv, | ||||||
|  | 		FullMethod: "/containerd.v1.services.Shim/Exit", | ||||||
|  | 	} | ||||||
|  | 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||||
|  | 		return srv.(ShimServer).Exit(ctx, req.(*ExitRequest)) | ||||||
|  | 	} | ||||||
|  | 	return interceptor(ctx, in, info, handler) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var _Shim_serviceDesc = grpc.ServiceDesc{ | var _Shim_serviceDesc = grpc.ServiceDesc{ | ||||||
| 	ServiceName: "containerd.v1.services.Shim", | 	ServiceName: "containerd.v1.services.Shim", | ||||||
| 	HandlerType: (*ShimServer)(nil), | 	HandlerType: (*ShimServer)(nil), | ||||||
|  | @ -603,6 +597,10 @@ var _Shim_serviceDesc = grpc.ServiceDesc{ | ||||||
| 			MethodName: "Resume", | 			MethodName: "Resume", | ||||||
| 			Handler:    _Shim_Resume_Handler, | 			Handler:    _Shim_Resume_Handler, | ||||||
| 		}, | 		}, | ||||||
|  | 		{ | ||||||
|  | 			MethodName: "Exit", | ||||||
|  | 			Handler:    _Shim_Exit_Handler, | ||||||
|  | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	Streams: []grpc.StreamDesc{ | 	Streams: []grpc.StreamDesc{ | ||||||
| 		{ | 		{ | ||||||
|  | @ -685,6 +683,18 @@ func (m *CreateRequest) MarshalTo(dAtA []byte) (int, error) { | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(len(m.Stderr))) | 		i = encodeVarintShim(dAtA, i, uint64(len(m.Stderr))) | ||||||
| 		i += copy(dAtA[i:], m.Stderr) | 		i += copy(dAtA[i:], m.Stderr) | ||||||
| 	} | 	} | ||||||
|  | 	if len(m.Rootfs) > 0 { | ||||||
|  | 		for _, msg := range m.Rootfs { | ||||||
|  | 			dAtA[i] = 0x4a | ||||||
|  | 			i++ | ||||||
|  | 			i = encodeVarintShim(dAtA, i, uint64(msg.Size())) | ||||||
|  | 			n, err := msg.MarshalTo(dAtA[i:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return 0, err | ||||||
|  | 			} | ||||||
|  | 			i += n | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	return i, nil | 	return i, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1024,45 +1034,6 @@ func (m *EventsRequest) MarshalTo(dAtA []byte) (int, error) { | ||||||
| 	return i, nil | 	return i, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *Event) Marshal() (dAtA []byte, err error) { |  | ||||||
| 	size := m.Size() |  | ||||||
| 	dAtA = make([]byte, size) |  | ||||||
| 	n, err := m.MarshalTo(dAtA) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return dAtA[:n], nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *Event) MarshalTo(dAtA []byte) (int, error) { |  | ||||||
| 	var i int |  | ||||||
| 	_ = i |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	if len(m.ID) > 0 { |  | ||||||
| 		dAtA[i] = 0xa |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(len(m.ID))) |  | ||||||
| 		i += copy(dAtA[i:], m.ID) |  | ||||||
| 	} |  | ||||||
| 	if m.Type != 0 { |  | ||||||
| 		dAtA[i] = 0x10 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(m.Type)) |  | ||||||
| 	} |  | ||||||
| 	if m.Pid != 0 { |  | ||||||
| 		dAtA[i] = 0x18 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(m.Pid)) |  | ||||||
| 	} |  | ||||||
| 	if m.ExitStatus != 0 { |  | ||||||
| 		dAtA[i] = 0x20 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(m.ExitStatus)) |  | ||||||
| 	} |  | ||||||
| 	return i, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *StateRequest) Marshal() (dAtA []byte, err error) { | func (m *StateRequest) Marshal() (dAtA []byte, err error) { | ||||||
| 	size := m.Size() | 	size := m.Size() | ||||||
| 	dAtA = make([]byte, size) | 	dAtA = make([]byte, size) | ||||||
|  | @ -1108,10 +1079,10 @@ func (m *StateResponse) MarshalTo(dAtA []byte) (int, error) { | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(len(m.Bundle))) | 		i = encodeVarintShim(dAtA, i, uint64(len(m.Bundle))) | ||||||
| 		i += copy(dAtA[i:], m.Bundle) | 		i += copy(dAtA[i:], m.Bundle) | ||||||
| 	} | 	} | ||||||
| 	if m.InitPid != 0 { | 	if m.Pid != 0 { | ||||||
| 		dAtA[i] = 0x18 | 		dAtA[i] = 0x18 | ||||||
| 		i++ | 		i++ | ||||||
| 		i = encodeVarintShim(dAtA, i, uint64(m.InitPid)) | 		i = encodeVarintShim(dAtA, i, uint64(m.Pid)) | ||||||
| 	} | 	} | ||||||
| 	if len(m.Processes) > 0 { | 	if len(m.Processes) > 0 { | ||||||
| 		for _, msg := range m.Processes { | 		for _, msg := range m.Processes { | ||||||
|  | @ -1164,6 +1135,24 @@ func (m *ResumeRequest) MarshalTo(dAtA []byte) (int, error) { | ||||||
| 	return i, nil | 	return i, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (m *ExitRequest) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *ExitRequest) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func encodeFixed64Shim(dAtA []byte, offset int, v uint64) int { | func encodeFixed64Shim(dAtA []byte, offset int, v uint64) int { | ||||||
| 	dAtA[offset] = uint8(v) | 	dAtA[offset] = uint8(v) | ||||||
| 	dAtA[offset+1] = uint8(v >> 8) | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | @ -1224,6 +1213,12 @@ func (m *CreateRequest) Size() (n int) { | ||||||
| 	if l > 0 { | 	if l > 0 { | ||||||
| 		n += 1 + l + sovShim(uint64(l)) | 		n += 1 + l + sovShim(uint64(l)) | ||||||
| 	} | 	} | ||||||
|  | 	if len(m.Rootfs) > 0 { | ||||||
|  | 		for _, e := range m.Rootfs { | ||||||
|  | 			l = e.Size() | ||||||
|  | 			n += 1 + l + sovShim(uint64(l)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	return n | 	return n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1370,25 +1365,6 @@ func (m *EventsRequest) Size() (n int) { | ||||||
| 	return n | 	return n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *Event) Size() (n int) { |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	l = len(m.ID) |  | ||||||
| 	if l > 0 { |  | ||||||
| 		n += 1 + l + sovShim(uint64(l)) |  | ||||||
| 	} |  | ||||||
| 	if m.Type != 0 { |  | ||||||
| 		n += 1 + sovShim(uint64(m.Type)) |  | ||||||
| 	} |  | ||||||
| 	if m.Pid != 0 { |  | ||||||
| 		n += 1 + sovShim(uint64(m.Pid)) |  | ||||||
| 	} |  | ||||||
| 	if m.ExitStatus != 0 { |  | ||||||
| 		n += 1 + sovShim(uint64(m.ExitStatus)) |  | ||||||
| 	} |  | ||||||
| 	return n |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *StateRequest) Size() (n int) { | func (m *StateRequest) Size() (n int) { | ||||||
| 	var l int | 	var l int | ||||||
| 	_ = l | 	_ = l | ||||||
|  | @ -1406,8 +1382,8 @@ func (m *StateResponse) Size() (n int) { | ||||||
| 	if l > 0 { | 	if l > 0 { | ||||||
| 		n += 1 + l + sovShim(uint64(l)) | 		n += 1 + l + sovShim(uint64(l)) | ||||||
| 	} | 	} | ||||||
| 	if m.InitPid != 0 { | 	if m.Pid != 0 { | ||||||
| 		n += 1 + sovShim(uint64(m.InitPid)) | 		n += 1 + sovShim(uint64(m.Pid)) | ||||||
| 	} | 	} | ||||||
| 	if len(m.Processes) > 0 { | 	if len(m.Processes) > 0 { | ||||||
| 		for _, e := range m.Processes { | 		for _, e := range m.Processes { | ||||||
|  | @ -1430,6 +1406,12 @@ func (m *ResumeRequest) Size() (n int) { | ||||||
| 	return n | 	return n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (m *ExitRequest) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func sovShim(x uint64) (n int) { | func sovShim(x uint64) (n int) { | ||||||
| 	for { | 	for { | ||||||
| 		n++ | 		n++ | ||||||
|  | @ -1456,6 +1438,7 @@ func (this *CreateRequest) String() string { | ||||||
| 		`Stdin:` + fmt.Sprintf("%v", this.Stdin) + `,`, | 		`Stdin:` + fmt.Sprintf("%v", this.Stdin) + `,`, | ||||||
| 		`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`, | 		`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`, | ||||||
| 		`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`, | 		`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`, | ||||||
|  | 		`Rootfs:` + strings.Replace(fmt.Sprintf("%v", this.Rootfs), "Mount", "containerd_v1_types.Mount", 1) + `,`, | ||||||
| 		`}`, | 		`}`, | ||||||
| 	}, "") | 	}, "") | ||||||
| 	return s | 	return s | ||||||
|  | @ -1509,7 +1492,7 @@ func (this *ExecRequest) String() string { | ||||||
| 		`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`, | 		`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`, | ||||||
| 		`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`, | 		`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`, | ||||||
| 		`SelinuxLabel:` + fmt.Sprintf("%v", this.SelinuxLabel) + `,`, | 		`SelinuxLabel:` + fmt.Sprintf("%v", this.SelinuxLabel) + `,`, | ||||||
| 		`User:` + strings.Replace(fmt.Sprintf("%v", this.User), "User", "containerd_v1_types.User", 1) + `,`, | 		`User:` + strings.Replace(fmt.Sprintf("%v", this.User), "User", "containerd_v1_types1.User", 1) + `,`, | ||||||
| 		`Args:` + fmt.Sprintf("%v", this.Args) + `,`, | 		`Args:` + fmt.Sprintf("%v", this.Args) + `,`, | ||||||
| 		`Env:` + fmt.Sprintf("%v", this.Env) + `,`, | 		`Env:` + fmt.Sprintf("%v", this.Env) + `,`, | ||||||
| 		`Cwd:` + fmt.Sprintf("%v", this.Cwd) + `,`, | 		`Cwd:` + fmt.Sprintf("%v", this.Cwd) + `,`, | ||||||
|  | @ -1564,19 +1547,6 @@ func (this *EventsRequest) String() string { | ||||||
| 	}, "") | 	}, "") | ||||||
| 	return s | 	return s | ||||||
| } | } | ||||||
| func (this *Event) String() string { |  | ||||||
| 	if this == nil { |  | ||||||
| 		return "nil" |  | ||||||
| 	} |  | ||||||
| 	s := strings.Join([]string{`&Event{`, |  | ||||||
| 		`ID:` + fmt.Sprintf("%v", this.ID) + `,`, |  | ||||||
| 		`Type:` + fmt.Sprintf("%v", this.Type) + `,`, |  | ||||||
| 		`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`, |  | ||||||
| 		`ExitStatus:` + fmt.Sprintf("%v", this.ExitStatus) + `,`, |  | ||||||
| 		`}`, |  | ||||||
| 	}, "") |  | ||||||
| 	return s |  | ||||||
| } |  | ||||||
| func (this *StateRequest) String() string { | func (this *StateRequest) String() string { | ||||||
| 	if this == nil { | 	if this == nil { | ||||||
| 		return "nil" | 		return "nil" | ||||||
|  | @ -1593,8 +1563,8 @@ func (this *StateResponse) String() string { | ||||||
| 	s := strings.Join([]string{`&StateResponse{`, | 	s := strings.Join([]string{`&StateResponse{`, | ||||||
| 		`ID:` + fmt.Sprintf("%v", this.ID) + `,`, | 		`ID:` + fmt.Sprintf("%v", this.ID) + `,`, | ||||||
| 		`Bundle:` + fmt.Sprintf("%v", this.Bundle) + `,`, | 		`Bundle:` + fmt.Sprintf("%v", this.Bundle) + `,`, | ||||||
| 		`InitPid:` + fmt.Sprintf("%v", this.InitPid) + `,`, | 		`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`, | ||||||
| 		`Processes:` + strings.Replace(fmt.Sprintf("%v", this.Processes), "Process", "containerd_v1_types2.Process", 1) + `,`, | 		`Processes:` + strings.Replace(fmt.Sprintf("%v", this.Processes), "Process", "containerd_v1_types1.Process", 1) + `,`, | ||||||
| 		`}`, | 		`}`, | ||||||
| 	}, "") | 	}, "") | ||||||
| 	return s | 	return s | ||||||
|  | @ -1617,6 +1587,15 @@ func (this *ResumeRequest) String() string { | ||||||
| 	}, "") | 	}, "") | ||||||
| 	return s | 	return s | ||||||
| } | } | ||||||
|  | func (this *ExitRequest) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := strings.Join([]string{`&ExitRequest{`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	return s | ||||||
|  | } | ||||||
| func valueToStringShim(v interface{}) string { | func valueToStringShim(v interface{}) string { | ||||||
| 	rv := reflect.ValueOf(v) | 	rv := reflect.ValueOf(v) | ||||||
| 	if rv.IsNil() { | 	if rv.IsNil() { | ||||||
|  | @ -1868,6 +1847,37 @@ func (m *CreateRequest) Unmarshal(dAtA []byte) error { | ||||||
| 			} | 			} | ||||||
| 			m.Stderr = string(dAtA[iNdEx:postIndex]) | 			m.Stderr = string(dAtA[iNdEx:postIndex]) | ||||||
| 			iNdEx = postIndex | 			iNdEx = postIndex | ||||||
|  | 		case 9: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Rootfs", wireType) | ||||||
|  | 			} | ||||||
|  | 			var msglen int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowShim | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				msglen |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if msglen < 0 { | ||||||
|  | 				return ErrInvalidLengthShim | ||||||
|  | 			} | ||||||
|  | 			postIndex := iNdEx + msglen | ||||||
|  | 			if postIndex > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			m.Rootfs = append(m.Rootfs, &containerd_v1_types.Mount{}) | ||||||
|  | 			if err := m.Rootfs[len(m.Rootfs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			iNdEx = postIndex | ||||||
| 		default: | 		default: | ||||||
| 			iNdEx = preIndex | 			iNdEx = preIndex | ||||||
| 			skippy, err := skipShim(dAtA[iNdEx:]) | 			skippy, err := skipShim(dAtA[iNdEx:]) | ||||||
|  | @ -2338,7 +2348,7 @@ func (m *ExecRequest) Unmarshal(dAtA []byte) error { | ||||||
| 				return io.ErrUnexpectedEOF | 				return io.ErrUnexpectedEOF | ||||||
| 			} | 			} | ||||||
| 			if m.User == nil { | 			if m.User == nil { | ||||||
| 				m.User = &containerd_v1_types.User{} | 				m.User = &containerd_v1_types1.User{} | ||||||
| 			} | 			} | ||||||
| 			if err := m.User.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { | 			if err := m.User.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { | ||||||
| 				return err | 				return err | ||||||
|  | @ -2904,142 +2914,6 @@ func (m *EventsRequest) Unmarshal(dAtA []byte) error { | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| func (m *Event) Unmarshal(dAtA []byte) error { |  | ||||||
| 	l := len(dAtA) |  | ||||||
| 	iNdEx := 0 |  | ||||||
| 	for iNdEx < l { |  | ||||||
| 		preIndex := iNdEx |  | ||||||
| 		var wire uint64 |  | ||||||
| 		for shift := uint(0); ; shift += 7 { |  | ||||||
| 			if shift >= 64 { |  | ||||||
| 				return ErrIntOverflowShim |  | ||||||
| 			} |  | ||||||
| 			if iNdEx >= l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			b := dAtA[iNdEx] |  | ||||||
| 			iNdEx++ |  | ||||||
| 			wire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 			if b < 0x80 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		fieldNum := int32(wire >> 3) |  | ||||||
| 		wireType := int(wire & 0x7) |  | ||||||
| 		if wireType == 4 { |  | ||||||
| 			return fmt.Errorf("proto: Event: wiretype end group for non-group") |  | ||||||
| 		} |  | ||||||
| 		if fieldNum <= 0 { |  | ||||||
| 			return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) |  | ||||||
| 		} |  | ||||||
| 		switch fieldNum { |  | ||||||
| 		case 1: |  | ||||||
| 			if wireType != 2 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) |  | ||||||
| 			} |  | ||||||
| 			var stringLen uint64 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowShim |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				stringLen |= (uint64(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			intStringLen := int(stringLen) |  | ||||||
| 			if intStringLen < 0 { |  | ||||||
| 				return ErrInvalidLengthShim |  | ||||||
| 			} |  | ||||||
| 			postIndex := iNdEx + intStringLen |  | ||||||
| 			if postIndex > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			m.ID = string(dAtA[iNdEx:postIndex]) |  | ||||||
| 			iNdEx = postIndex |  | ||||||
| 		case 2: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.Type = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowShim |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.Type |= (EventType(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 3: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.Pid = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowShim |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.Pid |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 4: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.ExitStatus = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowShim |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.ExitStatus |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			iNdEx = preIndex |  | ||||||
| 			skippy, err := skipShim(dAtA[iNdEx:]) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if skippy < 0 { |  | ||||||
| 				return ErrInvalidLengthShim |  | ||||||
| 			} |  | ||||||
| 			if (iNdEx + skippy) > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			iNdEx += skippy |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if iNdEx > l { |  | ||||||
| 		return io.ErrUnexpectedEOF |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| func (m *StateRequest) Unmarshal(dAtA []byte) error { | func (m *StateRequest) Unmarshal(dAtA []byte) error { | ||||||
| 	l := len(dAtA) | 	l := len(dAtA) | ||||||
| 	iNdEx := 0 | 	iNdEx := 0 | ||||||
|  | @ -3179,9 +3053,9 @@ func (m *StateResponse) Unmarshal(dAtA []byte) error { | ||||||
| 			iNdEx = postIndex | 			iNdEx = postIndex | ||||||
| 		case 3: | 		case 3: | ||||||
| 			if wireType != 0 { | 			if wireType != 0 { | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field InitPid", wireType) | 				return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) | ||||||
| 			} | 			} | ||||||
| 			m.InitPid = 0 | 			m.Pid = 0 | ||||||
| 			for shift := uint(0); ; shift += 7 { | 			for shift := uint(0); ; shift += 7 { | ||||||
| 				if shift >= 64 { | 				if shift >= 64 { | ||||||
| 					return ErrIntOverflowShim | 					return ErrIntOverflowShim | ||||||
|  | @ -3191,7 +3065,7 @@ func (m *StateResponse) Unmarshal(dAtA []byte) error { | ||||||
| 				} | 				} | ||||||
| 				b := dAtA[iNdEx] | 				b := dAtA[iNdEx] | ||||||
| 				iNdEx++ | 				iNdEx++ | ||||||
| 				m.InitPid |= (uint32(b) & 0x7F) << shift | 				m.Pid |= (uint32(b) & 0x7F) << shift | ||||||
| 				if b < 0x80 { | 				if b < 0x80 { | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
|  | @ -3222,7 +3096,7 @@ func (m *StateResponse) Unmarshal(dAtA []byte) error { | ||||||
| 			if postIndex > l { | 			if postIndex > l { | ||||||
| 				return io.ErrUnexpectedEOF | 				return io.ErrUnexpectedEOF | ||||||
| 			} | 			} | ||||||
| 			m.Processes = append(m.Processes, &containerd_v1_types2.Process{}) | 			m.Processes = append(m.Processes, &containerd_v1_types1.Process{}) | ||||||
| 			if err := m.Processes[len(m.Processes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { | 			if err := m.Processes[len(m.Processes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  | @ -3348,6 +3222,56 @@ func (m *ResumeRequest) Unmarshal(dAtA []byte) error { | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | func (m *ExitRequest) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowShim | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: ExitRequest: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: ExitRequest: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipShim(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthShim | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| func skipShim(dAtA []byte) (n int, err error) { | func skipShim(dAtA []byte) (n int, err error) { | ||||||
| 	l := len(dAtA) | 	l := len(dAtA) | ||||||
| 	iNdEx := 0 | 	iNdEx := 0 | ||||||
|  | @ -3458,66 +3382,63 @@ func init() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var fileDescriptorShim = []byte{ | var fileDescriptorShim = []byte{ | ||||||
| 	// 976 bytes of a gzipped FileDescriptorProto | 	// 918 bytes of a gzipped FileDescriptorProto | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x55, 0x4f, 0x6f, 0xe3, 0x44, | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x55, 0xc1, 0x6f, 0xe3, 0xc4, | ||||||
| 	0x14, 0xaf, 0x13, 0xe7, 0xdf, 0x6b, 0xdd, 0x86, 0xd1, 0xaa, 0xf2, 0x06, 0xc8, 0x76, 0xbd, 0xbb, | 	0x17, 0x5e, 0x27, 0xa9, 0x9b, 0xbc, 0xc4, 0xed, 0xfe, 0x46, 0xab, 0x6a, 0x36, 0x3f, 0x94, 0x0d, | ||||||
| 	0xa8, 0xac, 0x84, 0xc3, 0x16, 0x81, 0x00, 0x71, 0xe9, 0x36, 0x16, 0x5a, 0x69, 0x61, 0x83, 0x1b, | 	0xde, 0x5d, 0x54, 0x90, 0x70, 0xd8, 0x72, 0x59, 0x38, 0xc1, 0x6e, 0x2b, 0x84, 0xb4, 0x8b, 0x82, | ||||||
| 	0xc4, 0xde, 0x22, 0x27, 0x7e, 0x4d, 0x46, 0x38, 0xb6, 0x99, 0x19, 0xa7, 0xed, 0x8d, 0x2b, 0x1f, | 	0x0b, 0xe2, 0x18, 0x39, 0xf1, 0x6b, 0x32, 0xc2, 0xf6, 0x98, 0x99, 0x71, 0xda, 0xde, 0x38, 0x23, | ||||||
| 	0x80, 0xef, 0xc1, 0xc7, 0xd8, 0x0b, 0x12, 0x27, 0xc4, 0x09, 0xb1, 0xf9, 0x24, 0x68, 0x66, 0xec, | 	0x21, 0xfe, 0x15, 0xfe, 0x8c, 0x3d, 0x72, 0xe4, 0x84, 0xd8, 0xfc, 0x25, 0x68, 0x66, 0xec, 0xa4, | ||||||
| 	0xa4, 0xd9, 0xad, 0x5b, 0xc4, 0x25, 0x79, 0xef, 0xe7, 0xdf, 0xbc, 0x79, 0xff, 0x07, 0xbe, 0x98, | 	0x81, 0xb8, 0x85, 0x4b, 0xf4, 0xde, 0x97, 0x6f, 0x66, 0xde, 0x7c, 0xef, 0x9b, 0x67, 0xf8, 0x64, | ||||||
| 	0x52, 0x31, 0xcb, 0xc6, 0xee, 0x24, 0x99, 0xf7, 0xc2, 0x64, 0xf2, 0x23, 0xb2, 0xde, 0x24, 0x89, | 	0xce, 0xd4, 0xa2, 0x98, 0x06, 0x33, 0x9e, 0x8e, 0x62, 0x3e, 0xfb, 0x1e, 0xc5, 0x68, 0xc6, 0x33, | ||||||
| 	0x45, 0x40, 0x63, 0x64, 0x61, 0x2f, 0x48, 0x69, 0x8f, 0x23, 0x5b, 0xd0, 0x09, 0xf2, 0x1e, 0x9f, | 	0x15, 0xb1, 0x0c, 0x45, 0x3c, 0x8a, 0x72, 0x36, 0x92, 0x28, 0x96, 0x6c, 0x86, 0x72, 0x24, 0x17, | ||||||
| 	0xd1, 0xb9, 0xfa, 0x71, 0x53, 0x96, 0x88, 0x84, 0xec, 0xaf, 0x89, 0xee, 0xe2, 0x89, 0x5b, 0xf0, | 	0x2c, 0x35, 0x3f, 0x41, 0x2e, 0xb8, 0xe2, 0xe4, 0x68, 0x43, 0x0c, 0x96, 0xcf, 0x82, 0x8a, 0xd7, | ||||||
| 	0x3a, 0xef, 0x4e, 0x93, 0x64, 0x1a, 0x61, 0x4f, 0xb1, 0xc6, 0xd9, 0x59, 0x0f, 0xe7, 0xa9, 0xb8, | 	0xff, 0xff, 0x9c, 0xf3, 0x79, 0x82, 0x23, 0xc3, 0x9a, 0x16, 0x17, 0x23, 0x4c, 0x73, 0x75, 0x6d, | ||||||
| 	0xd4, 0x87, 0x3a, 0x77, 0xa6, 0xc9, 0x34, 0x51, 0x62, 0x4f, 0x4a, 0x39, 0xfa, 0xd5, 0xad, 0x5e, | 	0x17, 0xf5, 0x1f, 0xcc, 0xf9, 0x9c, 0x9b, 0x70, 0xa4, 0xa3, 0x12, 0x7d, 0x7e, 0x67, 0x15, 0xea, | ||||||
| 	0x88, 0xcb, 0x14, 0xb9, 0x34, 0x39, 0x41, 0xbe, 0xfa, 0xcf, 0x4f, 0x7f, 0xf6, 0x1f, 0x4f, 0x67, | 	0x3a, 0x47, 0x39, 0x4a, 0x79, 0x91, 0x29, 0xfb, 0x5b, 0xae, 0xfc, 0xec, 0x5f, 0xae, 0x5c, 0x83, | ||||||
| 	0x1c, 0x99, 0xfa, 0xd1, 0xe7, 0x9c, 0x3f, 0x0d, 0xb0, 0x4e, 0x18, 0x06, 0x02, 0x7d, 0xfc, 0x29, | 	0x9b, 0xc8, 0xee, 0xe0, 0xff, 0xd4, 0x00, 0xef, 0xa5, 0xc0, 0x48, 0x61, 0x88, 0x3f, 0x14, 0x28, | ||||||
| 	0x43, 0x2e, 0xc8, 0x3e, 0x54, 0x68, 0x68, 0x1b, 0x07, 0xc6, 0x61, 0xeb, 0x69, 0x7d, 0xf9, 0xf7, | 	0x15, 0x39, 0x82, 0x06, 0x8b, 0xa9, 0x33, 0x74, 0x8e, 0x3b, 0x2f, 0xdc, 0xd5, 0x1f, 0x8f, 0x1a, | ||||||
| 	0xbd, 0xca, 0xb3, 0xbe, 0x5f, 0xa1, 0x21, 0xd9, 0x87, 0xfa, 0x38, 0x8b, 0xc3, 0x08, 0xed, 0x8a, | 	0x5f, 0x9e, 0x86, 0x0d, 0x16, 0x93, 0x23, 0x70, 0xa7, 0x45, 0x16, 0x27, 0x48, 0x1b, 0xfa, 0xbf, | ||||||
| 	0xfc, 0xe6, 0xe7, 0x1a, 0xb1, 0xa1, 0xc1, 0xb2, 0x58, 0xd0, 0x39, 0xda, 0x55, 0xf5, 0xa1, 0x50, | 	0xb0, 0xcc, 0x08, 0x85, 0x7d, 0x51, 0x64, 0x8a, 0xa5, 0x48, 0x9b, 0xe6, 0x8f, 0x2a, 0x25, 0x0f, | ||||||
| 	0xc9, 0x5d, 0x68, 0xc6, 0xc9, 0x28, 0xa5, 0x8b, 0x44, 0xd8, 0xe6, 0x81, 0x71, 0xd8, 0xf4, 0x1b, | 	0xa1, 0x9d, 0xf1, 0x49, 0xce, 0x96, 0x5c, 0xd1, 0xd6, 0xd0, 0x39, 0x6e, 0x87, 0xfb, 0x19, 0x1f, | ||||||
| 	0x71, 0x32, 0x90, 0x2a, 0xe9, 0x40, 0x53, 0x20, 0x9b, 0xd3, 0x38, 0x88, 0xec, 0x9a, 0xfa, 0xb4, | 	0xeb, 0x94, 0xf4, 0xa1, 0xad, 0x50, 0xa4, 0x2c, 0x8b, 0x12, 0xba, 0x67, 0xfe, 0x5a, 0xe7, 0xe4, | ||||||
| 	0xd2, 0xc9, 0x1d, 0xa8, 0x71, 0x11, 0xd2, 0xd8, 0xae, 0x2b, 0x73, 0x5a, 0x91, 0xd7, 0x73, 0x11, | 	0x01, 0xec, 0x49, 0x15, 0xb3, 0x8c, 0xba, 0x66, 0x3b, 0x9b, 0xe8, 0xe3, 0xa5, 0x8a, 0x79, 0xa1, | ||||||
| 	0x26, 0x99, 0xb0, 0x1b, 0xfa, 0x7a, 0xad, 0xe5, 0x38, 0x32, 0x66, 0x37, 0x57, 0x38, 0x32, 0xe6, | 	0xe8, 0xbe, 0x3d, 0xde, 0x66, 0x25, 0x8e, 0x42, 0xd0, 0xf6, 0x1a, 0x47, 0x21, 0xc8, 0x09, 0xb8, | ||||||
| 	0x38, 0xb0, 0x5b, 0xc4, 0xc5, 0xd3, 0x24, 0xe6, 0x48, 0xda, 0x50, 0x4d, 0xf3, 0xc8, 0x2c, 0x5f, | 	0x82, 0x73, 0x75, 0x21, 0x69, 0x67, 0xd8, 0x3c, 0xee, 0x9e, 0xf4, 0x83, 0xed, 0x86, 0x19, 0x61, | ||||||
| 	0x8a, 0xce, 0x2e, 0xec, 0x9c, 0x8a, 0x80, 0x89, 0x3c, 0x74, 0xe7, 0x3e, 0x58, 0x7d, 0x8c, 0x70, | 	0x82, 0xd7, 0x5a, 0xcc, 0xb0, 0x64, 0xfa, 0x3e, 0x1c, 0x54, 0x5a, 0xc8, 0x9c, 0x67, 0x12, 0xc9, | ||||||
| 	0x9d, 0x8b, 0xb7, 0x8f, 0x3c, 0x81, 0xdd, 0x82, 0x92, 0x9b, 0xbd, 0x07, 0xdb, 0x78, 0x41, 0xc5, | 	0x7d, 0x68, 0xe6, 0xa5, 0x1a, 0x5e, 0xa8, 0x43, 0xff, 0x00, 0x7a, 0xe7, 0x2a, 0x12, 0xaa, 0x94, | ||||||
| 	0x88, 0x8b, 0x40, 0x64, 0x3c, 0xe7, 0x82, 0x84, 0x4e, 0x15, 0xe2, 0xfc, 0x56, 0x85, 0x6d, 0xef, | 	0xcb, 0x7f, 0x17, 0xbc, 0x53, 0x4c, 0x70, 0xa3, 0xdf, 0x3f, 0x97, 0x3c, 0x83, 0x83, 0x8a, 0x52, | ||||||
| 	0x02, 0x27, 0x85, 0xd1, 0xab, 0xb1, 0x1b, 0x65, 0xb1, 0x57, 0xae, 0x8f, 0xbd, 0x5a, 0x12, 0xbb, | 	0x6e, 0xfb, 0x08, 0xba, 0x78, 0xc5, 0xd4, 0x44, 0xaa, 0x48, 0x15, 0xb2, 0xe4, 0x82, 0x86, 0xce, | ||||||
| 	0x79, 0x35, 0x76, 0xf2, 0x00, 0x2c, 0x8e, 0x11, 0x8d, 0xb3, 0x8b, 0x51, 0x14, 0x8c, 0x51, 0xa7, | 	0x0d, 0xe2, 0xff, 0xda, 0x84, 0xee, 0xd9, 0x15, 0xce, 0xaa, 0x4d, 0x6f, 0xea, 0xe5, 0xd4, 0xe9, | ||||||
| 	0xb8, 0xe5, 0xef, 0xe4, 0xe0, 0x73, 0x89, 0x91, 0x8f, 0xc0, 0x94, 0x7d, 0xa0, 0xb2, 0xbc, 0x7d, | 	0xd5, 0xd8, 0xad, 0x57, 0xb3, 0x46, 0xaf, 0xd6, 0x96, 0x5e, 0x8f, 0xc1, 0x93, 0x98, 0xb0, 0xac, | ||||||
| 	0x74, 0xd7, 0xdd, 0xec, 0x64, 0xd5, 0x2d, 0xee, 0xf7, 0x1c, 0x99, 0xaf, 0x68, 0x84, 0x80, 0x19, | 	0xb8, 0x9a, 0x24, 0xd1, 0x14, 0x6d, 0x5b, 0x3a, 0x61, 0xaf, 0x04, 0x5f, 0x69, 0x8c, 0x7c, 0x08, | ||||||
| 	0xb0, 0x29, 0xb7, 0x1b, 0x07, 0xd5, 0xc3, 0x96, 0xaf, 0x64, 0x99, 0x1e, 0x8c, 0x17, 0x76, 0x53, | 	0xad, 0x42, 0xa2, 0x30, 0x9d, 0xe9, 0x9e, 0x3c, 0xdc, 0x29, 0xe9, 0xb7, 0x12, 0x45, 0x68, 0x68, | ||||||
| 	0x41, 0x52, 0x94, 0xc8, 0xe4, 0x3c, 0xb4, 0x5b, 0xea, 0x3e, 0x29, 0x12, 0x07, 0x76, 0x26, 0x41, | 	0x84, 0x40, 0x2b, 0x12, 0x73, 0x49, 0xf7, 0x87, 0xcd, 0xe3, 0x4e, 0x68, 0x62, 0x2d, 0x0f, 0x66, | ||||||
| 	0x1a, 0x8c, 0x69, 0x44, 0x05, 0x45, 0x6e, 0x83, 0x22, 0x6f, 0x60, 0xe4, 0x73, 0x68, 0xb0, 0x88, | 	0x4b, 0xda, 0x36, 0x90, 0x0e, 0x35, 0x32, 0xbb, 0x8c, 0x69, 0xc7, 0x9c, 0xa7, 0x43, 0xe2, 0x43, | ||||||
| 	0xce, 0xa9, 0xe0, 0xf6, 0xf6, 0x41, 0xf5, 0x70, 0xfb, 0xa8, 0xeb, 0x5e, 0x3f, 0x57, 0xae, 0xaf, | 	0x6f, 0x16, 0xe5, 0xd1, 0x94, 0x25, 0x4c, 0x31, 0x94, 0x14, 0x0c, 0x79, 0x0b, 0x23, 0xcf, 0x61, | ||||||
| 	0x68, 0x7e, 0x41, 0x27, 0x8f, 0xe1, 0x9d, 0x38, 0x19, 0xc5, 0x78, 0x3e, 0x4a, 0x19, 0x5d, 0xd0, | 	0x5f, 0x24, 0x2c, 0x65, 0x4a, 0xd2, 0xae, 0x69, 0xf0, 0x20, 0xd8, 0xfd, 0x22, 0x83, 0xd0, 0xd0, | ||||||
| 	0x08, 0xa7, 0xc8, 0xed, 0x1d, 0x95, 0xd4, 0xbd, 0x38, 0xf9, 0x16, 0xcf, 0x07, 0x2b, 0x98, 0x7c, | 	0xc2, 0x8a, 0x4e, 0x3e, 0x80, 0xff, 0x65, 0x7c, 0x92, 0xe1, 0xe5, 0x24, 0x17, 0x6c, 0xc9, 0x12, | ||||||
| 	0x08, 0xed, 0x20, 0x4d, 0x03, 0x36, 0x4f, 0xd8, 0x28, 0x65, 0xc9, 0x19, 0x8d, 0xd0, 0xb6, 0x94, | 	0x9c, 0xa3, 0xa4, 0x3d, 0x23, 0xea, 0x61, 0xc6, 0xbf, 0xc2, 0xcb, 0xf1, 0x1a, 0x26, 0xef, 0xc3, | ||||||
| 	0xa3, 0x7b, 0x05, 0x3e, 0xd0, 0xb0, 0xd3, 0x87, 0xba, 0xbe, 0x49, 0x86, 0x2d, 0x53, 0xa1, 0xe7, | 	0xfd, 0x28, 0xcf, 0x23, 0x91, 0x72, 0x31, 0xc9, 0x05, 0xbf, 0x60, 0x09, 0x52, 0xcf, 0x14, 0x7a, | ||||||
| 	0xc1, 0x57, 0xb2, 0xc4, 0x66, 0x01, 0x0b, 0x55, 0x8d, 0x4c, 0x5f, 0xc9, 0x12, 0xe3, 0xc9, 0x99, | 	0x58, 0xe1, 0x63, 0x0b, 0xfb, 0xa7, 0xe0, 0xda, 0x93, 0xf4, 0xb5, 0xb5, 0x14, 0xf6, 0x0d, 0x85, | ||||||
| 	0x2e, 0x90, 0xe9, 0x2b, 0xd9, 0x39, 0x80, 0x1d, 0x5d, 0xf7, 0xd2, 0x06, 0x7c, 0x0e, 0x30, 0x10, | 	0x26, 0xd6, 0xd8, 0x22, 0x12, 0xb1, 0xe9, 0x51, 0x2b, 0x34, 0xb1, 0xc6, 0x24, 0xbf, 0xb0, 0x0d, | ||||||
| 	0x97, 0xa5, 0xdd, 0x26, 0xdb, 0xe1, 0x9c, 0x86, 0x62, 0xa6, 0xae, 0xb2, 0x7c, 0xad, 0xc8, 0xb2, | 	0x6a, 0x85, 0x26, 0xf6, 0x87, 0xd0, 0xb3, 0x7d, 0xaf, 0x35, 0xe0, 0x2b, 0x80, 0xb1, 0xba, 0xae, | ||||||
| 	0xcf, 0x90, 0x4e, 0x67, 0xfa, 0x36, 0xcb, 0xcf, 0x35, 0x67, 0x0f, 0x2c, 0x6f, 0x81, 0xb1, 0xe0, | 	0x75, 0x9b, 0xb6, 0xc3, 0x25, 0x8b, 0xd5, 0xc2, 0x1c, 0xe5, 0x85, 0x36, 0xd1, 0x6d, 0x5f, 0x20, | ||||||
| 	0x45, 0x3f, 0xff, 0x62, 0x40, 0x4d, 0x21, 0xa5, 0x43, 0xfd, 0x69, 0x1e, 0x9e, 0xb4, 0xbf, 0x7b, | 	0x9b, 0x2f, 0xec, 0x69, 0x5e, 0x58, 0x66, 0xfe, 0x21, 0x78, 0x67, 0x4b, 0xcc, 0x94, 0xac, 0xfc, | ||||||
| 	0x74, 0xbf, 0x2c, 0xed, 0xca, 0xc8, 0xf0, 0x32, 0xc5, 0x3c, 0x03, 0xb9, 0xa7, 0xd5, 0xb5, 0xa7, | 	0x6c, 0xfd, 0xbd, 0xb6, 0xb3, 0xff, 0xb3, 0x03, 0x5e, 0x09, 0x94, 0x25, 0xfd, 0xd7, 0x01, 0x51, | ||||||
| 	0x6f, 0x4c, 0x81, 0xf9, 0xd6, 0x14, 0xe8, 0x59, 0x5b, 0x8d, 0x96, 0xf3, 0xab, 0x01, 0x56, 0x0e, | 	0x96, 0xd8, 0xdc, 0x94, 0xf8, 0x29, 0x74, 0x72, 0xc1, 0x67, 0x28, 0x25, 0x4a, 0xda, 0x32, 0xdd, | ||||||
| 	0xe4, 0xe9, 0xf9, 0x1f, 0x8b, 0x87, 0xc6, 0x54, 0x0c, 0x56, 0x8e, 0x14, 0x2a, 0xf9, 0x12, 0x5a, | 	0x7b, 0x67, 0xa7, 0x97, 0xc6, 0x96, 0x15, 0x6e, 0xe8, 0xba, 0xbe, 0x71, 0x54, 0xc8, 0x75, 0x7d, | ||||||
| 	0xf9, 0x76, 0x44, 0xe9, 0x8a, 0xec, 0xa8, 0xf7, 0xae, 0xed, 0xef, 0x81, 0x66, 0xf9, 0x6b, 0xba, | 	0x87, 0xe0, 0x85, 0x28, 0x8b, 0x74, 0x0d, 0x78, 0xfa, 0xe5, 0xb0, 0xea, 0x7d, 0x9e, 0xfc, 0xe2, | ||||||
| 	0xf4, 0x73, 0x10, 0x64, 0x7c, 0xe5, 0xe7, 0x1e, 0x58, 0x3e, 0xf2, 0x6c, 0x5e, 0x00, 0x8f, 0x3d, | 	0x42, 0xeb, 0x7c, 0xc1, 0x52, 0xf2, 0x1d, 0xb8, 0xf6, 0x71, 0x93, 0xa7, 0x75, 0x4e, 0xd9, 0x1a, | ||||||
| 	0x68, 0xad, 0xd2, 0x41, 0x9a, 0x60, 0x7a, 0x2f, 0x9f, 0x0d, 0xdb, 0x5b, 0xa4, 0x01, 0xd5, 0x17, | 	0x84, 0xfd, 0xf7, 0xee, 0xa2, 0x95, 0x7a, 0x9c, 0xc1, 0x9e, 0x99, 0x08, 0xe4, 0x49, 0xdd, 0x82, | ||||||
| 	0x2f, 0xbe, 0x69, 0x1b, 0x04, 0xa0, 0x7e, 0xe2, 0x7b, 0xc7, 0x43, 0xaf, 0x5d, 0x21, 0x2d, 0xa8, | 	0x9b, 0x03, 0xa3, 0x7f, 0x14, 0xd8, 0x2f, 0x44, 0x50, 0x7d, 0x21, 0x82, 0x33, 0xfd, 0x85, 0xd0, | ||||||
| 	0x9d, 0x0e, 0x8f, 0xfd, 0x61, 0xbb, 0x4a, 0x76, 0x01, 0xbc, 0x97, 0xde, 0xc9, 0xe8, 0xb8, 0xdf, | 	0xf5, 0xd9, 0x29, 0x51, 0x5f, 0xdf, 0xd6, 0xa0, 0xa9, 0xaf, 0xef, 0x6f, 0xc3, 0xe6, 0x6b, 0x68, | ||||||
| 	0xf7, 0xfa, 0x6d, 0xf3, 0xe8, 0xf7, 0x1a, 0x98, 0xa7, 0x33, 0x3a, 0x27, 0x3f, 0x40, 0x5d, 0x2f, | 	0x69, 0x4b, 0x91, 0xc7, 0x75, 0xfc, 0x1b, 0x83, 0xa6, 0xff, 0xe4, 0x76, 0x52, 0xb9, 0xe5, 0xe7, | ||||||
| 	0x2a, 0xf2, 0xa8, 0x2c, 0xfd, 0x1b, 0x0b, 0xba, 0xf3, 0xc1, 0x6d, 0xb4, 0x3c, 0x9f, 0x1e, 0xd4, | 	0xd0, 0x1c, 0xab, 0x6b, 0xe2, 0xd7, 0x91, 0x37, 0x06, 0xad, 0xbd, 0xee, 0x6b, 0x70, 0xad, 0xf1, | ||||||
| 	0xd4, 0x76, 0x23, 0x0f, 0xcb, 0x0e, 0x5c, 0x5d, 0x7e, 0x9d, 0x7d, 0x57, 0xbf, 0x59, 0x6e, 0xf1, | 	0xea, 0xaf, 0xbb, 0x65, 0xcc, 0xfe, 0xee, 0x01, 0x6e, 0x38, 0x1f, 0x39, 0xe4, 0x1b, 0xd3, 0x04, | ||||||
| 	0x66, 0xb9, 0x9e, 0x7c, 0xb3, 0xa4, 0x7f, 0x7a, 0xe3, 0x95, 0xfb, 0xb7, 0xb1, 0x34, 0xcb, 0xfd, | 	0x85, 0xb7, 0x36, 0x61, 0xa3, 0xdd, 0xd3, 0x3b, 0x58, 0x9b, 0xd6, 0x1a, 0xb3, 0xd5, 0xef, 0x7a, | ||||||
| 	0x7b, 0x63, 0x71, 0x7e, 0x07, 0xa6, 0x1c, 0x0f, 0xf2, 0xa0, 0xb4, 0xeb, 0xd6, 0x4b, 0xb3, 0xf3, | 	0xd3, 0x8b, 0xb5, 0x77, 0xfd, 0x02, 0x5c, 0xeb, 0xd1, 0xfa, 0xbb, 0x6e, 0x79, 0xb8, 0x76, 0xa3, | ||||||
| 	0xf0, 0x66, 0x52, 0x6e, 0xf2, 0x18, 0xaa, 0x03, 0x71, 0x49, 0x9c, 0x32, 0xf2, 0x7a, 0xd8, 0x4a, | 	0x97, 0xba, 0x95, 0x4c, 0xdd, 0xd6, 0x4a, 0x76, 0x97, 0xd1, 0x5e, 0xd0, 0x37, 0x6f, 0x07, 0xf7, | ||||||
| 	0xc3, 0x1d, 0x40, 0x5d, 0x0f, 0x51, 0x79, 0xb8, 0x1b, 0x43, 0xd6, 0x79, 0xff, 0x46, 0xda, 0xc7, | 	0x7e, 0x7f, 0x3b, 0xb8, 0xf7, 0xe3, 0x6a, 0xe0, 0xbc, 0x59, 0x0d, 0x9c, 0xdf, 0x56, 0x03, 0xe7, | ||||||
| 	0x06, 0x19, 0xaa, 0x3a, 0x08, 0xbc, 0xb1, 0x0e, 0xeb, 0xf4, 0x3d, 0xba, 0x85, 0xb5, 0xae, 0xae, | 	0xcf, 0xd5, 0xc0, 0x99, 0xba, 0x86, 0xf9, 0xf1, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x82, | ||||||
| 	0xea, 0xd3, 0x72, 0xab, 0x57, 0xdb, 0xb8, 0x34, 0xdc, 0xaf, 0xa1, 0xae, 0xdb, 0xbb, 0x3c, 0xdc, | 	0x40, 0x80, 0x17, 0x09, 0x00, 0x00, | ||||||
| 	0x8d, 0xf6, 0x2f, 0x33, 0xf4, 0xd4, 0x7e, 0xf5, 0xba, 0xbb, 0xf5, 0xd7, 0xeb, 0xee, 0xd6, 0xcf, |  | ||||||
| 	0xcb, 0xae, 0xf1, 0x6a, 0xd9, 0x35, 0xfe, 0x58, 0x76, 0x8d, 0x7f, 0x96, 0x5d, 0x63, 0x5c, 0x57, |  | ||||||
| 	0xcc, 0x4f, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x28, 0xed, 0x88, 0x67, 0x09, 0x00, 0x00, |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,8 +4,8 @@ package containerd.v1.services; | ||||||
| 
 | 
 | ||||||
| import "google/protobuf/empty.proto"; | import "google/protobuf/empty.proto"; | ||||||
| import "gogoproto/gogo.proto"; | import "gogoproto/gogo.proto"; | ||||||
| import "github.com/docker/containerd/api/types/process/process.proto"; | import "github.com/docker/containerd/api/types/mount/mount.proto"; | ||||||
| import "github.com/docker/containerd/api/types/user/user.proto"; | import "github.com/docker/containerd/api/types/container/container.proto"; | ||||||
| 
 | 
 | ||||||
| service Shim { | service Shim { | ||||||
| 	rpc Create(CreateRequest) returns (CreateResponse); | 	rpc Create(CreateRequest) returns (CreateResponse); | ||||||
|  | @ -13,10 +13,11 @@ service Shim { | ||||||
| 	rpc Delete(DeleteRequest) returns (DeleteResponse); | 	rpc Delete(DeleteRequest) returns (DeleteResponse); | ||||||
| 	rpc Exec(ExecRequest) returns (ExecResponse); | 	rpc Exec(ExecRequest) returns (ExecResponse); | ||||||
| 	rpc Pty(PtyRequest) returns (google.protobuf.Empty); | 	rpc Pty(PtyRequest) returns (google.protobuf.Empty); | ||||||
| 	rpc Events(EventsRequest) returns (stream Event); | 	rpc Events(EventsRequest) returns (stream containerd.v1.types.Event); | ||||||
| 	rpc State(StateRequest) returns (StateResponse); | 	rpc State(StateRequest) returns (StateResponse); | ||||||
| 	rpc Pause(PauseRequest) returns (google.protobuf.Empty); | 	rpc Pause(PauseRequest) returns (google.protobuf.Empty); | ||||||
| 	rpc Resume(ResumeRequest) returns (google.protobuf.Empty); | 	rpc Resume(ResumeRequest) returns (google.protobuf.Empty); | ||||||
|  | 	rpc Exit(ExitRequest) returns (google.protobuf.Empty); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message CreateRequest { | message CreateRequest { | ||||||
|  | @ -28,6 +29,7 @@ message CreateRequest { | ||||||
| 	string stdin = 6; | 	string stdin = 6; | ||||||
| 	string stdout = 7; | 	string stdout = 7; | ||||||
| 	string stderr = 8; | 	string stderr = 8; | ||||||
|  | 	repeated containerd.v1.types.Mount rootfs = 9; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message CreateResponse { | message CreateResponse { | ||||||
|  | @ -51,7 +53,7 @@ message ExecRequest { | ||||||
| 	string stdout = 3; | 	string stdout = 3; | ||||||
| 	string stderr = 4; | 	string stderr = 4; | ||||||
| 	string selinux_label = 5; | 	string selinux_label = 5; | ||||||
| 	types.User user = 6; | 	containerd.v1.types.User user = 6; | ||||||
| 	repeated string args = 7; | 	repeated string args = 7; | ||||||
| 	repeated string env = 8; | 	repeated string env = 8; | ||||||
| 	string cwd = 9; | 	string cwd = 9; | ||||||
|  | @ -80,34 +82,22 @@ message PtyRequest { | ||||||
| message EventsRequest { | message EventsRequest { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| enum EventType { |  | ||||||
| 	EXIT = 0; |  | ||||||
| 	OOM = 1; |  | ||||||
| 	CREATE = 2; |  | ||||||
| 	START = 3; |  | ||||||
| 	EXEC_ADDED = 4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // should be moved to api/types/event maybe |  | ||||||
| message Event { |  | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; |  | ||||||
| 	EventType type = 2; |  | ||||||
| 	uint32 pid = 3; |  | ||||||
| 	uint32 exit_status = 4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| message StateRequest { | message StateRequest { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message StateResponse { | message StateResponse { | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| 	string bundle = 2; | 	string bundle = 2; | ||||||
| 	uint32 initPid = 3; | 	uint32 pid = 3; | ||||||
| 	repeated types.Process processes = 4; | 	repeated containerd.v1.types.Process processes = 4; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| message PauseRequest { | message PauseRequest { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message ResumeRequest { | message ResumeRequest { | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | message ExitRequest { | ||||||
|  | } | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -3,10 +3,50 @@ syntax = "proto3"; | ||||||
| package containerd.v1.types; | package containerd.v1.types; | ||||||
| 
 | 
 | ||||||
| import "gogoproto/gogo.proto"; | import "gogoproto/gogo.proto"; | ||||||
| import "github.com/docker/containerd/api/types/state/state.proto"; | 
 | ||||||
|  | enum Status { | ||||||
|  | 	CREATED = 0; | ||||||
|  | 	RUNNING = 1; | ||||||
|  | 	STOPPED = 2; | ||||||
|  | 	PAUSED = 3; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| message Container { | message Container { | ||||||
| 	string id = 1 [(gogoproto.customname) = "ID"]; | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
| 	string bundle = 2; | 	uint32 pid = 2; | ||||||
| 	State state = 4; | 	Status status = 3; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | message Process { | ||||||
|  | 	uint32 pid = 1; | ||||||
|  | 	repeated string args = 2; | ||||||
|  | 	repeated string env = 3; | ||||||
|  | 	User user = 4; | ||||||
|  | 	string cwd = 5; | ||||||
|  | 	bool terminal = 6; | ||||||
|  | 	uint32 exit_status = 7; | ||||||
|  | 	Status status = 8; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | message User { | ||||||
|  | 	uint32 uid = 1; | ||||||
|  | 	uint32 gid = 2; | ||||||
|  | 	repeated uint32 additional_gids = 3; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | message Event { | ||||||
|  | 	string id = 1 [(gogoproto.customname) = "ID"]; | ||||||
|  | 
 | ||||||
|  | 	enum EventType { | ||||||
|  | 		EXIT = 0; | ||||||
|  | 		OOM = 1; | ||||||
|  | 		CREATE = 2; | ||||||
|  | 		START = 3; | ||||||
|  | 		EXEC_ADDED = 4; | ||||||
|  | 		PAUSED = 5; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	EventType type = 2; | ||||||
|  | 	uint32 pid = 3; | ||||||
|  | 	uint32 exit_status = 4; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -472,19 +472,18 @@ func init() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var fileDescriptorMount = []byte{ | var fileDescriptorMount = []byte{ | ||||||
| 	// 212 bytes of a gzipped FileDescriptorProto | 	// 204 bytes of a gzipped FileDescriptorProto | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x4c, 0x8e, 0xb1, 0x4a, 0x43, 0x31, | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x48, 0xcf, 0x2c, 0xc9, | ||||||
| 	0x14, 0x86, 0x1b, 0x5b, 0x2b, 0xcd, 0x18, 0x41, 0x82, 0x43, 0x28, 0x4e, 0x5d, 0x4c, 0x10, 0x17, | 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xc9, 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0x4f, 0xce, | ||||||
| 	0x67, 0x77, 0x97, 0xbe, 0xc1, 0xbd, 0x69, 0x8c, 0x41, 0x9a, 0x13, 0x72, 0x4f, 0x04, 0x37, 0x1f, | 	0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0xd1, 0x4f, 0x2c, 0xc8, 0xd4, 0x2f, 0xa9, 0x2c, | ||||||
| 	0xef, 0x8e, 0x8e, 0x8e, 0xde, 0x3c, 0x89, 0xdc, 0x13, 0xc5, 0x2e, 0x87, 0xff, 0xfb, 0xf9, 0xf9, | 	0x48, 0x2d, 0xd6, 0xcf, 0xcd, 0x2f, 0xcd, 0x2b, 0x81, 0x90, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, | ||||||
| 	0x38, 0xfc, 0xc1, 0x07, 0x7c, 0x29, 0xbd, 0xb6, 0x70, 0x34, 0x07, 0xb0, 0xaf, 0x2e, 0x1b, 0x0b, | 	0x42, 0xc2, 0x08, 0x75, 0x7a, 0x65, 0x86, 0x7a, 0x60, 0x65, 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, | ||||||
| 	0x11, 0xbb, 0x10, 0x5d, 0x3e, 0x98, 0x2e, 0x05, 0x83, 0xef, 0xc9, 0x0d, 0xe6, 0x08, 0x25, 0x62, | 	0x60, 0x79, 0x7d, 0x10, 0x0b, 0xa2, 0x54, 0x29, 0x95, 0x8b, 0xd5, 0x17, 0xa4, 0x53, 0x48, 0x88, | ||||||
| 	0xbb, 0x3a, 0x65, 0x40, 0x10, 0x97, 0xff, 0x3b, 0xfd, 0x76, 0xa7, 0x69, 0x76, 0x7d, 0x7b, 0xa2, | 	0x8b, 0x05, 0xa4, 0x4e, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x08, 0xcc, 0x16, 0x12, 0xe3, 0x62, | ||||||
| 	0xf3, 0xe0, 0xc1, 0xd0, 0xb6, 0x2f, 0xcf, 0x44, 0x04, 0x94, 0x9a, 0xe3, 0xc6, 0xf1, 0xf3, 0xa7, | 	0x2b, 0xce, 0x2f, 0x2d, 0x4a, 0x4e, 0x95, 0x60, 0x02, 0x8b, 0x42, 0x79, 0x20, 0xf1, 0x92, 0xc4, | ||||||
| 	0x59, 0x29, 0x04, 0x5f, 0xcd, 0x02, 0xc9, 0xb6, 0x6c, 0xb7, 0xd9, 0x53, 0x16, 0x57, 0x7c, 0x3d, | 	0xa2, 0xf4, 0xd4, 0x12, 0x09, 0x66, 0x88, 0x38, 0x84, 0x27, 0x24, 0xc1, 0xc5, 0x9e, 0x5f, 0x50, | ||||||
| 	0x40, 0xc9, 0xd6, 0xc9, 0x33, 0x6a, 0x7f, 0x69, 0xee, 0xb1, 0xcb, 0xde, 0xa1, 0x5c, 0xb6, 0xbe, | 	0x92, 0x99, 0x9f, 0x57, 0x2c, 0xc1, 0xa2, 0xc0, 0xac, 0xc1, 0x19, 0x04, 0xe3, 0x3a, 0x49, 0x9c, | ||||||
| 	0x91, 0x90, 0xfc, 0x02, 0x12, 0x06, 0x88, 0x83, 0x5c, 0x6d, 0x97, 0xbb, 0xcd, 0xfe, 0x0f, 0x1f, | 	0x78, 0x28, 0xc7, 0x70, 0xe3, 0xa1, 0x1c, 0x43, 0xc3, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, | ||||||
| 	0xe5, 0x38, 0xa9, 0xc5, 0xd7, 0xa4, 0x16, 0x1f, 0x55, 0xb1, 0xb1, 0x2a, 0xf6, 0x59, 0x15, 0xfb, | 	0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x31, 0x89, 0x0d, 0xec, 0x0e, 0x63, 0x40, 0x00, | ||||||
| 	0xae, 0x8a, 0xf5, 0x6b, 0xfa, 0xe3, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0x0f, 0xcf, 0x31, 0x1e, | 	0x00, 0x00, 0xff, 0xff, 0xf3, 0x5c, 0x4b, 0x3a, 0xee, 0x00, 0x00, 0x00, | ||||||
| 	0x07, 0x01, 0x00, 0x00, |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ syntax = "proto3"; | ||||||
| 
 | 
 | ||||||
| package containerd.v1.types; | package containerd.v1.types; | ||||||
| 
 | 
 | ||||||
| import "github.com/gogo/protobuf/gogoproto/gogo.proto"; | import "gogoproto/gogo.proto"; | ||||||
| 
 | 
 | ||||||
| // Mount describes mounts for a container. | // Mount describes mounts for a container. | ||||||
| // | // | ||||||
|  |  | ||||||
|  | @ -1,625 +0,0 @@ | ||||||
| // Code generated by protoc-gen-gogo. |  | ||||||
| // source: github.com/docker/containerd/api/types/process/process.proto |  | ||||||
| // DO NOT EDIT! |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| 	Package process is a generated protocol buffer package. |  | ||||||
| 
 |  | ||||||
| 	It is generated from these files: |  | ||||||
| 		github.com/docker/containerd/api/types/process/process.proto |  | ||||||
| 
 |  | ||||||
| 	It has these top-level messages: |  | ||||||
| 		Process |  | ||||||
| */ |  | ||||||
| package process |  | ||||||
| 
 |  | ||||||
| import proto "github.com/gogo/protobuf/proto" |  | ||||||
| import fmt "fmt" |  | ||||||
| import math "math" |  | ||||||
| import containerd_v1_types "github.com/docker/containerd/api/types/user" |  | ||||||
| import containerd_v1_types1 "github.com/docker/containerd/api/types/state" |  | ||||||
| 
 |  | ||||||
| import strings "strings" |  | ||||||
| import reflect "reflect" |  | ||||||
| 
 |  | ||||||
| import io "io" |  | ||||||
| 
 |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ = proto.Marshal |  | ||||||
| var _ = fmt.Errorf |  | ||||||
| var _ = math.Inf |  | ||||||
| 
 |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the proto package it is being compiled against. |  | ||||||
| // A compilation error at this line likely means your copy of the |  | ||||||
| // proto package needs to be updated. |  | ||||||
| const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package |  | ||||||
| 
 |  | ||||||
| type Process struct { |  | ||||||
| 	Pid        uint32                     `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"` |  | ||||||
| 	Args       []string                   `protobuf:"bytes,2,rep,name=args" json:"args,omitempty"` |  | ||||||
| 	Env        []string                   `protobuf:"bytes,3,rep,name=env" json:"env,omitempty"` |  | ||||||
| 	User       *containerd_v1_types.User  `protobuf:"bytes,4,opt,name=user" json:"user,omitempty"` |  | ||||||
| 	Cwd        string                     `protobuf:"bytes,5,opt,name=cwd,proto3" json:"cwd,omitempty"` |  | ||||||
| 	Terminal   bool                       `protobuf:"varint,6,opt,name=terminal,proto3" json:"terminal,omitempty"` |  | ||||||
| 	State      containerd_v1_types1.State `protobuf:"varint,7,opt,name=state,proto3,enum=containerd.v1.types.State" json:"state,omitempty"` |  | ||||||
| 	ExitStatus uint32                     `protobuf:"varint,8,opt,name=exit_status,json=exitStatus,proto3" json:"exit_status,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *Process) Reset()                    { *m = Process{} } |  | ||||||
| func (*Process) ProtoMessage()               {} |  | ||||||
| func (*Process) Descriptor() ([]byte, []int) { return fileDescriptorProcess, []int{0} } |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterType((*Process)(nil), "containerd.v1.types.Process") |  | ||||||
| } |  | ||||||
| func (m *Process) Marshal() (dAtA []byte, err error) { |  | ||||||
| 	size := m.Size() |  | ||||||
| 	dAtA = make([]byte, size) |  | ||||||
| 	n, err := m.MarshalTo(dAtA) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return dAtA[:n], nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *Process) MarshalTo(dAtA []byte) (int, error) { |  | ||||||
| 	var i int |  | ||||||
| 	_ = i |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	if m.Pid != 0 { |  | ||||||
| 		dAtA[i] = 0x8 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintProcess(dAtA, i, uint64(m.Pid)) |  | ||||||
| 	} |  | ||||||
| 	if len(m.Args) > 0 { |  | ||||||
| 		for _, s := range m.Args { |  | ||||||
| 			dAtA[i] = 0x12 |  | ||||||
| 			i++ |  | ||||||
| 			l = len(s) |  | ||||||
| 			for l >= 1<<7 { |  | ||||||
| 				dAtA[i] = uint8(uint64(l)&0x7f | 0x80) |  | ||||||
| 				l >>= 7 |  | ||||||
| 				i++ |  | ||||||
| 			} |  | ||||||
| 			dAtA[i] = uint8(l) |  | ||||||
| 			i++ |  | ||||||
| 			i += copy(dAtA[i:], s) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if len(m.Env) > 0 { |  | ||||||
| 		for _, s := range m.Env { |  | ||||||
| 			dAtA[i] = 0x1a |  | ||||||
| 			i++ |  | ||||||
| 			l = len(s) |  | ||||||
| 			for l >= 1<<7 { |  | ||||||
| 				dAtA[i] = uint8(uint64(l)&0x7f | 0x80) |  | ||||||
| 				l >>= 7 |  | ||||||
| 				i++ |  | ||||||
| 			} |  | ||||||
| 			dAtA[i] = uint8(l) |  | ||||||
| 			i++ |  | ||||||
| 			i += copy(dAtA[i:], s) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if m.User != nil { |  | ||||||
| 		dAtA[i] = 0x22 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintProcess(dAtA, i, uint64(m.User.Size())) |  | ||||||
| 		n1, err := m.User.MarshalTo(dAtA[i:]) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return 0, err |  | ||||||
| 		} |  | ||||||
| 		i += n1 |  | ||||||
| 	} |  | ||||||
| 	if len(m.Cwd) > 0 { |  | ||||||
| 		dAtA[i] = 0x2a |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintProcess(dAtA, i, uint64(len(m.Cwd))) |  | ||||||
| 		i += copy(dAtA[i:], m.Cwd) |  | ||||||
| 	} |  | ||||||
| 	if m.Terminal { |  | ||||||
| 		dAtA[i] = 0x30 |  | ||||||
| 		i++ |  | ||||||
| 		if m.Terminal { |  | ||||||
| 			dAtA[i] = 1 |  | ||||||
| 		} else { |  | ||||||
| 			dAtA[i] = 0 |  | ||||||
| 		} |  | ||||||
| 		i++ |  | ||||||
| 	} |  | ||||||
| 	if m.State != 0 { |  | ||||||
| 		dAtA[i] = 0x38 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintProcess(dAtA, i, uint64(m.State)) |  | ||||||
| 	} |  | ||||||
| 	if m.ExitStatus != 0 { |  | ||||||
| 		dAtA[i] = 0x40 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintProcess(dAtA, i, uint64(m.ExitStatus)) |  | ||||||
| 	} |  | ||||||
| 	return i, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func encodeFixed64Process(dAtA []byte, offset int, v uint64) int { |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	dAtA[offset+1] = uint8(v >> 8) |  | ||||||
| 	dAtA[offset+2] = uint8(v >> 16) |  | ||||||
| 	dAtA[offset+3] = uint8(v >> 24) |  | ||||||
| 	dAtA[offset+4] = uint8(v >> 32) |  | ||||||
| 	dAtA[offset+5] = uint8(v >> 40) |  | ||||||
| 	dAtA[offset+6] = uint8(v >> 48) |  | ||||||
| 	dAtA[offset+7] = uint8(v >> 56) |  | ||||||
| 	return offset + 8 |  | ||||||
| } |  | ||||||
| func encodeFixed32Process(dAtA []byte, offset int, v uint32) int { |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	dAtA[offset+1] = uint8(v >> 8) |  | ||||||
| 	dAtA[offset+2] = uint8(v >> 16) |  | ||||||
| 	dAtA[offset+3] = uint8(v >> 24) |  | ||||||
| 	return offset + 4 |  | ||||||
| } |  | ||||||
| func encodeVarintProcess(dAtA []byte, offset int, v uint64) int { |  | ||||||
| 	for v >= 1<<7 { |  | ||||||
| 		dAtA[offset] = uint8(v&0x7f | 0x80) |  | ||||||
| 		v >>= 7 |  | ||||||
| 		offset++ |  | ||||||
| 	} |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	return offset + 1 |  | ||||||
| } |  | ||||||
| func (m *Process) Size() (n int) { |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	if m.Pid != 0 { |  | ||||||
| 		n += 1 + sovProcess(uint64(m.Pid)) |  | ||||||
| 	} |  | ||||||
| 	if len(m.Args) > 0 { |  | ||||||
| 		for _, s := range m.Args { |  | ||||||
| 			l = len(s) |  | ||||||
| 			n += 1 + l + sovProcess(uint64(l)) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if len(m.Env) > 0 { |  | ||||||
| 		for _, s := range m.Env { |  | ||||||
| 			l = len(s) |  | ||||||
| 			n += 1 + l + sovProcess(uint64(l)) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if m.User != nil { |  | ||||||
| 		l = m.User.Size() |  | ||||||
| 		n += 1 + l + sovProcess(uint64(l)) |  | ||||||
| 	} |  | ||||||
| 	l = len(m.Cwd) |  | ||||||
| 	if l > 0 { |  | ||||||
| 		n += 1 + l + sovProcess(uint64(l)) |  | ||||||
| 	} |  | ||||||
| 	if m.Terminal { |  | ||||||
| 		n += 2 |  | ||||||
| 	} |  | ||||||
| 	if m.State != 0 { |  | ||||||
| 		n += 1 + sovProcess(uint64(m.State)) |  | ||||||
| 	} |  | ||||||
| 	if m.ExitStatus != 0 { |  | ||||||
| 		n += 1 + sovProcess(uint64(m.ExitStatus)) |  | ||||||
| 	} |  | ||||||
| 	return n |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func sovProcess(x uint64) (n int) { |  | ||||||
| 	for { |  | ||||||
| 		n++ |  | ||||||
| 		x >>= 7 |  | ||||||
| 		if x == 0 { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return n |  | ||||||
| } |  | ||||||
| func sozProcess(x uint64) (n int) { |  | ||||||
| 	return sovProcess(uint64((x << 1) ^ uint64((int64(x) >> 63)))) |  | ||||||
| } |  | ||||||
| func (this *Process) String() string { |  | ||||||
| 	if this == nil { |  | ||||||
| 		return "nil" |  | ||||||
| 	} |  | ||||||
| 	s := strings.Join([]string{`&Process{`, |  | ||||||
| 		`Pid:` + fmt.Sprintf("%v", this.Pid) + `,`, |  | ||||||
| 		`Args:` + fmt.Sprintf("%v", this.Args) + `,`, |  | ||||||
| 		`Env:` + fmt.Sprintf("%v", this.Env) + `,`, |  | ||||||
| 		`User:` + strings.Replace(fmt.Sprintf("%v", this.User), "User", "containerd_v1_types.User", 1) + `,`, |  | ||||||
| 		`Cwd:` + fmt.Sprintf("%v", this.Cwd) + `,`, |  | ||||||
| 		`Terminal:` + fmt.Sprintf("%v", this.Terminal) + `,`, |  | ||||||
| 		`State:` + fmt.Sprintf("%v", this.State) + `,`, |  | ||||||
| 		`ExitStatus:` + fmt.Sprintf("%v", this.ExitStatus) + `,`, |  | ||||||
| 		`}`, |  | ||||||
| 	}, "") |  | ||||||
| 	return s |  | ||||||
| } |  | ||||||
| func valueToStringProcess(v interface{}) string { |  | ||||||
| 	rv := reflect.ValueOf(v) |  | ||||||
| 	if rv.IsNil() { |  | ||||||
| 		return "nil" |  | ||||||
| 	} |  | ||||||
| 	pv := reflect.Indirect(rv).Interface() |  | ||||||
| 	return fmt.Sprintf("*%v", pv) |  | ||||||
| } |  | ||||||
| func (m *Process) Unmarshal(dAtA []byte) error { |  | ||||||
| 	l := len(dAtA) |  | ||||||
| 	iNdEx := 0 |  | ||||||
| 	for iNdEx < l { |  | ||||||
| 		preIndex := iNdEx |  | ||||||
| 		var wire uint64 |  | ||||||
| 		for shift := uint(0); ; shift += 7 { |  | ||||||
| 			if shift >= 64 { |  | ||||||
| 				return ErrIntOverflowProcess |  | ||||||
| 			} |  | ||||||
| 			if iNdEx >= l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			b := dAtA[iNdEx] |  | ||||||
| 			iNdEx++ |  | ||||||
| 			wire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 			if b < 0x80 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		fieldNum := int32(wire >> 3) |  | ||||||
| 		wireType := int(wire & 0x7) |  | ||||||
| 		if wireType == 4 { |  | ||||||
| 			return fmt.Errorf("proto: Process: wiretype end group for non-group") |  | ||||||
| 		} |  | ||||||
| 		if fieldNum <= 0 { |  | ||||||
| 			return fmt.Errorf("proto: Process: illegal tag %d (wire type %d)", fieldNum, wire) |  | ||||||
| 		} |  | ||||||
| 		switch fieldNum { |  | ||||||
| 		case 1: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.Pid = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.Pid |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 2: |  | ||||||
| 			if wireType != 2 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) |  | ||||||
| 			} |  | ||||||
| 			var stringLen uint64 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				stringLen |= (uint64(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			intStringLen := int(stringLen) |  | ||||||
| 			if intStringLen < 0 { |  | ||||||
| 				return ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			postIndex := iNdEx + intStringLen |  | ||||||
| 			if postIndex > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			m.Args = append(m.Args, string(dAtA[iNdEx:postIndex])) |  | ||||||
| 			iNdEx = postIndex |  | ||||||
| 		case 3: |  | ||||||
| 			if wireType != 2 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) |  | ||||||
| 			} |  | ||||||
| 			var stringLen uint64 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				stringLen |= (uint64(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			intStringLen := int(stringLen) |  | ||||||
| 			if intStringLen < 0 { |  | ||||||
| 				return ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			postIndex := iNdEx + intStringLen |  | ||||||
| 			if postIndex > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) |  | ||||||
| 			iNdEx = postIndex |  | ||||||
| 		case 4: |  | ||||||
| 			if wireType != 2 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) |  | ||||||
| 			} |  | ||||||
| 			var msglen int |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				msglen |= (int(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			if msglen < 0 { |  | ||||||
| 				return ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			postIndex := iNdEx + msglen |  | ||||||
| 			if postIndex > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			if m.User == nil { |  | ||||||
| 				m.User = &containerd_v1_types.User{} |  | ||||||
| 			} |  | ||||||
| 			if err := m.User.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			iNdEx = postIndex |  | ||||||
| 		case 5: |  | ||||||
| 			if wireType != 2 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Cwd", wireType) |  | ||||||
| 			} |  | ||||||
| 			var stringLen uint64 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				stringLen |= (uint64(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			intStringLen := int(stringLen) |  | ||||||
| 			if intStringLen < 0 { |  | ||||||
| 				return ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			postIndex := iNdEx + intStringLen |  | ||||||
| 			if postIndex > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			m.Cwd = string(dAtA[iNdEx:postIndex]) |  | ||||||
| 			iNdEx = postIndex |  | ||||||
| 		case 6: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Terminal", wireType) |  | ||||||
| 			} |  | ||||||
| 			var v int |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				v |= (int(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			m.Terminal = bool(v != 0) |  | ||||||
| 		case 7: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.State = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.State |= (containerd_v1_types1.State(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 8: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.ExitStatus = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.ExitStatus |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			iNdEx = preIndex |  | ||||||
| 			skippy, err := skipProcess(dAtA[iNdEx:]) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if skippy < 0 { |  | ||||||
| 				return ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			if (iNdEx + skippy) > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			iNdEx += skippy |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if iNdEx > l { |  | ||||||
| 		return io.ErrUnexpectedEOF |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| func skipProcess(dAtA []byte) (n int, err error) { |  | ||||||
| 	l := len(dAtA) |  | ||||||
| 	iNdEx := 0 |  | ||||||
| 	for iNdEx < l { |  | ||||||
| 		var wire uint64 |  | ||||||
| 		for shift := uint(0); ; shift += 7 { |  | ||||||
| 			if shift >= 64 { |  | ||||||
| 				return 0, ErrIntOverflowProcess |  | ||||||
| 			} |  | ||||||
| 			if iNdEx >= l { |  | ||||||
| 				return 0, io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			b := dAtA[iNdEx] |  | ||||||
| 			iNdEx++ |  | ||||||
| 			wire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 			if b < 0x80 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		wireType := int(wire & 0x7) |  | ||||||
| 		switch wireType { |  | ||||||
| 		case 0: |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return 0, ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return 0, io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				iNdEx++ |  | ||||||
| 				if dAtA[iNdEx-1] < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 1: |  | ||||||
| 			iNdEx += 8 |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 2: |  | ||||||
| 			var length int |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return 0, ErrIntOverflowProcess |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return 0, io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				length |= (int(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			iNdEx += length |  | ||||||
| 			if length < 0 { |  | ||||||
| 				return 0, ErrInvalidLengthProcess |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 3: |  | ||||||
| 			for { |  | ||||||
| 				var innerWire uint64 |  | ||||||
| 				var start int = iNdEx |  | ||||||
| 				for shift := uint(0); ; shift += 7 { |  | ||||||
| 					if shift >= 64 { |  | ||||||
| 						return 0, ErrIntOverflowProcess |  | ||||||
| 					} |  | ||||||
| 					if iNdEx >= l { |  | ||||||
| 						return 0, io.ErrUnexpectedEOF |  | ||||||
| 					} |  | ||||||
| 					b := dAtA[iNdEx] |  | ||||||
| 					iNdEx++ |  | ||||||
| 					innerWire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 					if b < 0x80 { |  | ||||||
| 						break |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				innerWireType := int(innerWire & 0x7) |  | ||||||
| 				if innerWireType == 4 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 				next, err := skipProcess(dAtA[start:]) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return 0, err |  | ||||||
| 				} |  | ||||||
| 				iNdEx = start + next |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 4: |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 5: |  | ||||||
| 			iNdEx += 4 |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		default: |  | ||||||
| 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	panic("unreachable") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	ErrInvalidLengthProcess = fmt.Errorf("proto: negative length found during unmarshaling") |  | ||||||
| 	ErrIntOverflowProcess   = fmt.Errorf("proto: integer overflow") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterFile("github.com/docker/containerd/api/types/process/process.proto", fileDescriptorProcess) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var fileDescriptorProcess = []byte{ |  | ||||||
| 	// 297 bytes of a gzipped FileDescriptorProto |  | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x90, 0xb1, 0x4e, 0xc3, 0x30, |  | ||||||
| 	0x10, 0x86, 0x7b, 0x34, 0x6d, 0x83, 0x2b, 0x10, 0x32, 0x8b, 0xc9, 0x60, 0x2c, 0xa6, 0x2c, 0x38, |  | ||||||
| 	0x50, 0x24, 0xc4, 0xc0, 0xc4, 0x13, 0xa0, 0x54, 0xcc, 0x28, 0x75, 0xac, 0x62, 0x41, 0xe3, 0xc8, |  | ||||||
| 	0x76, 0x5a, 0xd8, 0x78, 0xbc, 0x8e, 0x8c, 0x8c, 0x34, 0x6f, 0xc0, 0x1b, 0x20, 0x3b, 0x52, 0x59, |  | ||||||
| 	0x3a, 0x74, 0x39, 0xdf, 0xfd, 0xfa, 0xee, 0xd7, 0x7f, 0x46, 0xf7, 0x73, 0xe5, 0x5e, 0x9a, 0x19, |  | ||||||
| 	0x17, 0x7a, 0x91, 0x95, 0x5a, 0xbc, 0x4a, 0x93, 0x09, 0x5d, 0xb9, 0x42, 0x55, 0xd2, 0x94, 0x59, |  | ||||||
| 	0x51, 0xab, 0xcc, 0x7d, 0xd4, 0xd2, 0x66, 0xb5, 0xd1, 0x42, 0xda, 0xed, 0xcb, 0x6b, 0xa3, 0x9d, |  | ||||||
| 	0xc6, 0xa7, 0xff, 0x2c, 0x5f, 0x5e, 0xf3, 0x80, 0x26, 0xb7, 0x7b, 0x5a, 0x36, 0x56, 0x9a, 0x50, |  | ||||||
| 	0x3a, 0xb3, 0xe4, 0x6e, 0xcf, 0x3d, 0xeb, 0x0a, 0x27, 0xbb, 0xda, 0x6d, 0x5e, 0xfc, 0x02, 0x1a, |  | ||||||
| 	0x3d, 0x76, 0xc1, 0xf0, 0x09, 0xea, 0xd7, 0xaa, 0x24, 0xc0, 0x20, 0x3d, 0xca, 0x7d, 0x8b, 0x31, |  | ||||||
| 	0x8a, 0x0a, 0x33, 0xb7, 0xe4, 0x80, 0xf5, 0xd3, 0xc3, 0x3c, 0xf4, 0x9e, 0x92, 0xd5, 0x92, 0xf4, |  | ||||||
| 	0x83, 0xe4, 0x5b, 0x7c, 0x89, 0x22, 0x9f, 0x85, 0x44, 0x0c, 0xd2, 0xf1, 0xe4, 0x8c, 0xef, 0xb8, |  | ||||||
| 	0x8c, 0x3f, 0x59, 0x69, 0xf2, 0x80, 0x79, 0x03, 0xb1, 0x2a, 0xc9, 0x80, 0x81, 0x37, 0x10, 0xab, |  | ||||||
| 	0x12, 0x27, 0x28, 0x76, 0xd2, 0x2c, 0x54, 0x55, 0xbc, 0x91, 0x21, 0x83, 0x34, 0xce, 0xb7, 0x33, |  | ||||||
| 	0xbe, 0x42, 0x83, 0x90, 0x97, 0x8c, 0x18, 0xa4, 0xc7, 0x93, 0x64, 0xa7, 0xfb, 0xd4, 0x13, 0x79, |  | ||||||
| 	0x07, 0xe2, 0x73, 0x34, 0x96, 0xef, 0xca, 0x3d, 0xfb, 0xa9, 0xb1, 0x24, 0x0e, 0xe7, 0x20, 0x2f, |  | ||||||
| 	0x4d, 0x83, 0xf2, 0x40, 0xd6, 0x1b, 0xda, 0xfb, 0xde, 0xd0, 0xde, 0x67, 0x4b, 0x61, 0xdd, 0x52, |  | ||||||
| 	0xf8, 0x6a, 0x29, 0xfc, 0xb4, 0x14, 0x66, 0xc3, 0xf0, 0x29, 0x37, 0x7f, 0x01, 0x00, 0x00, 0xff, |  | ||||||
| 	0xff, 0x19, 0xf5, 0x94, 0x44, 0xdb, 0x01, 0x00, 0x00, |  | ||||||
| } |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| syntax = "proto3"; |  | ||||||
| 
 |  | ||||||
| package containerd.v1.types; |  | ||||||
| 
 |  | ||||||
| import "github.com/docker/containerd/api/types/user/user.proto"; |  | ||||||
| import "github.com/docker/containerd/api/types/state/state.proto"; |  | ||||||
| 
 |  | ||||||
| message Process { |  | ||||||
| 	uint32 pid = 1; |  | ||||||
| 	repeated string args = 2; |  | ||||||
| 	repeated string env = 3; |  | ||||||
| 	User user = 4; |  | ||||||
| 	string cwd = 5; |  | ||||||
| 	bool terminal = 6; |  | ||||||
| 	State state = 7; // only used by shim at the moment |  | ||||||
| 	uint32 exit_status = 8; |  | ||||||
| } |  | ||||||
|  | @ -1,83 +0,0 @@ | ||||||
| // Code generated by protoc-gen-gogo. |  | ||||||
| // source: github.com/docker/containerd/api/types/state/state.proto |  | ||||||
| // DO NOT EDIT! |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| Package state is a generated protocol buffer package. |  | ||||||
| 
 |  | ||||||
| It is generated from these files: |  | ||||||
| 	github.com/docker/containerd/api/types/state/state.proto |  | ||||||
| 
 |  | ||||||
| It has these top-level messages: |  | ||||||
| */ |  | ||||||
| package state |  | ||||||
| 
 |  | ||||||
| import proto "github.com/gogo/protobuf/proto" |  | ||||||
| import fmt "fmt" |  | ||||||
| import math "math" |  | ||||||
| 
 |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ = proto.Marshal |  | ||||||
| var _ = fmt.Errorf |  | ||||||
| var _ = math.Inf |  | ||||||
| 
 |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the proto package it is being compiled against. |  | ||||||
| // A compilation error at this line likely means your copy of the |  | ||||||
| // proto package needs to be updated. |  | ||||||
| const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package |  | ||||||
| 
 |  | ||||||
| // At the moment we have same State type for Container and Process |  | ||||||
| type State int32 |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	State_UNKNOWN State = 0 |  | ||||||
| 	State_CREATED State = 1 |  | ||||||
| 	State_RUNNING State = 2 |  | ||||||
| 	State_STOPPED State = 3 |  | ||||||
| 	State_PAUSED  State = 4 |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var State_name = map[int32]string{ |  | ||||||
| 	0: "UNKNOWN", |  | ||||||
| 	1: "CREATED", |  | ||||||
| 	2: "RUNNING", |  | ||||||
| 	3: "STOPPED", |  | ||||||
| 	4: "PAUSED", |  | ||||||
| } |  | ||||||
| var State_value = map[string]int32{ |  | ||||||
| 	"UNKNOWN": 0, |  | ||||||
| 	"CREATED": 1, |  | ||||||
| 	"RUNNING": 2, |  | ||||||
| 	"STOPPED": 3, |  | ||||||
| 	"PAUSED":  4, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (x State) String() string { |  | ||||||
| 	return proto.EnumName(State_name, int32(x)) |  | ||||||
| } |  | ||||||
| func (State) EnumDescriptor() ([]byte, []int) { return fileDescriptorState, []int{0} } |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterEnum("containerd.v1.types.State", State_name, State_value) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterFile("github.com/docker/containerd/api/types/state/state.proto", fileDescriptorState) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var fileDescriptorState = []byte{ |  | ||||||
| 	// 184 bytes of a gzipped FileDescriptorProto |  | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x48, 0xcf, 0x2c, 0xc9, |  | ||||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xc9, 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0x4f, 0xce, |  | ||||||
| 	0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0xd1, 0x4f, 0x2c, 0xc8, 0xd4, 0x2f, 0xa9, 0x2c, |  | ||||||
| 	0x48, 0x2d, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x49, 0x85, 0x90, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, |  | ||||||
| 	0x42, 0xc2, 0x08, 0x75, 0x7a, 0x65, 0x86, 0x7a, 0x60, 0x65, 0x5a, 0xee, 0x5c, 0xac, 0xc1, 0x20, |  | ||||||
| 	0x35, 0x42, 0xdc, 0x5c, 0xec, 0xa1, 0x7e, 0xde, 0x7e, 0xfe, 0xe1, 0x7e, 0x02, 0x0c, 0x20, 0x8e, |  | ||||||
| 	0x73, 0x90, 0xab, 0x63, 0x88, 0xab, 0x8b, 0x00, 0x23, 0x88, 0x13, 0x14, 0xea, 0xe7, 0xe7, 0xe9, |  | ||||||
| 	0xe7, 0x2e, 0xc0, 0x04, 0xe2, 0x04, 0x87, 0xf8, 0x07, 0x04, 0xb8, 0xba, 0x08, 0x30, 0x0b, 0x71, |  | ||||||
| 	0x71, 0xb1, 0x05, 0x38, 0x86, 0x06, 0xbb, 0xba, 0x08, 0xb0, 0x38, 0x49, 0x9c, 0x78, 0x28, 0xc7, |  | ||||||
| 	0x70, 0xe3, 0xa1, 0x1c, 0x43, 0xc3, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, |  | ||||||
| 	0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x31, 0x89, 0x0d, 0x6c, 0xbd, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, |  | ||||||
| 	0xcd, 0xc9, 0x58, 0x29, 0xba, 0x00, 0x00, 0x00, |  | ||||||
| } |  | ||||||
|  | @ -1,12 +0,0 @@ | ||||||
| syntax = "proto3"; |  | ||||||
| 
 |  | ||||||
| package containerd.v1.types; |  | ||||||
| 
 |  | ||||||
| // At the moment we have same State type for Container and Process |  | ||||||
| enum State { |  | ||||||
| 	UNKNOWN = 0; |  | ||||||
| 	CREATED = 1; |  | ||||||
| 	RUNNING = 2; |  | ||||||
| 	STOPPED = 3; |  | ||||||
| 	PAUSED = 4; |  | ||||||
| } |  | ||||||
|  | @ -1,446 +0,0 @@ | ||||||
| // Code generated by protoc-gen-gogo. |  | ||||||
| // source: github.com/docker/containerd/api/types/user/user.proto |  | ||||||
| // DO NOT EDIT! |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| 	Package user is a generated protocol buffer package. |  | ||||||
| 
 |  | ||||||
| 	It is generated from these files: |  | ||||||
| 		github.com/docker/containerd/api/types/user/user.proto |  | ||||||
| 
 |  | ||||||
| 	It has these top-level messages: |  | ||||||
| 		User |  | ||||||
| */ |  | ||||||
| package user |  | ||||||
| 
 |  | ||||||
| import proto "github.com/gogo/protobuf/proto" |  | ||||||
| import fmt "fmt" |  | ||||||
| import math "math" |  | ||||||
| 
 |  | ||||||
| import strings "strings" |  | ||||||
| import reflect "reflect" |  | ||||||
| 
 |  | ||||||
| import io "io" |  | ||||||
| 
 |  | ||||||
| // Reference imports to suppress errors if they are not otherwise used. |  | ||||||
| var _ = proto.Marshal |  | ||||||
| var _ = fmt.Errorf |  | ||||||
| var _ = math.Inf |  | ||||||
| 
 |  | ||||||
| // This is a compile-time assertion to ensure that this generated file |  | ||||||
| // is compatible with the proto package it is being compiled against. |  | ||||||
| // A compilation error at this line likely means your copy of the |  | ||||||
| // proto package needs to be updated. |  | ||||||
| const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package |  | ||||||
| 
 |  | ||||||
| type User struct { |  | ||||||
| 	Uid            uint32   `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"` |  | ||||||
| 	Gid            uint32   `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` |  | ||||||
| 	AdditionalGids []uint32 `protobuf:"varint,3,rep,packed,name=additional_gids,json=additionalGids" json:"additional_gids,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *User) Reset()                    { *m = User{} } |  | ||||||
| func (*User) ProtoMessage()               {} |  | ||||||
| func (*User) Descriptor() ([]byte, []int) { return fileDescriptorUser, []int{0} } |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterType((*User)(nil), "containerd.v1.types.User") |  | ||||||
| } |  | ||||||
| func (m *User) Marshal() (dAtA []byte, err error) { |  | ||||||
| 	size := m.Size() |  | ||||||
| 	dAtA = make([]byte, size) |  | ||||||
| 	n, err := m.MarshalTo(dAtA) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return dAtA[:n], nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (m *User) MarshalTo(dAtA []byte) (int, error) { |  | ||||||
| 	var i int |  | ||||||
| 	_ = i |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	if m.Uid != 0 { |  | ||||||
| 		dAtA[i] = 0x8 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintUser(dAtA, i, uint64(m.Uid)) |  | ||||||
| 	} |  | ||||||
| 	if m.Gid != 0 { |  | ||||||
| 		dAtA[i] = 0x10 |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintUser(dAtA, i, uint64(m.Gid)) |  | ||||||
| 	} |  | ||||||
| 	if len(m.AdditionalGids) > 0 { |  | ||||||
| 		dAtA2 := make([]byte, len(m.AdditionalGids)*10) |  | ||||||
| 		var j1 int |  | ||||||
| 		for _, num := range m.AdditionalGids { |  | ||||||
| 			for num >= 1<<7 { |  | ||||||
| 				dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) |  | ||||||
| 				num >>= 7 |  | ||||||
| 				j1++ |  | ||||||
| 			} |  | ||||||
| 			dAtA2[j1] = uint8(num) |  | ||||||
| 			j1++ |  | ||||||
| 		} |  | ||||||
| 		dAtA[i] = 0x1a |  | ||||||
| 		i++ |  | ||||||
| 		i = encodeVarintUser(dAtA, i, uint64(j1)) |  | ||||||
| 		i += copy(dAtA[i:], dAtA2[:j1]) |  | ||||||
| 	} |  | ||||||
| 	return i, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func encodeFixed64User(dAtA []byte, offset int, v uint64) int { |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	dAtA[offset+1] = uint8(v >> 8) |  | ||||||
| 	dAtA[offset+2] = uint8(v >> 16) |  | ||||||
| 	dAtA[offset+3] = uint8(v >> 24) |  | ||||||
| 	dAtA[offset+4] = uint8(v >> 32) |  | ||||||
| 	dAtA[offset+5] = uint8(v >> 40) |  | ||||||
| 	dAtA[offset+6] = uint8(v >> 48) |  | ||||||
| 	dAtA[offset+7] = uint8(v >> 56) |  | ||||||
| 	return offset + 8 |  | ||||||
| } |  | ||||||
| func encodeFixed32User(dAtA []byte, offset int, v uint32) int { |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	dAtA[offset+1] = uint8(v >> 8) |  | ||||||
| 	dAtA[offset+2] = uint8(v >> 16) |  | ||||||
| 	dAtA[offset+3] = uint8(v >> 24) |  | ||||||
| 	return offset + 4 |  | ||||||
| } |  | ||||||
| func encodeVarintUser(dAtA []byte, offset int, v uint64) int { |  | ||||||
| 	for v >= 1<<7 { |  | ||||||
| 		dAtA[offset] = uint8(v&0x7f | 0x80) |  | ||||||
| 		v >>= 7 |  | ||||||
| 		offset++ |  | ||||||
| 	} |  | ||||||
| 	dAtA[offset] = uint8(v) |  | ||||||
| 	return offset + 1 |  | ||||||
| } |  | ||||||
| func (m *User) Size() (n int) { |  | ||||||
| 	var l int |  | ||||||
| 	_ = l |  | ||||||
| 	if m.Uid != 0 { |  | ||||||
| 		n += 1 + sovUser(uint64(m.Uid)) |  | ||||||
| 	} |  | ||||||
| 	if m.Gid != 0 { |  | ||||||
| 		n += 1 + sovUser(uint64(m.Gid)) |  | ||||||
| 	} |  | ||||||
| 	if len(m.AdditionalGids) > 0 { |  | ||||||
| 		l = 0 |  | ||||||
| 		for _, e := range m.AdditionalGids { |  | ||||||
| 			l += sovUser(uint64(e)) |  | ||||||
| 		} |  | ||||||
| 		n += 1 + sovUser(uint64(l)) + l |  | ||||||
| 	} |  | ||||||
| 	return n |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func sovUser(x uint64) (n int) { |  | ||||||
| 	for { |  | ||||||
| 		n++ |  | ||||||
| 		x >>= 7 |  | ||||||
| 		if x == 0 { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return n |  | ||||||
| } |  | ||||||
| func sozUser(x uint64) (n int) { |  | ||||||
| 	return sovUser(uint64((x << 1) ^ uint64((int64(x) >> 63)))) |  | ||||||
| } |  | ||||||
| func (this *User) String() string { |  | ||||||
| 	if this == nil { |  | ||||||
| 		return "nil" |  | ||||||
| 	} |  | ||||||
| 	s := strings.Join([]string{`&User{`, |  | ||||||
| 		`Uid:` + fmt.Sprintf("%v", this.Uid) + `,`, |  | ||||||
| 		`Gid:` + fmt.Sprintf("%v", this.Gid) + `,`, |  | ||||||
| 		`AdditionalGids:` + fmt.Sprintf("%v", this.AdditionalGids) + `,`, |  | ||||||
| 		`}`, |  | ||||||
| 	}, "") |  | ||||||
| 	return s |  | ||||||
| } |  | ||||||
| func valueToStringUser(v interface{}) string { |  | ||||||
| 	rv := reflect.ValueOf(v) |  | ||||||
| 	if rv.IsNil() { |  | ||||||
| 		return "nil" |  | ||||||
| 	} |  | ||||||
| 	pv := reflect.Indirect(rv).Interface() |  | ||||||
| 	return fmt.Sprintf("*%v", pv) |  | ||||||
| } |  | ||||||
| func (m *User) Unmarshal(dAtA []byte) error { |  | ||||||
| 	l := len(dAtA) |  | ||||||
| 	iNdEx := 0 |  | ||||||
| 	for iNdEx < l { |  | ||||||
| 		preIndex := iNdEx |  | ||||||
| 		var wire uint64 |  | ||||||
| 		for shift := uint(0); ; shift += 7 { |  | ||||||
| 			if shift >= 64 { |  | ||||||
| 				return ErrIntOverflowUser |  | ||||||
| 			} |  | ||||||
| 			if iNdEx >= l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			b := dAtA[iNdEx] |  | ||||||
| 			iNdEx++ |  | ||||||
| 			wire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 			if b < 0x80 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		fieldNum := int32(wire >> 3) |  | ||||||
| 		wireType := int(wire & 0x7) |  | ||||||
| 		if wireType == 4 { |  | ||||||
| 			return fmt.Errorf("proto: User: wiretype end group for non-group") |  | ||||||
| 		} |  | ||||||
| 		if fieldNum <= 0 { |  | ||||||
| 			return fmt.Errorf("proto: User: illegal tag %d (wire type %d)", fieldNum, wire) |  | ||||||
| 		} |  | ||||||
| 		switch fieldNum { |  | ||||||
| 		case 1: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.Uid = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowUser |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.Uid |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 2: |  | ||||||
| 			if wireType != 0 { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field Gid", wireType) |  | ||||||
| 			} |  | ||||||
| 			m.Gid = 0 |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return ErrIntOverflowUser |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				m.Gid |= (uint32(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case 3: |  | ||||||
| 			if wireType == 2 { |  | ||||||
| 				var packedLen int |  | ||||||
| 				for shift := uint(0); ; shift += 7 { |  | ||||||
| 					if shift >= 64 { |  | ||||||
| 						return ErrIntOverflowUser |  | ||||||
| 					} |  | ||||||
| 					if iNdEx >= l { |  | ||||||
| 						return io.ErrUnexpectedEOF |  | ||||||
| 					} |  | ||||||
| 					b := dAtA[iNdEx] |  | ||||||
| 					iNdEx++ |  | ||||||
| 					packedLen |= (int(b) & 0x7F) << shift |  | ||||||
| 					if b < 0x80 { |  | ||||||
| 						break |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				if packedLen < 0 { |  | ||||||
| 					return ErrInvalidLengthUser |  | ||||||
| 				} |  | ||||||
| 				postIndex := iNdEx + packedLen |  | ||||||
| 				if postIndex > l { |  | ||||||
| 					return io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				for iNdEx < postIndex { |  | ||||||
| 					var v uint32 |  | ||||||
| 					for shift := uint(0); ; shift += 7 { |  | ||||||
| 						if shift >= 64 { |  | ||||||
| 							return ErrIntOverflowUser |  | ||||||
| 						} |  | ||||||
| 						if iNdEx >= l { |  | ||||||
| 							return io.ErrUnexpectedEOF |  | ||||||
| 						} |  | ||||||
| 						b := dAtA[iNdEx] |  | ||||||
| 						iNdEx++ |  | ||||||
| 						v |= (uint32(b) & 0x7F) << shift |  | ||||||
| 						if b < 0x80 { |  | ||||||
| 							break |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 					m.AdditionalGids = append(m.AdditionalGids, v) |  | ||||||
| 				} |  | ||||||
| 			} else if wireType == 0 { |  | ||||||
| 				var v uint32 |  | ||||||
| 				for shift := uint(0); ; shift += 7 { |  | ||||||
| 					if shift >= 64 { |  | ||||||
| 						return ErrIntOverflowUser |  | ||||||
| 					} |  | ||||||
| 					if iNdEx >= l { |  | ||||||
| 						return io.ErrUnexpectedEOF |  | ||||||
| 					} |  | ||||||
| 					b := dAtA[iNdEx] |  | ||||||
| 					iNdEx++ |  | ||||||
| 					v |= (uint32(b) & 0x7F) << shift |  | ||||||
| 					if b < 0x80 { |  | ||||||
| 						break |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				m.AdditionalGids = append(m.AdditionalGids, v) |  | ||||||
| 			} else { |  | ||||||
| 				return fmt.Errorf("proto: wrong wireType = %d for field AdditionalGids", wireType) |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			iNdEx = preIndex |  | ||||||
| 			skippy, err := skipUser(dAtA[iNdEx:]) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if skippy < 0 { |  | ||||||
| 				return ErrInvalidLengthUser |  | ||||||
| 			} |  | ||||||
| 			if (iNdEx + skippy) > l { |  | ||||||
| 				return io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			iNdEx += skippy |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if iNdEx > l { |  | ||||||
| 		return io.ErrUnexpectedEOF |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| func skipUser(dAtA []byte) (n int, err error) { |  | ||||||
| 	l := len(dAtA) |  | ||||||
| 	iNdEx := 0 |  | ||||||
| 	for iNdEx < l { |  | ||||||
| 		var wire uint64 |  | ||||||
| 		for shift := uint(0); ; shift += 7 { |  | ||||||
| 			if shift >= 64 { |  | ||||||
| 				return 0, ErrIntOverflowUser |  | ||||||
| 			} |  | ||||||
| 			if iNdEx >= l { |  | ||||||
| 				return 0, io.ErrUnexpectedEOF |  | ||||||
| 			} |  | ||||||
| 			b := dAtA[iNdEx] |  | ||||||
| 			iNdEx++ |  | ||||||
| 			wire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 			if b < 0x80 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		wireType := int(wire & 0x7) |  | ||||||
| 		switch wireType { |  | ||||||
| 		case 0: |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return 0, ErrIntOverflowUser |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return 0, io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				iNdEx++ |  | ||||||
| 				if dAtA[iNdEx-1] < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 1: |  | ||||||
| 			iNdEx += 8 |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 2: |  | ||||||
| 			var length int |  | ||||||
| 			for shift := uint(0); ; shift += 7 { |  | ||||||
| 				if shift >= 64 { |  | ||||||
| 					return 0, ErrIntOverflowUser |  | ||||||
| 				} |  | ||||||
| 				if iNdEx >= l { |  | ||||||
| 					return 0, io.ErrUnexpectedEOF |  | ||||||
| 				} |  | ||||||
| 				b := dAtA[iNdEx] |  | ||||||
| 				iNdEx++ |  | ||||||
| 				length |= (int(b) & 0x7F) << shift |  | ||||||
| 				if b < 0x80 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			iNdEx += length |  | ||||||
| 			if length < 0 { |  | ||||||
| 				return 0, ErrInvalidLengthUser |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 3: |  | ||||||
| 			for { |  | ||||||
| 				var innerWire uint64 |  | ||||||
| 				var start int = iNdEx |  | ||||||
| 				for shift := uint(0); ; shift += 7 { |  | ||||||
| 					if shift >= 64 { |  | ||||||
| 						return 0, ErrIntOverflowUser |  | ||||||
| 					} |  | ||||||
| 					if iNdEx >= l { |  | ||||||
| 						return 0, io.ErrUnexpectedEOF |  | ||||||
| 					} |  | ||||||
| 					b := dAtA[iNdEx] |  | ||||||
| 					iNdEx++ |  | ||||||
| 					innerWire |= (uint64(b) & 0x7F) << shift |  | ||||||
| 					if b < 0x80 { |  | ||||||
| 						break |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				innerWireType := int(innerWire & 0x7) |  | ||||||
| 				if innerWireType == 4 { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 				next, err := skipUser(dAtA[start:]) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return 0, err |  | ||||||
| 				} |  | ||||||
| 				iNdEx = start + next |  | ||||||
| 			} |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 4: |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		case 5: |  | ||||||
| 			iNdEx += 4 |  | ||||||
| 			return iNdEx, nil |  | ||||||
| 		default: |  | ||||||
| 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	panic("unreachable") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	ErrInvalidLengthUser = fmt.Errorf("proto: negative length found during unmarshaling") |  | ||||||
| 	ErrIntOverflowUser   = fmt.Errorf("proto: integer overflow") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	proto.RegisterFile("github.com/docker/containerd/api/types/user/user.proto", fileDescriptorUser) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var fileDescriptorUser = []byte{ |  | ||||||
| 	// 188 bytes of a gzipped FileDescriptorProto |  | ||||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x32, 0x4b, 0xcf, 0x2c, 0xc9, |  | ||||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xc9, 0x4f, 0xce, 0x4e, 0x2d, 0xd2, 0x4f, 0xce, |  | ||||||
| 	0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0xd1, 0x4f, 0x2c, 0xc8, 0xd4, 0x2f, 0xa9, 0x2c, |  | ||||||
| 	0x48, 0x2d, 0xd6, 0x2f, 0x2d, 0x4e, 0x2d, 0x02, 0x13, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, |  | ||||||
| 	0xc2, 0x08, 0x55, 0x7a, 0x65, 0x86, 0x7a, 0x60, 0x45, 0x4a, 0xc1, 0x5c, 0x2c, 0xa1, 0xc5, 0xa9, |  | ||||||
| 	0x45, 0x42, 0x02, 0x5c, 0xcc, 0xa5, 0x99, 0x29, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xbc, 0x41, 0x20, |  | ||||||
| 	0x26, 0x48, 0x24, 0x3d, 0x33, 0x45, 0x82, 0x09, 0x22, 0x92, 0x9e, 0x99, 0x22, 0xa4, 0xce, 0xc5, |  | ||||||
| 	0x9f, 0x98, 0x92, 0x92, 0x59, 0x92, 0x99, 0x9f, 0x97, 0x98, 0x13, 0x9f, 0x9e, 0x99, 0x52, 0x2c, |  | ||||||
| 	0xc1, 0xac, 0xc0, 0xac, 0xc1, 0x1b, 0xc4, 0x87, 0x10, 0x76, 0xcf, 0x4c, 0x29, 0x76, 0x92, 0x38, |  | ||||||
| 	0xf1, 0x50, 0x8e, 0xe1, 0xc6, 0x43, 0x39, 0x86, 0x86, 0x47, 0x72, 0x8c, 0x27, 0x1e, 0xc9, 0x31, |  | ||||||
| 	0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0x63, 0x12, 0x1b, 0xd8, 0x29, 0xc6, 0x80, 0x00, |  | ||||||
| 	0x00, 0x00, 0xff, 0xff, 0x39, 0x97, 0xe1, 0xe0, 0xc4, 0x00, 0x00, 0x00, |  | ||||||
| } |  | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| syntax = "proto3"; |  | ||||||
| 
 |  | ||||||
| package containerd.v1.types; |  | ||||||
| 
 |  | ||||||
| message User { |  | ||||||
| 	uint32 uid = 1; |  | ||||||
| 	uint32 gid = 2; |  | ||||||
| 	repeated uint32 additional_gids = 3; |  | ||||||
| } |  | ||||||
|  | @ -1,70 +0,0 @@ | ||||||
| package bundle |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 
 |  | ||||||
| 	"github.com/opencontainers/runtime-spec/specs-go" |  | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const configName = "config.json" |  | ||||||
| 
 |  | ||||||
| func New(path string, s *specs.Spec) (*Bundle, error) { |  | ||||||
| 	if err := os.Mkdir(path, 0700); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	b := &Bundle{ |  | ||||||
| 		Path: path, |  | ||||||
| 	} |  | ||||||
| 	if err := os.Mkdir(filepath.Join(path, "rootfs"), 0700); err != nil { |  | ||||||
| 		b.Delete() |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	f, err := os.Create(filepath.Join(path, configName)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		b.Delete() |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	err = json.NewEncoder(f).Encode(s) |  | ||||||
| 	f.Close() |  | ||||||
| 	if err != nil { |  | ||||||
| 		b.Delete() |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return b, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func Load(path string) (*Bundle, error) { |  | ||||||
| 	fi, err := os.Stat(path) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to access %q", path) |  | ||||||
| 	} |  | ||||||
| 	if !fi.IsDir() { |  | ||||||
| 		return nil, errors.Errorf("%q is not a directory", path) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &Bundle{ |  | ||||||
| 		Path: path, |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Bundle struct { |  | ||||||
| 	Path string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (b *Bundle) Config() (*specs.Spec, error) { |  | ||||||
| 	var s specs.Spec |  | ||||||
| 	f, err := os.Open(filepath.Join(b.Path, configName)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	err = json.NewDecoder(f).Decode(&s) |  | ||||||
| 	f.Close() |  | ||||||
| 	return &s, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (b *Bundle) Delete() error { |  | ||||||
| 	return os.RemoveAll(b.Path) |  | ||||||
| } |  | ||||||
|  | @ -2,6 +2,7 @@ package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -52,6 +53,9 @@ func main() { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  | 		if err := setupRoot(); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
| 		var ( | 		var ( | ||||||
| 			server = grpc.NewServer() | 			server = grpc.NewServer() | ||||||
| 			sv     = shim.New() | 			sv     = shim.New() | ||||||
|  | @ -84,7 +88,7 @@ func setupSignals() (chan os.Signal, error) { | ||||||
| // serve serves the grpc API over a unix socket at the provided path | // serve serves the grpc API over a unix socket at the provided path | ||||||
| // this function does not block | // this function does not block | ||||||
| func serve(server *grpc.Server, path string) error { | func serve(server *grpc.Server, path string) error { | ||||||
| 	l, err := utils.CreateUnixSocket(path) | 	l, err := net.FileListener(os.NewFile(3, "socket")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -126,3 +130,8 @@ func handleSignals(signals chan os.Signal, server *grpc.Server, service *shim.Se | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // setupRoot sets up the root as the shim is started in its own mount namespace | ||||||
|  | func setupRoot() error { | ||||||
|  | 	return syscall.Mount("", "/", "", syscall.MS_SLAVE|syscall.MS_REC, "") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -3,16 +3,12 @@ package main | ||||||
| import ( | import ( | ||||||
| 	_ "expvar" | 	_ "expvar" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	_ "net/http/pprof" | 	_ "net/http/pprof" | ||||||
| 	"net/url" |  | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"runtime" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| 	"syscall" | 	"syscall" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	gocontext "golang.org/x/net/context" | 	gocontext "golang.org/x/net/context" | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
|  | @ -20,17 +16,13 @@ import ( | ||||||
| 	"github.com/Sirupsen/logrus" | 	"github.com/Sirupsen/logrus" | ||||||
| 	"github.com/docker/containerd" | 	"github.com/docker/containerd" | ||||||
| 	api "github.com/docker/containerd/api/services/execution" | 	api "github.com/docker/containerd/api/services/execution" | ||||||
| 	"github.com/docker/containerd/events" | 	_ "github.com/docker/containerd/linux" | ||||||
| 	"github.com/docker/containerd/log" | 	"github.com/docker/containerd/log" | ||||||
| 	"github.com/docker/containerd/supervisor" | 	"github.com/docker/containerd/services/execution" | ||||||
| 	"github.com/docker/containerd/utils" | 	"github.com/docker/containerd/utils" | ||||||
| 	metrics "github.com/docker/go-metrics" | 	metrics "github.com/docker/go-metrics" | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
| 
 |  | ||||||
| 	natsd "github.com/nats-io/gnatsd/server" |  | ||||||
| 	"github.com/nats-io/go-nats" |  | ||||||
| 	stand "github.com/nats-io/nats-streaming-server/server" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const usage = ` | const usage = ` | ||||||
|  | @ -43,10 +35,7 @@ const usage = ` | ||||||
| high performance container runtime | high performance container runtime | ||||||
| ` | ` | ||||||
| 
 | 
 | ||||||
| const ( | var global = log.WithModule(gocontext.Background(), "containerd") | ||||||
| 	StanClusterID = "containerd" |  | ||||||
| 	stanClientID  = "containerd" |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
| 	app := cli.NewApp() | 	app := cli.NewApp() | ||||||
|  | @ -83,59 +72,120 @@ func main() { | ||||||
| 			Usage: "tcp address to serve metrics on", | 			Usage: "tcp address to serve metrics on", | ||||||
| 			Value: "127.0.0.1:7897", | 			Value: "127.0.0.1:7897", | ||||||
| 		}, | 		}, | ||||||
| 		cli.StringFlag{ |  | ||||||
| 			Name:  "events-address, e", |  | ||||||
| 			Usage: "nats address to serve events on", |  | ||||||
| 			Value: nats.DefaultURL, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
| 	app.Before = func(context *cli.Context) error { | 	app.Before = before | ||||||
|  | 	app.Action = func(context *cli.Context) error { | ||||||
|  | 		start := time.Now() | ||||||
|  | 		// start the signal handler as soon as we can to make sure that | ||||||
|  | 		// we don't miss any signals during boot | ||||||
|  | 		signals := make(chan os.Signal, 2048) | ||||||
|  | 		signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGUSR1) | ||||||
|  | 
 | ||||||
|  | 		log.G(global).Info("starting containerd boot...") | ||||||
|  | 		runtimes, err := loadRuntimes(context) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		supervisor, err := containerd.NewSupervisor(log.WithModule(global, "execution"), runtimes) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		// start debug and metrics APIs | ||||||
|  | 		if err := serveDebugAPI(context); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		serveMetricsAPI(context) | ||||||
|  | 		// start the GRPC api with the execution service registered | ||||||
|  | 		server := newGRPCServer(execution.New(supervisor)) | ||||||
|  | 		if err := serveGRPC(context, server); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		log.G(global).Infof("containerd successfully booted in %fs", time.Now().Sub(start).Seconds()) | ||||||
|  | 		return handleSignals(signals, server) | ||||||
|  | 	} | ||||||
|  | 	if err := app.Run(os.Args); err != nil { | ||||||
|  | 		fmt.Fprintf(os.Stderr, "containerd: %s\n", err) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func before(context *cli.Context) error { | ||||||
| 	if context.GlobalBool("debug") { | 	if context.GlobalBool("debug") { | ||||||
| 		logrus.SetLevel(logrus.DebugLevel) | 		logrus.SetLevel(logrus.DebugLevel) | ||||||
| 	} | 	} | ||||||
| 		if logLevel := context.GlobalString("log-level"); logLevel != "" { | 	if l := context.GlobalString("log-level"); l != "" { | ||||||
| 			lvl, err := logrus.ParseLevel(logLevel) | 		lvl, err := logrus.ParseLevel(l) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			lvl = logrus.InfoLevel | 			lvl = logrus.InfoLevel | ||||||
| 				fmt.Fprintf(os.Stderr, "Unable to parse logging level: %s\n, and being defaulted to info", logLevel) | 			fmt.Fprintf(os.Stderr, "Unable to parse logging level: %s\n, and being defaulted to info", l) | ||||||
| 		} | 		} | ||||||
| 		logrus.SetLevel(lvl) | 		logrus.SetLevel(lvl) | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 	app.Action = func(context *cli.Context) error { |  | ||||||
| 		signals := make(chan os.Signal, 2048) |  | ||||||
| 		signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGUSR1) |  | ||||||
| 
 | 
 | ||||||
| 		ctx := log.WithModule(gocontext.Background(), "containerd") | func serveMetricsAPI(context *cli.Context) { | ||||||
| 		if address := context.GlobalString("metrics-address"); address != "" { | 	if addr := context.GlobalString("metrics-address"); addr != "" { | ||||||
| 			log.G(ctx).WithField("metrics-address", address).Info("listening and serving metrics") | 		log.G(global).WithField("metrics", addr).Info("starting metrics API...") | ||||||
| 			go serveMetrics(ctx, address) | 		h := newMetricsHandler() | ||||||
|  | 		go func() { | ||||||
|  | 			if err := http.ListenAndServe(addr, h); err != nil { | ||||||
|  | 				log.G(global).WithError(err).Fatal("serve metrics API") | ||||||
|  | 			} | ||||||
|  | 		}() | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 		ea := context.GlobalString("events-address") | func newMetricsHandler() http.Handler { | ||||||
| 		log.G(ctx).WithField("events-address", ea).Info("starting nats-streaming-server") | 	m := http.NewServeMux() | ||||||
| 		s, err := startNATSServer(ea) | 	m.Handle("/metrics", metrics.Handler()) | ||||||
| 		if err != nil { | 	return m | ||||||
| 			return nil |  | ||||||
| } | } | ||||||
| 		defer s.Shutdown() |  | ||||||
| 
 | 
 | ||||||
| 		debugPath := context.GlobalString("debug-socket") | func serveDebugAPI(context *cli.Context) error { | ||||||
| 		if debugPath == "" { | 	path := context.GlobalString("debug-socket") | ||||||
|  | 	if path == "" { | ||||||
| 		return errors.New("--debug-socket path cannot be empty") | 		return errors.New("--debug-socket path cannot be empty") | ||||||
| 	} | 	} | ||||||
| 		d, err := utils.CreateUnixSocket(debugPath) | 	l, err := utils.CreateUnixSocket(path) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 	log.G(global).WithField("debug", path).Info("starting debug API...") | ||||||
|  | 	go func() { | ||||||
|  | 		defer l.Close() | ||||||
|  | 		// pprof and expvars are imported and automatically register their endpoints | ||||||
|  | 		// under /debug | ||||||
|  | 		if err := http.Serve(l, nil); err != nil { | ||||||
|  | 			log.G(global).WithError(err).Fatal("serve debug API") | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 		//publish profiling and debug socket. | func loadRuntimes(context *cli.Context) (map[string]containerd.Runtime, error) { | ||||||
| 		log.G(ctx).WithField("socket", debugPath).Info("starting profiler handlers") | 	var ( | ||||||
| 		log.G(ctx).WithFields(logrus.Fields{"expvars": "/debug/vars", "socket": debugPath}).Debug("serving expvars requests") | 		root = context.GlobalString("root") | ||||||
| 		log.G(ctx).WithFields(logrus.Fields{"pprof": "/debug/pprof", "socket": debugPath}).Debug("serving pprof requests") | 		o    = make(map[string]containerd.Runtime) | ||||||
| 		go serveProfiler(ctx, d) | 	) | ||||||
|  | 	for _, name := range containerd.Runtimes() { | ||||||
|  | 		r, err := containerd.NewRuntime(name, root) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		o[name] = r | ||||||
|  | 		log.G(global).WithField("runtime", name).Info("load runtime") | ||||||
|  | 	} | ||||||
|  | 	return o, nil | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | func newGRPCServer(service api.ContainerServiceServer) *grpc.Server { | ||||||
|  | 	s := grpc.NewServer(grpc.UnaryInterceptor(interceptor)) | ||||||
|  | 	api.RegisterContainerServiceServer(s, service) | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func serveGRPC(context *cli.Context, server *grpc.Server) error { | ||||||
| 	path := context.GlobalString("socket") | 	path := context.GlobalString("socket") | ||||||
| 	if path == "" { | 	if path == "" { | ||||||
| 		return errors.New("--socket path cannot be empty") | 		return errors.New("--socket path cannot be empty") | ||||||
|  | @ -144,129 +194,38 @@ func main() { | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 	go func() { | ||||||
| 		// Get events publisher | 		defer l.Close() | ||||||
| 		natsPoster, err := events.NewNATSPoster(StanClusterID, stanClientID) | 		if err := server.Serve(l); err != nil { | ||||||
| 		if err != nil { | 			log.G(global).WithError(err).Fatal("serve GRPC") | ||||||
| 			return err |  | ||||||
| 		} | 		} | ||||||
| 		execCtx := log.WithModule(ctx, "execution") | 	}() | ||||||
| 		execCtx = events.WithPoster(execCtx, natsPoster) | 	return nil | ||||||
| 		execService, err := supervisor.New(execCtx, context.GlobalString("root")) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 		// Intercept the GRPC call in order to populate the correct module path | func interceptor(ctx gocontext.Context, | ||||||
| 		interceptor := func(ctx gocontext.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { | 	req interface{}, | ||||||
|  | 	info *grpc.UnaryServerInfo, | ||||||
|  | 	handler grpc.UnaryHandler, | ||||||
|  | ) (interface{}, error) { | ||||||
| 	ctx = log.WithModule(ctx, "containerd") | 	ctx = log.WithModule(ctx, "containerd") | ||||||
| 	switch info.Server.(type) { | 	switch info.Server.(type) { | ||||||
| 			case api.ExecutionServiceServer: | 	case api.ContainerServiceServer: | ||||||
| 				ctx = log.WithModule(ctx, "execution") | 		ctx = log.WithModule(global, "execution") | ||||||
| 				ctx = events.WithPoster(ctx, natsPoster) |  | ||||||
| 	default: | 	default: | ||||||
| 				fmt.Printf("Unknown type: %#v\n", info.Server) | 		fmt.Printf("unknown GRPC server type: %#v\n", info.Server) | ||||||
| 	} | 	} | ||||||
| 			return handler(ctx, req) | 	return handler(global, req) | ||||||
| } | } | ||||||
| 		server := grpc.NewServer(grpc.UnaryInterceptor(interceptor)) |  | ||||||
| 		api.RegisterExecutionServiceServer(server, execService) |  | ||||||
| 		log.G(ctx).WithField("socket", l.Addr()).Info("start serving GRPC API") |  | ||||||
| 		go serveGRPC(ctx, server, l) |  | ||||||
| 
 | 
 | ||||||
|  | func handleSignals(signals chan os.Signal, server *grpc.Server) error { | ||||||
| 	for s := range signals { | 	for s := range signals { | ||||||
|  | 		log.G(global).WithField("signal", s).Debug("received signal") | ||||||
| 		switch s { | 		switch s { | ||||||
| 			case syscall.SIGUSR1: |  | ||||||
| 				dumpStacks(ctx) |  | ||||||
| 		default: | 		default: | ||||||
| 				log.G(ctx).WithField("signal", s).Info("stopping GRPC server") |  | ||||||
| 			server.Stop() | 			server.Stop() | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 	if err := app.Run(os.Args); err != nil { |  | ||||||
| 		fmt.Fprintf(os.Stderr, "containerd: %s\n", err) |  | ||||||
| 		os.Exit(1) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func serveMetrics(ctx gocontext.Context, address string) { |  | ||||||
| 	m := http.NewServeMux() |  | ||||||
| 	m.Handle("/metrics", metrics.Handler()) |  | ||||||
| 	if err := http.ListenAndServe(address, m); err != nil { |  | ||||||
| 		log.G(ctx).WithError(err).Fatal("metrics server failure") |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func serveGRPC(ctx gocontext.Context, server *grpc.Server, l net.Listener) { |  | ||||||
| 	defer l.Close() |  | ||||||
| 	if err := server.Serve(l); err != nil { |  | ||||||
| 		log.G(ctx).WithError(err).Fatal("GRPC server failure") |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func serveProfiler(ctx gocontext.Context, l net.Listener) { |  | ||||||
| 	defer l.Close() |  | ||||||
| 	if err := http.Serve(l, nil); err != nil { |  | ||||||
| 		log.G(ctx).WithError(err).Fatal("profiler server failure") |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DumpStacks dumps the runtime stack. |  | ||||||
| func dumpStacks(ctx gocontext.Context) { |  | ||||||
| 	var ( |  | ||||||
| 		buf       []byte |  | ||||||
| 		stackSize int |  | ||||||
| 	) |  | ||||||
| 	bufferLen := 16384 |  | ||||||
| 	for stackSize == len(buf) { |  | ||||||
| 		buf = make([]byte, bufferLen) |  | ||||||
| 		stackSize = runtime.Stack(buf, true) |  | ||||||
| 		bufferLen *= 2 |  | ||||||
| 	} |  | ||||||
| 	buf = buf[:stackSize] |  | ||||||
| 	log.G(ctx).Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func startNATSServer(address string) (s *stand.StanServer, err error) { |  | ||||||
| 	defer func() { |  | ||||||
| 		if r := recover(); r != nil { |  | ||||||
| 			s = nil |  | ||||||
| 			if _, ok := r.(error); !ok { |  | ||||||
| 				err = fmt.Errorf("failed to start NATS server: %v", r) |  | ||||||
| 			} else { |  | ||||||
| 				err = r.(error) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 	so, no, err := getServerOptions(address) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	s = stand.RunServerWithOpts(so, no) |  | ||||||
| 
 |  | ||||||
| 	return s, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getServerOptions(address string) (*stand.Options, *natsd.Options, error) { |  | ||||||
| 	url, err := url.Parse(address) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, errors.Wrapf(err, "failed to parse address url %q", address) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	no := stand.DefaultNatsServerOptions |  | ||||||
| 	parts := strings.Split(url.Host, ":") |  | ||||||
| 	if len(parts) == 2 { |  | ||||||
| 		no.Port, err = strconv.Atoi(parts[1]) |  | ||||||
| 	} else { |  | ||||||
| 		no.Port = nats.DefaultPort |  | ||||||
| 	} |  | ||||||
| 	no.Host = parts[0] |  | ||||||
| 
 |  | ||||||
| 	so := stand.GetDefaultOptions() |  | ||||||
| 	so.ID = StanClusterID |  | ||||||
| 
 |  | ||||||
| 	return so, &no, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -10,43 +10,20 @@ import ( | ||||||
| 
 | 
 | ||||||
| var deleteCommand = cli.Command{ | var deleteCommand = cli.Command{ | ||||||
| 	Name:      "delete", | 	Name:      "delete", | ||||||
| 	Usage:     "delete a process from containerd store", | 	Usage:     "delete an existing container", | ||||||
| 	ArgsUsage: "CONTAINER", | 	ArgsUsage: "CONTAINER", | ||||||
| 	Flags: []cli.Flag{ |  | ||||||
| 		cli.StringFlag{ |  | ||||||
| 			Name:  "pid, p", |  | ||||||
| 			Usage: "process id to be deleted", |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	Action: func(context *cli.Context) error { | 	Action: func(context *cli.Context) error { | ||||||
| 		executionService, err := getExecutionService(context) | 		containers, err := getExecutionService(context) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		id := context.Args().First() | 		id := context.Args().First() | ||||||
| 		if id == "" { | 		if id == "" { | ||||||
| 			return errors.New("container id must be provided") | 			return errors.New(" id must be provided") | ||||||
| 		} | 		} | ||||||
| 
 | 		_, err = containers.Delete(gocontext.Background(), &execution.DeleteRequest{ | ||||||
| 		pid := uint32(context.Int64("pid")) |  | ||||||
| 		if pid != 0 { |  | ||||||
| 			_, err = executionService.DeleteProcess(gocontext.Background(), &execution.DeleteProcessRequest{ |  | ||||||
| 				ContainerID: id, |  | ||||||
| 				Pid:         pid, |  | ||||||
| 			}) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if _, err := executionService.DeleteContainer(gocontext.Background(), &execution.DeleteContainerRequest{ |  | ||||||
| 			ID: id, | 			ID: id, | ||||||
| 		}); err != nil { | 		}) | ||||||
| 		return err | 		return err | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return nil |  | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,61 +1,47 @@ | ||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	gocontext "context" | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"text/tabwriter" | ||||||
| 
 | 
 | ||||||
| 	"github.com/nats-io/go-nats" | 	"github.com/docker/containerd/api/services/execution" | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var eventsCommand = cli.Command{ | var eventsCommand = cli.Command{ | ||||||
| 	Name:  "events", | 	Name:  "events", | ||||||
| 	Usage: "display containerd events", | 	Usage: "display containerd events", | ||||||
| 	Flags: []cli.Flag{ |  | ||||||
| 		cli.StringFlag{ |  | ||||||
| 			Name:  "subject, s", |  | ||||||
| 			Usage: "subjects filter", |  | ||||||
| 			Value: "containerd.>", |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	Action: func(context *cli.Context) error { | 	Action: func(context *cli.Context) error { | ||||||
| 		nc, err := nats.Connect(nats.DefaultURL) | 		containers, err := getExecutionService(context) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		nec, err := nats.NewEncodedConn(nc, nats.JSON_ENCODER) | 		events, err := containers.Events(gocontext.Background(), &execution.EventsRequest{}) | ||||||
| 		if err != nil { |  | ||||||
| 			nc.Close() |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		defer nec.Close() |  | ||||||
| 
 |  | ||||||
| 		evCh := make(chan *nats.Msg, 64) |  | ||||||
| 		sub, err := nec.Subscribe(context.String("subject"), func(e *nats.Msg) { |  | ||||||
| 			evCh <- e |  | ||||||
| 		}) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		defer sub.Unsubscribe() | 		w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0) | ||||||
| 
 | 		fmt.Fprintln(w, "TYPE\tID\tPID\tEXIT_STATUS") | ||||||
| 		for { | 		for { | ||||||
| 			e, more := <-evCh | 			e, err := events.Recv() | ||||||
| 			if !more { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			var prettyJSON bytes.Buffer |  | ||||||
| 
 |  | ||||||
| 			err := json.Indent(&prettyJSON, e.Data, "", "\t") |  | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				fmt.Println(string(e.Data)) | 				return err | ||||||
| 			} else { | 			} | ||||||
| 				fmt.Println(prettyJSON.String()) | 			if _, err := fmt.Fprintf(w, | ||||||
|  | 				"%s\t%s\t%d\t%d\n", | ||||||
|  | 				e.Type.String(), | ||||||
|  | 				e.ID, | ||||||
|  | 				e.Pid, | ||||||
|  | 				e.ExitStatus, | ||||||
|  | 			); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if err := w.Flush(); err != nil { | ||||||
|  | 				return err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,87 +0,0 @@ | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	gocontext "context" |  | ||||||
| 
 |  | ||||||
| 	"github.com/docker/containerd/api/services/execution" |  | ||||||
| 	"github.com/docker/containerd/api/types/process" |  | ||||||
| 	"github.com/urfave/cli" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var execCommand = cli.Command{ |  | ||||||
| 	Name:  "exec", |  | ||||||
| 	Usage: "exec a new process in a running container", |  | ||||||
| 	Flags: []cli.Flag{ |  | ||||||
| 		cli.StringFlag{ |  | ||||||
| 			Name:  "id, i", |  | ||||||
| 			Usage: "target container id", |  | ||||||
| 		}, |  | ||||||
| 		cli.StringFlag{ |  | ||||||
| 			Name:  "cwd, c", |  | ||||||
| 			Usage: "current working directory for the process", |  | ||||||
| 		}, |  | ||||||
| 		cli.BoolFlag{ |  | ||||||
| 			Name:  "tty, t", |  | ||||||
| 			Usage: "create a terminal for the process", |  | ||||||
| 		}, |  | ||||||
| 		cli.StringSliceFlag{ |  | ||||||
| 			Name:  "env, e", |  | ||||||
| 			Value: &cli.StringSlice{}, |  | ||||||
| 			Usage: "environment variables for the process", |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	Action: func(context *cli.Context) error { |  | ||||||
| 		executionService, err := getExecutionService(context) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		tmpDir, err := getTempDir(time.Now().Format("2006-02-01_15:04:05")) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		defer os.RemoveAll(tmpDir) |  | ||||||
| 
 |  | ||||||
| 		id := context.String("id") |  | ||||||
| 		sOpts := &execution.StartProcessRequest{ |  | ||||||
| 			ContainerID: id, |  | ||||||
| 			Process: &process.Process{ |  | ||||||
| 				Cwd:      context.String("cwd"), |  | ||||||
| 				Terminal: context.Bool("tty"), |  | ||||||
| 				Args:     context.Args(), |  | ||||||
| 				Env:      context.StringSlice("env"), |  | ||||||
| 			}, |  | ||||||
| 			Stdin:   filepath.Join(tmpDir, "stdin"), |  | ||||||
| 			Stdout:  filepath.Join(tmpDir, "stdout"), |  | ||||||
| 			Stderr:  filepath.Join(tmpDir, "stderr"), |  | ||||||
| 			Console: context.Bool("tty"), |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		fwg, err := prepareStdio(sOpts.Stdin, sOpts.Stdout, sOpts.Stderr, sOpts.Console) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		sr, err := executionService.StartProcess(gocontext.Background(), sOpts) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		_, err = executionService.DeleteProcess(gocontext.Background(), &execution.DeleteProcessRequest{ |  | ||||||
| 			ContainerID: id, |  | ||||||
| 			Pid:         sr.Process.Pid, |  | ||||||
| 		}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Ensure we read all io |  | ||||||
| 		fwg.Wait() |  | ||||||
| 
 |  | ||||||
| 		return nil |  | ||||||
| 	}, |  | ||||||
| } |  | ||||||
|  | @ -1,42 +0,0 @@ | ||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	gocontext "context" |  | ||||||
| 	"errors" |  | ||||||
| 
 |  | ||||||
| 	"github.com/davecgh/go-spew/spew" |  | ||||||
| 	"github.com/docker/containerd/api/services/execution" |  | ||||||
| 	"github.com/urfave/cli" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var inspectCommand = cli.Command{ |  | ||||||
| 	Name:      "inspect", |  | ||||||
| 	Usage:     "inspect a container", |  | ||||||
| 	ArgsUsage: "CONTAINER", |  | ||||||
| 	Action: func(context *cli.Context) error { |  | ||||||
| 		executionService, err := getExecutionService(context) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		id := context.Args().First() |  | ||||||
| 		if id == "" { |  | ||||||
| 			return errors.New("container id must be provided") |  | ||||||
| 		} |  | ||||||
| 		getResponse, err := executionService.GetContainer(gocontext.Background(), |  | ||||||
| 			&execution.GetContainerRequest{ID: id}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		listProcResponse, err := executionService.ListProcesses(gocontext.Background(), |  | ||||||
| 			&execution.ListProcessesRequest{ContainerID: id}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		dumper := spew.NewDefaultConfig() |  | ||||||
| 		dumper.Indent = "\t" |  | ||||||
| 		dumper.DisableMethods = true |  | ||||||
| 		dumper.DisablePointerAddresses = true |  | ||||||
| 		dumper.Dump(getResponse, listProcResponse) |  | ||||||
| 		return nil |  | ||||||
| 	}, |  | ||||||
| } |  | ||||||
|  | @ -3,6 +3,8 @@ package main | ||||||
| import ( | import ( | ||||||
| 	gocontext "context" | 	gocontext "context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"text/tabwriter" | ||||||
| 
 | 
 | ||||||
| 	"github.com/docker/containerd/api/services/execution" | 	"github.com/docker/containerd/api/services/execution" | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
|  | @ -12,29 +14,27 @@ var listCommand = cli.Command{ | ||||||
| 	Name:  "list", | 	Name:  "list", | ||||||
| 	Usage: "list containers", | 	Usage: "list containers", | ||||||
| 	Action: func(context *cli.Context) error { | 	Action: func(context *cli.Context) error { | ||||||
| 		executionService, err := getExecutionService(context) | 		containers, err := getExecutionService(context) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		listResponse, err := executionService.ListContainers(gocontext.Background(), &execution.ListContainersRequest{ | 		response, err := containers.List(gocontext.Background(), &execution.ListRequest{}) | ||||||
| 			Owner: []string{}, |  | ||||||
| 		}) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		fmt.Println("ID\tSTATUS\tPROCS\tBUNDLE") | 		w := tabwriter.NewWriter(os.Stdout, 10, 1, 3, ' ', 0) | ||||||
| 		for _, c := range listResponse.Containers { | 		fmt.Fprintln(w, "ID\tPID\tSTATUS") | ||||||
| 			listProcResponse, err := executionService.ListProcesses(gocontext.Background(), | 		for _, c := range response.Containers { | ||||||
| 				&execution.ListProcessesRequest{ContainerID: c.ID}) | 			if _, err := fmt.Fprintf(w, "%s\t%s\t%s\n", | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			fmt.Printf("%s\t%s\t%d\t%s\n", |  | ||||||
| 				c.ID, | 				c.ID, | ||||||
| 				c.State, | 				c.Pid, | ||||||
| 				len(listProcResponse.Processes), | 				c.Status.String(), | ||||||
| 				c.Bundle, | 			); err != nil { | ||||||
| 			) | 				return err | ||||||
|  | 			} | ||||||
|  | 			if err := w.Flush(); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | @ -35,11 +35,9 @@ containerd client | ||||||
| 	} | 	} | ||||||
| 	app.Commands = []cli.Command{ | 	app.Commands = []cli.Command{ | ||||||
| 		runCommand, | 		runCommand, | ||||||
| 		execCommand, |  | ||||||
| 		eventsCommand, | 		eventsCommand, | ||||||
| 		deleteCommand, | 		deleteCommand, | ||||||
| 		listCommand, | 		listCommand, | ||||||
| 		inspectCommand, |  | ||||||
| 		shimCommand, | 		shimCommand, | ||||||
| 		pprofCommand, | 		pprofCommand, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										252
									
								
								cmd/ctr/run.go
									
										
									
									
									
								
							
							
						
						
									
										252
									
								
								cmd/ctr/run.go
									
										
									
									
									
								
							|  | @ -3,148 +3,232 @@ package main | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	gocontext "context" | 	gocontext "context" | ||||||
| 
 | 
 | ||||||
|  | 	"runtime" | ||||||
|  | 
 | ||||||
| 	"github.com/crosbymichael/console" | 	"github.com/crosbymichael/console" | ||||||
| 	"github.com/docker/containerd/api/services/execution" | 	"github.com/docker/containerd/api/services/execution" | ||||||
| 	execEvents "github.com/docker/containerd/execution" | 	"github.com/docker/containerd/api/types/mount" | ||||||
| 	"github.com/nats-io/go-nats" | 	protobuf "github.com/gogo/protobuf/types" | ||||||
| 	"github.com/nats-io/go-nats-streaming" | 	"github.com/opencontainers/runtime-spec/specs-go" | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var rwm = "rwm" | ||||||
|  | 
 | ||||||
|  | func spec(id string, args []string, tty bool) *specs.Spec { | ||||||
|  | 	return &specs.Spec{ | ||||||
|  | 		Version: specs.Version, | ||||||
|  | 		Platform: specs.Platform{ | ||||||
|  | 			OS:   runtime.GOOS, | ||||||
|  | 			Arch: runtime.GOARCH, | ||||||
|  | 		}, | ||||||
|  | 		Root: specs.Root{ | ||||||
|  | 			Path:     "rootfs", | ||||||
|  | 			Readonly: true, | ||||||
|  | 		}, | ||||||
|  | 		Process: specs.Process{ | ||||||
|  | 			Args: args, | ||||||
|  | 			Env: []string{ | ||||||
|  | 				"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", | ||||||
|  | 			}, | ||||||
|  | 			Terminal:        tty, | ||||||
|  | 			Cwd:             "/", | ||||||
|  | 			NoNewPrivileges: true, | ||||||
|  | 		}, | ||||||
|  | 		Mounts: []specs.Mount{ | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/proc", | ||||||
|  | 				Type:        "proc", | ||||||
|  | 				Source:      "proc", | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/dev", | ||||||
|  | 				Type:        "tmpfs", | ||||||
|  | 				Source:      "tmpfs", | ||||||
|  | 				Options:     []string{"nosuid", "strictatime", "mode=755", "size=65536k"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/dev/pts", | ||||||
|  | 				Type:        "devpts", | ||||||
|  | 				Source:      "devpts", | ||||||
|  | 				Options:     []string{"nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/dev/shm", | ||||||
|  | 				Type:        "tmpfs", | ||||||
|  | 				Source:      "shm", | ||||||
|  | 				Options:     []string{"nosuid", "noexec", "nodev", "mode=1777", "size=65536k"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/dev/mqueue", | ||||||
|  | 				Type:        "mqueue", | ||||||
|  | 				Source:      "mqueue", | ||||||
|  | 				Options:     []string{"nosuid", "noexec", "nodev"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/sys", | ||||||
|  | 				Type:        "sysfs", | ||||||
|  | 				Source:      "sysfs", | ||||||
|  | 				Options:     []string{"nosuid", "noexec", "nodev"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/run", | ||||||
|  | 				Type:        "tmpfs", | ||||||
|  | 				Source:      "tmpfs", | ||||||
|  | 				Options:     []string{"nosuid", "strictatime", "mode=755", "size=65536k"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/etc/resolv.conf", | ||||||
|  | 				Type:        "bind", | ||||||
|  | 				Source:      "/etc/resolv.conf", | ||||||
|  | 				Options:     []string{"rbind", "ro"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/etc/hosts", | ||||||
|  | 				Type:        "bind", | ||||||
|  | 				Source:      "/etc/hosts", | ||||||
|  | 				Options:     []string{"rbind", "ro"}, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Destination: "/etc/localtime", | ||||||
|  | 				Type:        "bind", | ||||||
|  | 				Source:      "/etc/localtime", | ||||||
|  | 				Options:     []string{"rbind", "ro"}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		Hostname: id, | ||||||
|  | 		Linux: &specs.Linux{ | ||||||
|  | 			Resources: &specs.LinuxResources{ | ||||||
|  | 				Devices: []specs.LinuxDeviceCgroup{ | ||||||
|  | 					{ | ||||||
|  | 						Allow:  false, | ||||||
|  | 						Access: &rwm, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Namespaces: []specs.LinuxNamespace{ | ||||||
|  | 				{ | ||||||
|  | 					Type: "pid", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Type: "ipc", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Type: "uts", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Type: "mount", | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					Type: "network", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var runCommand = cli.Command{ | var runCommand = cli.Command{ | ||||||
| 	Name:  "run", | 	Name:  "run", | ||||||
| 	Usage: "run a container", | 	Usage: "run a container", | ||||||
| 	Flags: []cli.Flag{ | 	Flags: []cli.Flag{ | ||||||
| 		cli.StringFlag{ | 		cli.StringFlag{ | ||||||
| 			Name:  "bundle, b", | 			Name:  "id", | ||||||
| 			Usage: "path to the container's bundle", | 			Usage: "id of the container", | ||||||
| 		}, | 		}, | ||||||
| 		cli.BoolFlag{ | 		cli.BoolFlag{ | ||||||
| 			Name:  "tty,t", | 			Name:  "tty,t", | ||||||
| 			Usage: "allocate a TTY for the container", | 			Usage: "allocate a TTY for the container", | ||||||
| 		}, | 		}, | ||||||
|  | 		cli.StringFlag{ | ||||||
|  | 			Name:  "rootfs,r", | ||||||
|  | 			Usage: "path to the container's root filesystem", | ||||||
|  | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	Action: func(context *cli.Context) error { | 	Action: func(context *cli.Context) error { | ||||||
| 		id := context.Args().First() | 		id := context.String("id") | ||||||
| 		if id == "" { | 		if id == "" { | ||||||
| 			return fmt.Errorf("container id must be provided") | 			return fmt.Errorf("container id must be provided") | ||||||
| 		} | 		} | ||||||
| 		executionService, err := getExecutionService(context) | 
 | ||||||
|  | 		containers, err := getExecutionService(context) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		// setup our event subscriber |  | ||||||
| 		sc, err := stan.Connect("containerd", "ctr", stan.ConnectWait(5*time.Second)) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		defer sc.Close() |  | ||||||
| 
 |  | ||||||
| 		evCh := make(chan *execEvents.ContainerEvent, 64) |  | ||||||
| 		sub, err := sc.Subscribe(fmt.Sprintf("containers.%s", id), func(m *stan.Msg) { |  | ||||||
| 			var e execEvents.ContainerEvent |  | ||||||
| 
 |  | ||||||
| 			err := json.Unmarshal(m.Data, &e) |  | ||||||
| 			if err != nil { |  | ||||||
| 				fmt.Printf("failed to unmarshal event: %v", err) |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			evCh <- &e |  | ||||||
| 		}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		defer sub.Unsubscribe() |  | ||||||
| 
 |  | ||||||
| 		tmpDir, err := getTempDir(id) | 		tmpDir, err := getTempDir(id) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		defer os.RemoveAll(tmpDir) | 		events, err := containers.Events(gocontext.Background(), &execution.EventsRequest{}) | ||||||
| 
 |  | ||||||
| 		bundle, err := filepath.Abs(context.String("bundle")) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		crOpts := &execution.CreateContainerRequest{ | 		// for ctr right now just do a bind mount | ||||||
|  | 		rootfs := []*mount.Mount{ | ||||||
|  | 			{ | ||||||
|  | 				Type:   "bind", | ||||||
|  | 				Source: context.String("rootfs"), | ||||||
|  | 				Options: []string{ | ||||||
|  | 					"rw", | ||||||
|  | 					"rbind", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		} | ||||||
|  | 		s := spec(id, []string(context.Args()), context.Bool("tty")) | ||||||
|  | 		data, err := json.Marshal(s) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		create := &execution.CreateRequest{ | ||||||
| 			ID: id, | 			ID: id, | ||||||
| 			BundlePath: bundle, | 			Spec: &protobuf.Any{ | ||||||
| 			Console:    context.Bool("tty"), | 				TypeUrl: specs.Version, | ||||||
|  | 				Value:   data, | ||||||
|  | 			}, | ||||||
|  | 			Rootfs:   rootfs, | ||||||
|  | 			Runtime:  "linux", | ||||||
|  | 			Terminal: context.Bool("tty"), | ||||||
| 			Stdin:    filepath.Join(tmpDir, "stdin"), | 			Stdin:    filepath.Join(tmpDir, "stdin"), | ||||||
| 			Stdout:   filepath.Join(tmpDir, "stdout"), | 			Stdout:   filepath.Join(tmpDir, "stdout"), | ||||||
| 			Stderr:   filepath.Join(tmpDir, "stderr"), | 			Stderr:   filepath.Join(tmpDir, "stderr"), | ||||||
| 		} | 		} | ||||||
| 
 | 		if create.Terminal { | ||||||
| 		if crOpts.Console { |  | ||||||
| 			con := console.Current() | 			con := console.Current() | ||||||
| 			defer con.Reset() | 			defer con.Reset() | ||||||
| 			if err := con.SetRaw(); err != nil { | 			if err := con.SetRaw(); err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 		fwg, err := prepareStdio(create.Stdin, create.Stdout, create.Stderr, create.Terminal) | ||||||
| 		fwg, err := prepareStdio(crOpts.Stdin, crOpts.Stdout, crOpts.Stderr, crOpts.Console) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 		response, err := containers.Create(gocontext.Background(), create) | ||||||
| 		cr, err := executionService.CreateContainer(gocontext.Background(), crOpts) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return errors.Wrap(err, "CreateContainer RPC failed") | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 		if _, err := containers.Start(gocontext.Background(), &execution.StartRequest{ | ||||||
| 		if _, err := executionService.StartContainer(gocontext.Background(), &execution.StartContainerRequest{ | 			ID: response.ID, | ||||||
| 			ID: cr.Container.ID, |  | ||||||
| 		}); err != nil { | 		}); err != nil { | ||||||
| 			return errors.Wrap(err, "StartContainer RPC failed") | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 		status, err := waitContainer(events, response) | ||||||
| 		var ec uint32 | 		if err != nil { | ||||||
| 	eventLoop: | 			return err | ||||||
| 		for { |  | ||||||
| 			select { |  | ||||||
| 			case e, more := <-evCh: |  | ||||||
| 				if !more { |  | ||||||
| 					break eventLoop |  | ||||||
| 		} | 		} | ||||||
| 
 | 		if _, err := containers.Delete(gocontext.Background(), &execution.DeleteRequest{ | ||||||
| 				if e.Type != "exit" { | 			ID: response.ID, | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if e.ID == cr.Container.ID && e.Pid == cr.InitProcess.Pid { |  | ||||||
| 					ec = e.ExitStatus |  | ||||||
| 					break eventLoop |  | ||||||
| 				} |  | ||||||
| 			case <-time.After(1 * time.Second): |  | ||||||
| 				if sc.NatsConn().Status() != nats.CONNECTED { |  | ||||||
| 					break eventLoop |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if _, err := executionService.DeleteContainer(gocontext.Background(), &execution.DeleteContainerRequest{ |  | ||||||
| 			ID: cr.Container.ID, |  | ||||||
| 		}); err != nil { | 		}); err != nil { | ||||||
| 			return errors.Wrap(err, "DeleteContainer RPC failed") | 			return err | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		// Ensure we read all io | 		// Ensure we read all io | ||||||
| 		fwg.Wait() | 		fwg.Wait() | ||||||
| 
 | 		if status != 0 { | ||||||
| 		if ec != 0 { | 			return cli.NewExitError("", int(status)) | ||||||
| 			return cli.NewExitError("", int(ec)) |  | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ import ( | ||||||
| 	gocontext "context" | 	gocontext "context" | ||||||
| 
 | 
 | ||||||
| 	"github.com/docker/containerd/api/services/execution" | 	"github.com/docker/containerd/api/services/execution" | ||||||
|  | 	"github.com/docker/containerd/api/types/container" | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| 	"github.com/tonistiigi/fifo" | 	"github.com/tonistiigi/fifo" | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
|  | @ -103,12 +104,12 @@ func getGRPCConnection(context *cli.Context) (*grpc.ClientConn, error) { | ||||||
| 	return grpcConn, nil | 	return grpcConn, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getExecutionService(context *cli.Context) (execution.ExecutionServiceClient, error) { | func getExecutionService(context *cli.Context) (execution.ContainerServiceClient, error) { | ||||||
| 	conn, err := getGRPCConnection(context) | 	conn, err := getGRPCConnection(context) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return execution.NewExecutionServiceClient(conn), nil | 	return execution.NewContainerServiceClient(conn), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getTempDir(id string) (string, error) { | func getTempDir(id string) (string, error) { | ||||||
|  | @ -122,3 +123,19 @@ func getTempDir(id string) (string, error) { | ||||||
| 	} | 	} | ||||||
| 	return tmpDir, nil | 	return tmpDir, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func waitContainer(events execution.ContainerService_EventsClient, response *execution.CreateResponse) (uint32, error) { | ||||||
|  | 	for { | ||||||
|  | 		e, err := events.Recv() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return 255, err | ||||||
|  | 		} | ||||||
|  | 		if e.Type != container.Event_EXIT { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if e.ID == response.ID && | ||||||
|  | 			e.Pid == response.Pid { | ||||||
|  | 			return e.ExitStatus, nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -42,6 +42,7 @@ var ( | ||||||
| 	// becomes the M declarations at the end of the declaration. | 	// becomes the M declarations at the end of the declaration. | ||||||
| 	packageMap = map[string]string{ | 	packageMap = map[string]string{ | ||||||
| 		"google/protobuf/timestamp.proto":  "github.com/gogo/protobuf/types", | 		"google/protobuf/timestamp.proto":  "github.com/gogo/protobuf/types", | ||||||
|  | 		"google/protobuf/any.proto":        "github.com/gogo/protobuf/types", | ||||||
| 		"google/protobuf/descriptor.proto": "github.com/gogo/protobuf/protoc-gen-gogo/descriptor", | 		"google/protobuf/descriptor.proto": "github.com/gogo/protobuf/protoc-gen-gogo/descriptor", | ||||||
| 		"gogoproto/gogo.proto":             "github.com/gogo/protobuf/gogoproto", | 		"gogoproto/gogo.proto":             "github.com/gogo/protobuf/gogoproto", | ||||||
| 	} | 	} | ||||||
|  | @ -148,8 +149,9 @@ func main() { | ||||||
| 		// pass to sh -c so we don't need to re-split here. | 		// pass to sh -c so we don't need to re-split here. | ||||||
| 		args := []string{"-c", arg} | 		args := []string{"-c", arg} | ||||||
| 		cmd := exec.Command("sh", args...) | 		cmd := exec.Command("sh", args...) | ||||||
| 		if err := cmd.Run(); err != nil { | 		out, err := cmd.CombinedOutput() | ||||||
| 			log.Fatalln(err) | 		if err != nil { | ||||||
|  | 			log.Fatalf("%s %s\n", out, err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										92
									
								
								collector.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								collector.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,92 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"sync" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newCollector(ctx context.Context, runtimes map[string]Runtime) (*collector, error) { | ||||||
|  | 	c := &collector{ | ||||||
|  | 		context:      ctx, | ||||||
|  | 		ch:           make(chan *Event, 2048), | ||||||
|  | 		eventClients: make(map[*eventClient]struct{}), | ||||||
|  | 	} | ||||||
|  | 	for _, r := range runtimes { | ||||||
|  | 		if err := c.collect(r); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// run the publisher | ||||||
|  | 	go c.publisher() | ||||||
|  | 	// run a goroutine that waits for the context to be done | ||||||
|  | 	// and closes the channel after all writes have finished | ||||||
|  | 	go c.waitDone() | ||||||
|  | 	return c, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type eventClient struct { | ||||||
|  | 	eCh chan error | ||||||
|  | 	w   EventWriter | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type collector struct { | ||||||
|  | 	mu sync.Mutex | ||||||
|  | 	wg sync.WaitGroup | ||||||
|  | 
 | ||||||
|  | 	context      context.Context | ||||||
|  | 	ch           chan *Event | ||||||
|  | 	eventClients map[*eventClient]struct{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // collect collects events from the provided runtime | ||||||
|  | func (c *collector) collect(r Runtime) error { | ||||||
|  | 	c.wg.Add(1) | ||||||
|  | 	go func() { | ||||||
|  | 		defer c.wg.Done() | ||||||
|  | 		for e := range r.Events(c.context) { | ||||||
|  | 			c.ch <- e | ||||||
|  | 		} | ||||||
|  | 	}() | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Forward forwards all events from the collector to the EventWriters | ||||||
|  | // | ||||||
|  | // It forwards events until the channels are closed or the EventWriter | ||||||
|  | // returns an error | ||||||
|  | // This is a blocking call | ||||||
|  | func (c *collector) forward(w EventWriter) error { | ||||||
|  | 	client := &eventClient{ | ||||||
|  | 		w:   w, | ||||||
|  | 		eCh: make(chan error, 1), | ||||||
|  | 	} | ||||||
|  | 	c.mu.Lock() | ||||||
|  | 	c.eventClients[client] = struct{}{} | ||||||
|  | 	c.mu.Unlock() | ||||||
|  | 	err := <-client.eCh | ||||||
|  | 	c.mu.Lock() | ||||||
|  | 	delete(c.eventClients, client) | ||||||
|  | 	c.mu.Unlock() | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *collector) publisher() { | ||||||
|  | 	for e := range c.ch { | ||||||
|  | 		c.mu.Lock() | ||||||
|  | 		for client := range c.eventClients { | ||||||
|  | 			if err := client.w.Write(e); err != nil { | ||||||
|  | 				client.eCh <- err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		c.mu.Unlock() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // waitDone waits for the context to finish, waits for all the goroutines to finish | ||||||
|  | // collecting grpc events from the shim, and closes the output channel | ||||||
|  | func (c *collector) waitDone() { | ||||||
|  | 	<-c.context.Done() | ||||||
|  | 	c.wg.Wait() | ||||||
|  | 	close(c.ch) | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								container.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								container.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import "golang.org/x/net/context" | ||||||
|  | 
 | ||||||
|  | type ContainerInfo struct { | ||||||
|  | 	ID      string | ||||||
|  | 	Runtime string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Container interface { | ||||||
|  | 	// Information of the container | ||||||
|  | 	Info() ContainerInfo | ||||||
|  | 	// Start the container's user defined process | ||||||
|  | 	Start(context.Context) error | ||||||
|  | 	// State returns the container's state | ||||||
|  | 	State(context.Context) (State, error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ContainerStatus int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	CreatedStatus ContainerStatus = iota + 1 | ||||||
|  | 	RunningStatus | ||||||
|  | 	StoppedStatus | ||||||
|  | 	DeletedStatus | ||||||
|  | 	PausedStatus | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type State interface { | ||||||
|  | 	// Status is the current status of the container | ||||||
|  | 	Status() ContainerStatus | ||||||
|  | 	// Pid is the main process id for the container | ||||||
|  | 	Pid() uint32 | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								errors.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								errors.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import "errors" | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrUnknownRuntime    = errors.New("unknown runtime") | ||||||
|  | 	ErrContainerExists   = errors.New("container with id already exists") | ||||||
|  | 	ErrContainerNotExist = errors.New("container does not exist") | ||||||
|  | 	ErrRuntimeNotExist   = errors.New("runtime does not exist") | ||||||
|  | ) | ||||||
							
								
								
									
										70
									
								
								event.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								event.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import "time" | ||||||
|  | 
 | ||||||
|  | type EventType int | ||||||
|  | 
 | ||||||
|  | func (t EventType) String() string { | ||||||
|  | 	switch t { | ||||||
|  | 	case ExitEvent: | ||||||
|  | 		return "exit" | ||||||
|  | 	case PausedEvent: | ||||||
|  | 		return "paused" | ||||||
|  | 	case CreateEvent: | ||||||
|  | 		return "create" | ||||||
|  | 	case StartEvent: | ||||||
|  | 		return "start" | ||||||
|  | 	case OOMEvent: | ||||||
|  | 		return "oom" | ||||||
|  | 	case ExecAddEvent: | ||||||
|  | 		return "execAdd" | ||||||
|  | 	} | ||||||
|  | 	return "unknown" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	ExitEvent EventType = iota + 1 | ||||||
|  | 	PausedEvent | ||||||
|  | 	CreateEvent | ||||||
|  | 	StartEvent | ||||||
|  | 	OOMEvent | ||||||
|  | 	ExecAddEvent | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Event struct { | ||||||
|  | 	Timestamp  time.Time | ||||||
|  | 	Type       EventType | ||||||
|  | 	Runtime    string | ||||||
|  | 	ID         string | ||||||
|  | 	Pid        uint32 | ||||||
|  | 	ExitStatus uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type EventWriter interface { | ||||||
|  | 	Write(*Event) error | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type EventFilter func(*Event) bool | ||||||
|  | 
 | ||||||
|  | // NewFilterEventWriter returns an EventWriter that runs the provided filters on the events. | ||||||
|  | // If all the filters pass then the event is written to the wrapped EventWriter | ||||||
|  | func NewFilterEventWriter(w EventWriter, filters ...EventFilter) EventWriter { | ||||||
|  | 	return &filteredEventWriter{ | ||||||
|  | 		w:       w, | ||||||
|  | 		filters: filters, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type filteredEventWriter struct { | ||||||
|  | 	w       EventWriter | ||||||
|  | 	filters []EventFilter | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (f *filteredEventWriter) Write(e *Event) error { | ||||||
|  | 	for _, filter := range f.filters { | ||||||
|  | 		if !filter(e) { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return f.w.Write(e) | ||||||
|  | } | ||||||
|  | @ -1,179 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"sync" |  | ||||||
| 
 |  | ||||||
| 	"github.com/docker/containerd/log" |  | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	InitProcessID    = "init" |  | ||||||
| 	processesDirName = "processes" |  | ||||||
| 	bundleFileName   = "bundle" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func LoadContainer(ctx context.Context, stateDir, id string) (c *Container, err error) { |  | ||||||
| 	c = &Container{ |  | ||||||
| 		id:        id, |  | ||||||
| 		stateDir:  stateDir, |  | ||||||
| 		processes: make(map[string]Process, 1), |  | ||||||
| 		ctx:       ctx, |  | ||||||
| 		status:    Unknown, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	data, err := ioutil.ReadFile(filepath.Join(stateDir, bundleFileName)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		err = errors.Wrapf(err, "failed to read bundle path") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	c.bundle = string(data) |  | ||||||
| 
 |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewContainer(ctx context.Context, stateDir, id, bundle string) (c *Container, err error) { |  | ||||||
| 	c = &Container{ |  | ||||||
| 		id:        id, |  | ||||||
| 		stateDir:  stateDir, |  | ||||||
| 		bundle:    bundle, |  | ||||||
| 		processes: make(map[string]Process, 1), |  | ||||||
| 		status:    Created, |  | ||||||
| 		ctx:       ctx, |  | ||||||
| 	} |  | ||||||
| 	defer func() { |  | ||||||
| 		if err != nil { |  | ||||||
| 			c.Cleanup() |  | ||||||
| 			c = nil |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	if err = os.Mkdir(stateDir, 0700); err != nil { |  | ||||||
| 		err = errors.Wrap(err, "failed to create container state dir") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bundleFile := filepath.Join(stateDir, bundleFileName) |  | ||||||
| 	if err = ioutil.WriteFile(bundleFile, []byte(bundle), 0600); err != nil { |  | ||||||
| 		err = errors.Wrap(err, "failed to store bundle path") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	processesDir := filepath.Join(stateDir, processesDirName) |  | ||||||
| 	if err = os.Mkdir(processesDir, 0700); err != nil { |  | ||||||
| 		err = errors.Wrap(err, "failed to create processes statedir") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Container struct { |  | ||||||
| 	id        string |  | ||||||
| 	stateDir  string |  | ||||||
| 	bundle    string |  | ||||||
| 	processes map[string]Process |  | ||||||
| 	status    Status |  | ||||||
| 
 |  | ||||||
| 	ctx context.Context |  | ||||||
| 	mu  sync.Mutex |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) ID() string { |  | ||||||
| 	return c.id |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Bundle() string { |  | ||||||
| 	return c.bundle |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Wait() (uint32, error) { |  | ||||||
| 	initProcess := c.GetProcess(InitProcessID) |  | ||||||
| 	return initProcess.Wait() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Status() Status { |  | ||||||
| 	initProcess := c.GetProcess(InitProcessID) |  | ||||||
| 	return initProcess.Status() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) AddProcess(p Process) { |  | ||||||
| 	c.mu.Lock() |  | ||||||
| 	c.processes[p.ID()] = p |  | ||||||
| 	c.mu.Unlock() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) RemoveProcess(id string) error { |  | ||||||
| 	if _, ok := c.processes[id]; !ok { |  | ||||||
| 		return errors.Errorf("no such process %s", id) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	c.mu.Lock() |  | ||||||
| 	delete(c.processes, id) |  | ||||||
| 	c.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	processStateDir := filepath.Join(c.stateDir, processesDirName, id) |  | ||||||
| 	err := os.RemoveAll(processStateDir) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return errors.Wrap(err, "failed to remove process state dir") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) GetProcess(id string) Process { |  | ||||||
| 	c.mu.Lock() |  | ||||||
| 	defer c.mu.Unlock() |  | ||||||
| 	return c.processes[id] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Processes() []Process { |  | ||||||
| 	var procs []Process |  | ||||||
| 
 |  | ||||||
| 	c.mu.Lock() |  | ||||||
| 	for _, p := range c.processes { |  | ||||||
| 		procs = append(procs, p) |  | ||||||
| 	} |  | ||||||
| 	c.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	return procs |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ProcessStateDir returns the path of the state dir for a given |  | ||||||
| // process id. The process doesn't have to exist for this to succeed. |  | ||||||
| func (c *Container) ProcessStateDir(id string) string { |  | ||||||
| 	return filepath.Join(c.stateDir, processesDirName, id) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ProcessesStateDir returns a map matching process ids to their state |  | ||||||
| // directory |  | ||||||
| func (c *Container) ProcessesStateDir() (map[string]string, error) { |  | ||||||
| 	root := filepath.Join(c.stateDir, processesDirName) |  | ||||||
| 	dirs, err := ioutil.ReadDir(root) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to list processes state dirs") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	procs := make(map[string]string, 1) |  | ||||||
| 	for _, d := range dirs { |  | ||||||
| 		if d.IsDir() { |  | ||||||
| 			procs[d.Name()] = filepath.Join(root, d.Name()) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return procs, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Cleanup() { |  | ||||||
| 	if err := os.RemoveAll(c.stateDir); err != nil { |  | ||||||
| 		log.G(c.ctx).Warnf("failed to remove container state dir: %v", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *Container) Context() context.Context { |  | ||||||
| 	return c.ctx |  | ||||||
| } |  | ||||||
|  | @ -1,10 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| import "fmt" |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	ErrProcessNotFound   = fmt.Errorf("process not found") |  | ||||||
| 	ErrProcessNotExited  = fmt.Errorf("process has not exited") |  | ||||||
| 	ErrContainerNotFound = fmt.Errorf("container not found") |  | ||||||
| 	ErrContainerExists   = fmt.Errorf("container already exists") |  | ||||||
| ) |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| import "time" |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	ExitEvent   = "exit" |  | ||||||
| 	OOMEvent    = "oom" |  | ||||||
| 	CreateEvent = "create" |  | ||||||
| 	StartEvent  = "start" |  | ||||||
| 	ExecEvent   = "exec-added9" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type ContainerEvent struct { |  | ||||||
| 	Timestamp  time.Time |  | ||||||
| 	ID         string |  | ||||||
| 	Type       string |  | ||||||
| 	Pid        uint32 |  | ||||||
| 	ExitStatus uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	ContainersEventsSubjectSubscriber = "containerd.execution.container.>" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	containerEventsTopicFormat        = "container.%s" |  | ||||||
| 	containerProcessEventsTopicFormat = "container.%s.%s" |  | ||||||
| ) |  | ||||||
|  | @ -1,39 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"os" |  | ||||||
| 
 |  | ||||||
| 	"github.com/opencontainers/runtime-spec/specs-go" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type CreateOpts struct { |  | ||||||
| 	Bundle  string |  | ||||||
| 	Console bool |  | ||||||
| 	Stdin   string |  | ||||||
| 	Stdout  string |  | ||||||
| 	Stderr  string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type StartProcessOpts struct { |  | ||||||
| 	ID      string |  | ||||||
| 	Spec    specs.Process |  | ||||||
| 	Console bool |  | ||||||
| 	Stdin   string |  | ||||||
| 	Stdout  string |  | ||||||
| 	Stderr  string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Executor interface { |  | ||||||
| 	Create(ctx context.Context, id string, o CreateOpts) (*Container, error) |  | ||||||
| 	Pause(context.Context, *Container) error |  | ||||||
| 	Resume(context.Context, *Container) error |  | ||||||
| 	List(context.Context) ([]*Container, error) |  | ||||||
| 	Load(ctx context.Context, id string) (*Container, error) |  | ||||||
| 	Delete(context.Context, *Container) error |  | ||||||
| 	Start(context.Context, *Container) error |  | ||||||
| 
 |  | ||||||
| 	StartProcess(context.Context, *Container, StartProcessOpts) (Process, error) |  | ||||||
| 	SignalProcess(ctx context.Context, c *Container, id string, sig os.Signal) error |  | ||||||
| 	DeleteProcess(ctx context.Context, c *Container, id string) error |  | ||||||
| } |  | ||||||
|  | @ -1,12 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| import "os" |  | ||||||
| 
 |  | ||||||
| type Process interface { |  | ||||||
| 	ID() string |  | ||||||
| 	Pid() int64 |  | ||||||
| 	//Spec() *specs.Process |  | ||||||
| 	Wait() (uint32, error) |  | ||||||
| 	Signal(os.Signal) error |  | ||||||
| 	Status() Status |  | ||||||
| } |  | ||||||
|  | @ -1,15 +0,0 @@ | ||||||
| package execution |  | ||||||
| 
 |  | ||||||
| type Status string |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	Created Status = "created" |  | ||||||
| 	Paused  Status = "paused" |  | ||||||
| 	Pausing Status = "pausing" |  | ||||||
| 	Running Status = "running" |  | ||||||
| 	Stopped Status = "stopped" |  | ||||||
| 	Deleted Status = "deleted" |  | ||||||
| 	Unknown Status = "unknown" |  | ||||||
| 
 |  | ||||||
| 	UnknownStatusCode = 255 |  | ||||||
| ) |  | ||||||
							
								
								
									
										48
									
								
								linux/container.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								linux/container.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | package linux | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/docker/containerd" | ||||||
|  | 	"github.com/docker/containerd/api/services/shim" | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type State struct { | ||||||
|  | 	pid    uint32 | ||||||
|  | 	status containerd.ContainerStatus | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s State) Pid() uint32 { | ||||||
|  | 	return s.pid | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s State) Status() containerd.ContainerStatus { | ||||||
|  | 	return s.status | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Container struct { | ||||||
|  | 	id string | ||||||
|  | 
 | ||||||
|  | 	shim shim.ShimClient | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Container) Info() containerd.ContainerInfo { | ||||||
|  | 	return containerd.ContainerInfo{ | ||||||
|  | 		ID:      c.id, | ||||||
|  | 		Runtime: runtimeName, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Container) Start(ctx context.Context) error { | ||||||
|  | 	_, err := c.shim.Start(ctx, &shim.StartRequest{}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Container) State(ctx context.Context) (containerd.State, error) { | ||||||
|  | 	response, err := c.shim.State(ctx, &shim.StateRequest{}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &State{ | ||||||
|  | 		pid: response.Pid, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
							
								
								
									
										196
									
								
								linux/runtime.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								linux/runtime.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,196 @@ | ||||||
|  | package linux | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"github.com/docker/containerd" | ||||||
|  | 	"github.com/docker/containerd/api/services/shim" | ||||||
|  | 	"github.com/docker/containerd/api/types/container" | ||||||
|  | 	"github.com/docker/containerd/api/types/mount" | ||||||
|  | 	"github.com/docker/containerd/log" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	runtimeName    = "linux" | ||||||
|  | 	configFilename = "config.json" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	containerd.RegisterRuntime(runtimeName, New) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func New(root string) (containerd.Runtime, error) { | ||||||
|  | 	if err := os.MkdirAll(root, 0700); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	c, cancel := context.WithCancel(context.Background()) | ||||||
|  | 	return &Runtime{ | ||||||
|  | 		root:          root, | ||||||
|  | 		events:        make(chan *containerd.Event, 2048), | ||||||
|  | 		eventsContext: c, | ||||||
|  | 		eventsCancel:  cancel, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Runtime struct { | ||||||
|  | 	root string | ||||||
|  | 
 | ||||||
|  | 	events        chan *containerd.Event | ||||||
|  | 	eventsContext context.Context | ||||||
|  | 	eventsCancel  func() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) Create(ctx context.Context, id string, opts containerd.CreateOpts) (containerd.Container, error) { | ||||||
|  | 	path, err := r.newBundle(id, opts.Spec) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	s, err := newShim(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		os.RemoveAll(path) | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if err := r.handleEvents(s); err != nil { | ||||||
|  | 		os.RemoveAll(path) | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	sopts := &shim.CreateRequest{ | ||||||
|  | 		ID:       id, | ||||||
|  | 		Bundle:   path, | ||||||
|  | 		Runtime:  "runc", | ||||||
|  | 		Stdin:    opts.IO.Stdin, | ||||||
|  | 		Stdout:   opts.IO.Stdout, | ||||||
|  | 		Stderr:   opts.IO.Stderr, | ||||||
|  | 		Terminal: opts.IO.Terminal, | ||||||
|  | 	} | ||||||
|  | 	for _, m := range opts.Rootfs { | ||||||
|  | 		sopts.Rootfs = append(sopts.Rootfs, &mount.Mount{ | ||||||
|  | 			Type:    m.Type, | ||||||
|  | 			Source:  m.Source, | ||||||
|  | 			Options: m.Options, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	if _, err := s.Create(ctx, sopts); err != nil { | ||||||
|  | 		os.RemoveAll(path) | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &Container{ | ||||||
|  | 		id:   id, | ||||||
|  | 		shim: s, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) Delete(ctx context.Context, c containerd.Container) error { | ||||||
|  | 	lc, ok := c.(*Container) | ||||||
|  | 	if !ok { | ||||||
|  | 		return fmt.Errorf("container cannot be cast as *linux.Container") | ||||||
|  | 	} | ||||||
|  | 	if _, err := lc.shim.Delete(ctx, &shim.DeleteRequest{}); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	lc.shim.Exit(ctx, &shim.ExitRequest{}) | ||||||
|  | 	return r.deleteBundle(lc.id) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) Containers() ([]containerd.Container, error) { | ||||||
|  | 	dir, err := ioutil.ReadDir(r.root) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	var o []containerd.Container | ||||||
|  | 	for _, fi := range dir { | ||||||
|  | 		if !fi.IsDir() { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		c, err := r.loadContainer(fi.Name()) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		o = append(o, c) | ||||||
|  | 	} | ||||||
|  | 	return o, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) Events(ctx context.Context) <-chan *containerd.Event { | ||||||
|  | 	return r.events | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) handleEvents(s shim.ShimClient) error { | ||||||
|  | 	events, err := s.Events(r.eventsContext, &shim.EventsRequest{}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	go r.forward(events) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) forward(events shim.Shim_EventsClient) { | ||||||
|  | 	for { | ||||||
|  | 		e, err := events.Recv() | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.G(r.eventsContext).WithError(err).Error("get event from shim") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		var et containerd.EventType | ||||||
|  | 		switch e.Type { | ||||||
|  | 		case container.Event_CREATE: | ||||||
|  | 			et = containerd.CreateEvent | ||||||
|  | 		case container.Event_EXEC_ADDED: | ||||||
|  | 			et = containerd.ExecAddEvent | ||||||
|  | 		case container.Event_EXIT: | ||||||
|  | 			et = containerd.ExitEvent | ||||||
|  | 		case container.Event_OOM: | ||||||
|  | 			et = containerd.OOMEvent | ||||||
|  | 		case container.Event_START: | ||||||
|  | 			et = containerd.StartEvent | ||||||
|  | 		} | ||||||
|  | 		r.events <- &containerd.Event{ | ||||||
|  | 			Timestamp:  time.Now(), | ||||||
|  | 			Runtime:    runtimeName, | ||||||
|  | 			Type:       et, | ||||||
|  | 			Pid:        e.Pid, | ||||||
|  | 			ID:         e.ID, | ||||||
|  | 			ExitStatus: e.ExitStatus, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) newBundle(id string, spec []byte) (string, error) { | ||||||
|  | 	path := filepath.Join(r.root, id) | ||||||
|  | 	if err := os.Mkdir(path, 0700); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	if err := os.Mkdir(filepath.Join(path, "rootfs"), 0700); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	f, err := os.Create(filepath.Join(path, configFilename)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	_, err = io.Copy(f, bytes.NewReader(spec)) | ||||||
|  | 	return path, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) deleteBundle(id string) error { | ||||||
|  | 	return os.RemoveAll(filepath.Join(r.root, id)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *Runtime) loadContainer(path string) (*Container, error) { | ||||||
|  | 	id := filepath.Base(path) | ||||||
|  | 	s, err := loadShim(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &Container{ | ||||||
|  | 		id:   id, | ||||||
|  | 		shim: s, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
							
								
								
									
										76
									
								
								linux/shim.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								linux/shim.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,76 @@ | ||||||
|  | package linux | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"log" | ||||||
|  | 	"net" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"google.golang.org/grpc" | ||||||
|  | 	"google.golang.org/grpc/grpclog" | ||||||
|  | 
 | ||||||
|  | 	"github.com/docker/containerd/api/services/shim" | ||||||
|  | 	"github.com/docker/containerd/utils" | ||||||
|  | 	"github.com/pkg/errors" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newShim(path string) (shim.ShimClient, error) { | ||||||
|  | 	socket := filepath.Join(path, "shim.sock") | ||||||
|  | 	l, err := utils.CreateUnixSocket(socket) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	cmd := exec.Command("containerd-shim") | ||||||
|  | 	cmd.Dir = path | ||||||
|  | 	f, err := l.(*net.UnixListener).File() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	cmd.ExtraFiles = append(cmd.ExtraFiles, f) | ||||||
|  | 	// make sure the shim can be re-parented to system init | ||||||
|  | 	// and is cloned in a new mount namespace because the overlay/filesystems | ||||||
|  | 	// will be mounted by the shim | ||||||
|  | 	cmd.SysProcAttr = &syscall.SysProcAttr{ | ||||||
|  | 		Cloneflags: syscall.CLONE_NEWNS, | ||||||
|  | 		Setpgid:    true, | ||||||
|  | 	} | ||||||
|  | 	if err := cmd.Start(); err != nil { | ||||||
|  | 		return nil, errors.Wrapf(err, "failed to start shim") | ||||||
|  | 	} | ||||||
|  | 	// close our side of the socket, do not close the listener as it will | ||||||
|  | 	// remove the socket from disk | ||||||
|  | 	f.Close() | ||||||
|  | 	// since we are currently the parent go ahead and make sure we wait on the shim | ||||||
|  | 	go cmd.Wait() | ||||||
|  | 	return connectShim(socket) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func loadShim(path string) (shim.ShimClient, error) { | ||||||
|  | 	socket := filepath.Join(path, "shim.sock") | ||||||
|  | 	return connectShim(socket) | ||||||
|  | 	// TODO: failed to connect to the shim, check if it's alive | ||||||
|  | 	//   - if it is kill it | ||||||
|  | 	//   - in both case call runc killall and runc delete on the id | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func connectShim(socket string) (shim.ShimClient, error) { | ||||||
|  | 	// reset the logger for grpc to log to dev/null so that it does not mess with our stdio | ||||||
|  | 	grpclog.SetLogger(log.New(ioutil.Discard, "", log.LstdFlags)) | ||||||
|  | 	dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithTimeout(100 * time.Second)} | ||||||
|  | 	dialOpts = append(dialOpts, | ||||||
|  | 		grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { | ||||||
|  | 			return net.DialTimeout("unix", socket, timeout) | ||||||
|  | 		}), | ||||||
|  | 		grpc.WithBlock(), | ||||||
|  | 		grpc.WithTimeout(2*time.Second), | ||||||
|  | 	) | ||||||
|  | 	conn, err := grpc.Dial(fmt.Sprintf("unix://%s", socket), dialOpts...) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, errors.Wrapf(err, "failed to connect to shim via \"%s\"", fmt.Sprintf("unix://%s", socket)) | ||||||
|  | 	} | ||||||
|  | 	return shim.NewShimClient(conn), nil | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								mount.go
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								mount.go
									
										
									
									
									
								
							|  | @ -3,9 +3,6 @@ package containerd | ||||||
| import ( | import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 
 |  | ||||||
| 	"github.com/Sirupsen/logrus" |  | ||||||
| 	"github.com/docker/containerd/log" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Mount is the lingua franca of containerd. A mount represents a | // Mount is the lingua franca of containerd. A mount represents a | ||||||
|  | @ -23,13 +20,6 @@ type Mount struct { | ||||||
| 
 | 
 | ||||||
| func (m *Mount) Mount(target string) error { | func (m *Mount) Mount(target string) error { | ||||||
| 	flags, data := parseMountOptions(m.Options) | 	flags, data := parseMountOptions(m.Options) | ||||||
| 
 |  | ||||||
| 	lfields := logrus.Fields{"target": target, "source": m.Source} |  | ||||||
| 	if data != "" { |  | ||||||
| 		lfields["data"] = data |  | ||||||
| 	} |  | ||||||
| 	log.L.WithFields(lfields).Debug("syscall.Mount") |  | ||||||
| 
 |  | ||||||
| 	return syscall.Mount(m.Source, target, m.Type, uintptr(flags), data) | 	return syscall.Mount(m.Source, target, m.Type, uintptr(flags), data) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										79
									
								
								runtime.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								runtime.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,79 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"sync" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NewRuntimeFunc is the runtime's constructor | ||||||
|  | type NewRuntimeFunc func(root string) (Runtime, error) | ||||||
|  | 
 | ||||||
|  | var runtimeRegistration = struct { | ||||||
|  | 	mu       sync.Mutex | ||||||
|  | 	runtimes map[string]NewRuntimeFunc | ||||||
|  | }{ | ||||||
|  | 	runtimes: make(map[string]NewRuntimeFunc), | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RegisterRuntime is not external packages registers Runtimes for use with containerd | ||||||
|  | func RegisterRuntime(name string, f NewRuntimeFunc) { | ||||||
|  | 	runtimeRegistration.mu.Lock() | ||||||
|  | 	defer runtimeRegistration.mu.Unlock() | ||||||
|  | 	if _, ok := runtimeRegistration.runtimes[name]; ok { | ||||||
|  | 		panic(fmt.Errorf("runtime already registered as %q", name)) | ||||||
|  | 	} | ||||||
|  | 	runtimeRegistration.runtimes[name] = f | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Runtimes returns a slice of all registered runtime names for containerd | ||||||
|  | func Runtimes() (o []string) { | ||||||
|  | 	runtimeRegistration.mu.Lock() | ||||||
|  | 	defer runtimeRegistration.mu.Unlock() | ||||||
|  | 
 | ||||||
|  | 	for k := range runtimeRegistration.runtimes { | ||||||
|  | 		o = append(o, k) | ||||||
|  | 	} | ||||||
|  | 	return o | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewRuntime calls the runtime's constructor with the provided root | ||||||
|  | func NewRuntime(name, root string) (Runtime, error) { | ||||||
|  | 	runtimeRegistration.mu.Lock() | ||||||
|  | 	defer runtimeRegistration.mu.Unlock() | ||||||
|  | 	f, ok := runtimeRegistration.runtimes[name] | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil, ErrRuntimeNotExist | ||||||
|  | 	} | ||||||
|  | 	return f(root) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type IO struct { | ||||||
|  | 	Stdin    string | ||||||
|  | 	Stdout   string | ||||||
|  | 	Stderr   string | ||||||
|  | 	Terminal bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CreateOpts struct { | ||||||
|  | 	// Spec is the OCI runtime spec | ||||||
|  | 	Spec []byte | ||||||
|  | 	// Rootfs mounts to perform to gain access to the container's filesystem | ||||||
|  | 	Rootfs []Mount | ||||||
|  | 	// IO for the container's main process | ||||||
|  | 	IO IO | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Runtime is responsible for the creation of containers for a certain platform, | ||||||
|  | // arch, or custom usage. | ||||||
|  | type Runtime interface { | ||||||
|  | 	// Create creates a container with the provided id and options | ||||||
|  | 	Create(ctx context.Context, id string, opts CreateOpts) (Container, error) | ||||||
|  | 	// Containers returns all the current containers for the runtime | ||||||
|  | 	Containers() ([]Container, error) | ||||||
|  | 	// Delete removes the container in the runtime | ||||||
|  | 	Delete(ctx context.Context, c Container) error | ||||||
|  | 	// Events returns events for the runtime and all containers created by the runtime | ||||||
|  | 	Events(context.Context) <-chan *Event | ||||||
|  | } | ||||||
							
								
								
									
										137
									
								
								services/execution/service.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								services/execution/service.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,137 @@ | ||||||
|  | package execution | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/docker/containerd" | ||||||
|  | 	api "github.com/docker/containerd/api/services/execution" | ||||||
|  | 	"github.com/docker/containerd/api/types/container" | ||||||
|  | 	google_protobuf "github.com/golang/protobuf/ptypes/empty" | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	_     = (api.ContainerServiceServer)(&Service{}) | ||||||
|  | 	empty = &google_protobuf.Empty{} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // New creates a new GRPC service for the ContainerService | ||||||
|  | func New(s *containerd.Supervisor) *Service { | ||||||
|  | 	return &Service{ | ||||||
|  | 		s: s, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Service struct { | ||||||
|  | 	s *containerd.Supervisor | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) Create(ctx context.Context, r *api.CreateRequest) (*api.CreateResponse, error) { | ||||||
|  | 	opts := containerd.CreateOpts{ | ||||||
|  | 		Spec: r.Spec.Value, | ||||||
|  | 		IO: containerd.IO{ | ||||||
|  | 			Stdin:    r.Stdin, | ||||||
|  | 			Stdout:   r.Stdout, | ||||||
|  | 			Stderr:   r.Stderr, | ||||||
|  | 			Terminal: r.Terminal, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, m := range r.Rootfs { | ||||||
|  | 		opts.Rootfs = append(opts.Rootfs, containerd.Mount{ | ||||||
|  | 			Type:    m.Type, | ||||||
|  | 			Source:  m.Source, | ||||||
|  | 			Options: m.Options, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	c, err := s.s.Create(ctx, r.ID, r.Runtime, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	state, err := c.State(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		s.s.Delete(ctx, r.ID) | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &api.CreateResponse{ | ||||||
|  | 		ID:  r.ID, | ||||||
|  | 		Pid: state.Pid(), | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) Start(ctx context.Context, r *api.StartRequest) (*google_protobuf.Empty, error) { | ||||||
|  | 	c, err := s.s.Get(r.ID) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if err := c.Start(ctx); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return empty, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) Delete(ctx context.Context, r *api.DeleteRequest) (*google_protobuf.Empty, error) { | ||||||
|  | 	if err := s.s.Delete(ctx, r.ID); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return empty, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) List(ctx context.Context, r *api.ListRequest) (*api.ListResponse, error) { | ||||||
|  | 	resp := &api.ListResponse{} | ||||||
|  | 	for _, c := range s.s.Containers() { | ||||||
|  | 		state, err := c.State(ctx) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		var status container.Status | ||||||
|  | 		switch state.Status() { | ||||||
|  | 		case containerd.CreatedStatus: | ||||||
|  | 			status = container.Status_CREATED | ||||||
|  | 		case containerd.RunningStatus: | ||||||
|  | 			status = container.Status_RUNNING | ||||||
|  | 		case containerd.StoppedStatus: | ||||||
|  | 			status = container.Status_STOPPED | ||||||
|  | 		case containerd.PausedStatus: | ||||||
|  | 			status = container.Status_PAUSED | ||||||
|  | 		} | ||||||
|  | 		resp.Containers = append(resp.Containers, &container.Container{ | ||||||
|  | 			ID:     c.Info().ID, | ||||||
|  | 			Pid:    state.Pid(), | ||||||
|  | 			Status: status, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	return resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) Events(r *api.EventsRequest, server api.ContainerService_EventsServer) error { | ||||||
|  | 	w := &grpcEventWriter{ | ||||||
|  | 		server: server, | ||||||
|  | 	} | ||||||
|  | 	return s.s.ForwardEvents(w) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type grpcEventWriter struct { | ||||||
|  | 	server api.ContainerService_EventsServer | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g *grpcEventWriter) Write(e *containerd.Event) error { | ||||||
|  | 	var t container.Event_EventType | ||||||
|  | 	switch e.Type { | ||||||
|  | 	case containerd.ExitEvent: | ||||||
|  | 		t = container.Event_EXIT | ||||||
|  | 	case containerd.ExecAddEvent: | ||||||
|  | 		t = container.Event_EXEC_ADDED | ||||||
|  | 	case containerd.PausedEvent: | ||||||
|  | 		t = container.Event_PAUSED | ||||||
|  | 	case containerd.CreateEvent: | ||||||
|  | 		t = container.Event_CREATE | ||||||
|  | 	case containerd.StartEvent: | ||||||
|  | 		t = container.Event_START | ||||||
|  | 	case containerd.OOMEvent: | ||||||
|  | 		t = container.Event_OOM | ||||||
|  | 	} | ||||||
|  | 	return g.server.Send(&container.Event{ | ||||||
|  | 		Type:       t, | ||||||
|  | 		ID:         e.ID, | ||||||
|  | 		Pid:        e.Pid, | ||||||
|  | 		ExitStatus: e.ExitStatus, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								shim/init.go
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								shim/init.go
									
										
									
									
									
								
							|  | @ -9,6 +9,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/crosbymichael/console" | 	"github.com/crosbymichael/console" | ||||||
| 	runc "github.com/crosbymichael/go-runc" | 	runc "github.com/crosbymichael/go-runc" | ||||||
|  | 	"github.com/docker/containerd" | ||||||
| 	shimapi "github.com/docker/containerd/api/services/shim" | 	shimapi "github.com/docker/containerd/api/services/shim" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -29,6 +30,16 @@ func newInitProcess(context context.Context, r *shimapi.CreateRequest) (*initPro | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	for _, rm := range r.Rootfs { | ||||||
|  | 		m := &containerd.Mount{ | ||||||
|  | 			Type:    rm.Type, | ||||||
|  | 			Source:  rm.Source, | ||||||
|  | 			Options: rm.Options, | ||||||
|  | 		} | ||||||
|  | 		if err := m.Mount(filepath.Join(cwd, "rootfs")); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	runtime := &runc.Runc{ | 	runtime := &runc.Runc{ | ||||||
| 		Command:      r.Runtime, | 		Command:      r.Runtime, | ||||||
| 		Log:          filepath.Join(cwd, "log.json"), | 		Log:          filepath.Join(cwd, "log.json"), | ||||||
|  |  | ||||||
|  | @ -1,26 +1,26 @@ | ||||||
| package shim | package shim | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"os" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 
 | 
 | ||||||
| 	"github.com/crosbymichael/console" | 	"github.com/crosbymichael/console" | ||||||
| 	shimapi "github.com/docker/containerd/api/services/shim" | 	shimapi "github.com/docker/containerd/api/services/shim" | ||||||
| 	processapi "github.com/docker/containerd/api/types/process" | 	"github.com/docker/containerd/api/types/container" | ||||||
| 	stateapi "github.com/docker/containerd/api/types/state" |  | ||||||
| 	"github.com/docker/containerd/utils" | 	"github.com/docker/containerd/utils" | ||||||
| 	google_protobuf "github.com/golang/protobuf/ptypes/empty" | 	google_protobuf "github.com/golang/protobuf/ptypes/empty" | ||||||
| 	"github.com/pkg/errors" | 	"github.com/pkg/errors" | ||||||
| 	"golang.org/x/net/context" | 	"golang.org/x/net/context" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var emptyResponse = &google_protobuf.Empty{} | var empty = &google_protobuf.Empty{} | ||||||
| 
 | 
 | ||||||
| // New returns a new shim service that can be used via GRPC | // New returns a new shim service that can be used via GRPC | ||||||
| func New() *Service { | func New() *Service { | ||||||
| 	return &Service{ | 	return &Service{ | ||||||
| 		processes: make(map[int]process), | 		processes: make(map[int]process), | ||||||
| 		events:    make(chan *shimapi.Event, 4096), | 		events:    make(chan *container.Event, 4096), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -30,7 +30,7 @@ type Service struct { | ||||||
| 	bundle      string | 	bundle      string | ||||||
| 	mu          sync.Mutex | 	mu          sync.Mutex | ||||||
| 	processes   map[int]process | 	processes   map[int]process | ||||||
| 	events      chan *shimapi.Event | 	events      chan *container.Event | ||||||
| 	execID      int | 	execID      int | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -46,8 +46,8 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateRequest) (*shimap | ||||||
| 	pid := process.Pid() | 	pid := process.Pid() | ||||||
| 	s.processes[pid] = process | 	s.processes[pid] = process | ||||||
| 	s.mu.Unlock() | 	s.mu.Unlock() | ||||||
| 	s.events <- &shimapi.Event{ | 	s.events <- &container.Event{ | ||||||
| 		Type: shimapi.EventType_CREATE, | 		Type: container.Event_CREATE, | ||||||
| 		ID:   r.ID, | 		ID:   r.ID, | ||||||
| 		Pid:  uint32(pid), | 		Pid:  uint32(pid), | ||||||
| 	} | 	} | ||||||
|  | @ -60,12 +60,12 @@ func (s *Service) Start(ctx context.Context, r *shimapi.StartRequest) (*google_p | ||||||
| 	if err := s.initProcess.Start(ctx); err != nil { | 	if err := s.initProcess.Start(ctx); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	s.events <- &shimapi.Event{ | 	s.events <- &container.Event{ | ||||||
| 		Type: shimapi.EventType_START, | 		Type: container.Event_START, | ||||||
| 		ID:   s.id, | 		ID:   s.id, | ||||||
| 		Pid:  uint32(s.initProcess.Pid()), | 		Pid:  uint32(s.initProcess.Pid()), | ||||||
| 	} | 	} | ||||||
| 	return emptyResponse, nil | 	return empty, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *Service) Delete(ctx context.Context, r *shimapi.DeleteRequest) (*shimapi.DeleteResponse, error) { | func (s *Service) Delete(ctx context.Context, r *shimapi.DeleteRequest) (*shimapi.DeleteResponse, error) { | ||||||
|  | @ -73,7 +73,7 @@ func (s *Service) Delete(ctx context.Context, r *shimapi.DeleteRequest) (*shimap | ||||||
| 	p, ok := s.processes[int(r.Pid)] | 	p, ok := s.processes[int(r.Pid)] | ||||||
| 	s.mu.Unlock() | 	s.mu.Unlock() | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, errors.Errorf("process does not exist %d", r.Pid) | 		p = s.initProcess | ||||||
| 	} | 	} | ||||||
| 	if err := p.Delete(ctx); err != nil { | 	if err := p.Delete(ctx); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -96,8 +96,8 @@ func (s *Service) Exec(ctx context.Context, r *shimapi.ExecRequest) (*shimapi.Ex | ||||||
| 	} | 	} | ||||||
| 	pid := process.Pid() | 	pid := process.Pid() | ||||||
| 	s.processes[pid] = process | 	s.processes[pid] = process | ||||||
| 	s.events <- &shimapi.Event{ | 	s.events <- &container.Event{ | ||||||
| 		Type: shimapi.EventType_EXEC_ADDED, | 		Type: container.Event_EXEC_ADDED, | ||||||
| 		ID:   s.id, | 		ID:   s.id, | ||||||
| 		Pid:  uint32(pid), | 		Pid:  uint32(pid), | ||||||
| 	} | 	} | ||||||
|  | @ -123,7 +123,7 @@ func (s *Service) Pty(ctx context.Context, r *shimapi.PtyRequest) (*google_proto | ||||||
| 	if err := p.Resize(ws); err != nil { | 	if err := p.Resize(ws); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return emptyResponse, nil | 	return empty, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *Service) Events(r *shimapi.EventsRequest, stream shimapi.Shim_EventsServer) error { | func (s *Service) Events(r *shimapi.EventsRequest, stream shimapi.Shim_EventsServer) error { | ||||||
|  | @ -139,22 +139,22 @@ func (s *Service) State(ctx context.Context, r *shimapi.StateRequest) (*shimapi. | ||||||
| 	o := &shimapi.StateResponse{ | 	o := &shimapi.StateResponse{ | ||||||
| 		ID:        s.id, | 		ID:        s.id, | ||||||
| 		Bundle:    s.bundle, | 		Bundle:    s.bundle, | ||||||
| 		InitPid:   uint32(s.initProcess.Pid()), | 		Pid:       uint32(s.initProcess.Pid()), | ||||||
| 		Processes: []*processapi.Process{}, | 		Processes: []*container.Process{}, | ||||||
| 	} | 	} | ||||||
| 	s.mu.Lock() | 	s.mu.Lock() | ||||||
| 	defer s.mu.Unlock() | 	defer s.mu.Unlock() | ||||||
| 	for _, p := range s.processes { | 	for _, p := range s.processes { | ||||||
| 		state := stateapi.State_RUNNING | 		status := container.Status_RUNNING | ||||||
| 		if err := syscall.Kill(p.Pid(), 0); err != nil { | 		if err := syscall.Kill(p.Pid(), 0); err != nil { | ||||||
| 			if err != syscall.ESRCH { | 			if err != syscall.ESRCH { | ||||||
| 				return nil, err | 				return nil, err | ||||||
| 			} | 			} | ||||||
| 			state = stateapi.State_STOPPED | 			status = container.Status_STOPPED | ||||||
| 		} | 		} | ||||||
| 		o.Processes = append(o.Processes, &processapi.Process{ | 		o.Processes = append(o.Processes, &container.Process{ | ||||||
| 			Pid:    uint32(p.Pid()), | 			Pid:    uint32(p.Pid()), | ||||||
| 			State: state, | 			Status: status, | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 	return o, nil | 	return o, nil | ||||||
|  | @ -164,22 +164,30 @@ func (s *Service) Pause(ctx context.Context, r *shimapi.PauseRequest) (*google_p | ||||||
| 	if err := s.initProcess.Pause(ctx); err != nil { | 	if err := s.initProcess.Pause(ctx); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return emptyResponse, nil | 	return empty, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *Service) Resume(ctx context.Context, r *shimapi.ResumeRequest) (*google_protobuf.Empty, error) { | func (s *Service) Resume(ctx context.Context, r *shimapi.ResumeRequest) (*google_protobuf.Empty, error) { | ||||||
| 	if err := s.initProcess.Resume(ctx); err != nil { | 	if err := s.initProcess.Resume(ctx); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return emptyResponse, nil | 	return empty, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Service) Exit(ctx context.Context, r *shimapi.ExitRequest) (*google_protobuf.Empty, error) { | ||||||
|  | 	// signal ourself to exit | ||||||
|  | 	if err := syscall.Kill(os.Getpid(), syscall.SIGTERM); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return empty, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *Service) ProcessExit(e utils.Exit) error { | func (s *Service) ProcessExit(e utils.Exit) error { | ||||||
| 	s.mu.Lock() | 	s.mu.Lock() | ||||||
| 	if p, ok := s.processes[e.Pid]; ok { | 	if p, ok := s.processes[e.Pid]; ok { | ||||||
| 		p.Exited(e.Status) | 		p.Exited(e.Status) | ||||||
| 		s.events <- &shimapi.Event{ | 		s.events <- &container.Event{ | ||||||
| 			Type:       shimapi.EventType_EXIT, | 			Type:       container.Event_EXIT, | ||||||
| 			ID:         s.id, | 			ID:         s.id, | ||||||
| 			Pid:        uint32(p.Pid()), | 			Pid:        uint32(p.Pid()), | ||||||
| 			ExitStatus: uint32(e.Status), | 			ExitStatus: uint32(e.Status), | ||||||
|  |  | ||||||
|  | @ -1,70 +0,0 @@ | ||||||
| package specification |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"runtime" |  | ||||||
| 
 |  | ||||||
| 	"github.com/docker/containerd" |  | ||||||
| 	"github.com/opencontainers/runtime-spec/specs-go" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var rwm = "rwm" |  | ||||||
| 
 |  | ||||||
| func Default(config containerd.Config, mounts []containerd.Mount) *specs.Spec { |  | ||||||
| 	s := &specs.Spec{ |  | ||||||
| 		Version: specs.Version, |  | ||||||
| 		Platform: specs.Platform{ |  | ||||||
| 			OS:   runtime.GOOS, |  | ||||||
| 			Arch: runtime.GOARCH, |  | ||||||
| 		}, |  | ||||||
| 		Root: specs.Root{ |  | ||||||
| 			Path:     "rootfs", |  | ||||||
| 			Readonly: false, |  | ||||||
| 		}, |  | ||||||
| 		Process: specs.Process{ |  | ||||||
| 			Args:            config.Process.Args, |  | ||||||
| 			Env:             config.Process.Env, |  | ||||||
| 			Terminal:        config.Process.TTY, |  | ||||||
| 			Cwd:             config.Process.Cwd, |  | ||||||
| 			NoNewPrivileges: true, |  | ||||||
| 		}, |  | ||||||
| 		Hostname: config.Hostname, |  | ||||||
| 		Linux: &specs.Linux{ |  | ||||||
| 			Resources: &specs.LinuxResources{ |  | ||||||
| 				Devices: []specs.LinuxDeviceCgroup{ |  | ||||||
| 					{ |  | ||||||
| 						Allow:  false, |  | ||||||
| 						Access: &rwm, |  | ||||||
| 					}, |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 			Namespaces: []specs.LinuxNamespace{ |  | ||||||
| 				{ |  | ||||||
| 					Type: "pid", |  | ||||||
| 				}, |  | ||||||
| 				{ |  | ||||||
| 					Type: "ipc", |  | ||||||
| 				}, |  | ||||||
| 				{ |  | ||||||
| 					Type: "uts", |  | ||||||
| 				}, |  | ||||||
| 				{ |  | ||||||
| 					Type: "mount", |  | ||||||
| 				}, |  | ||||||
| 				{ |  | ||||||
| 					Type: "network", |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		Annotations: config.Labels, |  | ||||||
| 	} |  | ||||||
| 	// apply snapshot mounts |  | ||||||
| 	for _, m := range mounts { |  | ||||||
| 		s.Mounts = append(s.Mounts, specs.Mount{ |  | ||||||
| 			Source:      m.Source, |  | ||||||
| 			Destination: "/", |  | ||||||
| 			Type:        m.Type, |  | ||||||
| 			Options:     m.Options, |  | ||||||
| 		}) |  | ||||||
| 	} |  | ||||||
| 	return s |  | ||||||
| } |  | ||||||
							
								
								
									
										100
									
								
								supervisor.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								supervisor.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | package containerd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"sync" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/net/context" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func NewSupervisor(ctx context.Context, runtimes map[string]Runtime) (*Supervisor, error) { | ||||||
|  | 	c, err := newCollector(ctx, runtimes) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	s := &Supervisor{ | ||||||
|  | 		containers: make(map[string]Container), | ||||||
|  | 		runtimes:   runtimes, | ||||||
|  | 		collector:  c, | ||||||
|  | 	} | ||||||
|  | 	for _, r := range runtimes { | ||||||
|  | 		containers, err := r.Containers() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		for _, c := range containers { | ||||||
|  | 			s.containers[c.Info().ID] = c | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return s, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Supervisor supervises containers and events from multiple runtimes | ||||||
|  | type Supervisor struct { | ||||||
|  | 	mu sync.Mutex | ||||||
|  | 
 | ||||||
|  | 	containers map[string]Container | ||||||
|  | 	runtimes   map[string]Runtime | ||||||
|  | 	collector  *collector | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ForwardEvents is a blocking method that will forward all events from the supervisor | ||||||
|  | // to the EventWriter provided by the caller | ||||||
|  | func (s *Supervisor) ForwardEvents(w EventWriter) error { | ||||||
|  | 	return s.collector.forward(w) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Create creates a new container with the provided runtime | ||||||
|  | func (s *Supervisor) Create(ctx context.Context, id, runtime string, opts CreateOpts) (Container, error) { | ||||||
|  | 	r, ok := s.runtimes[runtime] | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil, ErrUnknownRuntime | ||||||
|  | 	} | ||||||
|  | 	// check to make sure the container's id is unique across the entire system | ||||||
|  | 	s.mu.Lock() | ||||||
|  | 	defer s.mu.Unlock() | ||||||
|  | 	if _, ok := s.containers[id]; ok { | ||||||
|  | 		return nil, ErrContainerExists | ||||||
|  | 	} | ||||||
|  | 	c, err := r.Create(ctx, id, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	s.containers[c.Info().ID] = c | ||||||
|  | 	return c, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Delete deletes the container | ||||||
|  | func (s *Supervisor) Delete(ctx context.Context, id string) error { | ||||||
|  | 	s.mu.Lock() | ||||||
|  | 	defer s.mu.Unlock() | ||||||
|  | 	c, ok := s.containers[id] | ||||||
|  | 	if !ok { | ||||||
|  | 		return ErrContainerNotExist | ||||||
|  | 	} | ||||||
|  | 	err := s.runtimes[c.Info().Runtime].Delete(ctx, c) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	delete(s.containers, id) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Containers returns all the containers for the supervisor | ||||||
|  | func (s *Supervisor) Containers() (o []Container) { | ||||||
|  | 	s.mu.Lock() | ||||||
|  | 	defer s.mu.Unlock() | ||||||
|  | 	for _, c := range s.containers { | ||||||
|  | 		o = append(o, c) | ||||||
|  | 	} | ||||||
|  | 	return o | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *Supervisor) Get(id string) (Container, error) { | ||||||
|  | 	s.mu.Lock() | ||||||
|  | 	c, ok := s.containers[id] | ||||||
|  | 	s.mu.Unlock() | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil, ErrContainerNotExist | ||||||
|  | 	} | ||||||
|  | 	return c, nil | ||||||
|  | } | ||||||
|  | @ -1,354 +0,0 @@ | ||||||
| package supervisor |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	executionapi "github.com/docker/containerd/api/services/execution" |  | ||||||
| 	"github.com/docker/containerd/api/services/shim" |  | ||||||
| 	"github.com/docker/containerd/api/types/container" |  | ||||||
| 	"github.com/docker/containerd/api/types/process" |  | ||||||
| 	"github.com/docker/containerd/events" |  | ||||||
| 	"github.com/docker/containerd/execution" |  | ||||||
| 	"github.com/docker/containerd/log" |  | ||||||
| 	google_protobuf "github.com/golang/protobuf/ptypes/empty" |  | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| 	"golang.org/x/net/context" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	_     = (executionapi.ExecutionServiceServer)(&Service{}) |  | ||||||
| 	empty = &google_protobuf.Empty{} |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // New creates a new GRPC services for execution |  | ||||||
| func New(ctx context.Context, root string) (*Service, error) { |  | ||||||
| 	ctx = log.WithModule(ctx, "supervisor") |  | ||||||
| 	log.G(ctx).WithField("root", root).Debugf("New()") |  | ||||||
| 	if err := os.MkdirAll(root, 0700); err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "unable to create root directory %q", root) |  | ||||||
| 	} |  | ||||||
| 	clients, err := loadClients(ctx, root) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	s := &Service{ |  | ||||||
| 		root:  root, |  | ||||||
| 		shims: clients, |  | ||||||
| 		ctx:   ctx, |  | ||||||
| 	} |  | ||||||
| 	for _, c := range clients { |  | ||||||
| 		if err := s.monitor(events.GetPoster(ctx), c); err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return s, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Service struct { |  | ||||||
| 	mu sync.Mutex |  | ||||||
| 
 |  | ||||||
| 	ctx   context.Context |  | ||||||
| 	root  string |  | ||||||
| 	shims map[string]*shimClient |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) propagateRuntimeLog(client *shimClient, entries int) { |  | ||||||
| 	logs, err := client.readRuntimeLogEntries(entries) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.G(s.ctx).WithError(err).WithField("container", client.id). |  | ||||||
| 			Warnf("failed to read shim log") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	log.G(s.ctx).WithField("container", client.id). |  | ||||||
| 		Warnf("shim log (last %d entry): %v", entries, logs) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) CreateContainer(ctx context.Context, r *executionapi.CreateContainerRequest) (*executionapi.CreateContainerResponse, error) { |  | ||||||
| 	client, err := s.newShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer func() { |  | ||||||
| 		if err != nil { |  | ||||||
| 			s.propagateRuntimeLog(client, 1) |  | ||||||
| 			s.removeShim(r.ID) |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	if err := s.monitor(events.GetPoster(ctx), client); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	createResponse, err := client.Create(ctx, &shim.CreateRequest{ |  | ||||||
| 		ID:       r.ID, |  | ||||||
| 		Bundle:   r.BundlePath, |  | ||||||
| 		Terminal: r.Console, |  | ||||||
| 		Stdin:    r.Stdin, |  | ||||||
| 		Stdout:   r.Stdout, |  | ||||||
| 		Stderr:   r.Stderr, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "shim create request failed") |  | ||||||
| 	} |  | ||||||
| 	client.initPid = createResponse.Pid |  | ||||||
| 	return &executionapi.CreateContainerResponse{ |  | ||||||
| 		Container: &container.Container{ |  | ||||||
| 			ID: r.ID, |  | ||||||
| 		}, |  | ||||||
| 		InitProcess: &process.Process{ |  | ||||||
| 			Pid: createResponse.Pid, |  | ||||||
| 		}, |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) StartContainer(ctx context.Context, r *executionapi.StartContainerRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	client, err := s.getShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	if _, err := client.Start(ctx, &shim.StartRequest{}); err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return empty, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) DeleteContainer(ctx context.Context, r *executionapi.DeleteContainerRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	client, err := s.getShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	_, err = client.Delete(ctx, &shim.DeleteRequest{ |  | ||||||
| 		Pid: client.initPid, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	s.removeShim(r.ID) |  | ||||||
| 	return empty, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) ListContainers(ctx context.Context, r *executionapi.ListContainersRequest) (*executionapi.ListContainersResponse, error) { |  | ||||||
| 	resp := &executionapi.ListContainersResponse{} |  | ||||||
| 	for _, client := range s.shims { |  | ||||||
| 		status, err := client.State(ctx, &shim.StateRequest{}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		resp.Containers = append(resp.Containers, &container.Container{ |  | ||||||
| 			ID:     status.ID, |  | ||||||
| 			Bundle: status.Bundle, |  | ||||||
| 		}) |  | ||||||
| 	} |  | ||||||
| 	return resp, nil |  | ||||||
| } |  | ||||||
| func (s *Service) GetContainer(ctx context.Context, r *executionapi.GetContainerRequest) (*executionapi.GetContainerResponse, error) { |  | ||||||
| 	client, err := s.getShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	state, err := client.State(ctx, &shim.StateRequest{}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return &executionapi.GetContainerResponse{ |  | ||||||
| 		Container: &container.Container{ |  | ||||||
| 			ID:     state.ID, |  | ||||||
| 			Bundle: state.Bundle, |  | ||||||
| 			// TODO: add processes |  | ||||||
| 		}, |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) UpdateContainer(ctx context.Context, r *executionapi.UpdateContainerRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	panic("not implemented") |  | ||||||
| 	return empty, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) PauseContainer(ctx context.Context, r *executionapi.PauseContainerRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	client, err := s.getShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return client.Pause(ctx, &shim.PauseRequest{}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) ResumeContainer(ctx context.Context, r *executionapi.ResumeContainerRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	client, err := s.getShim(r.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return client.Resume(ctx, &shim.ResumeRequest{}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) StartProcess(ctx context.Context, r *executionapi.StartProcessRequest) (*executionapi.StartProcessResponse, error) { |  | ||||||
| 	client, err := s.getShim(r.ContainerID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	er := &shim.ExecRequest{ |  | ||||||
| 		Terminal: r.Console, |  | ||||||
| 		Stdin:    r.Stdin, |  | ||||||
| 		Stdout:   r.Stdout, |  | ||||||
| 		Stderr:   r.Stderr, |  | ||||||
| 		Args:     r.Process.Args, |  | ||||||
| 		Env:      r.Process.Env, |  | ||||||
| 		Cwd:      r.Process.Cwd, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if r.Process.User != nil { |  | ||||||
| 		er.User.Uid = r.Process.User.Uid |  | ||||||
| 		er.User.Gid = r.Process.User.Gid |  | ||||||
| 		er.User.AdditionalGids = r.Process.User.AdditionalGids |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	resp, err := client.Exec(ctx, er) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to exec into container %q", r.ContainerID) |  | ||||||
| 	} |  | ||||||
| 	r.Process.Pid = resp.Pid |  | ||||||
| 	return &executionapi.StartProcessResponse{ |  | ||||||
| 		Process: r.Process, |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // containerd managed execs + system pids forked in container |  | ||||||
| func (s *Service) GetProcess(ctx context.Context, r *executionapi.GetProcessRequest) (*executionapi.GetProcessResponse, error) { |  | ||||||
| 	panic("not implemented") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) SignalProcess(ctx context.Context, r *executionapi.SignalProcessRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	panic("not implemented") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) DeleteProcess(ctx context.Context, r *executionapi.DeleteProcessRequest) (*google_protobuf.Empty, error) { |  | ||||||
| 	client, err := s.getShim(r.ContainerID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	_, err = client.Delete(ctx, &shim.DeleteRequest{ |  | ||||||
| 		Pid: r.Pid, |  | ||||||
| 	}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	if r.Pid == client.initPid { |  | ||||||
| 		s.removeShim(r.ContainerID) |  | ||||||
| 	} |  | ||||||
| 	return empty, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) ListProcesses(ctx context.Context, r *executionapi.ListProcessesRequest) (*executionapi.ListProcessesResponse, error) { |  | ||||||
| 	panic("not implemented") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // monitor monitors the shim's event rpc and forwards container and process |  | ||||||
| // events to callers |  | ||||||
| func (s *Service) monitor(poster events.Poster, client *shimClient) error { |  | ||||||
| 	// we use the service context here because we don't want to be |  | ||||||
| 	// tied to the Create rpc call |  | ||||||
| 	stream, err := client.Events(s.ctx, &shim.EventsRequest{}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return errors.Wrapf(err, "failed to get events stream for client at %q", client.root) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	go func() { |  | ||||||
| 		for { |  | ||||||
| 			e, err := stream.Recv() |  | ||||||
| 			if err != nil { |  | ||||||
| 				if err.Error() == "EOF" || strings.Contains(err.Error(), "transport is closing") { |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 				log.G(s.ctx).WithError(err).WithField("container", client.id). |  | ||||||
| 					Warnf("event stream for client at %q got terminated", client.root) |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			var topic string |  | ||||||
| 			if e.Type == shim.EventType_CREATE { |  | ||||||
| 				topic = "containers" |  | ||||||
| 			} else { |  | ||||||
| 				topic = fmt.Sprintf("containers.%s", e.ID) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			ctx := events.WithTopic(s.ctx, topic) |  | ||||||
| 			poster.Post(ctx, execution.ContainerEvent{ |  | ||||||
| 				Timestamp:  time.Now(), |  | ||||||
| 				ID:         e.ID, |  | ||||||
| 				Type:       toExecutionEventType(e.Type), |  | ||||||
| 				Pid:        e.Pid, |  | ||||||
| 				ExitStatus: e.ExitStatus, |  | ||||||
| 			}) |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) newShim(id string) (*shimClient, error) { |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	defer s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	if _, ok := s.shims[id]; ok { |  | ||||||
| 		return nil, errors.Errorf("container %q already exists", id) |  | ||||||
| 	} |  | ||||||
| 	client, err := newShimClient(filepath.Join(s.root, id), id) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	s.shims[id] = client |  | ||||||
| 	return client, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) getShim(id string) (*shimClient, error) { |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	defer s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	client, ok := s.shims[id] |  | ||||||
| 	if !ok { |  | ||||||
| 		return nil, fmt.Errorf("container does not exist %q", id) |  | ||||||
| 	} |  | ||||||
| 	return client, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *Service) removeShim(id string) { |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	defer s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	client, ok := s.shims[id] |  | ||||||
| 	if ok { |  | ||||||
| 		client.stop() |  | ||||||
| 		delete(s.shims, id) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func loadClients(ctx context.Context, root string) (map[string]*shimClient, error) { |  | ||||||
| 	files, err := ioutil.ReadDir(root) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	out := make(map[string]*shimClient) |  | ||||||
| 	for _, f := range files { |  | ||||||
| 		if !f.IsDir() { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		// |  | ||||||
| 		id := f.Name() |  | ||||||
| 		client, err := loadShimClient(filepath.Join(root, id), id) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.G(ctx).WithError(err).WithField("id", id).Warn("failed to load container") |  | ||||||
| 			// TODO: send an exit event with 255 as exit status |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		out[f.Name()] = client |  | ||||||
| 	} |  | ||||||
| 	return out, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func toExecutionEventType(et shim.EventType) string { |  | ||||||
| 	return strings.Replace(strings.ToLower(et.String()), "_", "-", -1) |  | ||||||
| } |  | ||||||
|  | @ -1,160 +0,0 @@ | ||||||
| package supervisor |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"log" |  | ||||||
| 	"net" |  | ||||||
| 	"os" |  | ||||||
| 	"os/exec" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"strings" |  | ||||||
| 	"syscall" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/docker/containerd/api/services/shim" |  | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| 	"google.golang.org/grpc" |  | ||||||
| 	"google.golang.org/grpc/grpclog" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func newShimClient(root, id string) (*shimClient, error) { |  | ||||||
| 	if err := os.Mkdir(root, 0700); err != nil { |  | ||||||
| 		return nil, errors.Wrap(err, "failed to create shim working dir") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	cmd := exec.Command("containerd-shim") |  | ||||||
| 	cmd.Dir = root |  | ||||||
| 	cmd.SysProcAttr = &syscall.SysProcAttr{ |  | ||||||
| 		Setpgid: true, |  | ||||||
| 	} |  | ||||||
| 	if err := cmd.Start(); err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to start shim") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	socket := filepath.Join(root, "shim.sock") |  | ||||||
| 	sc, err := connectToShim(socket) |  | ||||||
| 	if err != nil { |  | ||||||
| 		syscall.Kill(cmd.Process.Pid, syscall.SIGKILL) |  | ||||||
| 		cmd.Wait() |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	s := &shimClient{ |  | ||||||
| 		ShimClient: sc, |  | ||||||
| 		shimCmd:    cmd, |  | ||||||
| 		syncCh:     make(chan struct{}), |  | ||||||
| 		root:       root, |  | ||||||
| 		id:         id, |  | ||||||
| 	} |  | ||||||
| 	go func() { |  | ||||||
| 		cmd.Wait() |  | ||||||
| 		close(s.syncCh) |  | ||||||
| 	}() |  | ||||||
| 
 |  | ||||||
| 	return s, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func loadShimClient(root, id string) (*shimClient, error) { |  | ||||||
| 	socket := filepath.Join(root, "shim.sock") |  | ||||||
| 	client, err := connectToShim(socket) |  | ||||||
| 	if err != nil { |  | ||||||
| 		// TODO: failed to connect to the shim, check if it's alive |  | ||||||
| 		//   - if it is kill it |  | ||||||
| 		//   - in both case call runc killall and runc delete on the id |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	resp, err := client.State(context.Background(), &shim.StateRequest{}) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to fetch state for container %s", id) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &shimClient{ |  | ||||||
| 		ShimClient: client, |  | ||||||
| 		root:       root, |  | ||||||
| 		id:         id, |  | ||||||
| 		initPid:    resp.InitPid, |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type shimClient struct { |  | ||||||
| 	shim.ShimClient |  | ||||||
| 	shimCmd *exec.Cmd |  | ||||||
| 	syncCh  chan struct{} |  | ||||||
| 	root    string |  | ||||||
| 	id      string |  | ||||||
| 	initPid uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *shimClient) stop() { |  | ||||||
| 	if s.shimCmd != nil { |  | ||||||
| 		select { |  | ||||||
| 		case <-s.syncCh: |  | ||||||
| 		default: |  | ||||||
| 			syscall.Kill(s.shimCmd.Process.Pid, syscall.SIGTERM) |  | ||||||
| 			select { |  | ||||||
| 			case <-s.syncCh: |  | ||||||
| 			case <-time.After(10 * time.Second): |  | ||||||
| 				syscall.Kill(s.shimCmd.Process.Pid, syscall.SIGKILL) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	os.RemoveAll(s.root) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *shimClient) readRuntimeLogEntries(lastEntries int) ([]map[string]interface{}, error) { |  | ||||||
| 	f, err := os.Open(filepath.Join(s.root, "log.json")) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer f.Close() |  | ||||||
| 	return parseRuntimeLog(f, lastEntries) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // parseRuntimeLog parses log.json. |  | ||||||
| // If lastEntries is greater than 0, only some last entries are returned. |  | ||||||
| func parseRuntimeLog(r io.Reader, lastEntries int) ([]map[string]interface{}, error) { |  | ||||||
| 	b, err := ioutil.ReadAll(r) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	lines := strings.Split(string(b), "\n") |  | ||||||
| 	if lastEntries > 0 { |  | ||||||
| 		lines = lines[len(lines)-lastEntries-1 : len(lines)] |  | ||||||
| 	} |  | ||||||
| 	var entries []map[string]interface{} |  | ||||||
| 	for _, line := range lines { |  | ||||||
| 		line = strings.TrimSpace(line) |  | ||||||
| 		if line == "" { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		var entry map[string]interface{} |  | ||||||
| 		if err := json.Unmarshal([]byte(line), &entry); err != nil { |  | ||||||
| 			return nil, errors.Wrapf(err, "cannot unmarshal JSON string %q", line) |  | ||||||
| 		} |  | ||||||
| 		entries = append(entries, entry) |  | ||||||
| 	} |  | ||||||
| 	return entries, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func connectToShim(socket string) (shim.ShimClient, error) { |  | ||||||
| 	// reset the logger for grpc to log to dev/null so that it does not mess with our stdio |  | ||||||
| 	grpclog.SetLogger(log.New(ioutil.Discard, "", log.LstdFlags)) |  | ||||||
| 	dialOpts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithTimeout(100 * time.Second)} |  | ||||||
| 	dialOpts = append(dialOpts, |  | ||||||
| 		grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { |  | ||||||
| 			return net.DialTimeout("unix", socket, timeout) |  | ||||||
| 		}), |  | ||||||
| 		grpc.WithBlock(), |  | ||||||
| 		grpc.WithTimeout(2*time.Second), |  | ||||||
| 	) |  | ||||||
| 	conn, err := grpc.Dial(fmt.Sprintf("unix://%s", socket), dialOpts...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, errors.Wrapf(err, "failed to connect to shim via \"%s\"", fmt.Sprintf("unix://%s", socket)) |  | ||||||
| 	} |  | ||||||
| 	return shim.NewShimClient(conn), nil |  | ||||||
| } |  | ||||||
|  | @ -1,47 +0,0 @@ | ||||||
| package supervisor |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"reflect" |  | ||||||
| 	"strings" |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestParseRuntimeLog(t *testing.T) { |  | ||||||
| 	s := `{"level": "error", "msg": "foo\n", "time": "2017-01-01T00:00:42Z"} |  | ||||||
| {"level": "error", "msg": "bar\n", "time": "2017-01-01T00:00:43Z"} |  | ||||||
| ` |  | ||||||
| 	testCases := []struct { |  | ||||||
| 		entries  int |  | ||||||
| 		expected []map[string]interface{} |  | ||||||
| 	}{ |  | ||||||
| 		{ |  | ||||||
| 			entries: 0, |  | ||||||
| 			expected: []map[string]interface{}{ |  | ||||||
| 				map[string]interface{}{"level": "error", "msg": "foo\n", "time": "2017-01-01T00:00:42Z"}, |  | ||||||
| 				map[string]interface{}{"level": "error", "msg": "bar\n", "time": "2017-01-01T00:00:43Z"}, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			entries: 1, |  | ||||||
| 			expected: []map[string]interface{}{ |  | ||||||
| 				map[string]interface{}{"level": "error", "msg": "bar\n", "time": "2017-01-01T00:00:43Z"}}, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			entries: 2, |  | ||||||
| 			expected: []map[string]interface{}{ |  | ||||||
| 				map[string]interface{}{"level": "error", "msg": "foo\n", "time": "2017-01-01T00:00:42Z"}, |  | ||||||
| 				map[string]interface{}{"level": "error", "msg": "bar\n", "time": "2017-01-01T00:00:43Z"}, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, tc := range testCases { |  | ||||||
| 		got, err := parseRuntimeLog(strings.NewReader(s), tc.entries) |  | ||||||
| 		if err != nil { |  | ||||||
| 			t.Fatal(err) |  | ||||||
| 		} |  | ||||||
| 		if !reflect.DeepEqual(tc.expected, got) { |  | ||||||
| 			t.Fatalf("expected %v, got %v", tc.expected, got) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										66
									
								
								vendor/github.com/docker/docker/pkg/term/ascii.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/docker/docker/pkg/term/ascii.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,66 +0,0 @@ | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"strings" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // ASCII list the possible supported ASCII key sequence |  | ||||||
| var ASCII = []string{ |  | ||||||
| 	"ctrl-@", |  | ||||||
| 	"ctrl-a", |  | ||||||
| 	"ctrl-b", |  | ||||||
| 	"ctrl-c", |  | ||||||
| 	"ctrl-d", |  | ||||||
| 	"ctrl-e", |  | ||||||
| 	"ctrl-f", |  | ||||||
| 	"ctrl-g", |  | ||||||
| 	"ctrl-h", |  | ||||||
| 	"ctrl-i", |  | ||||||
| 	"ctrl-j", |  | ||||||
| 	"ctrl-k", |  | ||||||
| 	"ctrl-l", |  | ||||||
| 	"ctrl-m", |  | ||||||
| 	"ctrl-n", |  | ||||||
| 	"ctrl-o", |  | ||||||
| 	"ctrl-p", |  | ||||||
| 	"ctrl-q", |  | ||||||
| 	"ctrl-r", |  | ||||||
| 	"ctrl-s", |  | ||||||
| 	"ctrl-t", |  | ||||||
| 	"ctrl-u", |  | ||||||
| 	"ctrl-v", |  | ||||||
| 	"ctrl-w", |  | ||||||
| 	"ctrl-x", |  | ||||||
| 	"ctrl-y", |  | ||||||
| 	"ctrl-z", |  | ||||||
| 	"ctrl-[", |  | ||||||
| 	"ctrl-\\", |  | ||||||
| 	"ctrl-]", |  | ||||||
| 	"ctrl-^", |  | ||||||
| 	"ctrl-_", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ToBytes converts a string representing a suite of key-sequence to the corresponding ASCII code. |  | ||||||
| func ToBytes(keys string) ([]byte, error) { |  | ||||||
| 	codes := []byte{} |  | ||||||
| next: |  | ||||||
| 	for _, key := range strings.Split(keys, ",") { |  | ||||||
| 		if len(key) != 1 { |  | ||||||
| 			for code, ctrl := range ASCII { |  | ||||||
| 				if ctrl == key { |  | ||||||
| 					codes = append(codes, byte(code)) |  | ||||||
| 					continue next |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			if key == "DEL" { |  | ||||||
| 				codes = append(codes, 127) |  | ||||||
| 			} else { |  | ||||||
| 				return nil, fmt.Errorf("Unknown character: '%s'", key) |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			codes = append(codes, byte(key[0])) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return codes, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										50
									
								
								vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,50 +0,0 @@ | ||||||
| // +build linux,cgo |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // #include <termios.h> |  | ||||||
| import "C" |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| // It is passthrough for syscall.Termios in order to make it portable with |  | ||||||
| // other platforms where it is not available or handled differently. |  | ||||||
| type Termios syscall.Termios |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if err := tcget(fd, &oldState.termios); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 
 |  | ||||||
| 	C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&newState))) |  | ||||||
| 	if err := tcset(fd, &newState); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func tcget(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p))) |  | ||||||
| 	if ret != 0 { |  | ||||||
| 		return err.(syscall.Errno) |  | ||||||
| 	} |  | ||||||
| 	return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func tcset(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p))) |  | ||||||
| 	if ret != 0 { |  | ||||||
| 		return err.(syscall.Errno) |  | ||||||
| 	} |  | ||||||
| 	return 0 |  | ||||||
| } |  | ||||||
							
								
								
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/tc_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/tc_other.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,20 +0,0 @@ | ||||||
| // +build !windows |  | ||||||
| // +build !linux !cgo |  | ||||||
| // +build !solaris !cgo |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func tcget(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p))) |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func tcset(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p))) |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
							
								
								
									
										63
									
								
								vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,63 +0,0 @@ | ||||||
| // +build solaris,cgo |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // #include <termios.h> |  | ||||||
| import "C" |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| // It is passthrough for syscall.Termios in order to make it portable with |  | ||||||
| // other platforms where it is not available or handled differently. |  | ||||||
| type Termios syscall.Termios |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if err := tcget(fd, &oldState.termios); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 
 |  | ||||||
| 	newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON | syscall.IXANY) |  | ||||||
| 	newState.Oflag &^= syscall.OPOST |  | ||||||
| 	newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN) |  | ||||||
| 	newState.Cflag &^= (syscall.CSIZE | syscall.PARENB) |  | ||||||
| 	newState.Cflag |= syscall.CS8 |  | ||||||
| 
 |  | ||||||
| 	/* |  | ||||||
| 		VMIN is the minimum number of characters that needs to be read in non-canonical mode for it to be returned |  | ||||||
| 		Since VMIN is overloaded with another element in canonical mode when we switch modes it defaults to 4. It |  | ||||||
| 		needs to be explicitly set to 1. |  | ||||||
| 	*/ |  | ||||||
| 	newState.Cc[C.VMIN] = 1 |  | ||||||
| 	newState.Cc[C.VTIME] = 0 |  | ||||||
| 
 |  | ||||||
| 	if err := tcset(fd, &newState); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func tcget(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p))) |  | ||||||
| 	if ret != 0 { |  | ||||||
| 		return err.(syscall.Errno) |  | ||||||
| 	} |  | ||||||
| 	return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func tcset(fd uintptr, p *Termios) syscall.Errno { |  | ||||||
| 	ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p))) |  | ||||||
| 	if ret != 0 { |  | ||||||
| 		return err.(syscall.Errno) |  | ||||||
| 	} |  | ||||||
| 	return 0 |  | ||||||
| } |  | ||||||
							
								
								
									
										123
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										123
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,123 +0,0 @@ | ||||||
| // +build !windows |  | ||||||
| 
 |  | ||||||
| // Package term provides structures and helper functions to work with |  | ||||||
| // terminal (state, sizes). |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| 	"os/signal" |  | ||||||
| 	"syscall" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// ErrInvalidState is returned if the state of the terminal is invalid. |  | ||||||
| 	ErrInvalidState = errors.New("Invalid terminal state") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // State represents the state of the terminal. |  | ||||||
| type State struct { |  | ||||||
| 	termios Termios |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Winsize represents the size of the terminal window. |  | ||||||
| type Winsize struct { |  | ||||||
| 	Height uint16 |  | ||||||
| 	Width  uint16 |  | ||||||
| 	x      uint16 |  | ||||||
| 	y      uint16 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // StdStreams returns the standard streams (stdin, stdout, stedrr). |  | ||||||
| func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { |  | ||||||
| 	return os.Stdin, os.Stdout, os.Stderr |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. |  | ||||||
| func GetFdInfo(in interface{}) (uintptr, bool) { |  | ||||||
| 	var inFd uintptr |  | ||||||
| 	var isTerminalIn bool |  | ||||||
| 	if file, ok := in.(*os.File); ok { |  | ||||||
| 		inFd = file.Fd() |  | ||||||
| 		isTerminalIn = IsTerminal(inFd) |  | ||||||
| 	} |  | ||||||
| 	return inFd, isTerminalIn |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal. |  | ||||||
| func IsTerminal(fd uintptr) bool { |  | ||||||
| 	var termios Termios |  | ||||||
| 	return tcget(fd, &termios) == 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RestoreTerminal restores the terminal connected to the given file descriptor |  | ||||||
| // to a previous state. |  | ||||||
| func RestoreTerminal(fd uintptr, state *State) error { |  | ||||||
| 	if state == nil { |  | ||||||
| 		return ErrInvalidState |  | ||||||
| 	} |  | ||||||
| 	if err := tcset(fd, &state.termios); err != 0 { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SaveState saves the state of the terminal connected to the given file descriptor. |  | ||||||
| func SaveState(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if err := tcget(fd, &oldState.termios); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DisableEcho applies the specified state to the terminal connected to the file |  | ||||||
| // descriptor, with echo disabled. |  | ||||||
| func DisableEcho(fd uintptr, state *State) error { |  | ||||||
| 	newState := state.termios |  | ||||||
| 	newState.Lflag &^= syscall.ECHO |  | ||||||
| 
 |  | ||||||
| 	if err := tcset(fd, &newState); err != 0 { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	handleInterrupt(fd, state) |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetRawTerminal puts the terminal connected to the given file descriptor into |  | ||||||
| // raw mode and returns the previous state. On UNIX, this puts both the input |  | ||||||
| // and output into raw mode. On Windows, it only puts the input into raw mode. |  | ||||||
| func SetRawTerminal(fd uintptr) (*State, error) { |  | ||||||
| 	oldState, err := MakeRaw(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	handleInterrupt(fd, oldState) |  | ||||||
| 	return oldState, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetRawTerminalOutput puts the output of terminal connected to the given file |  | ||||||
| // descriptor into raw mode. On UNIX, this does nothing and returns nil for the |  | ||||||
| // state. On Windows, it disables LF -> CRLF translation. |  | ||||||
| func SetRawTerminalOutput(fd uintptr) (*State, error) { |  | ||||||
| 	return nil, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func handleInterrupt(fd uintptr, state *State) { |  | ||||||
| 	sigchan := make(chan os.Signal, 1) |  | ||||||
| 	signal.Notify(sigchan, os.Interrupt) |  | ||||||
| 	go func() { |  | ||||||
| 		for range sigchan { |  | ||||||
| 			// quit cleanly and the new terminal item is on a new line |  | ||||||
| 			fmt.Println() |  | ||||||
| 			signal.Stop(sigchan) |  | ||||||
| 			close(sigchan) |  | ||||||
| 			RestoreTerminal(fd, state) |  | ||||||
| 			os.Exit(1) |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
| } |  | ||||||
							
								
								
									
										41
									
								
								vendor/github.com/docker/docker/pkg/term/term_solaris.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/docker/docker/pkg/term/term_solaris.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,41 +0,0 @@ | ||||||
| // +build solaris |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <stropts.h> |  | ||||||
| #include <termios.h> |  | ||||||
| 
 |  | ||||||
| // Small wrapper to get rid of variadic args of ioctl() |  | ||||||
| int my_ioctl(int fd, int cmd, struct winsize *ws) { |  | ||||||
| 	return ioctl(fd, cmd, ws); |  | ||||||
| } |  | ||||||
| */ |  | ||||||
| import "C" |  | ||||||
| 
 |  | ||||||
| // GetWinsize returns the window size based on the specified file descriptor. |  | ||||||
| func GetWinsize(fd uintptr) (*Winsize, error) { |  | ||||||
| 	ws := &Winsize{} |  | ||||||
| 	ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCGWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) |  | ||||||
| 	// Skip retval = 0 |  | ||||||
| 	if ret == 0 { |  | ||||||
| 		return ws, nil |  | ||||||
| 	} |  | ||||||
| 	return ws, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetWinsize tries to set the specified window size for the specified file descriptor. |  | ||||||
| func SetWinsize(fd uintptr, ws *Winsize) error { |  | ||||||
| 	ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCSWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) |  | ||||||
| 	// Skip retval = 0 |  | ||||||
| 	if ret == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
							
								
								
									
										29
									
								
								vendor/github.com/docker/docker/pkg/term/term_unix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/docker/docker/pkg/term/term_unix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,29 +0,0 @@ | ||||||
| // +build !solaris,!windows |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // GetWinsize returns the window size based on the specified file descriptor. |  | ||||||
| func GetWinsize(fd uintptr) (*Winsize, error) { |  | ||||||
| 	ws := &Winsize{} |  | ||||||
| 	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) |  | ||||||
| 	// Skipp errno = 0 |  | ||||||
| 	if err == 0 { |  | ||||||
| 		return ws, nil |  | ||||||
| 	} |  | ||||||
| 	return ws, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetWinsize tries to set the specified window size for the specified file descriptor. |  | ||||||
| func SetWinsize(fd uintptr, ws *Winsize) error { |  | ||||||
| 	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) |  | ||||||
| 	// Skipp errno = 0 |  | ||||||
| 	if err == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
							
								
								
									
										233
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										233
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,233 +0,0 @@ | ||||||
| // +build windows |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| 	"os/signal" |  | ||||||
| 	"syscall" |  | ||||||
| 
 |  | ||||||
| 	"github.com/Azure/go-ansiterm/winterm" |  | ||||||
| 	"github.com/docker/docker/pkg/term/windows" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // State holds the console mode for the terminal. |  | ||||||
| type State struct { |  | ||||||
| 	mode uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Winsize is used for window size. |  | ||||||
| type Winsize struct { |  | ||||||
| 	Height uint16 |  | ||||||
| 	Width  uint16 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	// 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 |  | ||||||
| 
 |  | ||||||
| // StdStreams returns the standard streams (stdin, stdout, stedrr). |  | ||||||
| func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { |  | ||||||
| 	// Turn on VT handling on all std handles, if possible. This might |  | ||||||
| 	// fail, in which case we will fall back to terminal emulation. |  | ||||||
| 	var emulateStdin, emulateStdout, emulateStderr bool |  | ||||||
| 	fd := os.Stdin.Fd() |  | ||||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { |  | ||||||
| 		// Validate that enableVirtualTerminalInput is supported, but do not set it. |  | ||||||
| 		if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalInput); err != nil { |  | ||||||
| 			emulateStdin = true |  | ||||||
| 		} else { |  | ||||||
| 			vtInputSupported = true |  | ||||||
| 		} |  | ||||||
| 		// Unconditionally set the console mode back even on failure because SetConsoleMode |  | ||||||
| 		// remembers invalid bits on input handles. |  | ||||||
| 		winterm.SetConsoleMode(fd, mode) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	fd = os.Stdout.Fd() |  | ||||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { |  | ||||||
| 		// Validate disableNewlineAutoReturn is supported, but do not set it. |  | ||||||
| 		if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { |  | ||||||
| 			emulateStdout = true |  | ||||||
| 		} else { |  | ||||||
| 			winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	fd = os.Stderr.Fd() |  | ||||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { |  | ||||||
| 		// Validate disableNewlineAutoReturn is supported, but do not set it. |  | ||||||
| 		if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { |  | ||||||
| 			emulateStderr = true |  | ||||||
| 		} else { |  | ||||||
| 			winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if os.Getenv("ConEmuANSI") == "ON" || os.Getenv("ConsoleZVersion") != "" { |  | ||||||
| 		// The ConEmu and ConsoleZ terminals emulate ANSI on output streams well. |  | ||||||
| 		emulateStdin = true |  | ||||||
| 		emulateStdout = false |  | ||||||
| 		emulateStderr = false |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if emulateStdin { |  | ||||||
| 		stdIn = windows.NewAnsiReader(syscall.STD_INPUT_HANDLE) |  | ||||||
| 	} else { |  | ||||||
| 		stdIn = os.Stdin |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if emulateStdout { |  | ||||||
| 		stdOut = windows.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) |  | ||||||
| 	} else { |  | ||||||
| 		stdOut = os.Stdout |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if emulateStderr { |  | ||||||
| 		stdErr = windows.NewAnsiWriter(syscall.STD_ERROR_HANDLE) |  | ||||||
| 	} else { |  | ||||||
| 		stdErr = os.Stderr |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. |  | ||||||
| func GetFdInfo(in interface{}) (uintptr, bool) { |  | ||||||
| 	return windows.GetHandleInfo(in) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetWinsize returns the window size based on the specified file descriptor. |  | ||||||
| func GetWinsize(fd uintptr) (*Winsize, error) { |  | ||||||
| 	info, err := winterm.GetConsoleScreenBufferInfo(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	winsize := &Winsize{ |  | ||||||
| 		Width:  uint16(info.Window.Right - info.Window.Left + 1), |  | ||||||
| 		Height: uint16(info.Window.Bottom - info.Window.Top + 1), |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return winsize, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal. |  | ||||||
| func IsTerminal(fd uintptr) bool { |  | ||||||
| 	return windows.IsConsole(fd) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RestoreTerminal restores the terminal connected to the given file descriptor |  | ||||||
| // to a previous state. |  | ||||||
| func RestoreTerminal(fd uintptr, state *State) error { |  | ||||||
| 	return winterm.SetConsoleMode(fd, state.mode) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SaveState saves the state of the terminal connected to the given file descriptor. |  | ||||||
| func SaveState(fd uintptr) (*State, error) { |  | ||||||
| 	mode, e := winterm.GetConsoleMode(fd) |  | ||||||
| 	if e != nil { |  | ||||||
| 		return nil, e |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &State{mode: mode}, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DisableEcho disables echo for the terminal connected to the given file descriptor. |  | ||||||
| // -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx |  | ||||||
| func DisableEcho(fd uintptr, state *State) error { |  | ||||||
| 	mode := state.mode |  | ||||||
| 	mode &^= winterm.ENABLE_ECHO_INPUT |  | ||||||
| 	mode |= winterm.ENABLE_PROCESSED_INPUT | winterm.ENABLE_LINE_INPUT |  | ||||||
| 	err := winterm.SetConsoleMode(fd, mode) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Register an interrupt handler to catch and restore prior state |  | ||||||
| 	restoreAtInterrupt(fd, state) |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetRawTerminal puts the terminal connected to the given file descriptor into |  | ||||||
| // raw mode and returns the previous state. On UNIX, this puts both the input |  | ||||||
| // and output into raw mode. On Windows, it only puts the input into raw mode. |  | ||||||
| func SetRawTerminal(fd uintptr) (*State, error) { |  | ||||||
| 	state, err := MakeRaw(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Register an interrupt handler to catch and restore prior state |  | ||||||
| 	restoreAtInterrupt(fd, state) |  | ||||||
| 	return state, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetRawTerminalOutput puts the output of terminal connected to the given file |  | ||||||
| // descriptor into raw mode. On UNIX, this does nothing and returns nil for the |  | ||||||
| // state. On Windows, it disables LF -> CRLF translation. |  | ||||||
| func SetRawTerminalOutput(fd uintptr) (*State, error) { |  | ||||||
| 	state, err := SaveState(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Ignore failures, since disableNewlineAutoReturn might not be supported on this |  | ||||||
| 	// version of Windows. |  | ||||||
| 	winterm.SetConsoleMode(fd, state.mode|disableNewlineAutoReturn) |  | ||||||
| 	return state, err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeRaw puts the terminal (Windows Console) connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	state, err := SaveState(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	mode := state.mode |  | ||||||
| 
 |  | ||||||
| 	// See |  | ||||||
| 	// -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx |  | ||||||
| 	// -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx |  | ||||||
| 
 |  | ||||||
| 	// Disable these modes |  | ||||||
| 	mode &^= winterm.ENABLE_ECHO_INPUT |  | ||||||
| 	mode &^= winterm.ENABLE_LINE_INPUT |  | ||||||
| 	mode &^= winterm.ENABLE_MOUSE_INPUT |  | ||||||
| 	mode &^= winterm.ENABLE_WINDOW_INPUT |  | ||||||
| 	mode &^= winterm.ENABLE_PROCESSED_INPUT |  | ||||||
| 
 |  | ||||||
| 	// Enable these modes |  | ||||||
| 	mode |= winterm.ENABLE_EXTENDED_FLAGS |  | ||||||
| 	mode |= winterm.ENABLE_INSERT_MODE |  | ||||||
| 	mode |= winterm.ENABLE_QUICK_EDIT_MODE |  | ||||||
| 	if vtInputSupported { |  | ||||||
| 		mode |= enableVirtualTerminalInput |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = winterm.SetConsoleMode(fd, mode) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return state, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func restoreAtInterrupt(fd uintptr, state *State) { |  | ||||||
| 	sigchan := make(chan os.Signal, 1) |  | ||||||
| 	signal.Notify(sigchan, os.Interrupt) |  | ||||||
| 
 |  | ||||||
| 	go func() { |  | ||||||
| 		_ = <-sigchan |  | ||||||
| 		RestoreTerminal(fd, state) |  | ||||||
| 		os.Exit(0) |  | ||||||
| 	}() |  | ||||||
| } |  | ||||||
							
								
								
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_darwin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_darwin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,69 +0,0 @@ | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	getTermios = syscall.TIOCGETA |  | ||||||
| 	setTermios = syscall.TIOCSETA |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios magic numbers, passthrough to the ones defined in syscall. |  | ||||||
| const ( |  | ||||||
| 	IGNBRK = syscall.IGNBRK |  | ||||||
| 	PARMRK = syscall.PARMRK |  | ||||||
| 	INLCR  = syscall.INLCR |  | ||||||
| 	IGNCR  = syscall.IGNCR |  | ||||||
| 	ECHONL = syscall.ECHONL |  | ||||||
| 	CSIZE  = syscall.CSIZE |  | ||||||
| 	ICRNL  = syscall.ICRNL |  | ||||||
| 	ISTRIP = syscall.ISTRIP |  | ||||||
| 	PARENB = syscall.PARENB |  | ||||||
| 	ECHO   = syscall.ECHO |  | ||||||
| 	ICANON = syscall.ICANON |  | ||||||
| 	ISIG   = syscall.ISIG |  | ||||||
| 	IXON   = syscall.IXON |  | ||||||
| 	BRKINT = syscall.BRKINT |  | ||||||
| 	INPCK  = syscall.INPCK |  | ||||||
| 	OPOST  = syscall.OPOST |  | ||||||
| 	CS8    = syscall.CS8 |  | ||||||
| 	IEXTEN = syscall.IEXTEN |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| type Termios struct { |  | ||||||
| 	Iflag  uint64 |  | ||||||
| 	Oflag  uint64 |  | ||||||
| 	Cflag  uint64 |  | ||||||
| 	Lflag  uint64 |  | ||||||
| 	Cc     [20]byte |  | ||||||
| 	Ispeed uint64 |  | ||||||
| 	Ospeed uint64 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) |  | ||||||
| 	newState.Oflag &^= OPOST |  | ||||||
| 	newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) |  | ||||||
| 	newState.Cflag &^= (CSIZE | PARENB) |  | ||||||
| 	newState.Cflag |= CS8 |  | ||||||
| 	newState.Cc[syscall.VMIN] = 1 |  | ||||||
| 	newState.Cc[syscall.VTIME] = 0 |  | ||||||
| 
 |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_freebsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_freebsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,69 +0,0 @@ | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	getTermios = syscall.TIOCGETA |  | ||||||
| 	setTermios = syscall.TIOCSETA |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios magic numbers, passthrough to the ones defined in syscall. |  | ||||||
| const ( |  | ||||||
| 	IGNBRK = syscall.IGNBRK |  | ||||||
| 	PARMRK = syscall.PARMRK |  | ||||||
| 	INLCR  = syscall.INLCR |  | ||||||
| 	IGNCR  = syscall.IGNCR |  | ||||||
| 	ECHONL = syscall.ECHONL |  | ||||||
| 	CSIZE  = syscall.CSIZE |  | ||||||
| 	ICRNL  = syscall.ICRNL |  | ||||||
| 	ISTRIP = syscall.ISTRIP |  | ||||||
| 	PARENB = syscall.PARENB |  | ||||||
| 	ECHO   = syscall.ECHO |  | ||||||
| 	ICANON = syscall.ICANON |  | ||||||
| 	ISIG   = syscall.ISIG |  | ||||||
| 	IXON   = syscall.IXON |  | ||||||
| 	BRKINT = syscall.BRKINT |  | ||||||
| 	INPCK  = syscall.INPCK |  | ||||||
| 	OPOST  = syscall.OPOST |  | ||||||
| 	CS8    = syscall.CS8 |  | ||||||
| 	IEXTEN = syscall.IEXTEN |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| type Termios struct { |  | ||||||
| 	Iflag  uint32 |  | ||||||
| 	Oflag  uint32 |  | ||||||
| 	Cflag  uint32 |  | ||||||
| 	Lflag  uint32 |  | ||||||
| 	Cc     [20]byte |  | ||||||
| 	Ispeed uint32 |  | ||||||
| 	Ospeed uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) |  | ||||||
| 	newState.Oflag &^= OPOST |  | ||||||
| 	newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) |  | ||||||
| 	newState.Cflag &^= (CSIZE | PARENB) |  | ||||||
| 	newState.Cflag |= CS8 |  | ||||||
| 	newState.Cc[syscall.VMIN] = 1 |  | ||||||
| 	newState.Cc[syscall.VTIME] = 0 |  | ||||||
| 
 |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										47
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,47 +0,0 @@ | ||||||
| // +build !cgo |  | ||||||
| 
 |  | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	getTermios = syscall.TCGETS |  | ||||||
| 	setTermios = syscall.TCSETS |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| type Termios struct { |  | ||||||
| 	Iflag  uint32 |  | ||||||
| 	Oflag  uint32 |  | ||||||
| 	Cflag  uint32 |  | ||||||
| 	Lflag  uint32 |  | ||||||
| 	Cc     [20]byte |  | ||||||
| 	Ispeed uint32 |  | ||||||
| 	Ospeed uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 
 |  | ||||||
| 	newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON) |  | ||||||
| 	newState.Oflag &^= syscall.OPOST |  | ||||||
| 	newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN) |  | ||||||
| 	newState.Cflag &^= (syscall.CSIZE | syscall.PARENB) |  | ||||||
| 	newState.Cflag |= syscall.CS8 |  | ||||||
| 
 |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_openbsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_openbsd.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,69 +0,0 @@ | ||||||
| package term |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"syscall" |  | ||||||
| 	"unsafe" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	getTermios = syscall.TIOCGETA |  | ||||||
| 	setTermios = syscall.TIOCSETA |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios magic numbers, passthrough to the ones defined in syscall. |  | ||||||
| const ( |  | ||||||
| 	IGNBRK = syscall.IGNBRK |  | ||||||
| 	PARMRK = syscall.PARMRK |  | ||||||
| 	INLCR  = syscall.INLCR |  | ||||||
| 	IGNCR  = syscall.IGNCR |  | ||||||
| 	ECHONL = syscall.ECHONL |  | ||||||
| 	CSIZE  = syscall.CSIZE |  | ||||||
| 	ICRNL  = syscall.ICRNL |  | ||||||
| 	ISTRIP = syscall.ISTRIP |  | ||||||
| 	PARENB = syscall.PARENB |  | ||||||
| 	ECHO   = syscall.ECHO |  | ||||||
| 	ICANON = syscall.ICANON |  | ||||||
| 	ISIG   = syscall.ISIG |  | ||||||
| 	IXON   = syscall.IXON |  | ||||||
| 	BRKINT = syscall.BRKINT |  | ||||||
| 	INPCK  = syscall.INPCK |  | ||||||
| 	OPOST  = syscall.OPOST |  | ||||||
| 	CS8    = syscall.CS8 |  | ||||||
| 	IEXTEN = syscall.IEXTEN |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Termios is the Unix API for terminal I/O. |  | ||||||
| type Termios struct { |  | ||||||
| 	Iflag  uint32 |  | ||||||
| 	Oflag  uint32 |  | ||||||
| 	Cflag  uint32 |  | ||||||
| 	Lflag  uint32 |  | ||||||
| 	Cc     [20]byte |  | ||||||
| 	Ispeed uint32 |  | ||||||
| 	Ospeed uint32 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MakeRaw put the terminal connected to the given file descriptor into raw |  | ||||||
| // mode and returns the previous state of the terminal so that it can be |  | ||||||
| // restored. |  | ||||||
| func MakeRaw(fd uintptr) (*State, error) { |  | ||||||
| 	var oldState State |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	newState := oldState.termios |  | ||||||
| 	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) |  | ||||||
| 	newState.Oflag &^= OPOST |  | ||||||
| 	newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) |  | ||||||
| 	newState.Cflag &^= (CSIZE | PARENB) |  | ||||||
| 	newState.Cflag |= CS8 |  | ||||||
| 	newState.Cc[syscall.VMIN] = 1 |  | ||||||
| 	newState.Cc[syscall.VTIME] = 0 |  | ||||||
| 
 |  | ||||||
| 	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &oldState, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										263
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										263
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,263 +0,0 @@ | ||||||
| // +build windows |  | ||||||
| 
 |  | ||||||
| package windows |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| 	"unsafe" |  | ||||||
| 
 |  | ||||||
| 	ansiterm "github.com/Azure/go-ansiterm" |  | ||||||
| 	"github.com/Azure/go-ansiterm/winterm" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	escapeSequence = ansiterm.KEY_ESC_CSI |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // ansiReader wraps a standard input file (e.g., os.Stdin) providing ANSI sequence translation. |  | ||||||
| type ansiReader struct { |  | ||||||
| 	file     *os.File |  | ||||||
| 	fd       uintptr |  | ||||||
| 	buffer   []byte |  | ||||||
| 	cbBuffer int |  | ||||||
| 	command  []byte |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewAnsiReader returns an io.ReadCloser that provides VT100 terminal emulation on top of a |  | ||||||
| // Windows console input handle. |  | ||||||
| func NewAnsiReader(nFile int) io.ReadCloser { |  | ||||||
| 	initLogger() |  | ||||||
| 	file, fd := winterm.GetStdFile(nFile) |  | ||||||
| 	return &ansiReader{ |  | ||||||
| 		file:    file, |  | ||||||
| 		fd:      fd, |  | ||||||
| 		command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), |  | ||||||
| 		buffer:  make([]byte, 0), |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Close closes the wrapped file. |  | ||||||
| func (ar *ansiReader) Close() (err error) { |  | ||||||
| 	return ar.file.Close() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Fd returns the file descriptor of the wrapped file. |  | ||||||
| func (ar *ansiReader) Fd() uintptr { |  | ||||||
| 	return ar.fd |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Read reads up to len(p) bytes of translated input events into p. |  | ||||||
| func (ar *ansiReader) Read(p []byte) (int, error) { |  | ||||||
| 	if len(p) == 0 { |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Previously read bytes exist, read as much as we can and return |  | ||||||
| 	if len(ar.buffer) > 0 { |  | ||||||
| 		logger.Debugf("Reading previously cached bytes") |  | ||||||
| 
 |  | ||||||
| 		originalLength := len(ar.buffer) |  | ||||||
| 		copiedLength := copy(p, ar.buffer) |  | ||||||
| 
 |  | ||||||
| 		if copiedLength == originalLength { |  | ||||||
| 			ar.buffer = make([]byte, 0, len(p)) |  | ||||||
| 		} else { |  | ||||||
| 			ar.buffer = ar.buffer[copiedLength:] |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		logger.Debugf("Read from cache p[%d]: % x", copiedLength, p) |  | ||||||
| 		return copiedLength, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Read and translate key events |  | ||||||
| 	events, err := readInputEvents(ar.fd, len(p)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return 0, err |  | ||||||
| 	} else if len(events) == 0 { |  | ||||||
| 		logger.Debug("No input events detected") |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	keyBytes := translateKeyEvents(events, []byte(escapeSequence)) |  | ||||||
| 
 |  | ||||||
| 	// Save excess bytes and right-size keyBytes |  | ||||||
| 	if len(keyBytes) > len(p) { |  | ||||||
| 		logger.Debugf("Received %d keyBytes, only room for %d bytes", len(keyBytes), len(p)) |  | ||||||
| 		ar.buffer = keyBytes[len(p):] |  | ||||||
| 		keyBytes = keyBytes[:len(p)] |  | ||||||
| 	} else if len(keyBytes) == 0 { |  | ||||||
| 		logger.Debug("No key bytes returned from the translator") |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	copiedLength := copy(p, keyBytes) |  | ||||||
| 	if copiedLength != len(keyBytes) { |  | ||||||
| 		return 0, errors.New("unexpected copy length encountered") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	logger.Debugf("Read        p[%d]: % x", copiedLength, p) |  | ||||||
| 	logger.Debugf("Read keyBytes[%d]: % x", copiedLength, keyBytes) |  | ||||||
| 	return copiedLength, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // readInputEvents polls until at least one event is available. |  | ||||||
| func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { |  | ||||||
| 	// Determine the maximum number of records to retrieve |  | ||||||
| 	// -- Cast around the type system to obtain the size of a single INPUT_RECORD. |  | ||||||
| 	//    unsafe.Sizeof requires an expression vs. a type-reference; the casting |  | ||||||
| 	//    tricks the type system into believing it has such an expression. |  | ||||||
| 	recordSize := int(unsafe.Sizeof(*((*winterm.INPUT_RECORD)(unsafe.Pointer(&maxBytes))))) |  | ||||||
| 	countRecords := maxBytes / recordSize |  | ||||||
| 	if countRecords > ansiterm.MAX_INPUT_EVENTS { |  | ||||||
| 		countRecords = ansiterm.MAX_INPUT_EVENTS |  | ||||||
| 	} else if countRecords == 0 { |  | ||||||
| 		countRecords = 1 |  | ||||||
| 	} |  | ||||||
| 	logger.Debugf("[windows] readInputEvents: Reading %v records (buffer size %v, record size %v)", countRecords, maxBytes, recordSize) |  | ||||||
| 
 |  | ||||||
| 	// Wait for and read input events |  | ||||||
| 	events := make([]winterm.INPUT_RECORD, countRecords) |  | ||||||
| 	nEvents := uint32(0) |  | ||||||
| 	eventsExist, err := winterm.WaitForSingleObject(fd, winterm.WAIT_INFINITE) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if eventsExist { |  | ||||||
| 		err = winterm.ReadConsoleInput(fd, events, &nEvents) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Return a slice restricted to the number of returned records |  | ||||||
| 	logger.Debugf("[windows] readInputEvents: Read %v events", nEvents) |  | ||||||
| 	return events[:nEvents], nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // KeyEvent Translation Helpers |  | ||||||
| 
 |  | ||||||
| var arrowKeyMapPrefix = map[uint16]string{ |  | ||||||
| 	winterm.VK_UP:    "%s%sA", |  | ||||||
| 	winterm.VK_DOWN:  "%s%sB", |  | ||||||
| 	winterm.VK_RIGHT: "%s%sC", |  | ||||||
| 	winterm.VK_LEFT:  "%s%sD", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var keyMapPrefix = map[uint16]string{ |  | ||||||
| 	winterm.VK_UP:     "\x1B[%sA", |  | ||||||
| 	winterm.VK_DOWN:   "\x1B[%sB", |  | ||||||
| 	winterm.VK_RIGHT:  "\x1B[%sC", |  | ||||||
| 	winterm.VK_LEFT:   "\x1B[%sD", |  | ||||||
| 	winterm.VK_HOME:   "\x1B[1%s~", // showkey shows ^[[1 |  | ||||||
| 	winterm.VK_END:    "\x1B[4%s~", // showkey shows ^[[4 |  | ||||||
| 	winterm.VK_INSERT: "\x1B[2%s~", |  | ||||||
| 	winterm.VK_DELETE: "\x1B[3%s~", |  | ||||||
| 	winterm.VK_PRIOR:  "\x1B[5%s~", |  | ||||||
| 	winterm.VK_NEXT:   "\x1B[6%s~", |  | ||||||
| 	winterm.VK_F1:     "", |  | ||||||
| 	winterm.VK_F2:     "", |  | ||||||
| 	winterm.VK_F3:     "\x1B[13%s~", |  | ||||||
| 	winterm.VK_F4:     "\x1B[14%s~", |  | ||||||
| 	winterm.VK_F5:     "\x1B[15%s~", |  | ||||||
| 	winterm.VK_F6:     "\x1B[17%s~", |  | ||||||
| 	winterm.VK_F7:     "\x1B[18%s~", |  | ||||||
| 	winterm.VK_F8:     "\x1B[19%s~", |  | ||||||
| 	winterm.VK_F9:     "\x1B[20%s~", |  | ||||||
| 	winterm.VK_F10:    "\x1B[21%s~", |  | ||||||
| 	winterm.VK_F11:    "\x1B[23%s~", |  | ||||||
| 	winterm.VK_F12:    "\x1B[24%s~", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // translateKeyEvents converts the input events into the appropriate ANSI string. |  | ||||||
| func translateKeyEvents(events []winterm.INPUT_RECORD, escapeSequence []byte) []byte { |  | ||||||
| 	var buffer bytes.Buffer |  | ||||||
| 	for _, event := range events { |  | ||||||
| 		if event.EventType == winterm.KEY_EVENT && event.KeyEvent.KeyDown != 0 { |  | ||||||
| 			buffer.WriteString(keyToString(&event.KeyEvent, escapeSequence)) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return buffer.Bytes() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // keyToString maps the given input event record to the corresponding string. |  | ||||||
| func keyToString(keyEvent *winterm.KEY_EVENT_RECORD, escapeSequence []byte) string { |  | ||||||
| 	if keyEvent.UnicodeChar == 0 { |  | ||||||
| 		return formatVirtualKey(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	_, alt, control := getControlKeys(keyEvent.ControlKeyState) |  | ||||||
| 	if control { |  | ||||||
| 		// TODO(azlinux): Implement following control sequences |  | ||||||
| 		// <Ctrl>-D  Signals the end of input from the keyboard; also exits current shell. |  | ||||||
| 		// <Ctrl>-H  Deletes the first character to the left of the cursor. Also called the ERASE key. |  | ||||||
| 		// <Ctrl>-Q  Restarts printing after it has been stopped with <Ctrl>-s. |  | ||||||
| 		// <Ctrl>-S  Suspends printing on the screen (does not stop the program). |  | ||||||
| 		// <Ctrl>-U  Deletes all characters on the current line. Also called the KILL key. |  | ||||||
| 		// <Ctrl>-E  Quits current command and creates a core |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// <Alt>+Key generates ESC N Key |  | ||||||
| 	if !control && alt { |  | ||||||
| 		return ansiterm.KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return string(keyEvent.UnicodeChar) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // formatVirtualKey converts a virtual key (e.g., up arrow) into the appropriate ANSI string. |  | ||||||
| func formatVirtualKey(key uint16, controlState uint32, escapeSequence []byte) string { |  | ||||||
| 	shift, alt, control := getControlKeys(controlState) |  | ||||||
| 	modifier := getControlKeysModifier(shift, alt, control) |  | ||||||
| 
 |  | ||||||
| 	if format, ok := arrowKeyMapPrefix[key]; ok { |  | ||||||
| 		return fmt.Sprintf(format, escapeSequence, modifier) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if format, ok := keyMapPrefix[key]; ok { |  | ||||||
| 		return fmt.Sprintf(format, modifier) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // getControlKeys extracts the shift, alt, and ctrl key states. |  | ||||||
| func getControlKeys(controlState uint32) (shift, alt, control bool) { |  | ||||||
| 	shift = 0 != (controlState & winterm.SHIFT_PRESSED) |  | ||||||
| 	alt = 0 != (controlState & (winterm.LEFT_ALT_PRESSED | winterm.RIGHT_ALT_PRESSED)) |  | ||||||
| 	control = 0 != (controlState & (winterm.LEFT_CTRL_PRESSED | winterm.RIGHT_CTRL_PRESSED)) |  | ||||||
| 	return shift, alt, control |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // getControlKeysModifier returns the ANSI modifier for the given combination of control keys. |  | ||||||
| func getControlKeysModifier(shift, alt, control bool) string { |  | ||||||
| 	if shift && alt && control { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_8 |  | ||||||
| 	} |  | ||||||
| 	if alt && control { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_7 |  | ||||||
| 	} |  | ||||||
| 	if shift && control { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_6 |  | ||||||
| 	} |  | ||||||
| 	if control { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_5 |  | ||||||
| 	} |  | ||||||
| 	if shift && alt { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_4 |  | ||||||
| 	} |  | ||||||
| 	if alt { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_3 |  | ||||||
| 	} |  | ||||||
| 	if shift { |  | ||||||
| 		return ansiterm.KEY_CONTROL_PARAM_2 |  | ||||||
| 	} |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
							
								
								
									
										64
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,64 +0,0 @@ | ||||||
| // +build windows |  | ||||||
| 
 |  | ||||||
| package windows |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"io" |  | ||||||
| 	"os" |  | ||||||
| 
 |  | ||||||
| 	ansiterm "github.com/Azure/go-ansiterm" |  | ||||||
| 	"github.com/Azure/go-ansiterm/winterm" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation. |  | ||||||
| type ansiWriter struct { |  | ||||||
| 	file           *os.File |  | ||||||
| 	fd             uintptr |  | ||||||
| 	infoReset      *winterm.CONSOLE_SCREEN_BUFFER_INFO |  | ||||||
| 	command        []byte |  | ||||||
| 	escapeSequence []byte |  | ||||||
| 	inAnsiSequence bool |  | ||||||
| 	parser         *ansiterm.AnsiParser |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewAnsiWriter returns an io.Writer that provides VT100 terminal emulation on top of a |  | ||||||
| // Windows console output handle. |  | ||||||
| func NewAnsiWriter(nFile int) io.Writer { |  | ||||||
| 	initLogger() |  | ||||||
| 	file, fd := winterm.GetStdFile(nFile) |  | ||||||
| 	info, err := winterm.GetConsoleScreenBufferInfo(fd) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) |  | ||||||
| 	logger.Infof("newAnsiWriter: parser %p", parser) |  | ||||||
| 
 |  | ||||||
| 	aw := &ansiWriter{ |  | ||||||
| 		file:           file, |  | ||||||
| 		fd:             fd, |  | ||||||
| 		infoReset:      info, |  | ||||||
| 		command:        make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), |  | ||||||
| 		escapeSequence: []byte(ansiterm.KEY_ESC_CSI), |  | ||||||
| 		parser:         parser, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) |  | ||||||
| 	logger.Infof("newAnsiWriter: %v", aw) |  | ||||||
| 	return aw |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (aw *ansiWriter) Fd() uintptr { |  | ||||||
| 	return aw.fd |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Write writes len(p) bytes from p to the underlying data stream. |  | ||||||
| func (aw *ansiWriter) Write(p []byte) (total int, err error) { |  | ||||||
| 	if len(p) == 0 { |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	logger.Infof("Write: % x", p) |  | ||||||
| 	logger.Infof("Write: %s", string(p)) |  | ||||||
| 	return aw.parser.Parse(p) |  | ||||||
| } |  | ||||||
							
								
								
									
										35
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,35 +0,0 @@ | ||||||
| // +build windows |  | ||||||
| 
 |  | ||||||
| package windows |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"os" |  | ||||||
| 
 |  | ||||||
| 	"github.com/Azure/go-ansiterm/winterm" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // GetHandleInfo returns file descriptor and bool indicating whether the file is a console. |  | ||||||
| func GetHandleInfo(in interface{}) (uintptr, bool) { |  | ||||||
| 	switch t := in.(type) { |  | ||||||
| 	case *ansiReader: |  | ||||||
| 		return t.Fd(), true |  | ||||||
| 	case *ansiWriter: |  | ||||||
| 		return t.Fd(), true |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var inFd uintptr |  | ||||||
| 	var isTerminal bool |  | ||||||
| 
 |  | ||||||
| 	if file, ok := in.(*os.File); ok { |  | ||||||
| 		inFd = file.Fd() |  | ||||||
| 		isTerminal = IsConsole(inFd) |  | ||||||
| 	} |  | ||||||
| 	return inFd, isTerminal |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsConsole returns true if the given file descriptor is a Windows Console. |  | ||||||
| // The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. |  | ||||||
| func IsConsole(fd uintptr) bool { |  | ||||||
| 	_, e := winterm.GetConsoleMode(fd) |  | ||||||
| 	return e == nil |  | ||||||
| } |  | ||||||
							
								
								
									
										33
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,33 +0,0 @@ | ||||||
| // These files implement ANSI-aware input and output streams for use by the Docker Windows client. |  | ||||||
| // When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create |  | ||||||
| // and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. |  | ||||||
| 
 |  | ||||||
| package windows |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"sync" |  | ||||||
| 
 |  | ||||||
| 	ansiterm "github.com/Azure/go-ansiterm" |  | ||||||
| 	"github.com/Sirupsen/logrus" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var logger *logrus.Logger |  | ||||||
| var initOnce sync.Once |  | ||||||
| 
 |  | ||||||
| func initLogger() { |  | ||||||
| 	initOnce.Do(func() { |  | ||||||
| 		logFile := ioutil.Discard |  | ||||||
| 
 |  | ||||||
| 		if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { |  | ||||||
| 			logFile, _ = os.Create("ansiReaderWriter.log") |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		logger = &logrus.Logger{ |  | ||||||
| 			Out:       logFile, |  | ||||||
| 			Formatter: new(logrus.TextFormatter), |  | ||||||
| 			Level:     logrus.DebugLevel, |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
							
								
								
									
										101
									
								
								vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,101 @@ | ||||||
|  | // Protocol Buffers for Go with Gadgets | ||||||
|  | // | ||||||
|  | // Copyright (c) 2013, The GoGo Authors. All rights reserved. | ||||||
|  | // http://github.com/gogo/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package sortkeys | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"sort" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func Strings(l []string) { | ||||||
|  | 	sort.Strings(l) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Float64s(l []float64) { | ||||||
|  | 	sort.Float64s(l) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Float32s(l []float32) { | ||||||
|  | 	sort.Sort(Float32Slice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Int64s(l []int64) { | ||||||
|  | 	sort.Sort(Int64Slice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Int32s(l []int32) { | ||||||
|  | 	sort.Sort(Int32Slice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Uint64s(l []uint64) { | ||||||
|  | 	sort.Sort(Uint64Slice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Uint32s(l []uint32) { | ||||||
|  | 	sort.Sort(Uint32Slice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Bools(l []bool) { | ||||||
|  | 	sort.Sort(BoolSlice(l)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BoolSlice []bool | ||||||
|  | 
 | ||||||
|  | func (p BoolSlice) Len() int           { return len(p) } | ||||||
|  | func (p BoolSlice) Less(i, j int) bool { return p[j] } | ||||||
|  | func (p BoolSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
|  | 
 | ||||||
|  | type Int64Slice []int64 | ||||||
|  | 
 | ||||||
|  | func (p Int64Slice) Len() int           { return len(p) } | ||||||
|  | func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } | ||||||
|  | func (p Int64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
|  | 
 | ||||||
|  | type Int32Slice []int32 | ||||||
|  | 
 | ||||||
|  | func (p Int32Slice) Len() int           { return len(p) } | ||||||
|  | func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] } | ||||||
|  | func (p Int32Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
|  | 
 | ||||||
|  | type Uint64Slice []uint64 | ||||||
|  | 
 | ||||||
|  | func (p Uint64Slice) Len() int           { return len(p) } | ||||||
|  | func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] } | ||||||
|  | func (p Uint64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
|  | 
 | ||||||
|  | type Uint32Slice []uint32 | ||||||
|  | 
 | ||||||
|  | func (p Uint32Slice) Len() int           { return len(p) } | ||||||
|  | func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] } | ||||||
|  | func (p Uint32Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
|  | 
 | ||||||
|  | type Float32Slice []float32 | ||||||
|  | 
 | ||||||
|  | func (p Float32Slice) Len() int           { return len(p) } | ||||||
|  | func (p Float32Slice) Less(i, j int) bool { return p[i] < p[j] } | ||||||
|  | func (p Float32Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] } | ||||||
							
								
								
									
										135
									
								
								vendor/github.com/gogo/protobuf/types/any.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								vendor/github.com/gogo/protobuf/types/any.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,135 @@ | ||||||
|  | // Go support for Protocol Buffers - Google's data interchange format | ||||||
|  | // | ||||||
|  | // Copyright 2016 The Go Authors.  All rights reserved. | ||||||
|  | // https://github.com/golang/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | //     * Neither the name of Google Inc. nor the names of its | ||||||
|  | // contributors may be used to endorse or promote products derived from | ||||||
|  | // this software without specific prior written permission. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | // This file implements functions to marshal proto.Message to/from | ||||||
|  | // google.protobuf.Any message. | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"reflect" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gogo/protobuf/proto" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const googleApis = "type.googleapis.com/" | ||||||
|  | 
 | ||||||
|  | // AnyMessageName returns the name of the message contained in a google.protobuf.Any message. | ||||||
|  | // | ||||||
|  | // Note that regular type assertions should be done using the Is | ||||||
|  | // function. AnyMessageName is provided for less common use cases like filtering a | ||||||
|  | // sequence of Any messages based on a set of allowed message type names. | ||||||
|  | func AnyMessageName(any *Any) (string, error) { | ||||||
|  | 	slash := strings.LastIndex(any.TypeUrl, "/") | ||||||
|  | 	if slash < 0 { | ||||||
|  | 		return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) | ||||||
|  | 	} | ||||||
|  | 	return any.TypeUrl[slash+1:], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. | ||||||
|  | func MarshalAny(pb proto.Message) (*Any, error) { | ||||||
|  | 	value, err := proto.Marshal(pb) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DynamicAny is a value that can be passed to UnmarshalAny to automatically | ||||||
|  | // allocate a proto.Message for the type specified in a google.protobuf.Any | ||||||
|  | // message. The allocated message is stored in the embedded proto.Message. | ||||||
|  | // | ||||||
|  | // Example: | ||||||
|  | // | ||||||
|  | //   var x ptypes.DynamicAny | ||||||
|  | //   if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } | ||||||
|  | //   fmt.Printf("unmarshaled message: %v", x.Message) | ||||||
|  | type DynamicAny struct { | ||||||
|  | 	proto.Message | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Empty returns a new proto.Message of the type specified in a | ||||||
|  | // google.protobuf.Any message. It returns an error if corresponding message | ||||||
|  | // type isn't linked in. | ||||||
|  | func EmptyAny(any *Any) (proto.Message, error) { | ||||||
|  | 	aname, err := AnyMessageName(any) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	t := proto.MessageType(aname) | ||||||
|  | 	if t == nil { | ||||||
|  | 		return nil, fmt.Errorf("any: message type %q isn't linked in", aname) | ||||||
|  | 	} | ||||||
|  | 	return reflect.New(t.Elem()).Interface().(proto.Message), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any | ||||||
|  | // message and places the decoded result in pb. It returns an error if type of | ||||||
|  | // contents of Any message does not match type of pb message. | ||||||
|  | // | ||||||
|  | // pb can be a proto.Message, or a *DynamicAny. | ||||||
|  | func UnmarshalAny(any *Any, pb proto.Message) error { | ||||||
|  | 	if d, ok := pb.(*DynamicAny); ok { | ||||||
|  | 		if d.Message == nil { | ||||||
|  | 			var err error | ||||||
|  | 			d.Message, err = EmptyAny(any) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return UnmarshalAny(any, d.Message) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	aname, err := AnyMessageName(any) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	mname := proto.MessageName(pb) | ||||||
|  | 	if aname != mname { | ||||||
|  | 		return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) | ||||||
|  | 	} | ||||||
|  | 	return proto.Unmarshal(any.Value, pb) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Is returns true if any value contains a given message type. | ||||||
|  | func Is(any *Any, pb proto.Message) bool { | ||||||
|  | 	aname, err := AnyMessageName(any) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return aname == proto.MessageName(pb) | ||||||
|  | } | ||||||
							
								
								
									
										687
									
								
								vendor/github.com/gogo/protobuf/types/any.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										687
									
								
								vendor/github.com/gogo/protobuf/types/any.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,687 @@ | ||||||
|  | // Code generated by protoc-gen-gogo. | ||||||
|  | // source: any.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 	Package types is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | 	It is generated from these files: | ||||||
|  | 		any.proto | ||||||
|  | 
 | ||||||
|  | 	It has these top-level messages: | ||||||
|  | 		Any | ||||||
|  | */ | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import bytes "bytes" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" | ||||||
|  | import sort "sort" | ||||||
|  | import strconv "strconv" | ||||||
|  | import reflect "reflect" | ||||||
|  | 
 | ||||||
|  | import io "io" | ||||||
|  | 
 | ||||||
|  | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | var _ = proto.Marshal | ||||||
|  | var _ = fmt.Errorf | ||||||
|  | var _ = math.Inf | ||||||
|  | 
 | ||||||
|  | // This is a compile-time assertion to ensure that this generated file | ||||||
|  | // is compatible with the proto package it is being compiled against. | ||||||
|  | // A compilation error at this line likely means your copy of the | ||||||
|  | // proto package needs to be updated. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
|  | 
 | ||||||
|  | // `Any` contains an arbitrary serialized protocol buffer message along with a | ||||||
|  | // URL that describes the type of the serialized message. | ||||||
|  | // | ||||||
|  | // Protobuf library provides support to pack/unpack Any values in the form | ||||||
|  | // of utility functions or additional generated methods of the Any type. | ||||||
|  | // | ||||||
|  | // Example 1: Pack and unpack a message in C++. | ||||||
|  | // | ||||||
|  | //     Foo foo = ...; | ||||||
|  | //     Any any; | ||||||
|  | //     any.PackFrom(foo); | ||||||
|  | //     ... | ||||||
|  | //     if (any.UnpackTo(&foo)) { | ||||||
|  | //       ... | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // Example 2: Pack and unpack a message in Java. | ||||||
|  | // | ||||||
|  | //     Foo foo = ...; | ||||||
|  | //     Any any = Any.pack(foo); | ||||||
|  | //     ... | ||||||
|  | //     if (any.is(Foo.class)) { | ||||||
|  | //       foo = any.unpack(Foo.class); | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | //  Example 3: Pack and unpack a message in Python. | ||||||
|  | // | ||||||
|  | //     foo = Foo(...) | ||||||
|  | //     any = Any() | ||||||
|  | //     any.Pack(foo) | ||||||
|  | //     ... | ||||||
|  | //     if any.Is(Foo.DESCRIPTOR): | ||||||
|  | //       any.Unpack(foo) | ||||||
|  | //       ... | ||||||
|  | // | ||||||
|  | // The pack methods provided by protobuf library will by default use | ||||||
|  | // 'type.googleapis.com/full.type.name' as the type URL and the unpack | ||||||
|  | // methods only use the fully qualified type name after the last '/' | ||||||
|  | // in the type URL, for example "foo.bar.com/x/y.z" will yield type | ||||||
|  | // name "y.z". | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // JSON | ||||||
|  | // ==== | ||||||
|  | // The JSON representation of an `Any` value uses the regular | ||||||
|  | // representation of the deserialized, embedded message, with an | ||||||
|  | // additional field `@type` which contains the type URL. Example: | ||||||
|  | // | ||||||
|  | //     package google.profile; | ||||||
|  | //     message Person { | ||||||
|  | //       string first_name = 1; | ||||||
|  | //       string last_name = 2; | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | //     { | ||||||
|  | //       "@type": "type.googleapis.com/google.profile.Person", | ||||||
|  | //       "firstName": <string>, | ||||||
|  | //       "lastName": <string> | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // If the embedded message type is well-known and has a custom JSON | ||||||
|  | // representation, that representation will be embedded adding a field | ||||||
|  | // `value` which holds the custom JSON in addition to the `@type` | ||||||
|  | // field. Example (for message [google.protobuf.Duration][]): | ||||||
|  | // | ||||||
|  | //     { | ||||||
|  | //       "@type": "type.googleapis.com/google.protobuf.Duration", | ||||||
|  | //       "value": "1.212s" | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | type Any struct { | ||||||
|  | 	// A URL/resource name whose content describes the type of the | ||||||
|  | 	// serialized protocol buffer message. | ||||||
|  | 	// | ||||||
|  | 	// For URLs which use the scheme `http`, `https`, or no scheme, the | ||||||
|  | 	// following restrictions and interpretations apply: | ||||||
|  | 	// | ||||||
|  | 	// * If no scheme is provided, `https` is assumed. | ||||||
|  | 	// * The last segment of the URL's path must represent the fully | ||||||
|  | 	//   qualified name of the type (as in `path/google.protobuf.Duration`). | ||||||
|  | 	//   The name should be in a canonical form (e.g., leading "." is | ||||||
|  | 	//   not accepted). | ||||||
|  | 	// * An HTTP GET on the URL must yield a [google.protobuf.Type][] | ||||||
|  | 	//   value in binary format, or produce an error. | ||||||
|  | 	// * Applications are allowed to cache lookup results based on the | ||||||
|  | 	//   URL, or have them precompiled into a binary to avoid any | ||||||
|  | 	//   lookup. Therefore, binary compatibility needs to be preserved | ||||||
|  | 	//   on changes to types. (Use versioned type names to manage | ||||||
|  | 	//   breaking changes.) | ||||||
|  | 	// | ||||||
|  | 	// Schemes other than `http`, `https` (or the empty scheme) might be | ||||||
|  | 	// used with implementation specific semantics. | ||||||
|  | 	// | ||||||
|  | 	TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` | ||||||
|  | 	// Must be a valid serialized protocol buffer of the above specified type. | ||||||
|  | 	Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Any) Reset()                    { *m = Any{} } | ||||||
|  | func (*Any) ProtoMessage()               {} | ||||||
|  | func (*Any) Descriptor() ([]byte, []int) { return fileDescriptorAny, []int{0} } | ||||||
|  | func (*Any) XXX_WellKnownType() string   { return "Any" } | ||||||
|  | 
 | ||||||
|  | func (m *Any) GetTypeUrl() string { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.TypeUrl | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Any) GetValue() []byte { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Value | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*Any)(nil), "google.protobuf.Any") | ||||||
|  | } | ||||||
|  | func (this *Any) Compare(that interface{}) int { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Any) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Any) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	if this.TypeUrl != that1.TypeUrl { | ||||||
|  | 		if this.TypeUrl < that1.TypeUrl { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	if c := bytes.Compare(this.Value, that1.Value); c != 0 { | ||||||
|  | 		return c | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | func (this *Any) Equal(that interface{}) bool { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Any) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Any) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if this.TypeUrl != that1.TypeUrl { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if !bytes.Equal(this.Value, that1.Value) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | func (this *Any) GoString() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := make([]string, 0, 6) | ||||||
|  | 	s = append(s, "&types.Any{") | ||||||
|  | 	s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n") | ||||||
|  | 	s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") | ||||||
|  | 	s = append(s, "}") | ||||||
|  | 	return strings.Join(s, "") | ||||||
|  | } | ||||||
|  | func valueToGoStringAny(v interface{}, typ string) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) | ||||||
|  | } | ||||||
|  | func extensionToGoStringAny(m github_com_gogo_protobuf_proto.Message) string { | ||||||
|  | 	e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) | ||||||
|  | 	if e == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" | ||||||
|  | 	keys := make([]int, 0, len(e)) | ||||||
|  | 	for k := range e { | ||||||
|  | 		keys = append(keys, int(k)) | ||||||
|  | 	} | ||||||
|  | 	sort.Ints(keys) | ||||||
|  | 	ss := []string{} | ||||||
|  | 	for _, k := range keys { | ||||||
|  | 		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) | ||||||
|  | 	} | ||||||
|  | 	s += strings.Join(ss, ",") + "})" | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (m *Any) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Any) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if len(m.TypeUrl) > 0 { | ||||||
|  | 		dAtA[i] = 0xa | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintAny(dAtA, i, uint64(len(m.TypeUrl))) | ||||||
|  | 		i += copy(dAtA[i:], m.TypeUrl) | ||||||
|  | 	} | ||||||
|  | 	if len(m.Value) > 0 { | ||||||
|  | 		dAtA[i] = 0x12 | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintAny(dAtA, i, uint64(len(m.Value))) | ||||||
|  | 		i += copy(dAtA[i:], m.Value) | ||||||
|  | 	} | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeFixed64Any(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	dAtA[offset+4] = uint8(v >> 32) | ||||||
|  | 	dAtA[offset+5] = uint8(v >> 40) | ||||||
|  | 	dAtA[offset+6] = uint8(v >> 48) | ||||||
|  | 	dAtA[offset+7] = uint8(v >> 56) | ||||||
|  | 	return offset + 8 | ||||||
|  | } | ||||||
|  | func encodeFixed32Any(dAtA []byte, offset int, v uint32) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	return offset + 4 | ||||||
|  | } | ||||||
|  | func encodeVarintAny(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA[offset] = uint8(v&0x7f | 0x80) | ||||||
|  | 		v >>= 7 | ||||||
|  | 		offset++ | ||||||
|  | 	} | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	return offset + 1 | ||||||
|  | } | ||||||
|  | func NewPopulatedAny(r randyAny, easy bool) *Any { | ||||||
|  | 	this := &Any{} | ||||||
|  | 	this.TypeUrl = string(randStringAny(r)) | ||||||
|  | 	v1 := r.Intn(100) | ||||||
|  | 	this.Value = make([]byte, v1) | ||||||
|  | 	for i := 0; i < v1; i++ { | ||||||
|  | 		this.Value[i] = byte(r.Intn(256)) | ||||||
|  | 	} | ||||||
|  | 	if !easy && r.Intn(10) != 0 { | ||||||
|  | 	} | ||||||
|  | 	return this | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type randyAny interface { | ||||||
|  | 	Float32() float32 | ||||||
|  | 	Float64() float64 | ||||||
|  | 	Int63() int64 | ||||||
|  | 	Int31() int32 | ||||||
|  | 	Uint32() uint32 | ||||||
|  | 	Intn(n int) int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func randUTF8RuneAny(r randyAny) rune { | ||||||
|  | 	ru := r.Intn(62) | ||||||
|  | 	if ru < 10 { | ||||||
|  | 		return rune(ru + 48) | ||||||
|  | 	} else if ru < 36 { | ||||||
|  | 		return rune(ru + 55) | ||||||
|  | 	} | ||||||
|  | 	return rune(ru + 61) | ||||||
|  | } | ||||||
|  | func randStringAny(r randyAny) string { | ||||||
|  | 	v2 := r.Intn(100) | ||||||
|  | 	tmps := make([]rune, v2) | ||||||
|  | 	for i := 0; i < v2; i++ { | ||||||
|  | 		tmps[i] = randUTF8RuneAny(r) | ||||||
|  | 	} | ||||||
|  | 	return string(tmps) | ||||||
|  | } | ||||||
|  | func randUnrecognizedAny(r randyAny, maxFieldNumber int) (dAtA []byte) { | ||||||
|  | 	l := r.Intn(5) | ||||||
|  | 	for i := 0; i < l; i++ { | ||||||
|  | 		wire := r.Intn(4) | ||||||
|  | 		if wire == 3 { | ||||||
|  | 			wire = 5 | ||||||
|  | 		} | ||||||
|  | 		fieldNumber := maxFieldNumber + r.Intn(100) | ||||||
|  | 		dAtA = randFieldAny(dAtA, r, fieldNumber, wire) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func randFieldAny(dAtA []byte, r randyAny, fieldNumber int, wire int) []byte { | ||||||
|  | 	key := uint32(fieldNumber)<<3 | uint32(wire) | ||||||
|  | 	switch wire { | ||||||
|  | 	case 0: | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) | ||||||
|  | 		v3 := r.Int63() | ||||||
|  | 		if r.Intn(2) == 0 { | ||||||
|  | 			v3 *= -1 | ||||||
|  | 		} | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(v3)) | ||||||
|  | 	case 1: | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	case 2: | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) | ||||||
|  | 		ll := r.Intn(100) | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(ll)) | ||||||
|  | 		for j := 0; j < ll; j++ { | ||||||
|  | 			dAtA = append(dAtA, byte(r.Intn(256))) | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func encodeVarintPopulateAny(dAtA []byte, v uint64) []byte { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) | ||||||
|  | 		v >>= 7 | ||||||
|  | 	} | ||||||
|  | 	dAtA = append(dAtA, uint8(v)) | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func (m *Any) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	l = len(m.TypeUrl) | ||||||
|  | 	if l > 0 { | ||||||
|  | 		n += 1 + l + sovAny(uint64(l)) | ||||||
|  | 	} | ||||||
|  | 	l = len(m.Value) | ||||||
|  | 	if l > 0 { | ||||||
|  | 		n += 1 + l + sovAny(uint64(l)) | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sovAny(x uint64) (n int) { | ||||||
|  | 	for { | ||||||
|  | 		n++ | ||||||
|  | 		x >>= 7 | ||||||
|  | 		if x == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | func sozAny(x uint64) (n int) { | ||||||
|  | 	return sovAny(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||||
|  | } | ||||||
|  | func (this *Any) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := strings.Join([]string{`&Any{`, | ||||||
|  | 		`TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`, | ||||||
|  | 		`Value:` + fmt.Sprintf("%v", this.Value) + `,`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func valueToStringAny(v interface{}) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("*%v", pv) | ||||||
|  | } | ||||||
|  | func (m *Any) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowAny | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: Any: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: Any: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		case 1: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType) | ||||||
|  | 			} | ||||||
|  | 			var stringLen uint64 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowAny | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				stringLen |= (uint64(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			intStringLen := int(stringLen) | ||||||
|  | 			if intStringLen < 0 { | ||||||
|  | 				return ErrInvalidLengthAny | ||||||
|  | 			} | ||||||
|  | 			postIndex := iNdEx + intStringLen | ||||||
|  | 			if postIndex > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			m.TypeUrl = string(dAtA[iNdEx:postIndex]) | ||||||
|  | 			iNdEx = postIndex | ||||||
|  | 		case 2: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) | ||||||
|  | 			} | ||||||
|  | 			var byteLen int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowAny | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				byteLen |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if byteLen < 0 { | ||||||
|  | 				return ErrInvalidLengthAny | ||||||
|  | 			} | ||||||
|  | 			postIndex := iNdEx + byteLen | ||||||
|  | 			if postIndex > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) | ||||||
|  | 			if m.Value == nil { | ||||||
|  | 				m.Value = []byte{} | ||||||
|  | 			} | ||||||
|  | 			iNdEx = postIndex | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipAny(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthAny | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func skipAny(dAtA []byte) (n int, err error) { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return 0, ErrIntOverflowAny | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return 0, io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		switch wireType { | ||||||
|  | 		case 0: | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowAny | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				iNdEx++ | ||||||
|  | 				if dAtA[iNdEx-1] < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 1: | ||||||
|  | 			iNdEx += 8 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 2: | ||||||
|  | 			var length int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowAny | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				length |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			iNdEx += length | ||||||
|  | 			if length < 0 { | ||||||
|  | 				return 0, ErrInvalidLengthAny | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 3: | ||||||
|  | 			for { | ||||||
|  | 				var innerWire uint64 | ||||||
|  | 				var start int = iNdEx | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return 0, ErrIntOverflowAny | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return 0, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					innerWire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				innerWireType := int(innerWire & 0x7) | ||||||
|  | 				if innerWireType == 4 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				next, err := skipAny(dAtA[start:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return 0, err | ||||||
|  | 				} | ||||||
|  | 				iNdEx = start + next | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 4: | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 5: | ||||||
|  | 			iNdEx += 4 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		default: | ||||||
|  | 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrInvalidLengthAny = fmt.Errorf("proto: negative length found during unmarshaling") | ||||||
|  | 	ErrIntOverflowAny   = fmt.Errorf("proto: integer overflow") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { proto.RegisterFile("any.proto", fileDescriptorAny) } | ||||||
|  | 
 | ||||||
|  | var fileDescriptorAny = []byte{ | ||||||
|  | 	// 208 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x4c, 0xcc, 0xab, 0xd4, | ||||||
|  | 	0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92, | ||||||
|  | 	0x4a, 0xd3, 0x94, 0xcc, 0xb8, 0x98, 0x1d, 0xf3, 0x2a, 0x85, 0x24, 0xb9, 0x38, 0x4a, 0x2a, 0x0b, | ||||||
|  | 	0x52, 0xe3, 0x4b, 0x8b, 0x72, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0xd8, 0x41, 0xfc, 0xd0, | ||||||
|  | 	0xa2, 0x1c, 0x21, 0x11, 0x2e, 0xd6, 0xb2, 0xc4, 0x9c, 0xd2, 0x54, 0x09, 0x26, 0x05, 0x46, 0x0d, | ||||||
|  | 	0x9e, 0x20, 0x08, 0xc7, 0xa9, 0x89, 0xf1, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18, 0x3e, | ||||||
|  | 	0x3c, 0x94, 0x63, 0xfc, 0xf1, 0x50, 0x8e, 0xb1, 0xe1, 0x91, 0x1c, 0xe3, 0x8a, 0x47, 0x72, 0x8c, | ||||||
|  | 	0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x8b, 0x47, 0x72, | ||||||
|  | 	0x0c, 0x1f, 0x40, 0xe2, 0x8f, 0xe5, 0x18, 0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0xec, 0x77, | ||||||
|  | 	0xe2, 0x70, 0xcc, 0xab, 0x0c, 0x00, 0x71, 0x02, 0x18, 0xa3, 0x58, 0x41, 0x56, 0x16, 0x2f, 0x60, | ||||||
|  | 	0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0xa2, 0x3a, 0x00, 0xaa, | ||||||
|  | 	0x5a, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b, 0x2f, 0xbf, 0x3c, 0x2f, 0x04, 0xa4, 0x32, 0x89, 0x0d, | ||||||
|  | 	0x6c, 0x8c, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x63, 0x5d, 0x2d, 0x27, 0xe1, 0x00, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								vendor/github.com/gogo/protobuf/types/doc.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/gogo/protobuf/types/doc.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | // Go support for Protocol Buffers - Google's data interchange format | ||||||
|  | // | ||||||
|  | // Copyright 2016 The Go Authors.  All rights reserved. | ||||||
|  | // https://github.com/golang/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | //     * Neither the name of Google Inc. nor the names of its | ||||||
|  | // contributors may be used to endorse or promote products derived from | ||||||
|  | // this software without specific prior written permission. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | Package types contains code for interacting with well-known types. | ||||||
|  | */ | ||||||
|  | package types | ||||||
							
								
								
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | // Go support for Protocol Buffers - Google's data interchange format | ||||||
|  | // | ||||||
|  | // Copyright 2016 The Go Authors.  All rights reserved. | ||||||
|  | // https://github.com/golang/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | //     * Neither the name of Google Inc. nor the names of its | ||||||
|  | // contributors may be used to endorse or promote products derived from | ||||||
|  | // this software without specific prior written permission. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | // This file implements conversions between google.protobuf.Duration | ||||||
|  | // and time.Duration. | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// Range of a Duration in seconds, as specified in | ||||||
|  | 	// google/protobuf/duration.proto. This is about 10,000 years in seconds. | ||||||
|  | 	maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) | ||||||
|  | 	minSeconds = -maxSeconds | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // validateDuration determines whether the Duration is valid according to the | ||||||
|  | // definition in google/protobuf/duration.proto. A valid Duration | ||||||
|  | // may still be too large to fit into a time.Duration (the range of Duration | ||||||
|  | // is about 10,000 years, and the range of time.Duration is about 290). | ||||||
|  | func validateDuration(d *Duration) error { | ||||||
|  | 	if d == nil { | ||||||
|  | 		return errors.New("duration: nil Duration") | ||||||
|  | 	} | ||||||
|  | 	if d.Seconds < minSeconds || d.Seconds > maxSeconds { | ||||||
|  | 		return fmt.Errorf("duration: %#v: seconds out of range", d) | ||||||
|  | 	} | ||||||
|  | 	if d.Nanos <= -1e9 || d.Nanos >= 1e9 { | ||||||
|  | 		return fmt.Errorf("duration: %#v: nanos out of range", d) | ||||||
|  | 	} | ||||||
|  | 	// Seconds and Nanos must have the same sign, unless d.Nanos is zero. | ||||||
|  | 	if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { | ||||||
|  | 		return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DurationFromProto converts a Duration to a time.Duration. DurationFromProto | ||||||
|  | // returns an error if the Duration is invalid or is too large to be | ||||||
|  | // represented in a time.Duration. | ||||||
|  | func DurationFromProto(p *Duration) (time.Duration, error) { | ||||||
|  | 	if err := validateDuration(p); err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	d := time.Duration(p.Seconds) * time.Second | ||||||
|  | 	if int64(d/time.Second) != p.Seconds { | ||||||
|  | 		return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) | ||||||
|  | 	} | ||||||
|  | 	if p.Nanos != 0 { | ||||||
|  | 		d += time.Duration(p.Nanos) | ||||||
|  | 		if (d < 0) != (p.Nanos < 0) { | ||||||
|  | 			return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return d, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DurationProto converts a time.Duration to a Duration. | ||||||
|  | func DurationProto(d time.Duration) *Duration { | ||||||
|  | 	nanos := d.Nanoseconds() | ||||||
|  | 	secs := nanos / 1e9 | ||||||
|  | 	nanos -= secs * 1e9 | ||||||
|  | 	return &Duration{ | ||||||
|  | 		Seconds: secs, | ||||||
|  | 		Nanos:   int32(nanos), | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										515
									
								
								vendor/github.com/gogo/protobuf/types/duration.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										515
									
								
								vendor/github.com/gogo/protobuf/types/duration.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,515 @@ | ||||||
|  | // Code generated by protoc-gen-gogo. | ||||||
|  | // source: duration.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 	Package types is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | 	It is generated from these files: | ||||||
|  | 		duration.proto | ||||||
|  | 
 | ||||||
|  | 	It has these top-level messages: | ||||||
|  | 		Duration | ||||||
|  | */ | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" | ||||||
|  | import sort "sort" | ||||||
|  | import strconv "strconv" | ||||||
|  | import reflect "reflect" | ||||||
|  | 
 | ||||||
|  | import io "io" | ||||||
|  | 
 | ||||||
|  | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | var _ = proto.Marshal | ||||||
|  | var _ = fmt.Errorf | ||||||
|  | var _ = math.Inf | ||||||
|  | 
 | ||||||
|  | // This is a compile-time assertion to ensure that this generated file | ||||||
|  | // is compatible with the proto package it is being compiled against. | ||||||
|  | // A compilation error at this line likely means your copy of the | ||||||
|  | // proto package needs to be updated. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
|  | 
 | ||||||
|  | // A Duration represents a signed, fixed-length span of time represented | ||||||
|  | // as a count of seconds and fractions of seconds at nanosecond | ||||||
|  | // resolution. It is independent of any calendar and concepts like "day" | ||||||
|  | // or "month". It is related to Timestamp in that the difference between | ||||||
|  | // two Timestamp values is a Duration and it can be added or subtracted | ||||||
|  | // from a Timestamp. Range is approximately +-10,000 years. | ||||||
|  | // | ||||||
|  | // Example 1: Compute Duration from two Timestamps in pseudo code. | ||||||
|  | // | ||||||
|  | //     Timestamp start = ...; | ||||||
|  | //     Timestamp end = ...; | ||||||
|  | //     Duration duration = ...; | ||||||
|  | // | ||||||
|  | //     duration.seconds = end.seconds - start.seconds; | ||||||
|  | //     duration.nanos = end.nanos - start.nanos; | ||||||
|  | // | ||||||
|  | //     if (duration.seconds < 0 && duration.nanos > 0) { | ||||||
|  | //       duration.seconds += 1; | ||||||
|  | //       duration.nanos -= 1000000000; | ||||||
|  | //     } else if (durations.seconds > 0 && duration.nanos < 0) { | ||||||
|  | //       duration.seconds -= 1; | ||||||
|  | //       duration.nanos += 1000000000; | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. | ||||||
|  | // | ||||||
|  | //     Timestamp start = ...; | ||||||
|  | //     Duration duration = ...; | ||||||
|  | //     Timestamp end = ...; | ||||||
|  | // | ||||||
|  | //     end.seconds = start.seconds + duration.seconds; | ||||||
|  | //     end.nanos = start.nanos + duration.nanos; | ||||||
|  | // | ||||||
|  | //     if (end.nanos < 0) { | ||||||
|  | //       end.seconds -= 1; | ||||||
|  | //       end.nanos += 1000000000; | ||||||
|  | //     } else if (end.nanos >= 1000000000) { | ||||||
|  | //       end.seconds += 1; | ||||||
|  | //       end.nanos -= 1000000000; | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // | ||||||
|  | type Duration struct { | ||||||
|  | 	// Signed seconds of the span of time. Must be from -315,576,000,000 | ||||||
|  | 	// to +315,576,000,000 inclusive. | ||||||
|  | 	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` | ||||||
|  | 	// Signed fractions of a second at nanosecond resolution of the span | ||||||
|  | 	// of time. Durations less than one second are represented with a 0 | ||||||
|  | 	// `seconds` field and a positive or negative `nanos` field. For durations | ||||||
|  | 	// of one second or more, a non-zero value for the `nanos` field must be | ||||||
|  | 	// of the same sign as the `seconds` field. Must be from -999,999,999 | ||||||
|  | 	// to +999,999,999 inclusive. | ||||||
|  | 	Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Duration) Reset()                    { *m = Duration{} } | ||||||
|  | func (*Duration) ProtoMessage()               {} | ||||||
|  | func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorDuration, []int{0} } | ||||||
|  | func (*Duration) XXX_WellKnownType() string   { return "Duration" } | ||||||
|  | 
 | ||||||
|  | func (m *Duration) GetSeconds() int64 { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Seconds | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Duration) GetNanos() int32 { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Nanos | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") | ||||||
|  | } | ||||||
|  | func (this *Duration) Compare(that interface{}) int { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Duration) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Duration) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	if this.Seconds != that1.Seconds { | ||||||
|  | 		if this.Seconds < that1.Seconds { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	if this.Nanos != that1.Nanos { | ||||||
|  | 		if this.Nanos < that1.Nanos { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | func (this *Duration) Equal(that interface{}) bool { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Duration) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Duration) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if this.Seconds != that1.Seconds { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if this.Nanos != that1.Nanos { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | func (this *Duration) GoString() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := make([]string, 0, 6) | ||||||
|  | 	s = append(s, "&types.Duration{") | ||||||
|  | 	s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") | ||||||
|  | 	s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n") | ||||||
|  | 	s = append(s, "}") | ||||||
|  | 	return strings.Join(s, "") | ||||||
|  | } | ||||||
|  | func valueToGoStringDuration(v interface{}, typ string) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) | ||||||
|  | } | ||||||
|  | func extensionToGoStringDuration(m github_com_gogo_protobuf_proto.Message) string { | ||||||
|  | 	e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) | ||||||
|  | 	if e == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" | ||||||
|  | 	keys := make([]int, 0, len(e)) | ||||||
|  | 	for k := range e { | ||||||
|  | 		keys = append(keys, int(k)) | ||||||
|  | 	} | ||||||
|  | 	sort.Ints(keys) | ||||||
|  | 	ss := []string{} | ||||||
|  | 	for _, k := range keys { | ||||||
|  | 		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) | ||||||
|  | 	} | ||||||
|  | 	s += strings.Join(ss, ",") + "})" | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (m *Duration) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Duration) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if m.Seconds != 0 { | ||||||
|  | 		dAtA[i] = 0x8 | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintDuration(dAtA, i, uint64(m.Seconds)) | ||||||
|  | 	} | ||||||
|  | 	if m.Nanos != 0 { | ||||||
|  | 		dAtA[i] = 0x10 | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintDuration(dAtA, i, uint64(m.Nanos)) | ||||||
|  | 	} | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeFixed64Duration(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	dAtA[offset+4] = uint8(v >> 32) | ||||||
|  | 	dAtA[offset+5] = uint8(v >> 40) | ||||||
|  | 	dAtA[offset+6] = uint8(v >> 48) | ||||||
|  | 	dAtA[offset+7] = uint8(v >> 56) | ||||||
|  | 	return offset + 8 | ||||||
|  | } | ||||||
|  | func encodeFixed32Duration(dAtA []byte, offset int, v uint32) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	return offset + 4 | ||||||
|  | } | ||||||
|  | func encodeVarintDuration(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA[offset] = uint8(v&0x7f | 0x80) | ||||||
|  | 		v >>= 7 | ||||||
|  | 		offset++ | ||||||
|  | 	} | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	return offset + 1 | ||||||
|  | } | ||||||
|  | func (m *Duration) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if m.Seconds != 0 { | ||||||
|  | 		n += 1 + sovDuration(uint64(m.Seconds)) | ||||||
|  | 	} | ||||||
|  | 	if m.Nanos != 0 { | ||||||
|  | 		n += 1 + sovDuration(uint64(m.Nanos)) | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sovDuration(x uint64) (n int) { | ||||||
|  | 	for { | ||||||
|  | 		n++ | ||||||
|  | 		x >>= 7 | ||||||
|  | 		if x == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | func sozDuration(x uint64) (n int) { | ||||||
|  | 	return sovDuration(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||||
|  | } | ||||||
|  | func (m *Duration) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowDuration | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: Duration: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: Duration: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		case 1: | ||||||
|  | 			if wireType != 0 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) | ||||||
|  | 			} | ||||||
|  | 			m.Seconds = 0 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowDuration | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				m.Seconds |= (int64(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		case 2: | ||||||
|  | 			if wireType != 0 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) | ||||||
|  | 			} | ||||||
|  | 			m.Nanos = 0 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowDuration | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				m.Nanos |= (int32(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipDuration(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthDuration | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func skipDuration(dAtA []byte) (n int, err error) { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return 0, ErrIntOverflowDuration | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return 0, io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		switch wireType { | ||||||
|  | 		case 0: | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowDuration | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				iNdEx++ | ||||||
|  | 				if dAtA[iNdEx-1] < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 1: | ||||||
|  | 			iNdEx += 8 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 2: | ||||||
|  | 			var length int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowDuration | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				length |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			iNdEx += length | ||||||
|  | 			if length < 0 { | ||||||
|  | 				return 0, ErrInvalidLengthDuration | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 3: | ||||||
|  | 			for { | ||||||
|  | 				var innerWire uint64 | ||||||
|  | 				var start int = iNdEx | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return 0, ErrIntOverflowDuration | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return 0, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					innerWire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				innerWireType := int(innerWire & 0x7) | ||||||
|  | 				if innerWireType == 4 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				next, err := skipDuration(dAtA[start:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return 0, err | ||||||
|  | 				} | ||||||
|  | 				iNdEx = start + next | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 4: | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 5: | ||||||
|  | 			iNdEx += 4 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		default: | ||||||
|  | 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrInvalidLengthDuration = fmt.Errorf("proto: negative length found during unmarshaling") | ||||||
|  | 	ErrIntOverflowDuration   = fmt.Errorf("proto: integer overflow") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { proto.RegisterFile("duration.proto", fileDescriptorDuration) } | ||||||
|  | 
 | ||||||
|  | var fileDescriptorDuration = []byte{ | ||||||
|  | 	// 203 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x29, 0x2d, 0x4a, | ||||||
|  | 	0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f, | ||||||
|  | 	0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 0x94, 0xac, 0xb8, 0x38, 0x5c, 0xa0, 0x4a, 0x84, 0x24, | ||||||
|  | 	0xb8, 0xd8, 0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, | ||||||
|  | 	0x60, 0x5c, 0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0x05, 0x46, 0x0d, | ||||||
|  | 	0xd6, 0x20, 0x08, 0xc7, 0xa9, 0xfe, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18, 0x3e, 0x3c, | ||||||
|  | 	0x94, 0x63, 0x5c, 0xf1, 0x48, 0x8e, 0xf1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, | ||||||
|  | 	0x3c, 0x92, 0x63, 0x7c, 0xf1, 0x48, 0x8e, 0xe1, 0xc3, 0x23, 0x39, 0xc6, 0x15, 0x8f, 0xe5, 0x18, | ||||||
|  | 	0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0xac, 0x76, 0xe2, 0x85, 0x59, 0x1c, 0x00, 0x12, 0x09, | ||||||
|  | 	0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0x5e, 0xc0, 0xc8, 0xb8, 0x88, 0x89, 0xd9, 0x3d, | ||||||
|  | 	0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x4b, 0x00, 0x54, 0x8b, 0x5e, 0x78, 0x6a, 0x4e, 0x8e, | ||||||
|  | 	0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8, 0x2c, 0x63, 0x40, 0x00, 0x00, | ||||||
|  | 	0x00, 0xff, 0xff, 0xba, 0xfb, 0x15, 0xc9, 0xe6, 0x00, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration_gogo.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration_gogo.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | // Protocol Buffers for Go with Gadgets | ||||||
|  | // | ||||||
|  | // Copyright (c) 2016, The GoGo Authors. All rights reserved. | ||||||
|  | // http://github.com/gogo/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func NewPopulatedDuration(r interface { | ||||||
|  | 	Int63() int64 | ||||||
|  | }, easy bool) *Duration { | ||||||
|  | 	this := &Duration{} | ||||||
|  | 	maxSecs := time.Hour.Nanoseconds() / 1e9 | ||||||
|  | 	max := 2 * maxSecs | ||||||
|  | 	s := int64(r.Int63()) % max | ||||||
|  | 	s -= maxSecs | ||||||
|  | 	neg := int64(1) | ||||||
|  | 	if s < 0 { | ||||||
|  | 		neg = -1 | ||||||
|  | 	} | ||||||
|  | 	this.Seconds = s | ||||||
|  | 	this.Nanos = int32(neg * (r.Int63() % 1e9)) | ||||||
|  | 	return this | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Duration) String() string { | ||||||
|  | 	td, err := DurationFromProto(d) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Sprintf("(%v)", err) | ||||||
|  | 	} | ||||||
|  | 	return td.String() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewPopulatedStdDuration(r interface { | ||||||
|  | 	Int63() int64 | ||||||
|  | }, easy bool) *time.Duration { | ||||||
|  | 	dur := NewPopulatedDuration(r, easy) | ||||||
|  | 	d, err := DurationFromProto(dur) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return &d | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func SizeOfStdDuration(d time.Duration) int { | ||||||
|  | 	dur := DurationProto(d) | ||||||
|  | 	return dur.Size() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdDurationMarshal(d time.Duration) ([]byte, error) { | ||||||
|  | 	size := SizeOfStdDuration(d) | ||||||
|  | 	buf := make([]byte, size) | ||||||
|  | 	_, err := StdDurationMarshalTo(d, buf) | ||||||
|  | 	return buf, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdDurationMarshalTo(d time.Duration, data []byte) (int, error) { | ||||||
|  | 	dur := DurationProto(d) | ||||||
|  | 	return dur.MarshalTo(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdDurationUnmarshal(d *time.Duration, data []byte) error { | ||||||
|  | 	dur := &Duration{} | ||||||
|  | 	if err := dur.Unmarshal(data); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	dd, err := DurationFromProto(dur) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	*d = dd | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										478
									
								
								vendor/github.com/gogo/protobuf/types/empty.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										478
									
								
								vendor/github.com/gogo/protobuf/types/empty.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,478 @@ | ||||||
|  | // Code generated by protoc-gen-gogo. | ||||||
|  | // source: empty.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | Package types is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | It is generated from these files: | ||||||
|  | 	empty.proto | ||||||
|  | 
 | ||||||
|  | It has these top-level messages: | ||||||
|  | 	Empty | ||||||
|  | */ | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" | ||||||
|  | import sort "sort" | ||||||
|  | import strconv "strconv" | ||||||
|  | import reflect "reflect" | ||||||
|  | 
 | ||||||
|  | import io "io" | ||||||
|  | 
 | ||||||
|  | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | var _ = proto.Marshal | ||||||
|  | var _ = fmt.Errorf | ||||||
|  | var _ = math.Inf | ||||||
|  | 
 | ||||||
|  | // This is a compile-time assertion to ensure that this generated file | ||||||
|  | // is compatible with the proto package it is being compiled against. | ||||||
|  | // A compilation error at this line likely means your copy of the | ||||||
|  | // proto package needs to be updated. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
|  | 
 | ||||||
|  | // A generic empty message that you can re-use to avoid defining duplicated | ||||||
|  | // empty messages in your APIs. A typical example is to use it as the request | ||||||
|  | // or the response type of an API method. For instance: | ||||||
|  | // | ||||||
|  | //     service Foo { | ||||||
|  | //       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // The JSON representation for `Empty` is empty JSON object `{}`. | ||||||
|  | type Empty struct { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Empty) Reset()                    { *m = Empty{} } | ||||||
|  | func (*Empty) ProtoMessage()               {} | ||||||
|  | func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptorEmpty, []int{0} } | ||||||
|  | func (*Empty) XXX_WellKnownType() string   { return "Empty" } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") | ||||||
|  | } | ||||||
|  | func (this *Empty) Compare(that interface{}) int { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Empty) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Empty) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | func (this *Empty) Equal(that interface{}) bool { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Empty) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Empty) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | func (this *Empty) GoString() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := make([]string, 0, 4) | ||||||
|  | 	s = append(s, "&types.Empty{") | ||||||
|  | 	s = append(s, "}") | ||||||
|  | 	return strings.Join(s, "") | ||||||
|  | } | ||||||
|  | func valueToGoStringEmpty(v interface{}, typ string) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) | ||||||
|  | } | ||||||
|  | func extensionToGoStringEmpty(m github_com_gogo_protobuf_proto.Message) string { | ||||||
|  | 	e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) | ||||||
|  | 	if e == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" | ||||||
|  | 	keys := make([]int, 0, len(e)) | ||||||
|  | 	for k := range e { | ||||||
|  | 		keys = append(keys, int(k)) | ||||||
|  | 	} | ||||||
|  | 	sort.Ints(keys) | ||||||
|  | 	ss := []string{} | ||||||
|  | 	for _, k := range keys { | ||||||
|  | 		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) | ||||||
|  | 	} | ||||||
|  | 	s += strings.Join(ss, ",") + "})" | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (m *Empty) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Empty) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeFixed64Empty(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	dAtA[offset+4] = uint8(v >> 32) | ||||||
|  | 	dAtA[offset+5] = uint8(v >> 40) | ||||||
|  | 	dAtA[offset+6] = uint8(v >> 48) | ||||||
|  | 	dAtA[offset+7] = uint8(v >> 56) | ||||||
|  | 	return offset + 8 | ||||||
|  | } | ||||||
|  | func encodeFixed32Empty(dAtA []byte, offset int, v uint32) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	return offset + 4 | ||||||
|  | } | ||||||
|  | func encodeVarintEmpty(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA[offset] = uint8(v&0x7f | 0x80) | ||||||
|  | 		v >>= 7 | ||||||
|  | 		offset++ | ||||||
|  | 	} | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	return offset + 1 | ||||||
|  | } | ||||||
|  | func NewPopulatedEmpty(r randyEmpty, easy bool) *Empty { | ||||||
|  | 	this := &Empty{} | ||||||
|  | 	if !easy && r.Intn(10) != 0 { | ||||||
|  | 	} | ||||||
|  | 	return this | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type randyEmpty interface { | ||||||
|  | 	Float32() float32 | ||||||
|  | 	Float64() float64 | ||||||
|  | 	Int63() int64 | ||||||
|  | 	Int31() int32 | ||||||
|  | 	Uint32() uint32 | ||||||
|  | 	Intn(n int) int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func randUTF8RuneEmpty(r randyEmpty) rune { | ||||||
|  | 	ru := r.Intn(62) | ||||||
|  | 	if ru < 10 { | ||||||
|  | 		return rune(ru + 48) | ||||||
|  | 	} else if ru < 36 { | ||||||
|  | 		return rune(ru + 55) | ||||||
|  | 	} | ||||||
|  | 	return rune(ru + 61) | ||||||
|  | } | ||||||
|  | func randStringEmpty(r randyEmpty) string { | ||||||
|  | 	v1 := r.Intn(100) | ||||||
|  | 	tmps := make([]rune, v1) | ||||||
|  | 	for i := 0; i < v1; i++ { | ||||||
|  | 		tmps[i] = randUTF8RuneEmpty(r) | ||||||
|  | 	} | ||||||
|  | 	return string(tmps) | ||||||
|  | } | ||||||
|  | func randUnrecognizedEmpty(r randyEmpty, maxFieldNumber int) (dAtA []byte) { | ||||||
|  | 	l := r.Intn(5) | ||||||
|  | 	for i := 0; i < l; i++ { | ||||||
|  | 		wire := r.Intn(4) | ||||||
|  | 		if wire == 3 { | ||||||
|  | 			wire = 5 | ||||||
|  | 		} | ||||||
|  | 		fieldNumber := maxFieldNumber + r.Intn(100) | ||||||
|  | 		dAtA = randFieldEmpty(dAtA, r, fieldNumber, wire) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func randFieldEmpty(dAtA []byte, r randyEmpty, fieldNumber int, wire int) []byte { | ||||||
|  | 	key := uint32(fieldNumber)<<3 | uint32(wire) | ||||||
|  | 	switch wire { | ||||||
|  | 	case 0: | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) | ||||||
|  | 		v2 := r.Int63() | ||||||
|  | 		if r.Intn(2) == 0 { | ||||||
|  | 			v2 *= -1 | ||||||
|  | 		} | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(v2)) | ||||||
|  | 	case 1: | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	case 2: | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) | ||||||
|  | 		ll := r.Intn(100) | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(ll)) | ||||||
|  | 		for j := 0; j < ll; j++ { | ||||||
|  | 			dAtA = append(dAtA, byte(r.Intn(256))) | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func encodeVarintPopulateEmpty(dAtA []byte, v uint64) []byte { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) | ||||||
|  | 		v >>= 7 | ||||||
|  | 	} | ||||||
|  | 	dAtA = append(dAtA, uint8(v)) | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func (m *Empty) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sovEmpty(x uint64) (n int) { | ||||||
|  | 	for { | ||||||
|  | 		n++ | ||||||
|  | 		x >>= 7 | ||||||
|  | 		if x == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | func sozEmpty(x uint64) (n int) { | ||||||
|  | 	return sovEmpty(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||||
|  | } | ||||||
|  | func (this *Empty) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := strings.Join([]string{`&Empty{`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func valueToStringEmpty(v interface{}) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("*%v", pv) | ||||||
|  | } | ||||||
|  | func (m *Empty) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowEmpty | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: Empty: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipEmpty(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthEmpty | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func skipEmpty(dAtA []byte) (n int, err error) { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return 0, ErrIntOverflowEmpty | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return 0, io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		switch wireType { | ||||||
|  | 		case 0: | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowEmpty | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				iNdEx++ | ||||||
|  | 				if dAtA[iNdEx-1] < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 1: | ||||||
|  | 			iNdEx += 8 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 2: | ||||||
|  | 			var length int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowEmpty | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				length |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			iNdEx += length | ||||||
|  | 			if length < 0 { | ||||||
|  | 				return 0, ErrInvalidLengthEmpty | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 3: | ||||||
|  | 			for { | ||||||
|  | 				var innerWire uint64 | ||||||
|  | 				var start int = iNdEx | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return 0, ErrIntOverflowEmpty | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return 0, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					innerWire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				innerWireType := int(innerWire & 0x7) | ||||||
|  | 				if innerWireType == 4 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				next, err := skipEmpty(dAtA[start:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return 0, err | ||||||
|  | 				} | ||||||
|  | 				iNdEx = start + next | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 4: | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 5: | ||||||
|  | 			iNdEx += 4 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		default: | ||||||
|  | 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrInvalidLengthEmpty = fmt.Errorf("proto: negative length found during unmarshaling") | ||||||
|  | 	ErrIntOverflowEmpty   = fmt.Errorf("proto: integer overflow") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { proto.RegisterFile("empty.proto", fileDescriptorEmpty) } | ||||||
|  | 
 | ||||||
|  | var fileDescriptorEmpty = []byte{ | ||||||
|  | 	// 172 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x4e, 0xcd, 0x2d, 0x28, | ||||||
|  | 	0xa9, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, 0x85, | ||||||
|  | 	0xf0, 0x92, 0x4a, 0xd3, 0x94, 0xd8, 0xb9, 0x58, 0x5d, 0x41, 0xf2, 0x4e, 0xed, 0x8c, 0x17, 0x1e, | ||||||
|  | 	0xca, 0x31, 0xdc, 0x78, 0x28, 0xc7, 0xf0, 0xe1, 0xa1, 0x1c, 0xe3, 0x8f, 0x87, 0x72, 0x8c, 0x0d, | ||||||
|  | 	0x8f, 0xe4, 0x18, 0x57, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, | ||||||
|  | 	0x07, 0x8f, 0xe4, 0x18, 0x5f, 0x3c, 0x92, 0x63, 0xf8, 0x00, 0x12, 0x7f, 0x2c, 0xc7, 0xc8, 0x25, | ||||||
|  | 	0x9c, 0x9c, 0x9f, 0xab, 0x87, 0x66, 0xa0, 0x13, 0x17, 0xd8, 0xb8, 0x00, 0x10, 0x37, 0x80, 0x31, | ||||||
|  | 	0x8a, 0xb5, 0xa4, 0xb2, 0x20, 0xb5, 0x78, 0x01, 0x23, 0xe3, 0x0f, 0x46, 0xc6, 0x45, 0x4c, 0xcc, | ||||||
|  | 	0xee, 0x01, 0x4e, 0xab, 0x98, 0xe4, 0xdc, 0x21, 0x5a, 0x02, 0xa0, 0x5a, 0xf4, 0xc2, 0x53, 0x73, | ||||||
|  | 	0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, 0x8a, 0x93, 0xd8, 0xc0, 0x66, 0x19, 0x03, 0x02, | ||||||
|  | 	0x00, 0x00, 0xff, 0xff, 0x97, 0x6c, 0x95, 0xdd, 0xb9, 0x00, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										759
									
								
								vendor/github.com/gogo/protobuf/types/field_mask.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										759
									
								
								vendor/github.com/gogo/protobuf/types/field_mask.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,759 @@ | ||||||
|  | // Code generated by protoc-gen-gogo. | ||||||
|  | // source: field_mask.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | Package types is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | It is generated from these files: | ||||||
|  | 	field_mask.proto | ||||||
|  | 
 | ||||||
|  | It has these top-level messages: | ||||||
|  | 	FieldMask | ||||||
|  | */ | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" | ||||||
|  | import sort "sort" | ||||||
|  | import strconv "strconv" | ||||||
|  | import reflect "reflect" | ||||||
|  | 
 | ||||||
|  | import io "io" | ||||||
|  | 
 | ||||||
|  | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | var _ = proto.Marshal | ||||||
|  | var _ = fmt.Errorf | ||||||
|  | var _ = math.Inf | ||||||
|  | 
 | ||||||
|  | // This is a compile-time assertion to ensure that this generated file | ||||||
|  | // is compatible with the proto package it is being compiled against. | ||||||
|  | // A compilation error at this line likely means your copy of the | ||||||
|  | // proto package needs to be updated. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
|  | 
 | ||||||
|  | // `FieldMask` represents a set of symbolic field paths, for example: | ||||||
|  | // | ||||||
|  | //     paths: "f.a" | ||||||
|  | //     paths: "f.b.d" | ||||||
|  | // | ||||||
|  | // Here `f` represents a field in some root message, `a` and `b` | ||||||
|  | // fields in the message found in `f`, and `d` a field found in the | ||||||
|  | // message in `f.b`. | ||||||
|  | // | ||||||
|  | // Field masks are used to specify a subset of fields that should be | ||||||
|  | // returned by a get operation or modified by an update operation. | ||||||
|  | // Field masks also have a custom JSON encoding (see below). | ||||||
|  | // | ||||||
|  | // # Field Masks in Projections | ||||||
|  | // | ||||||
|  | // When used in the context of a projection, a response message or | ||||||
|  | // sub-message is filtered by the API to only contain those fields as | ||||||
|  | // specified in the mask. For example, if the mask in the previous | ||||||
|  | // example is applied to a response message as follows: | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       a : 22 | ||||||
|  | //       b { | ||||||
|  | //         d : 1 | ||||||
|  | //         x : 2 | ||||||
|  | //       } | ||||||
|  | //       y : 13 | ||||||
|  | //     } | ||||||
|  | //     z: 8 | ||||||
|  | // | ||||||
|  | // The result will not contain specific values for fields x,y and z | ||||||
|  | // (their value will be set to the default, and omitted in proto text | ||||||
|  | // output): | ||||||
|  | // | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       a : 22 | ||||||
|  | //       b { | ||||||
|  | //         d : 1 | ||||||
|  | //       } | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // A repeated field is not allowed except at the last position of a | ||||||
|  | // field mask. | ||||||
|  | // | ||||||
|  | // If a FieldMask object is not present in a get operation, the | ||||||
|  | // operation applies to all fields (as if a FieldMask of all fields | ||||||
|  | // had been specified). | ||||||
|  | // | ||||||
|  | // Note that a field mask does not necessarily apply to the | ||||||
|  | // top-level response message. In case of a REST get operation, the | ||||||
|  | // field mask applies directly to the response, but in case of a REST | ||||||
|  | // list operation, the mask instead applies to each individual message | ||||||
|  | // in the returned resource list. In case of a REST custom method, | ||||||
|  | // other definitions may be used. Where the mask applies will be | ||||||
|  | // clearly documented together with its declaration in the API.  In | ||||||
|  | // any case, the effect on the returned resource/resources is required | ||||||
|  | // behavior for APIs. | ||||||
|  | // | ||||||
|  | // # Field Masks in Update Operations | ||||||
|  | // | ||||||
|  | // A field mask in update operations specifies which fields of the | ||||||
|  | // targeted resource are going to be updated. The API is required | ||||||
|  | // to only change the values of the fields as specified in the mask | ||||||
|  | // and leave the others untouched. If a resource is passed in to | ||||||
|  | // describe the updated values, the API ignores the values of all | ||||||
|  | // fields not covered by the mask. | ||||||
|  | // | ||||||
|  | // If a repeated field is specified for an update operation, the existing | ||||||
|  | // repeated values in the target resource will be overwritten by the new values. | ||||||
|  | // Note that a repeated field is only allowed in the last position of a field | ||||||
|  | // mask. | ||||||
|  | // | ||||||
|  | // If a sub-message is specified in the last position of the field mask for an | ||||||
|  | // update operation, then the existing sub-message in the target resource is | ||||||
|  | // overwritten. Given the target message: | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       b { | ||||||
|  | //         d : 1 | ||||||
|  | //         x : 2 | ||||||
|  | //       } | ||||||
|  | //       c : 1 | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // And an update message: | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       b { | ||||||
|  | //         d : 10 | ||||||
|  | //       } | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // then if the field mask is: | ||||||
|  | // | ||||||
|  | //  paths: "f.b" | ||||||
|  | // | ||||||
|  | // then the result will be: | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       b { | ||||||
|  | //         d : 10 | ||||||
|  | //       } | ||||||
|  | //       c : 1 | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // However, if the update mask was: | ||||||
|  | // | ||||||
|  | //  paths: "f.b.d" | ||||||
|  | // | ||||||
|  | // then the result would be: | ||||||
|  | // | ||||||
|  | //     f { | ||||||
|  | //       b { | ||||||
|  | //         d : 10 | ||||||
|  | //         x : 2 | ||||||
|  | //       } | ||||||
|  | //       c : 1 | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // In order to reset a field's value to the default, the field must | ||||||
|  | // be in the mask and set to the default value in the provided resource. | ||||||
|  | // Hence, in order to reset all fields of a resource, provide a default | ||||||
|  | // instance of the resource and set all fields in the mask, or do | ||||||
|  | // not provide a mask as described below. | ||||||
|  | // | ||||||
|  | // If a field mask is not present on update, the operation applies to | ||||||
|  | // all fields (as if a field mask of all fields has been specified). | ||||||
|  | // Note that in the presence of schema evolution, this may mean that | ||||||
|  | // fields the client does not know and has therefore not filled into | ||||||
|  | // the request will be reset to their default. If this is unwanted | ||||||
|  | // behavior, a specific service may require a client to always specify | ||||||
|  | // a field mask, producing an error if not. | ||||||
|  | // | ||||||
|  | // As with get operations, the location of the resource which | ||||||
|  | // describes the updated values in the request message depends on the | ||||||
|  | // operation kind. In any case, the effect of the field mask is | ||||||
|  | // required to be honored by the API. | ||||||
|  | // | ||||||
|  | // ## Considerations for HTTP REST | ||||||
|  | // | ||||||
|  | // The HTTP kind of an update operation which uses a field mask must | ||||||
|  | // be set to PATCH instead of PUT in order to satisfy HTTP semantics | ||||||
|  | // (PUT must only be used for full updates). | ||||||
|  | // | ||||||
|  | // # JSON Encoding of Field Masks | ||||||
|  | // | ||||||
|  | // In JSON, a field mask is encoded as a single string where paths are | ||||||
|  | // separated by a comma. Fields name in each path are converted | ||||||
|  | // to/from lower-camel naming conventions. | ||||||
|  | // | ||||||
|  | // As an example, consider the following message declarations: | ||||||
|  | // | ||||||
|  | //     message Profile { | ||||||
|  | //       User user = 1; | ||||||
|  | //       Photo photo = 2; | ||||||
|  | //     } | ||||||
|  | //     message User { | ||||||
|  | //       string display_name = 1; | ||||||
|  | //       string address = 2; | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // In proto a field mask for `Profile` may look as such: | ||||||
|  | // | ||||||
|  | //     mask { | ||||||
|  | //       paths: "user.display_name" | ||||||
|  | //       paths: "photo" | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // In JSON, the same mask is represented as below: | ||||||
|  | // | ||||||
|  | //     { | ||||||
|  | //       mask: "user.displayName,photo" | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // # Field Masks and Oneof Fields | ||||||
|  | // | ||||||
|  | // Field masks treat fields in oneofs just as regular fields. Consider the | ||||||
|  | // following message: | ||||||
|  | // | ||||||
|  | //     message SampleMessage { | ||||||
|  | //       oneof test_oneof { | ||||||
|  | //         string name = 4; | ||||||
|  | //         SubMessage sub_message = 9; | ||||||
|  | //       } | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // The field mask can be: | ||||||
|  | // | ||||||
|  | //     mask { | ||||||
|  | //       paths: "name" | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // Or: | ||||||
|  | // | ||||||
|  | //     mask { | ||||||
|  | //       paths: "sub_message" | ||||||
|  | //     } | ||||||
|  | // | ||||||
|  | // Note that oneof type names ("test_oneof" in this case) cannot be used in | ||||||
|  | // paths. | ||||||
|  | type FieldMask struct { | ||||||
|  | 	// The set of field mask paths. | ||||||
|  | 	Paths []string `protobuf:"bytes,1,rep,name=paths" json:"paths,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *FieldMask) Reset()                    { *m = FieldMask{} } | ||||||
|  | func (*FieldMask) ProtoMessage()               {} | ||||||
|  | func (*FieldMask) Descriptor() ([]byte, []int) { return fileDescriptorFieldMask, []int{0} } | ||||||
|  | 
 | ||||||
|  | func (m *FieldMask) GetPaths() []string { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Paths | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask") | ||||||
|  | } | ||||||
|  | func (this *FieldMask) Compare(that interface{}) int { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*FieldMask) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(FieldMask) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	if len(this.Paths) != len(that1.Paths) { | ||||||
|  | 		if len(this.Paths) < len(that1.Paths) { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	for i := range this.Paths { | ||||||
|  | 		if this.Paths[i] != that1.Paths[i] { | ||||||
|  | 			if this.Paths[i] < that1.Paths[i] { | ||||||
|  | 				return -1 | ||||||
|  | 			} | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | func (this *FieldMask) Equal(that interface{}) bool { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*FieldMask) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(FieldMask) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if len(this.Paths) != len(that1.Paths) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	for i := range this.Paths { | ||||||
|  | 		if this.Paths[i] != that1.Paths[i] { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | func (this *FieldMask) GoString() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := make([]string, 0, 5) | ||||||
|  | 	s = append(s, "&types.FieldMask{") | ||||||
|  | 	s = append(s, "Paths: "+fmt.Sprintf("%#v", this.Paths)+",\n") | ||||||
|  | 	s = append(s, "}") | ||||||
|  | 	return strings.Join(s, "") | ||||||
|  | } | ||||||
|  | func valueToGoStringFieldMask(v interface{}, typ string) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) | ||||||
|  | } | ||||||
|  | func extensionToGoStringFieldMask(m github_com_gogo_protobuf_proto.Message) string { | ||||||
|  | 	e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) | ||||||
|  | 	if e == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" | ||||||
|  | 	keys := make([]int, 0, len(e)) | ||||||
|  | 	for k := range e { | ||||||
|  | 		keys = append(keys, int(k)) | ||||||
|  | 	} | ||||||
|  | 	sort.Ints(keys) | ||||||
|  | 	ss := []string{} | ||||||
|  | 	for _, k := range keys { | ||||||
|  | 		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) | ||||||
|  | 	} | ||||||
|  | 	s += strings.Join(ss, ",") + "})" | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (m *FieldMask) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *FieldMask) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if len(m.Paths) > 0 { | ||||||
|  | 		for _, s := range m.Paths { | ||||||
|  | 			dAtA[i] = 0xa | ||||||
|  | 			i++ | ||||||
|  | 			l = len(s) | ||||||
|  | 			for l >= 1<<7 { | ||||||
|  | 				dAtA[i] = uint8(uint64(l)&0x7f | 0x80) | ||||||
|  | 				l >>= 7 | ||||||
|  | 				i++ | ||||||
|  | 			} | ||||||
|  | 			dAtA[i] = uint8(l) | ||||||
|  | 			i++ | ||||||
|  | 			i += copy(dAtA[i:], s) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeFixed64FieldMask(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	dAtA[offset+4] = uint8(v >> 32) | ||||||
|  | 	dAtA[offset+5] = uint8(v >> 40) | ||||||
|  | 	dAtA[offset+6] = uint8(v >> 48) | ||||||
|  | 	dAtA[offset+7] = uint8(v >> 56) | ||||||
|  | 	return offset + 8 | ||||||
|  | } | ||||||
|  | func encodeFixed32FieldMask(dAtA []byte, offset int, v uint32) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	return offset + 4 | ||||||
|  | } | ||||||
|  | func encodeVarintFieldMask(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA[offset] = uint8(v&0x7f | 0x80) | ||||||
|  | 		v >>= 7 | ||||||
|  | 		offset++ | ||||||
|  | 	} | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	return offset + 1 | ||||||
|  | } | ||||||
|  | func NewPopulatedFieldMask(r randyFieldMask, easy bool) *FieldMask { | ||||||
|  | 	this := &FieldMask{} | ||||||
|  | 	v1 := r.Intn(10) | ||||||
|  | 	this.Paths = make([]string, v1) | ||||||
|  | 	for i := 0; i < v1; i++ { | ||||||
|  | 		this.Paths[i] = string(randStringFieldMask(r)) | ||||||
|  | 	} | ||||||
|  | 	if !easy && r.Intn(10) != 0 { | ||||||
|  | 	} | ||||||
|  | 	return this | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type randyFieldMask interface { | ||||||
|  | 	Float32() float32 | ||||||
|  | 	Float64() float64 | ||||||
|  | 	Int63() int64 | ||||||
|  | 	Int31() int32 | ||||||
|  | 	Uint32() uint32 | ||||||
|  | 	Intn(n int) int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func randUTF8RuneFieldMask(r randyFieldMask) rune { | ||||||
|  | 	ru := r.Intn(62) | ||||||
|  | 	if ru < 10 { | ||||||
|  | 		return rune(ru + 48) | ||||||
|  | 	} else if ru < 36 { | ||||||
|  | 		return rune(ru + 55) | ||||||
|  | 	} | ||||||
|  | 	return rune(ru + 61) | ||||||
|  | } | ||||||
|  | func randStringFieldMask(r randyFieldMask) string { | ||||||
|  | 	v2 := r.Intn(100) | ||||||
|  | 	tmps := make([]rune, v2) | ||||||
|  | 	for i := 0; i < v2; i++ { | ||||||
|  | 		tmps[i] = randUTF8RuneFieldMask(r) | ||||||
|  | 	} | ||||||
|  | 	return string(tmps) | ||||||
|  | } | ||||||
|  | func randUnrecognizedFieldMask(r randyFieldMask, maxFieldNumber int) (dAtA []byte) { | ||||||
|  | 	l := r.Intn(5) | ||||||
|  | 	for i := 0; i < l; i++ { | ||||||
|  | 		wire := r.Intn(4) | ||||||
|  | 		if wire == 3 { | ||||||
|  | 			wire = 5 | ||||||
|  | 		} | ||||||
|  | 		fieldNumber := maxFieldNumber + r.Intn(100) | ||||||
|  | 		dAtA = randFieldFieldMask(dAtA, r, fieldNumber, wire) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func randFieldFieldMask(dAtA []byte, r randyFieldMask, fieldNumber int, wire int) []byte { | ||||||
|  | 	key := uint32(fieldNumber)<<3 | uint32(wire) | ||||||
|  | 	switch wire { | ||||||
|  | 	case 0: | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) | ||||||
|  | 		v3 := r.Int63() | ||||||
|  | 		if r.Intn(2) == 0 { | ||||||
|  | 			v3 *= -1 | ||||||
|  | 		} | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(v3)) | ||||||
|  | 	case 1: | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	case 2: | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) | ||||||
|  | 		ll := r.Intn(100) | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(ll)) | ||||||
|  | 		for j := 0; j < ll; j++ { | ||||||
|  | 			dAtA = append(dAtA, byte(r.Intn(256))) | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) | ||||||
|  | 		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) | ||||||
|  | 	} | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func encodeVarintPopulateFieldMask(dAtA []byte, v uint64) []byte { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) | ||||||
|  | 		v >>= 7 | ||||||
|  | 	} | ||||||
|  | 	dAtA = append(dAtA, uint8(v)) | ||||||
|  | 	return dAtA | ||||||
|  | } | ||||||
|  | func (m *FieldMask) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if len(m.Paths) > 0 { | ||||||
|  | 		for _, s := range m.Paths { | ||||||
|  | 			l = len(s) | ||||||
|  | 			n += 1 + l + sovFieldMask(uint64(l)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sovFieldMask(x uint64) (n int) { | ||||||
|  | 	for { | ||||||
|  | 		n++ | ||||||
|  | 		x >>= 7 | ||||||
|  | 		if x == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | func sozFieldMask(x uint64) (n int) { | ||||||
|  | 	return sovFieldMask(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||||
|  | } | ||||||
|  | func (this *FieldMask) String() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := strings.Join([]string{`&FieldMask{`, | ||||||
|  | 		`Paths:` + fmt.Sprintf("%v", this.Paths) + `,`, | ||||||
|  | 		`}`, | ||||||
|  | 	}, "") | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func valueToStringFieldMask(v interface{}) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("*%v", pv) | ||||||
|  | } | ||||||
|  | func (m *FieldMask) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowFieldMask | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: FieldMask: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: FieldMask: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		case 1: | ||||||
|  | 			if wireType != 2 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType) | ||||||
|  | 			} | ||||||
|  | 			var stringLen uint64 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowFieldMask | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				stringLen |= (uint64(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			intStringLen := int(stringLen) | ||||||
|  | 			if intStringLen < 0 { | ||||||
|  | 				return ErrInvalidLengthFieldMask | ||||||
|  | 			} | ||||||
|  | 			postIndex := iNdEx + intStringLen | ||||||
|  | 			if postIndex > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex])) | ||||||
|  | 			iNdEx = postIndex | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipFieldMask(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthFieldMask | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func skipFieldMask(dAtA []byte) (n int, err error) { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return 0, ErrIntOverflowFieldMask | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return 0, io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		switch wireType { | ||||||
|  | 		case 0: | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowFieldMask | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				iNdEx++ | ||||||
|  | 				if dAtA[iNdEx-1] < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 1: | ||||||
|  | 			iNdEx += 8 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 2: | ||||||
|  | 			var length int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowFieldMask | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				length |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			iNdEx += length | ||||||
|  | 			if length < 0 { | ||||||
|  | 				return 0, ErrInvalidLengthFieldMask | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 3: | ||||||
|  | 			for { | ||||||
|  | 				var innerWire uint64 | ||||||
|  | 				var start int = iNdEx | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return 0, ErrIntOverflowFieldMask | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return 0, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					innerWire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				innerWireType := int(innerWire & 0x7) | ||||||
|  | 				if innerWireType == 4 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				next, err := skipFieldMask(dAtA[start:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return 0, err | ||||||
|  | 				} | ||||||
|  | 				iNdEx = start + next | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 4: | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 5: | ||||||
|  | 			iNdEx += 4 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		default: | ||||||
|  | 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrInvalidLengthFieldMask = fmt.Errorf("proto: negative length found during unmarshaling") | ||||||
|  | 	ErrIntOverflowFieldMask   = fmt.Errorf("proto: integer overflow") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { proto.RegisterFile("field_mask.proto", fileDescriptorFieldMask) } | ||||||
|  | 
 | ||||||
|  | var fileDescriptorFieldMask = []byte{ | ||||||
|  | 	// 196 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x12, 0x48, 0xcb, 0x4c, 0xcd, | ||||||
|  | 	0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, | ||||||
|  | 	0xcf, 0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 0x94, 0x14, 0xb9, 0x38, 0xdd, 0x40, 0x8a, | ||||||
|  | 	0x7c, 0x13, 0x8b, 0xb3, 0x85, 0x44, 0xb8, 0x58, 0x0b, 0x12, 0x4b, 0x32, 0x8a, 0x25, 0x18, 0x15, | ||||||
|  | 	0x98, 0x35, 0x38, 0x83, 0x20, 0x1c, 0xa7, 0x0e, 0xc6, 0x0b, 0x0f, 0xe5, 0x18, 0x6e, 0x3c, 0x94, | ||||||
|  | 	0x63, 0xf8, 0xf0, 0x50, 0x8e, 0xf1, 0xc7, 0x43, 0x39, 0xc6, 0x86, 0x47, 0x72, 0x8c, 0x2b, 0x1e, | ||||||
|  | 	0xc9, 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, | ||||||
|  | 	0x1e, 0xc9, 0x31, 0x7c, 0x00, 0x89, 0x3f, 0x96, 0x63, 0xe4, 0x12, 0x4e, 0xce, 0xcf, 0xd5, 0x43, | ||||||
|  | 	0xb3, 0xca, 0x89, 0x0f, 0x6e, 0x51, 0x00, 0x48, 0x28, 0x80, 0x31, 0x8a, 0xb5, 0xa4, 0xb2, 0x20, | ||||||
|  | 	0xb5, 0x78, 0x01, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, | ||||||
|  | 	0x3d, 0x01, 0x50, 0x3d, 0x7a, 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, | ||||||
|  | 	0x95, 0x49, 0x6c, 0x60, 0xc3, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xea, 0xb1, 0x3a, 0xd5, | ||||||
|  | 	0xd9, 0x00, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										1908
									
								
								vendor/github.com/gogo/protobuf/types/struct.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1908
									
								
								vendor/github.com/gogo/protobuf/types/struct.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										123
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | ||||||
|  | // Go support for Protocol Buffers - Google's data interchange format | ||||||
|  | // | ||||||
|  | // Copyright 2016 The Go Authors.  All rights reserved. | ||||||
|  | // https://github.com/golang/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | //     * Neither the name of Google Inc. nor the names of its | ||||||
|  | // contributors may be used to endorse or promote products derived from | ||||||
|  | // this software without specific prior written permission. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | // This file implements operations on google.protobuf.Timestamp. | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// Seconds field of the earliest valid Timestamp. | ||||||
|  | 	// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). | ||||||
|  | 	minValidSeconds = -62135596800 | ||||||
|  | 	// Seconds field just after the latest valid Timestamp. | ||||||
|  | 	// This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). | ||||||
|  | 	maxValidSeconds = 253402300800 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // validateTimestamp determines whether a Timestamp is valid. | ||||||
|  | // A valid timestamp represents a time in the range | ||||||
|  | // [0001-01-01, 10000-01-01) and has a Nanos field | ||||||
|  | // in the range [0, 1e9). | ||||||
|  | // | ||||||
|  | // If the Timestamp is valid, validateTimestamp returns nil. | ||||||
|  | // Otherwise, it returns an error that describes | ||||||
|  | // the problem. | ||||||
|  | // | ||||||
|  | // Every valid Timestamp can be represented by a time.Time, but the converse is not true. | ||||||
|  | func validateTimestamp(ts *Timestamp) error { | ||||||
|  | 	if ts == nil { | ||||||
|  | 		return errors.New("timestamp: nil Timestamp") | ||||||
|  | 	} | ||||||
|  | 	if ts.Seconds < minValidSeconds { | ||||||
|  | 		return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) | ||||||
|  | 	} | ||||||
|  | 	if ts.Seconds >= maxValidSeconds { | ||||||
|  | 		return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) | ||||||
|  | 	} | ||||||
|  | 	if ts.Nanos < 0 || ts.Nanos >= 1e9 { | ||||||
|  | 		return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. | ||||||
|  | // It returns an error if the argument is invalid. | ||||||
|  | // | ||||||
|  | // Unlike most Go functions, if Timestamp returns an error, the first return value | ||||||
|  | // is not the zero time.Time. Instead, it is the value obtained from the | ||||||
|  | // time.Unix function when passed the contents of the Timestamp, in the UTC | ||||||
|  | // locale. This may or may not be a meaningful time; many invalid Timestamps | ||||||
|  | // do map to valid time.Times. | ||||||
|  | // | ||||||
|  | // A nil Timestamp returns an error. The first return value in that case is | ||||||
|  | // undefined. | ||||||
|  | func TimestampFromProto(ts *Timestamp) (time.Time, error) { | ||||||
|  | 	// Don't return the zero value on error, because corresponds to a valid | ||||||
|  | 	// timestamp. Instead return whatever time.Unix gives us. | ||||||
|  | 	var t time.Time | ||||||
|  | 	if ts == nil { | ||||||
|  | 		t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp | ||||||
|  | 	} else { | ||||||
|  | 		t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() | ||||||
|  | 	} | ||||||
|  | 	return t, validateTimestamp(ts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. | ||||||
|  | // It returns an error if the resulting Timestamp is invalid. | ||||||
|  | func TimestampProto(t time.Time) (*Timestamp, error) { | ||||||
|  | 	seconds := t.Unix() | ||||||
|  | 	nanos := int32(t.Sub(time.Unix(seconds, 0))) | ||||||
|  | 	ts := &Timestamp{ | ||||||
|  | 		Seconds: seconds, | ||||||
|  | 		Nanos:   nanos, | ||||||
|  | 	} | ||||||
|  | 	if err := validateTimestamp(ts); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return ts, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TimestampString returns the RFC 3339 string for valid Timestamps. For invalid | ||||||
|  | // Timestamps, it returns an error message in parentheses. | ||||||
|  | func TimestampString(ts *Timestamp) string { | ||||||
|  | 	t, err := TimestampFromProto(ts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Sprintf("(%v)", err) | ||||||
|  | 	} | ||||||
|  | 	return t.Format(time.RFC3339Nano) | ||||||
|  | } | ||||||
							
								
								
									
										527
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,527 @@ | ||||||
|  | // Code generated by protoc-gen-gogo. | ||||||
|  | // source: timestamp.proto | ||||||
|  | // DO NOT EDIT! | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 	Package types is a generated protocol buffer package. | ||||||
|  | 
 | ||||||
|  | 	It is generated from these files: | ||||||
|  | 		timestamp.proto | ||||||
|  | 
 | ||||||
|  | 	It has these top-level messages: | ||||||
|  | 		Timestamp | ||||||
|  | */ | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import proto "github.com/gogo/protobuf/proto" | ||||||
|  | import fmt "fmt" | ||||||
|  | import math "math" | ||||||
|  | 
 | ||||||
|  | import strings "strings" | ||||||
|  | import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" | ||||||
|  | import sort "sort" | ||||||
|  | import strconv "strconv" | ||||||
|  | import reflect "reflect" | ||||||
|  | 
 | ||||||
|  | import io "io" | ||||||
|  | 
 | ||||||
|  | // Reference imports to suppress errors if they are not otherwise used. | ||||||
|  | var _ = proto.Marshal | ||||||
|  | var _ = fmt.Errorf | ||||||
|  | var _ = math.Inf | ||||||
|  | 
 | ||||||
|  | // This is a compile-time assertion to ensure that this generated file | ||||||
|  | // is compatible with the proto package it is being compiled against. | ||||||
|  | // A compilation error at this line likely means your copy of the | ||||||
|  | // proto package needs to be updated. | ||||||
|  | const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package | ||||||
|  | 
 | ||||||
|  | // A Timestamp represents a point in time independent of any time zone | ||||||
|  | // or calendar, represented as seconds and fractions of seconds at | ||||||
|  | // nanosecond resolution in UTC Epoch time. It is encoded using the | ||||||
|  | // Proleptic Gregorian Calendar which extends the Gregorian calendar | ||||||
|  | // backwards to year one. It is encoded assuming all minutes are 60 | ||||||
|  | // seconds long, i.e. leap seconds are "smeared" so that no leap second | ||||||
|  | // table is needed for interpretation. Range is from | ||||||
|  | // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. | ||||||
|  | // By restricting to that range, we ensure that we can convert to | ||||||
|  | // and from  RFC 3339 date strings. | ||||||
|  | // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). | ||||||
|  | // | ||||||
|  | // Example 1: Compute Timestamp from POSIX `time()`. | ||||||
|  | // | ||||||
|  | //     Timestamp timestamp; | ||||||
|  | //     timestamp.set_seconds(time(NULL)); | ||||||
|  | //     timestamp.set_nanos(0); | ||||||
|  | // | ||||||
|  | // Example 2: Compute Timestamp from POSIX `gettimeofday()`. | ||||||
|  | // | ||||||
|  | //     struct timeval tv; | ||||||
|  | //     gettimeofday(&tv, NULL); | ||||||
|  | // | ||||||
|  | //     Timestamp timestamp; | ||||||
|  | //     timestamp.set_seconds(tv.tv_sec); | ||||||
|  | //     timestamp.set_nanos(tv.tv_usec * 1000); | ||||||
|  | // | ||||||
|  | // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. | ||||||
|  | // | ||||||
|  | //     FILETIME ft; | ||||||
|  | //     GetSystemTimeAsFileTime(&ft); | ||||||
|  | //     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; | ||||||
|  | // | ||||||
|  | //     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z | ||||||
|  | //     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. | ||||||
|  | //     Timestamp timestamp; | ||||||
|  | //     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); | ||||||
|  | //     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); | ||||||
|  | // | ||||||
|  | // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. | ||||||
|  | // | ||||||
|  | //     long millis = System.currentTimeMillis(); | ||||||
|  | // | ||||||
|  | //     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) | ||||||
|  | //         .setNanos((int) ((millis % 1000) * 1000000)).build(); | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // Example 5: Compute Timestamp from current time in Python. | ||||||
|  | // | ||||||
|  | //     now = time.time() | ||||||
|  | //     seconds = int(now) | ||||||
|  | //     nanos = int((now - seconds) * 10**9) | ||||||
|  | //     timestamp = Timestamp(seconds=seconds, nanos=nanos) | ||||||
|  | // | ||||||
|  | // | ||||||
|  | type Timestamp struct { | ||||||
|  | 	// Represents seconds of UTC time since Unix epoch | ||||||
|  | 	// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to | ||||||
|  | 	// 9999-12-31T23:59:59Z inclusive. | ||||||
|  | 	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` | ||||||
|  | 	// Non-negative fractions of a second at nanosecond resolution. Negative | ||||||
|  | 	// second values with fractions must still have non-negative nanos values | ||||||
|  | 	// that count forward in time. Must be from 0 to 999,999,999 | ||||||
|  | 	// inclusive. | ||||||
|  | 	Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Timestamp) Reset()                    { *m = Timestamp{} } | ||||||
|  | func (*Timestamp) ProtoMessage()               {} | ||||||
|  | func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorTimestamp, []int{0} } | ||||||
|  | func (*Timestamp) XXX_WellKnownType() string   { return "Timestamp" } | ||||||
|  | 
 | ||||||
|  | func (m *Timestamp) GetSeconds() int64 { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Seconds | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Timestamp) GetNanos() int32 { | ||||||
|  | 	if m != nil { | ||||||
|  | 		return m.Nanos | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") | ||||||
|  | } | ||||||
|  | func (this *Timestamp) Compare(that interface{}) int { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Timestamp) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Timestamp) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	if this.Seconds != that1.Seconds { | ||||||
|  | 		if this.Seconds < that1.Seconds { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	if this.Nanos != that1.Nanos { | ||||||
|  | 		if this.Nanos < that1.Nanos { | ||||||
|  | 			return -1 | ||||||
|  | 		} | ||||||
|  | 		return 1 | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | func (this *Timestamp) Equal(that interface{}) bool { | ||||||
|  | 	if that == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	that1, ok := that.(*Timestamp) | ||||||
|  | 	if !ok { | ||||||
|  | 		that2, ok := that.(Timestamp) | ||||||
|  | 		if ok { | ||||||
|  | 			that1 = &that2 | ||||||
|  | 		} else { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if that1 == nil { | ||||||
|  | 		if this == nil { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} else if this == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if this.Seconds != that1.Seconds { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	if this.Nanos != that1.Nanos { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | func (this *Timestamp) GoString() string { | ||||||
|  | 	if this == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := make([]string, 0, 6) | ||||||
|  | 	s = append(s, "&types.Timestamp{") | ||||||
|  | 	s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") | ||||||
|  | 	s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n") | ||||||
|  | 	s = append(s, "}") | ||||||
|  | 	return strings.Join(s, "") | ||||||
|  | } | ||||||
|  | func valueToGoStringTimestamp(v interface{}, typ string) string { | ||||||
|  | 	rv := reflect.ValueOf(v) | ||||||
|  | 	if rv.IsNil() { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	pv := reflect.Indirect(rv).Interface() | ||||||
|  | 	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) | ||||||
|  | } | ||||||
|  | func extensionToGoStringTimestamp(m github_com_gogo_protobuf_proto.Message) string { | ||||||
|  | 	e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) | ||||||
|  | 	if e == nil { | ||||||
|  | 		return "nil" | ||||||
|  | 	} | ||||||
|  | 	s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" | ||||||
|  | 	keys := make([]int, 0, len(e)) | ||||||
|  | 	for k := range e { | ||||||
|  | 		keys = append(keys, int(k)) | ||||||
|  | 	} | ||||||
|  | 	sort.Ints(keys) | ||||||
|  | 	ss := []string{} | ||||||
|  | 	for _, k := range keys { | ||||||
|  | 		ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) | ||||||
|  | 	} | ||||||
|  | 	s += strings.Join(ss, ",") + "})" | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  | func (m *Timestamp) Marshal() (dAtA []byte, err error) { | ||||||
|  | 	size := m.Size() | ||||||
|  | 	dAtA = make([]byte, size) | ||||||
|  | 	n, err := m.MarshalTo(dAtA) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return dAtA[:n], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m *Timestamp) MarshalTo(dAtA []byte) (int, error) { | ||||||
|  | 	var i int | ||||||
|  | 	_ = i | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if m.Seconds != 0 { | ||||||
|  | 		dAtA[i] = 0x8 | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintTimestamp(dAtA, i, uint64(m.Seconds)) | ||||||
|  | 	} | ||||||
|  | 	if m.Nanos != 0 { | ||||||
|  | 		dAtA[i] = 0x10 | ||||||
|  | 		i++ | ||||||
|  | 		i = encodeVarintTimestamp(dAtA, i, uint64(m.Nanos)) | ||||||
|  | 	} | ||||||
|  | 	return i, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeFixed64Timestamp(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	dAtA[offset+4] = uint8(v >> 32) | ||||||
|  | 	dAtA[offset+5] = uint8(v >> 40) | ||||||
|  | 	dAtA[offset+6] = uint8(v >> 48) | ||||||
|  | 	dAtA[offset+7] = uint8(v >> 56) | ||||||
|  | 	return offset + 8 | ||||||
|  | } | ||||||
|  | func encodeFixed32Timestamp(dAtA []byte, offset int, v uint32) int { | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	dAtA[offset+1] = uint8(v >> 8) | ||||||
|  | 	dAtA[offset+2] = uint8(v >> 16) | ||||||
|  | 	dAtA[offset+3] = uint8(v >> 24) | ||||||
|  | 	return offset + 4 | ||||||
|  | } | ||||||
|  | func encodeVarintTimestamp(dAtA []byte, offset int, v uint64) int { | ||||||
|  | 	for v >= 1<<7 { | ||||||
|  | 		dAtA[offset] = uint8(v&0x7f | 0x80) | ||||||
|  | 		v >>= 7 | ||||||
|  | 		offset++ | ||||||
|  | 	} | ||||||
|  | 	dAtA[offset] = uint8(v) | ||||||
|  | 	return offset + 1 | ||||||
|  | } | ||||||
|  | func (m *Timestamp) Size() (n int) { | ||||||
|  | 	var l int | ||||||
|  | 	_ = l | ||||||
|  | 	if m.Seconds != 0 { | ||||||
|  | 		n += 1 + sovTimestamp(uint64(m.Seconds)) | ||||||
|  | 	} | ||||||
|  | 	if m.Nanos != 0 { | ||||||
|  | 		n += 1 + sovTimestamp(uint64(m.Nanos)) | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func sovTimestamp(x uint64) (n int) { | ||||||
|  | 	for { | ||||||
|  | 		n++ | ||||||
|  | 		x >>= 7 | ||||||
|  | 		if x == 0 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return n | ||||||
|  | } | ||||||
|  | func sozTimestamp(x uint64) (n int) { | ||||||
|  | 	return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63)))) | ||||||
|  | } | ||||||
|  | func (m *Timestamp) Unmarshal(dAtA []byte) error { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		preIndex := iNdEx | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return ErrIntOverflowTimestamp | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		fieldNum := int32(wire >> 3) | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		if wireType == 4 { | ||||||
|  | 			return fmt.Errorf("proto: Timestamp: wiretype end group for non-group") | ||||||
|  | 		} | ||||||
|  | 		if fieldNum <= 0 { | ||||||
|  | 			return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire) | ||||||
|  | 		} | ||||||
|  | 		switch fieldNum { | ||||||
|  | 		case 1: | ||||||
|  | 			if wireType != 0 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) | ||||||
|  | 			} | ||||||
|  | 			m.Seconds = 0 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowTimestamp | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				m.Seconds |= (int64(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		case 2: | ||||||
|  | 			if wireType != 0 { | ||||||
|  | 				return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) | ||||||
|  | 			} | ||||||
|  | 			m.Nanos = 0 | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return ErrIntOverflowTimestamp | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				m.Nanos |= (int32(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			iNdEx = preIndex | ||||||
|  | 			skippy, err := skipTimestamp(dAtA[iNdEx:]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			if skippy < 0 { | ||||||
|  | 				return ErrInvalidLengthTimestamp | ||||||
|  | 			} | ||||||
|  | 			if (iNdEx + skippy) > l { | ||||||
|  | 				return io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			iNdEx += skippy | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if iNdEx > l { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | func skipTimestamp(dAtA []byte) (n int, err error) { | ||||||
|  | 	l := len(dAtA) | ||||||
|  | 	iNdEx := 0 | ||||||
|  | 	for iNdEx < l { | ||||||
|  | 		var wire uint64 | ||||||
|  | 		for shift := uint(0); ; shift += 7 { | ||||||
|  | 			if shift >= 64 { | ||||||
|  | 				return 0, ErrIntOverflowTimestamp | ||||||
|  | 			} | ||||||
|  | 			if iNdEx >= l { | ||||||
|  | 				return 0, io.ErrUnexpectedEOF | ||||||
|  | 			} | ||||||
|  | 			b := dAtA[iNdEx] | ||||||
|  | 			iNdEx++ | ||||||
|  | 			wire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 			if b < 0x80 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wireType := int(wire & 0x7) | ||||||
|  | 		switch wireType { | ||||||
|  | 		case 0: | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowTimestamp | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				iNdEx++ | ||||||
|  | 				if dAtA[iNdEx-1] < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 1: | ||||||
|  | 			iNdEx += 8 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 2: | ||||||
|  | 			var length int | ||||||
|  | 			for shift := uint(0); ; shift += 7 { | ||||||
|  | 				if shift >= 64 { | ||||||
|  | 					return 0, ErrIntOverflowTimestamp | ||||||
|  | 				} | ||||||
|  | 				if iNdEx >= l { | ||||||
|  | 					return 0, io.ErrUnexpectedEOF | ||||||
|  | 				} | ||||||
|  | 				b := dAtA[iNdEx] | ||||||
|  | 				iNdEx++ | ||||||
|  | 				length |= (int(b) & 0x7F) << shift | ||||||
|  | 				if b < 0x80 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			iNdEx += length | ||||||
|  | 			if length < 0 { | ||||||
|  | 				return 0, ErrInvalidLengthTimestamp | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 3: | ||||||
|  | 			for { | ||||||
|  | 				var innerWire uint64 | ||||||
|  | 				var start int = iNdEx | ||||||
|  | 				for shift := uint(0); ; shift += 7 { | ||||||
|  | 					if shift >= 64 { | ||||||
|  | 						return 0, ErrIntOverflowTimestamp | ||||||
|  | 					} | ||||||
|  | 					if iNdEx >= l { | ||||||
|  | 						return 0, io.ErrUnexpectedEOF | ||||||
|  | 					} | ||||||
|  | 					b := dAtA[iNdEx] | ||||||
|  | 					iNdEx++ | ||||||
|  | 					innerWire |= (uint64(b) & 0x7F) << shift | ||||||
|  | 					if b < 0x80 { | ||||||
|  | 						break | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				innerWireType := int(innerWire & 0x7) | ||||||
|  | 				if innerWireType == 4 { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				next, err := skipTimestamp(dAtA[start:]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					return 0, err | ||||||
|  | 				} | ||||||
|  | 				iNdEx = start + next | ||||||
|  | 			} | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 4: | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		case 5: | ||||||
|  | 			iNdEx += 4 | ||||||
|  | 			return iNdEx, nil | ||||||
|  | 		default: | ||||||
|  | 			return 0, fmt.Errorf("proto: illegal wireType %d", wireType) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	panic("unreachable") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrInvalidLengthTimestamp = fmt.Errorf("proto: negative length found during unmarshaling") | ||||||
|  | 	ErrIntOverflowTimestamp   = fmt.Errorf("proto: integer overflow") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { proto.RegisterFile("timestamp.proto", fileDescriptorTimestamp) } | ||||||
|  | 
 | ||||||
|  | var fileDescriptorTimestamp = []byte{ | ||||||
|  | 	// 208 bytes of a gzipped FileDescriptorProto | ||||||
|  | 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x2f, 0xc9, 0xcc, 0x4d, | ||||||
|  | 	0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, | ||||||
|  | 	0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 0x94, 0xac, 0xb9, 0x38, 0x43, 0x60, 0x6a, 0x84, | ||||||
|  | 	0x24, 0xb8, 0xd8, 0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, | ||||||
|  | 	0x83, 0x60, 0x5c, 0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0x05, 0x46, | ||||||
|  | 	0x0d, 0xd6, 0x20, 0x08, 0xc7, 0xa9, 0x99, 0xf1, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18, | ||||||
|  | 	0x3e, 0x3c, 0x94, 0x63, 0x5c, 0xf1, 0x48, 0x8e, 0xf1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, | ||||||
|  | 	0x18, 0x1f, 0x3c, 0x92, 0x63, 0x7c, 0xf1, 0x48, 0x8e, 0xe1, 0xc3, 0x23, 0x39, 0xc6, 0x15, 0x8f, | ||||||
|  | 	0xe5, 0x18, 0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0x2c, 0x77, 0xe2, 0x83, 0x5b, 0x1d, 0x00, | ||||||
|  | 	0x12, 0x0a, 0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0x5e, 0xc0, 0xc8, 0xf8, 0x83, 0x91, | ||||||
|  | 	0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xb6, 0x00, 0xa8, 0x36, | ||||||
|  | 	0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2, 0xbc, 0x10, 0x90, 0xe2, 0x24, 0x36, 0xb0, | ||||||
|  | 	0x79, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x4d, 0xbd, 0x9c, 0xed, 0x00, 0x00, 0x00, | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | // Protocol Buffers for Go with Gadgets | ||||||
|  | // | ||||||
|  | // Copyright (c) 2016, The GoGo Authors. All rights reserved. | ||||||
|  | // http://github.com/gogo/protobuf | ||||||
|  | // | ||||||
|  | // Redistribution and use in source and binary forms, with or without | ||||||
|  | // modification, are permitted provided that the following conditions are | ||||||
|  | // met: | ||||||
|  | // | ||||||
|  | //     * Redistributions of source code must retain the above copyright | ||||||
|  | // notice, this list of conditions and the following disclaimer. | ||||||
|  | //     * Redistributions in binary form must reproduce the above | ||||||
|  | // copyright notice, this list of conditions and the following disclaimer | ||||||
|  | // in the documentation and/or other materials provided with the | ||||||
|  | // distribution. | ||||||
|  | // | ||||||
|  | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | 
 | ||||||
|  | package types | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func NewPopulatedTimestamp(r interface { | ||||||
|  | 	Int63() int64 | ||||||
|  | }, easy bool) *Timestamp { | ||||||
|  | 	this := &Timestamp{} | ||||||
|  | 	ns := int64(r.Int63()) | ||||||
|  | 	this.Seconds = ns / 1e9 | ||||||
|  | 	this.Nanos = int32(ns % 1e9) | ||||||
|  | 	return this | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (ts *Timestamp) String() string { | ||||||
|  | 	return TimestampString(ts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewPopulatedStdTime(r interface { | ||||||
|  | 	Int63() int64 | ||||||
|  | }, easy bool) *time.Time { | ||||||
|  | 	timestamp := NewPopulatedTimestamp(r, easy) | ||||||
|  | 	t, err := TimestampFromProto(timestamp) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return &t | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func SizeOfStdTime(t time.Time) int { | ||||||
|  | 	ts, err := TimestampProto(t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return ts.Size() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdTimeMarshal(t time.Time) ([]byte, error) { | ||||||
|  | 	size := SizeOfStdTime(t) | ||||||
|  | 	buf := make([]byte, size) | ||||||
|  | 	_, err := StdTimeMarshalTo(t, buf) | ||||||
|  | 	return buf, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdTimeMarshalTo(t time.Time, data []byte) (int, error) { | ||||||
|  | 	ts, err := TimestampProto(t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	return ts.MarshalTo(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func StdTimeUnmarshal(t *time.Time, data []byte) error { | ||||||
|  | 	ts := &Timestamp{} | ||||||
|  | 	if err := ts.Unmarshal(data); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	tt, err := TimestampFromProto(ts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	*t = tt | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										2280
									
								
								vendor/github.com/gogo/protobuf/types/wrappers.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2280
									
								
								vendor/github.com/gogo/protobuf/types/wrappers.pb.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										20
									
								
								vendor/github.com/nats-io/gnatsd/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/nats-io/gnatsd/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,20 +0,0 @@ | ||||||
| The MIT License (MIT) |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2012-2016 Apcera Inc. |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of |  | ||||||
| this software and associated documentation files (the "Software"), to deal in |  | ||||||
| the Software without restriction, including without limitation the rights to |  | ||||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |  | ||||||
| the Software, and to permit persons to whom the Software is furnished to do so, |  | ||||||
| subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in all |  | ||||||
| copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |  | ||||||
| FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |  | ||||||
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |  | ||||||
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |  | ||||||
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |  | ||||||
							
								
								
									
										45
									
								
								vendor/github.com/nats-io/gnatsd/auth/multiuser.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/nats-io/gnatsd/auth/multiuser.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,45 +0,0 @@ | ||||||
| // Copyright 2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package auth |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"github.com/nats-io/gnatsd/server" |  | ||||||
| 	"golang.org/x/crypto/bcrypt" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Plain authentication is a basic username and password |  | ||||||
| type MultiUser struct { |  | ||||||
| 	users map[string]*server.User |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Create a new multi-user |  | ||||||
| func NewMultiUser(users []*server.User) *MultiUser { |  | ||||||
| 	m := &MultiUser{users: make(map[string]*server.User)} |  | ||||||
| 	for _, u := range users { |  | ||||||
| 		m.users[u.Username] = u |  | ||||||
| 	} |  | ||||||
| 	return m |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Check authenticates the client using a username and password against a list of multiple users. |  | ||||||
| func (m *MultiUser) Check(c server.ClientAuth) bool { |  | ||||||
| 	opts := c.GetOpts() |  | ||||||
| 	user, ok := m.users[opts.Username] |  | ||||||
| 	if !ok { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 	pass := user.Password |  | ||||||
| 
 |  | ||||||
| 	// Check to see if the password is a bcrypt hash |  | ||||||
| 	if isBcrypt(pass) { |  | ||||||
| 		if err := bcrypt.CompareHashAndPassword([]byte(pass), []byte(opts.Password)); err != nil { |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 	} else if pass != opts.Password { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	c.RegisterUser(user) |  | ||||||
| 
 |  | ||||||
| 	return true |  | ||||||
| } |  | ||||||
							
								
								
									
										40
									
								
								vendor/github.com/nats-io/gnatsd/auth/plain.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/nats-io/gnatsd/auth/plain.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,40 +0,0 @@ | ||||||
| // Copyright 2014-2015 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package auth |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"strings" |  | ||||||
| 
 |  | ||||||
| 	"github.com/nats-io/gnatsd/server" |  | ||||||
| 	"golang.org/x/crypto/bcrypt" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const bcryptPrefix = "$2a$" |  | ||||||
| 
 |  | ||||||
| func isBcrypt(password string) bool { |  | ||||||
| 	return strings.HasPrefix(password, bcryptPrefix) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Plain authentication is a basic username and password |  | ||||||
| type Plain struct { |  | ||||||
| 	Username string |  | ||||||
| 	Password string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Check authenticates the client using a username and password |  | ||||||
| func (p *Plain) Check(c server.ClientAuth) bool { |  | ||||||
| 	opts := c.GetOpts() |  | ||||||
| 	if p.Username != opts.Username { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 	// Check to see if the password is a bcrypt hash |  | ||||||
| 	if isBcrypt(p.Password) { |  | ||||||
| 		if err := bcrypt.CompareHashAndPassword([]byte(p.Password), []byte(opts.Password)); err != nil { |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 	} else if p.Password != opts.Password { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return true |  | ||||||
| } |  | ||||||
							
								
								
									
										26
									
								
								vendor/github.com/nats-io/gnatsd/auth/token.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/nats-io/gnatsd/auth/token.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,26 +0,0 @@ | ||||||
| package auth |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"github.com/nats-io/gnatsd/server" |  | ||||||
| 	"golang.org/x/crypto/bcrypt" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Token holds a string token used for authentication |  | ||||||
| type Token struct { |  | ||||||
| 	Token string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Check authenticates a client from a token |  | ||||||
| func (p *Token) Check(c server.ClientAuth) bool { |  | ||||||
| 	opts := c.GetOpts() |  | ||||||
| 	// Check to see if the token is a bcrypt hash |  | ||||||
| 	if isBcrypt(p.Token) { |  | ||||||
| 		if err := bcrypt.CompareHashAndPassword([]byte(p.Token), []byte(opts.Authorization)); err != nil { |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 	} else if p.Token != opts.Authorization { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return true |  | ||||||
| } |  | ||||||
							
								
								
									
										1087
									
								
								vendor/github.com/nats-io/gnatsd/conf/lex.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1087
									
								
								vendor/github.com/nats-io/gnatsd/conf/lex.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										284
									
								
								vendor/github.com/nats-io/gnatsd/conf/parse.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										284
									
								
								vendor/github.com/nats-io/gnatsd/conf/parse.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,284 +0,0 @@ | ||||||
| // Copyright 2013-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| // Package conf supports a configuration file format used by gnatsd. It is |  | ||||||
| // a flexible format that combines the best of traditional |  | ||||||
| // configuration formats and newer styles such as JSON and YAML. |  | ||||||
| package conf |  | ||||||
| 
 |  | ||||||
| // The format supported is less restrictive than today's formats. |  | ||||||
| // Supports mixed Arrays [], nested Maps {}, multiple comment types (# and //) |  | ||||||
| // Also supports key value assigments using '=' or ':' or whiteSpace() |  | ||||||
| //   e.g. foo = 2, foo : 2, foo 2 |  | ||||||
| // maps can be assigned with no key separator as well |  | ||||||
| // semicolons as value terminators in key/value assignments are optional |  | ||||||
| // |  | ||||||
| // see parse_test.go for more examples. |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| 	"time" |  | ||||||
| 	"unicode" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type parser struct { |  | ||||||
| 	mapping map[string]interface{} |  | ||||||
| 	lx      *lexer |  | ||||||
| 
 |  | ||||||
| 	// The current scoped context, can be array or map |  | ||||||
| 	ctx interface{} |  | ||||||
| 
 |  | ||||||
| 	// stack of contexts, either map or array/slice stack |  | ||||||
| 	ctxs []interface{} |  | ||||||
| 
 |  | ||||||
| 	// Keys stack |  | ||||||
| 	keys []string |  | ||||||
| 
 |  | ||||||
| 	// The config file path, empty by default. |  | ||||||
| 	fp string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Parse will return a map of keys to interface{}, although concrete types |  | ||||||
| // underly them. The values supported are string, bool, int64, float64, DateTime. |  | ||||||
| // Arrays and nested Maps are also supported. |  | ||||||
| func Parse(data string) (map[string]interface{}, error) { |  | ||||||
| 	p, err := parse(data, "") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return p.mapping, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ParseFile is a helper to open file, etc. and parse the contents. |  | ||||||
| func ParseFile(fp string) (map[string]interface{}, error) { |  | ||||||
| 	data, err := ioutil.ReadFile(fp) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, fmt.Errorf("error opening config file: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	p, err := parse(string(data), filepath.Dir(fp)) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	return p.mapping, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func parse(data, fp string) (p *parser, err error) { |  | ||||||
| 	p = &parser{ |  | ||||||
| 		mapping: make(map[string]interface{}), |  | ||||||
| 		lx:      lex(data), |  | ||||||
| 		ctxs:    make([]interface{}, 0, 4), |  | ||||||
| 		keys:    make([]string, 0, 4), |  | ||||||
| 		fp:      fp, |  | ||||||
| 	} |  | ||||||
| 	p.pushContext(p.mapping) |  | ||||||
| 
 |  | ||||||
| 	for { |  | ||||||
| 		it := p.next() |  | ||||||
| 		if it.typ == itemEOF { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		if err := p.processItem(it); err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return p, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) next() item { |  | ||||||
| 	return p.lx.nextItem() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) pushContext(ctx interface{}) { |  | ||||||
| 	p.ctxs = append(p.ctxs, ctx) |  | ||||||
| 	p.ctx = ctx |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) popContext() interface{} { |  | ||||||
| 	if len(p.ctxs) == 0 { |  | ||||||
| 		panic("BUG in parser, context stack empty") |  | ||||||
| 	} |  | ||||||
| 	li := len(p.ctxs) - 1 |  | ||||||
| 	last := p.ctxs[li] |  | ||||||
| 	p.ctxs = p.ctxs[0:li] |  | ||||||
| 	p.ctx = p.ctxs[len(p.ctxs)-1] |  | ||||||
| 	return last |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) pushKey(key string) { |  | ||||||
| 	p.keys = append(p.keys, key) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) popKey() string { |  | ||||||
| 	if len(p.keys) == 0 { |  | ||||||
| 		panic("BUG in parser, keys stack empty") |  | ||||||
| 	} |  | ||||||
| 	li := len(p.keys) - 1 |  | ||||||
| 	last := p.keys[li] |  | ||||||
| 	p.keys = p.keys[0:li] |  | ||||||
| 	return last |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) processItem(it item) error { |  | ||||||
| 	switch it.typ { |  | ||||||
| 	case itemError: |  | ||||||
| 		return fmt.Errorf("Parse error on line %d: '%s'", it.line, it.val) |  | ||||||
| 	case itemKey: |  | ||||||
| 		p.pushKey(it.val) |  | ||||||
| 	case itemMapStart: |  | ||||||
| 		newCtx := make(map[string]interface{}) |  | ||||||
| 		p.pushContext(newCtx) |  | ||||||
| 	case itemMapEnd: |  | ||||||
| 		p.setValue(p.popContext()) |  | ||||||
| 	case itemString: |  | ||||||
| 		p.setValue(it.val) // FIXME(dlc) sanitize string? |  | ||||||
| 	case itemInteger: |  | ||||||
| 		lastDigit := 0 |  | ||||||
| 		for _, r := range it.val { |  | ||||||
| 			if !unicode.IsDigit(r) { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 			lastDigit++ |  | ||||||
| 		} |  | ||||||
| 		numStr := it.val[:lastDigit] |  | ||||||
| 		num, err := strconv.ParseInt(numStr, 10, 64) |  | ||||||
| 		if err != nil { |  | ||||||
| 			if e, ok := err.(*strconv.NumError); ok && |  | ||||||
| 				e.Err == strconv.ErrRange { |  | ||||||
| 				return fmt.Errorf("Integer '%s' is out of the range.", it.val) |  | ||||||
| 			} |  | ||||||
| 			return fmt.Errorf("Expected integer, but got '%s'.", it.val) |  | ||||||
| 		} |  | ||||||
| 		// Process a suffix |  | ||||||
| 		suffix := strings.ToLower(strings.TrimSpace(it.val[lastDigit:])) |  | ||||||
| 		switch suffix { |  | ||||||
| 		case "": |  | ||||||
| 			p.setValue(num) |  | ||||||
| 		case "k": |  | ||||||
| 			p.setValue(num * 1000) |  | ||||||
| 		case "kb": |  | ||||||
| 			p.setValue(num * 1024) |  | ||||||
| 		case "m": |  | ||||||
| 			p.setValue(num * 1000 * 1000) |  | ||||||
| 		case "mb": |  | ||||||
| 			p.setValue(num * 1024 * 1024) |  | ||||||
| 		case "g": |  | ||||||
| 			p.setValue(num * 1000 * 1000 * 1000) |  | ||||||
| 		case "gb": |  | ||||||
| 			p.setValue(num * 1024 * 1024 * 1024) |  | ||||||
| 		} |  | ||||||
| 	case itemFloat: |  | ||||||
| 		num, err := strconv.ParseFloat(it.val, 64) |  | ||||||
| 		if err != nil { |  | ||||||
| 			if e, ok := err.(*strconv.NumError); ok && |  | ||||||
| 				e.Err == strconv.ErrRange { |  | ||||||
| 				return fmt.Errorf("Float '%s' is out of the range.", it.val) |  | ||||||
| 			} |  | ||||||
| 			return fmt.Errorf("Expected float, but got '%s'.", it.val) |  | ||||||
| 		} |  | ||||||
| 		p.setValue(num) |  | ||||||
| 	case itemBool: |  | ||||||
| 		switch strings.ToLower(it.val) { |  | ||||||
| 		case "true", "yes", "on": |  | ||||||
| 			p.setValue(true) |  | ||||||
| 		case "false", "no", "off": |  | ||||||
| 			p.setValue(false) |  | ||||||
| 		default: |  | ||||||
| 			return fmt.Errorf("Expected boolean value, but got '%s'.", it.val) |  | ||||||
| 		} |  | ||||||
| 	case itemDatetime: |  | ||||||
| 		dt, err := time.Parse("2006-01-02T15:04:05Z", it.val) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf( |  | ||||||
| 				"Expected Zulu formatted DateTime, but got '%s'.", it.val) |  | ||||||
| 		} |  | ||||||
| 		p.setValue(dt) |  | ||||||
| 	case itemArrayStart: |  | ||||||
| 		var array = make([]interface{}, 0) |  | ||||||
| 		p.pushContext(array) |  | ||||||
| 	case itemArrayEnd: |  | ||||||
| 		array := p.ctx |  | ||||||
| 		p.popContext() |  | ||||||
| 		p.setValue(array) |  | ||||||
| 	case itemVariable: |  | ||||||
| 		if value, ok := p.lookupVariable(it.val); ok { |  | ||||||
| 			p.setValue(value) |  | ||||||
| 		} else { |  | ||||||
| 			return fmt.Errorf("Variable reference for '%s' on line %d can not be found.", |  | ||||||
| 				it.val, it.line) |  | ||||||
| 		} |  | ||||||
| 	case itemInclude: |  | ||||||
| 		m, err := ParseFile(filepath.Join(p.fp, it.val)) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return fmt.Errorf("Error parsing include file '%s', %v.", it.val, err) |  | ||||||
| 		} |  | ||||||
| 		for k, v := range m { |  | ||||||
| 			p.pushKey(k) |  | ||||||
| 			p.setValue(v) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Used to map an environment value into a temporary map to pass to secondary Parse call. |  | ||||||
| const pkey = "pk" |  | ||||||
| 
 |  | ||||||
| // We special case raw strings here that are bcrypt'd. This allows us not to force quoting the strings |  | ||||||
| const bcryptPrefix = "2a$" |  | ||||||
| 
 |  | ||||||
| // lookupVariable will lookup a variable reference. It will use block scoping on keys |  | ||||||
| // it has seen before, with the top level scoping being the environment variables. We |  | ||||||
| // ignore array contexts and only process the map contexts.. |  | ||||||
| // |  | ||||||
| // Returns true for ok if it finds something, similar to map. |  | ||||||
| func (p *parser) lookupVariable(varReference string) (interface{}, bool) { |  | ||||||
| 	// Do special check to see if it is a raw bcrypt string. |  | ||||||
| 	if strings.HasPrefix(varReference, bcryptPrefix) { |  | ||||||
| 		return "$" + varReference, true |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Loop through contexts currently on the stack. |  | ||||||
| 	for i := len(p.ctxs) - 1; i >= 0; i -= 1 { |  | ||||||
| 		ctx := p.ctxs[i] |  | ||||||
| 		// Process if it is a map context |  | ||||||
| 		if m, ok := ctx.(map[string]interface{}); ok { |  | ||||||
| 			if v, ok := m[varReference]; ok { |  | ||||||
| 				return v, ok |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// If we are here, we have exhausted our context maps and still not found anything. |  | ||||||
| 	// Parse from the environment. |  | ||||||
| 	if vStr, ok := os.LookupEnv(varReference); ok { |  | ||||||
| 		// Everything we get here will be a string value, so we need to process as a parser would. |  | ||||||
| 		if vmap, err := Parse(fmt.Sprintf("%s=%s", pkey, vStr)); err == nil { |  | ||||||
| 			v, ok := vmap[pkey] |  | ||||||
| 			return v, ok |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil, false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (p *parser) setValue(val interface{}) { |  | ||||||
| 	// Test to see if we are on an array or a map |  | ||||||
| 
 |  | ||||||
| 	// Array processing |  | ||||||
| 	if ctx, ok := p.ctx.([]interface{}); ok { |  | ||||||
| 		p.ctx = append(ctx, val) |  | ||||||
| 		p.ctxs[len(p.ctxs)-1] = p.ctx |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Map processing |  | ||||||
| 	if ctx, ok := p.ctx.(map[string]interface{}); ok { |  | ||||||
| 		key := p.popKey() |  | ||||||
| 		// FIXME(dlc), make sure to error if redefining same key? |  | ||||||
| 		ctx[key] = val |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										128
									
								
								vendor/github.com/nats-io/gnatsd/logger/log.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										128
									
								
								vendor/github.com/nats-io/gnatsd/logger/log.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,128 +0,0 @@ | ||||||
| // Copyright 2012-2015 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| //Package logger provides logging facilities for the NATS server |  | ||||||
| package logger |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"log" |  | ||||||
| 	"os" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Logger is the server logger |  | ||||||
| type Logger struct { |  | ||||||
| 	logger     *log.Logger |  | ||||||
| 	debug      bool |  | ||||||
| 	trace      bool |  | ||||||
| 	infoLabel  string |  | ||||||
| 	errorLabel string |  | ||||||
| 	fatalLabel string |  | ||||||
| 	debugLabel string |  | ||||||
| 	traceLabel string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewStdLogger creates a logger with output directed to Stderr |  | ||||||
| func NewStdLogger(time, debug, trace, colors, pid bool) *Logger { |  | ||||||
| 	flags := 0 |  | ||||||
| 	if time { |  | ||||||
| 		flags = log.LstdFlags | log.Lmicroseconds |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	pre := "" |  | ||||||
| 	if pid { |  | ||||||
| 		pre = pidPrefix() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	l := &Logger{ |  | ||||||
| 		logger: log.New(os.Stderr, pre, flags), |  | ||||||
| 		debug:  debug, |  | ||||||
| 		trace:  trace, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if colors { |  | ||||||
| 		setColoredLabelFormats(l) |  | ||||||
| 	} else { |  | ||||||
| 		setPlainLabelFormats(l) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return l |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewFileLogger creates a logger with output directed to a file |  | ||||||
| func NewFileLogger(filename string, time, debug, trace, pid bool) *Logger { |  | ||||||
| 	fileflags := os.O_WRONLY | os.O_APPEND | os.O_CREATE |  | ||||||
| 	f, err := os.OpenFile(filename, fileflags, 0660) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatalf("error opening file: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	flags := 0 |  | ||||||
| 	if time { |  | ||||||
| 		flags = log.LstdFlags | log.Lmicroseconds |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	pre := "" |  | ||||||
| 	if pid { |  | ||||||
| 		pre = pidPrefix() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	l := &Logger{ |  | ||||||
| 		logger: log.New(f, pre, flags), |  | ||||||
| 		debug:  debug, |  | ||||||
| 		trace:  trace, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	setPlainLabelFormats(l) |  | ||||||
| 	return l |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Generate the pid prefix string |  | ||||||
| func pidPrefix() string { |  | ||||||
| 	return fmt.Sprintf("[%d] ", os.Getpid()) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func setPlainLabelFormats(l *Logger) { |  | ||||||
| 	l.infoLabel = "[INF] " |  | ||||||
| 	l.debugLabel = "[DBG] " |  | ||||||
| 	l.errorLabel = "[ERR] " |  | ||||||
| 	l.fatalLabel = "[FTL] " |  | ||||||
| 	l.traceLabel = "[TRC] " |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func setColoredLabelFormats(l *Logger) { |  | ||||||
| 	colorFormat := "[\x1b[%dm%s\x1b[0m] " |  | ||||||
| 	l.infoLabel = fmt.Sprintf(colorFormat, 32, "INF") |  | ||||||
| 	l.debugLabel = fmt.Sprintf(colorFormat, 36, "DBG") |  | ||||||
| 	l.errorLabel = fmt.Sprintf(colorFormat, 31, "ERR") |  | ||||||
| 	l.fatalLabel = fmt.Sprintf(colorFormat, 31, "FTL") |  | ||||||
| 	l.traceLabel = fmt.Sprintf(colorFormat, 33, "TRC") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Noticef logs a notice statement |  | ||||||
| func (l *Logger) Noticef(format string, v ...interface{}) { |  | ||||||
| 	l.logger.Printf(l.infoLabel+format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Errorf logs an error statement |  | ||||||
| func (l *Logger) Errorf(format string, v ...interface{}) { |  | ||||||
| 	l.logger.Printf(l.errorLabel+format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Fatalf logs a fatal error |  | ||||||
| func (l *Logger) Fatalf(format string, v ...interface{}) { |  | ||||||
| 	l.logger.Fatalf(l.fatalLabel+format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Debugf logs a debug statement |  | ||||||
| func (l *Logger) Debugf(format string, v ...interface{}) { |  | ||||||
| 	if l.debug { |  | ||||||
| 		l.logger.Printf(l.debugLabel+format, v...) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Tracef logs a trace statement |  | ||||||
| func (l *Logger) Tracef(format string, v ...interface{}) { |  | ||||||
| 	if l.trace { |  | ||||||
| 		l.logger.Printf(l.traceLabel+format, v...) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										112
									
								
								vendor/github.com/nats-io/gnatsd/logger/syslog.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/nats-io/gnatsd/logger/syslog.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,112 +0,0 @@ | ||||||
| // Copyright 2012-2014 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| // +build !windows |  | ||||||
| 
 |  | ||||||
| package logger |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"log" |  | ||||||
| 	"log/syslog" |  | ||||||
| 	"net/url" |  | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // SysLogger provides a system logger facility |  | ||||||
| type SysLogger struct { |  | ||||||
| 	writer *syslog.Writer |  | ||||||
| 	debug  bool |  | ||||||
| 	trace  bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetSysLoggerTag generates the tag name for use in syslog statements. If |  | ||||||
| // the executable is linked, the name of the link will be used as the tag, |  | ||||||
| // otherwise, the name of the executable is used.  "gnatsd" is the default |  | ||||||
| // for the NATS server. |  | ||||||
| func GetSysLoggerTag() string { |  | ||||||
| 	procName := os.Args[0] |  | ||||||
| 	if strings.ContainsRune(procName, os.PathSeparator) { |  | ||||||
| 		parts := strings.FieldsFunc(procName, func(c rune) bool { |  | ||||||
| 			return c == os.PathSeparator |  | ||||||
| 		}) |  | ||||||
| 		procName = parts[len(parts)-1] |  | ||||||
| 	} |  | ||||||
| 	return procName |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewSysLogger creates a new system logger |  | ||||||
| func NewSysLogger(debug, trace bool) *SysLogger { |  | ||||||
| 	w, err := syslog.New(syslog.LOG_DAEMON|syslog.LOG_NOTICE, GetSysLoggerTag()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatalf("error connecting to syslog: %q", err.Error()) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &SysLogger{ |  | ||||||
| 		writer: w, |  | ||||||
| 		debug:  debug, |  | ||||||
| 		trace:  trace, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewRemoteSysLogger creates a new remote system logger |  | ||||||
| func NewRemoteSysLogger(fqn string, debug, trace bool) *SysLogger { |  | ||||||
| 	network, addr := getNetworkAndAddr(fqn) |  | ||||||
| 	w, err := syslog.Dial(network, addr, syslog.LOG_DEBUG, GetSysLoggerTag()) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatalf("error connecting to syslog: %q", err.Error()) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &SysLogger{ |  | ||||||
| 		writer: w, |  | ||||||
| 		debug:  debug, |  | ||||||
| 		trace:  trace, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getNetworkAndAddr(fqn string) (network, addr string) { |  | ||||||
| 	u, err := url.Parse(fqn) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	network = u.Scheme |  | ||||||
| 	if network == "udp" || network == "tcp" { |  | ||||||
| 		addr = u.Host |  | ||||||
| 	} else if network == "unix" { |  | ||||||
| 		addr = u.Path |  | ||||||
| 	} else { |  | ||||||
| 		log.Fatalf("error invalid network type: %q", u.Scheme) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Noticef logs a notice statement |  | ||||||
| func (l *SysLogger) Noticef(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Notice(fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Fatalf logs a fatal error |  | ||||||
| func (l *SysLogger) Fatalf(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Crit(fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Errorf logs an error statement |  | ||||||
| func (l *SysLogger) Errorf(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Err(fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Debugf logs a debug statement |  | ||||||
| func (l *SysLogger) Debugf(format string, v ...interface{}) { |  | ||||||
| 	if l.debug { |  | ||||||
| 		l.writer.Debug(fmt.Sprintf(format, v...)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Tracef logs a trace statement |  | ||||||
| func (l *SysLogger) Tracef(format string, v ...interface{}) { |  | ||||||
| 	if l.trace { |  | ||||||
| 		l.writer.Notice(fmt.Sprintf(format, v...)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										52
									
								
								vendor/github.com/nats-io/gnatsd/logger/syslog_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/nats-io/gnatsd/logger/syslog_windows.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,52 +0,0 @@ | ||||||
| // Copyright 2012-2014 Apcera Inc. All rights reserved. |  | ||||||
| package logger |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"log" |  | ||||||
| 	"os" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type SysLogger struct { |  | ||||||
| 	writer *log.Logger |  | ||||||
| 	debug  bool |  | ||||||
| 	trace  bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewSysLogger(debug, trace bool) *SysLogger { |  | ||||||
| 	w := log.New(os.Stdout, "gnatsd", log.LstdFlags) |  | ||||||
| 
 |  | ||||||
| 	return &SysLogger{ |  | ||||||
| 		writer: w, |  | ||||||
| 		debug:  debug, |  | ||||||
| 		trace:  trace, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewRemoteSysLogger(fqn string, debug, trace bool) *SysLogger { |  | ||||||
| 	return NewSysLogger(debug, trace) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (l *SysLogger) Noticef(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Println("NOTICE", fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (l *SysLogger) Fatalf(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Println("CRITICAL", fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (l *SysLogger) Errorf(format string, v ...interface{}) { |  | ||||||
| 	l.writer.Println("ERROR", fmt.Sprintf(format, v...)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (l *SysLogger) Debugf(format string, v ...interface{}) { |  | ||||||
| 	if l.debug { |  | ||||||
| 		l.writer.Println("DEBUG", fmt.Sprintf(format, v...)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (l *SysLogger) Tracef(format string, v ...interface{}) { |  | ||||||
| 	if l.trace { |  | ||||||
| 		l.writer.Println("NOTICE", fmt.Sprintf(format, v...)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										17
									
								
								vendor/github.com/nats-io/gnatsd/server/auth.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/nats-io/gnatsd/server/auth.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,17 +0,0 @@ | ||||||
| // Copyright 2012-2014 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| // Auth is an interface for implementing authentication |  | ||||||
| type Auth interface { |  | ||||||
| 	// Check if a client is authorized to connect |  | ||||||
| 	Check(c ClientAuth) bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ClientAuth is an interface for client authentication |  | ||||||
| type ClientAuth interface { |  | ||||||
| 	// Get options associated with a client |  | ||||||
| 	GetOpts() *clientOpts |  | ||||||
| 	// Optionally map a user after auth. |  | ||||||
| 	RegisterUser(*User) |  | ||||||
| } |  | ||||||
							
								
								
									
										33
									
								
								vendor/github.com/nats-io/gnatsd/server/ciphersuites_1.4.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/nats-io/gnatsd/server/ciphersuites_1.4.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,33 +0,0 @@ | ||||||
| // Copyright 2015 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| // +build go1.4,!go1.5 |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"crypto/tls" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Where we maintain all of the available 1.4 ciphers |  | ||||||
| var cipherMap = map[string]uint16{ |  | ||||||
| 	"TLS_RSA_WITH_RC4_128_SHA":                tls.TLS_RSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_RSA_WITH_3DES_EDE_CBC_SHA":           tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, |  | ||||||
| 	"TLS_RSA_WITH_AES_128_CBC_SHA":            tls.TLS_RSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_RSA_WITH_AES_256_CBC_SHA":            tls.TLS_RSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":        tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_RC4_128_SHA":          tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":     tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func defaultCipherSuites() []uint16 { |  | ||||||
| 	return []uint16{ |  | ||||||
| 		tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 		tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										38
									
								
								vendor/github.com/nats-io/gnatsd/server/ciphersuites_1.5.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/nats-io/gnatsd/server/ciphersuites_1.5.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,38 +0,0 @@ | ||||||
| // Copyright 2015 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| // +build go1.5 |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"crypto/tls" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Where we maintain all of the available 1.5 ciphers |  | ||||||
| var cipherMap = map[string]uint16{ |  | ||||||
| 	"TLS_RSA_WITH_RC4_128_SHA":                tls.TLS_RSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_RSA_WITH_3DES_EDE_CBC_SHA":           tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, |  | ||||||
| 	"TLS_RSA_WITH_AES_128_CBC_SHA":            tls.TLS_RSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_RSA_WITH_AES_256_CBC_SHA":            tls.TLS_RSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":        tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_RC4_128_SHA":          tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":     tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 	"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":   tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, |  | ||||||
| 	"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func defaultCipherSuites() []uint16 { |  | ||||||
| 	return []uint16{ |  | ||||||
| 		// The SHA384 versions are only in Go1.5 |  | ||||||
| 		tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, |  | ||||||
| 		tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 		tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, |  | ||||||
| 		tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										1366
									
								
								vendor/github.com/nats-io/gnatsd/server/client.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1366
									
								
								vendor/github.com/nats-io/gnatsd/server/client.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										82
									
								
								vendor/github.com/nats-io/gnatsd/server/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/github.com/nats-io/gnatsd/server/const.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,82 +0,0 @@ | ||||||
| // Copyright 2012-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"time" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	// VERSION is the current version for the server. |  | ||||||
| 	VERSION = "0.9.6" |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_PORT is the default port for client connections. |  | ||||||
| 	DEFAULT_PORT = 4222 |  | ||||||
| 
 |  | ||||||
| 	// RANDOM_PORT is the value for port that, when supplied, will cause the |  | ||||||
| 	// server to listen on a randomly-chosen available port. The resolved port |  | ||||||
| 	// is available via the Addr() method. |  | ||||||
| 	RANDOM_PORT = -1 |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_HOST defaults to all interfaces. |  | ||||||
| 	DEFAULT_HOST = "0.0.0.0" |  | ||||||
| 
 |  | ||||||
| 	// MAX_CONTROL_LINE_SIZE is the maximum allowed protocol control line size. |  | ||||||
| 	// 1k should be plenty since payloads sans connect string are separate |  | ||||||
| 	MAX_CONTROL_LINE_SIZE = 1024 |  | ||||||
| 
 |  | ||||||
| 	// MAX_PAYLOAD_SIZE is the maximum allowed payload size. Should be using |  | ||||||
| 	// something different if > 1MB payloads are needed. |  | ||||||
| 	MAX_PAYLOAD_SIZE = (1024 * 1024) |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_MAX_CONNECTIONS is the default maximum connections allowed. |  | ||||||
| 	DEFAULT_MAX_CONNECTIONS = (64 * 1024) |  | ||||||
| 
 |  | ||||||
| 	// TLS_TIMEOUT is the TLS wait time. |  | ||||||
| 	TLS_TIMEOUT = 500 * time.Millisecond |  | ||||||
| 
 |  | ||||||
| 	// AUTH_TIMEOUT is the authorization wait time. |  | ||||||
| 	AUTH_TIMEOUT = 2 * TLS_TIMEOUT |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_PING_INTERVAL is how often pings are sent to clients and routes. |  | ||||||
| 	DEFAULT_PING_INTERVAL = 2 * time.Minute |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_PING_MAX_OUT is maximum allowed pings outstanding before disconnect. |  | ||||||
| 	DEFAULT_PING_MAX_OUT = 2 |  | ||||||
| 
 |  | ||||||
| 	// CR_LF string |  | ||||||
| 	CR_LF = "\r\n" |  | ||||||
| 
 |  | ||||||
| 	// LEN_CR_LF hold onto the computed size. |  | ||||||
| 	LEN_CR_LF = len(CR_LF) |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_FLUSH_DEADLINE is the write/flush deadlines. |  | ||||||
| 	DEFAULT_FLUSH_DEADLINE = 2 * time.Second |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_HTTP_PORT is the default monitoring port. |  | ||||||
| 	DEFAULT_HTTP_PORT = 8222 |  | ||||||
| 
 |  | ||||||
| 	// ACCEPT_MIN_SLEEP is the minimum acceptable sleep times on temporary errors. |  | ||||||
| 	ACCEPT_MIN_SLEEP = 10 * time.Millisecond |  | ||||||
| 
 |  | ||||||
| 	// ACCEPT_MAX_SLEEP is the maximum acceptable sleep times on temporary errors |  | ||||||
| 	ACCEPT_MAX_SLEEP = 1 * time.Second |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_ROUTE_CONNECT Route solicitation intervals. |  | ||||||
| 	DEFAULT_ROUTE_CONNECT = 1 * time.Second |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_ROUTE_RECONNECT Route reconnect intervals. |  | ||||||
| 	DEFAULT_ROUTE_RECONNECT = 1 * time.Second |  | ||||||
| 
 |  | ||||||
| 	// DEFAULT_ROUTE_DIAL Route dial timeout. |  | ||||||
| 	DEFAULT_ROUTE_DIAL = 1 * time.Second |  | ||||||
| 
 |  | ||||||
| 	// PROTO_SNIPPET_SIZE is the default size of proto to print on parse errors. |  | ||||||
| 	PROTO_SNIPPET_SIZE = 32 |  | ||||||
| 
 |  | ||||||
| 	// MAX_MSG_ARGS Maximum possible number of arguments from MSG proto. |  | ||||||
| 	MAX_MSG_ARGS = 4 |  | ||||||
| 
 |  | ||||||
| 	// MAX_PUB_ARGS Maximum possible number of arguments from PUB proto. |  | ||||||
| 	MAX_PUB_ARGS = 3 |  | ||||||
| ) |  | ||||||
							
								
								
									
										32
									
								
								vendor/github.com/nats-io/gnatsd/server/errors.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/nats-io/gnatsd/server/errors.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,32 +0,0 @@ | ||||||
| // Copyright 2012-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import "errors" |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// ErrConnectionClosed represents an error condition on a closed connection. |  | ||||||
| 	ErrConnectionClosed = errors.New("Connection Closed") |  | ||||||
| 
 |  | ||||||
| 	// ErrAuthorization represents an error condition on failed authorization. |  | ||||||
| 	ErrAuthorization = errors.New("Authorization Error") |  | ||||||
| 
 |  | ||||||
| 	// ErrAuthTimeout represents an error condition on failed authorization due to timeout. |  | ||||||
| 	ErrAuthTimeout = errors.New("Authorization Timeout") |  | ||||||
| 
 |  | ||||||
| 	// ErrMaxPayload represents an error condition when the payload is too big. |  | ||||||
| 	ErrMaxPayload = errors.New("Maximum Payload Exceeded") |  | ||||||
| 
 |  | ||||||
| 	// ErrMaxControlLine represents an error condition when the control line is too big. |  | ||||||
| 	ErrMaxControlLine = errors.New("Maximum Control Line Exceeded") |  | ||||||
| 
 |  | ||||||
| 	// ErrReservedPublishSubject represents an error condition when sending to a reserved subject, e.g. _SYS.> |  | ||||||
| 	ErrReservedPublishSubject = errors.New("Reserved Internal Subject") |  | ||||||
| 
 |  | ||||||
| 	// ErrBadClientProtocol signals a client requested an invalud client protocol. |  | ||||||
| 	ErrBadClientProtocol = errors.New("Invalid Client Protocol") |  | ||||||
| 
 |  | ||||||
| 	// ErrTooManyConnections signals a client that the maximum number of connections supported by the |  | ||||||
| 	// server has been reached. |  | ||||||
| 	ErrTooManyConnections = errors.New("Maximum Connections Exceeded") |  | ||||||
| ) |  | ||||||
							
								
								
									
										132
									
								
								vendor/github.com/nats-io/gnatsd/server/log.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/nats-io/gnatsd/server/log.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,132 +0,0 @@ | ||||||
| // Copyright 2012-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"sync" |  | ||||||
| 	"sync/atomic" |  | ||||||
| 
 |  | ||||||
| 	"github.com/nats-io/gnatsd/logger" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Package globals for performance checks |  | ||||||
| var trace int32 |  | ||||||
| var debug int32 |  | ||||||
| 
 |  | ||||||
| var log = struct { |  | ||||||
| 	sync.Mutex |  | ||||||
| 	logger Logger |  | ||||||
| }{} |  | ||||||
| 
 |  | ||||||
| // Logger interface of the NATS Server |  | ||||||
| type Logger interface { |  | ||||||
| 
 |  | ||||||
| 	// Log a notice statement |  | ||||||
| 	Noticef(format string, v ...interface{}) |  | ||||||
| 
 |  | ||||||
| 	// Log a fatal error |  | ||||||
| 	Fatalf(format string, v ...interface{}) |  | ||||||
| 
 |  | ||||||
| 	// Log an error |  | ||||||
| 	Errorf(format string, v ...interface{}) |  | ||||||
| 
 |  | ||||||
| 	// Log a debug statement |  | ||||||
| 	Debugf(format string, v ...interface{}) |  | ||||||
| 
 |  | ||||||
| 	// Log a trace statement |  | ||||||
| 	Tracef(format string, v ...interface{}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // SetLogger sets the logger of the server |  | ||||||
| func (s *Server) SetLogger(logger Logger, debugFlag, traceFlag bool) { |  | ||||||
| 	if debugFlag { |  | ||||||
| 		atomic.StoreInt32(&debug, 1) |  | ||||||
| 	} else { |  | ||||||
| 		atomic.StoreInt32(&debug, 0) |  | ||||||
| 	} |  | ||||||
| 	if traceFlag { |  | ||||||
| 		atomic.StoreInt32(&trace, 1) |  | ||||||
| 	} else { |  | ||||||
| 		atomic.StoreInt32(&trace, 0) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	log.Lock() |  | ||||||
| 	log.logger = logger |  | ||||||
| 	log.Unlock() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // If the logger is a file based logger, close and re-open the file. |  | ||||||
| // This allows for file rotation by 'mv'ing the file then signalling |  | ||||||
| // the process to trigger this function. |  | ||||||
| func (s *Server) ReOpenLogFile() { |  | ||||||
| 	// Check to make sure this is a file logger. |  | ||||||
| 	log.Lock() |  | ||||||
| 	ll := log.logger |  | ||||||
| 	log.Unlock() |  | ||||||
| 
 |  | ||||||
| 	if ll == nil { |  | ||||||
| 		Noticef("File log re-open ignored, no logger") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	if s.opts.LogFile == "" { |  | ||||||
| 		Noticef("File log re-open ignored, not a file logger") |  | ||||||
| 	} else { |  | ||||||
| 		fileLog := logger.NewFileLogger(s.opts.LogFile, |  | ||||||
| 			s.opts.Logtime, s.opts.Debug, s.opts.Trace, true) |  | ||||||
| 		s.SetLogger(fileLog, s.opts.Debug, s.opts.Trace) |  | ||||||
| 		Noticef("File log re-opened") |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Noticef logs a notice statement |  | ||||||
| func Noticef(format string, v ...interface{}) { |  | ||||||
| 	executeLogCall(func(logger Logger, format string, v ...interface{}) { |  | ||||||
| 		logger.Noticef(format, v...) |  | ||||||
| 	}, format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Errorf logs an error |  | ||||||
| func Errorf(format string, v ...interface{}) { |  | ||||||
| 	executeLogCall(func(logger Logger, format string, v ...interface{}) { |  | ||||||
| 		logger.Errorf(format, v...) |  | ||||||
| 	}, format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Fatalf logs a fatal error |  | ||||||
| func Fatalf(format string, v ...interface{}) { |  | ||||||
| 	executeLogCall(func(logger Logger, format string, v ...interface{}) { |  | ||||||
| 		logger.Fatalf(format, v...) |  | ||||||
| 	}, format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Debugf logs a debug statement |  | ||||||
| func Debugf(format string, v ...interface{}) { |  | ||||||
| 	if atomic.LoadInt32(&debug) == 0 { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	executeLogCall(func(logger Logger, format string, v ...interface{}) { |  | ||||||
| 		logger.Debugf(format, v...) |  | ||||||
| 	}, format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Tracef logs a trace statement |  | ||||||
| func Tracef(format string, v ...interface{}) { |  | ||||||
| 	if atomic.LoadInt32(&trace) == 0 { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	executeLogCall(func(logger Logger, format string, v ...interface{}) { |  | ||||||
| 		logger.Tracef(format, v...) |  | ||||||
| 	}, format, v...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func executeLogCall(f func(logger Logger, format string, v ...interface{}), format string, args ...interface{}) { |  | ||||||
| 	log.Lock() |  | ||||||
| 	defer log.Unlock() |  | ||||||
| 	if log.logger == nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	f(log.logger, format, args...) |  | ||||||
| } |  | ||||||
							
								
								
									
										526
									
								
								vendor/github.com/nats-io/gnatsd/server/monitor.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										526
									
								
								vendor/github.com/nats-io/gnatsd/server/monitor.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,526 +0,0 @@ | ||||||
| // Copyright 2013-2015 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"crypto/tls" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"fmt" |  | ||||||
| 	"net" |  | ||||||
| 	"net/http" |  | ||||||
| 	"runtime" |  | ||||||
| 	"sort" |  | ||||||
| 	"strconv" |  | ||||||
| 	"sync/atomic" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/nats-io/gnatsd/server/pse" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Snapshot this |  | ||||||
| var numCores int |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	numCores = runtime.NumCPU() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Connz represents detailed information on current client connections. |  | ||||||
| type Connz struct { |  | ||||||
| 	Now      time.Time  `json:"now"` |  | ||||||
| 	NumConns int        `json:"num_connections"` |  | ||||||
| 	Total    int        `json:"total"` |  | ||||||
| 	Offset   int        `json:"offset"` |  | ||||||
| 	Limit    int        `json:"limit"` |  | ||||||
| 	Conns    []ConnInfo `json:"connections"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ConnInfo has detailed information on a per connection basis. |  | ||||||
| type ConnInfo struct { |  | ||||||
| 	Cid            uint64    `json:"cid"` |  | ||||||
| 	IP             string    `json:"ip"` |  | ||||||
| 	Port           int       `json:"port"` |  | ||||||
| 	Start          time.Time `json:"start"` |  | ||||||
| 	LastActivity   time.Time `json:"last_activity"` |  | ||||||
| 	Uptime         string    `json:"uptime"` |  | ||||||
| 	Idle           string    `json:"idle"` |  | ||||||
| 	Pending        int       `json:"pending_bytes"` |  | ||||||
| 	InMsgs         int64     `json:"in_msgs"` |  | ||||||
| 	OutMsgs        int64     `json:"out_msgs"` |  | ||||||
| 	InBytes        int64     `json:"in_bytes"` |  | ||||||
| 	OutBytes       int64     `json:"out_bytes"` |  | ||||||
| 	NumSubs        uint32    `json:"subscriptions"` |  | ||||||
| 	Name           string    `json:"name,omitempty"` |  | ||||||
| 	Lang           string    `json:"lang,omitempty"` |  | ||||||
| 	Version        string    `json:"version,omitempty"` |  | ||||||
| 	TLSVersion     string    `json:"tls_version,omitempty"` |  | ||||||
| 	TLSCipher      string    `json:"tls_cipher_suite,omitempty"` |  | ||||||
| 	AuthorizedUser string    `json:"authorized_user,omitempty"` |  | ||||||
| 	Subs           []string  `json:"subscriptions_list,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DefaultConnListSize is the default size of the connection list. |  | ||||||
| const DefaultConnListSize = 1024 |  | ||||||
| 
 |  | ||||||
| const defaultStackBufSize = 10000 |  | ||||||
| 
 |  | ||||||
| // HandleConnz process HTTP requests for connection information. |  | ||||||
| func (s *Server) HandleConnz(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	sortOpt := SortOpt(r.URL.Query().Get("sort")) |  | ||||||
| 
 |  | ||||||
| 	// If no sort option given or sort is by uptime, then sort by cid |  | ||||||
| 	if sortOpt == "" || sortOpt == byUptime { |  | ||||||
| 		sortOpt = byCid |  | ||||||
| 	} else if !sortOpt.IsValid() { |  | ||||||
| 		w.WriteHeader(http.StatusBadRequest) |  | ||||||
| 		w.Write([]byte(fmt.Sprintf("Invalid sorting option: %s", sortOpt))) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	c := &Connz{} |  | ||||||
| 	c.Now = time.Now() |  | ||||||
| 
 |  | ||||||
| 	auth, _ := strconv.Atoi(r.URL.Query().Get("auth")) |  | ||||||
| 	subs, _ := strconv.Atoi(r.URL.Query().Get("subs")) |  | ||||||
| 	c.Offset, _ = strconv.Atoi(r.URL.Query().Get("offset")) |  | ||||||
| 	c.Limit, _ = strconv.Atoi(r.URL.Query().Get("limit")) |  | ||||||
| 
 |  | ||||||
| 	if c.Limit == 0 { |  | ||||||
| 		c.Limit = DefaultConnListSize |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Walk the list |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	s.httpReqStats[ConnzPath]++ |  | ||||||
| 	tlsRequired := s.info.TLSRequired |  | ||||||
| 
 |  | ||||||
| 	// number total of clients. The resulting ConnInfo array |  | ||||||
| 	// may be smaller if pagination is used. |  | ||||||
| 	totalClients := len(s.clients) |  | ||||||
| 	c.Total = totalClients |  | ||||||
| 
 |  | ||||||
| 	i := 0 |  | ||||||
| 	pairs := make(Pairs, totalClients) |  | ||||||
| 	for _, client := range s.clients { |  | ||||||
| 		client.mu.Lock() |  | ||||||
| 		switch sortOpt { |  | ||||||
| 		case byCid: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: int64(client.cid)} |  | ||||||
| 		case bySubs: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: int64(len(client.subs))} |  | ||||||
| 		case byPending: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: int64(client.bw.Buffered())} |  | ||||||
| 		case byOutMsgs: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: client.outMsgs} |  | ||||||
| 		case byInMsgs: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: atomic.LoadInt64(&client.inMsgs)} |  | ||||||
| 		case byOutBytes: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: client.outBytes} |  | ||||||
| 		case byInBytes: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: atomic.LoadInt64(&client.inBytes)} |  | ||||||
| 		case byLast: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: client.last.UnixNano()} |  | ||||||
| 		case byIdle: |  | ||||||
| 			pairs[i] = Pair{Key: client, Val: c.Now.Sub(client.last).Nanoseconds()} |  | ||||||
| 		} |  | ||||||
| 		client.mu.Unlock() |  | ||||||
| 		i++ |  | ||||||
| 	} |  | ||||||
| 	s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	if totalClients > 0 { |  | ||||||
| 		if sortOpt == byCid { |  | ||||||
| 			// Return in ascending order |  | ||||||
| 			sort.Sort(pairs) |  | ||||||
| 		} else { |  | ||||||
| 			// Return in descending order |  | ||||||
| 			sort.Sort(sort.Reverse(pairs)) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	minoff := c.Offset |  | ||||||
| 	maxoff := c.Offset + c.Limit |  | ||||||
| 
 |  | ||||||
| 	// Make sure these are sane. |  | ||||||
| 	if minoff > totalClients { |  | ||||||
| 		minoff = totalClients |  | ||||||
| 	} |  | ||||||
| 	if maxoff > totalClients { |  | ||||||
| 		maxoff = totalClients |  | ||||||
| 	} |  | ||||||
| 	pairs = pairs[minoff:maxoff] |  | ||||||
| 
 |  | ||||||
| 	// Now we have the real number of ConnInfo objects, we can set c.NumConns |  | ||||||
| 	// and allocate the array |  | ||||||
| 	c.NumConns = len(pairs) |  | ||||||
| 	c.Conns = make([]ConnInfo, c.NumConns) |  | ||||||
| 
 |  | ||||||
| 	i = 0 |  | ||||||
| 	for _, pair := range pairs { |  | ||||||
| 
 |  | ||||||
| 		client := pair.Key |  | ||||||
| 
 |  | ||||||
| 		client.mu.Lock() |  | ||||||
| 
 |  | ||||||
| 		// First, fill ConnInfo with current client's values. We will |  | ||||||
| 		// then overwrite the field used for the sort with what was stored |  | ||||||
| 		// in 'pair'. |  | ||||||
| 		ci := &c.Conns[i] |  | ||||||
| 
 |  | ||||||
| 		ci.Cid = client.cid |  | ||||||
| 		ci.Start = client.start |  | ||||||
| 		ci.LastActivity = client.last |  | ||||||
| 		ci.Uptime = myUptime(c.Now.Sub(client.start)) |  | ||||||
| 		ci.Idle = myUptime(c.Now.Sub(client.last)) |  | ||||||
| 		ci.OutMsgs = client.outMsgs |  | ||||||
| 		ci.OutBytes = client.outBytes |  | ||||||
| 		ci.NumSubs = uint32(len(client.subs)) |  | ||||||
| 		ci.Pending = client.bw.Buffered() |  | ||||||
| 		ci.Name = client.opts.Name |  | ||||||
| 		ci.Lang = client.opts.Lang |  | ||||||
| 		ci.Version = client.opts.Version |  | ||||||
| 		// inMsgs and inBytes are updated outside of the client's lock, so |  | ||||||
| 		// we need to use atomic here. |  | ||||||
| 		ci.InMsgs = atomic.LoadInt64(&client.inMsgs) |  | ||||||
| 		ci.InBytes = atomic.LoadInt64(&client.inBytes) |  | ||||||
| 
 |  | ||||||
| 		// Now overwrite the field that was used as the sort key, so results |  | ||||||
| 		// still look sorted even if the value has changed since sort occurred. |  | ||||||
| 		sortValue := pair.Val |  | ||||||
| 		switch sortOpt { |  | ||||||
| 		case bySubs: |  | ||||||
| 			ci.NumSubs = uint32(sortValue) |  | ||||||
| 		case byPending: |  | ||||||
| 			ci.Pending = int(sortValue) |  | ||||||
| 		case byOutMsgs: |  | ||||||
| 			ci.OutMsgs = sortValue |  | ||||||
| 		case byInMsgs: |  | ||||||
| 			ci.InMsgs = sortValue |  | ||||||
| 		case byOutBytes: |  | ||||||
| 			ci.OutBytes = sortValue |  | ||||||
| 		case byInBytes: |  | ||||||
| 			ci.InBytes = sortValue |  | ||||||
| 		case byLast: |  | ||||||
| 			ci.LastActivity = time.Unix(0, sortValue) |  | ||||||
| 		case byIdle: |  | ||||||
| 			ci.Idle = myUptime(time.Duration(sortValue)) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// If the connection is gone, too bad, we won't set TLSVersion and TLSCipher. |  | ||||||
| 		if tlsRequired && client.nc != nil { |  | ||||||
| 			conn := client.nc.(*tls.Conn) |  | ||||||
| 			cs := conn.ConnectionState() |  | ||||||
| 			ci.TLSVersion = tlsVersion(cs.Version) |  | ||||||
| 			ci.TLSCipher = tlsCipher(cs.CipherSuite) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		switch conn := client.nc.(type) { |  | ||||||
| 		case *net.TCPConn, *tls.Conn: |  | ||||||
| 			addr := conn.RemoteAddr().(*net.TCPAddr) |  | ||||||
| 			ci.Port = addr.Port |  | ||||||
| 			ci.IP = addr.IP.String() |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Fill in subscription data if requested. |  | ||||||
| 		if subs == 1 { |  | ||||||
| 			sublist := make([]*subscription, 0, len(client.subs)) |  | ||||||
| 			for _, sub := range client.subs { |  | ||||||
| 				sublist = append(sublist, sub) |  | ||||||
| 			} |  | ||||||
| 			ci.Subs = castToSliceString(sublist) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Fill in user if auth requested. |  | ||||||
| 		if auth == 1 { |  | ||||||
| 			ci.AuthorizedUser = client.opts.Username |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		client.mu.Unlock() |  | ||||||
| 		i++ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	b, err := json.MarshalIndent(c, "", "  ") |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error marshalling response to /connz request: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Handle response |  | ||||||
| 	ResponseHandler(w, r, b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func castToSliceString(input []*subscription) []string { |  | ||||||
| 	output := make([]string, 0, len(input)) |  | ||||||
| 	for _, line := range input { |  | ||||||
| 		output = append(output, string(line.subject)) |  | ||||||
| 	} |  | ||||||
| 	return output |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Subsz represents detail information on current connections. |  | ||||||
| type Subsz struct { |  | ||||||
| 	*SublistStats |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Routez represents detailed information on current client connections. |  | ||||||
| type Routez struct { |  | ||||||
| 	Now       time.Time    `json:"now"` |  | ||||||
| 	NumRoutes int          `json:"num_routes"` |  | ||||||
| 	Routes    []*RouteInfo `json:"routes"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RouteInfo has detailed information on a per connection basis. |  | ||||||
| type RouteInfo struct { |  | ||||||
| 	Rid          uint64   `json:"rid"` |  | ||||||
| 	RemoteID     string   `json:"remote_id"` |  | ||||||
| 	DidSolicit   bool     `json:"did_solicit"` |  | ||||||
| 	IsConfigured bool     `json:"is_configured"` |  | ||||||
| 	IP           string   `json:"ip"` |  | ||||||
| 	Port         int      `json:"port"` |  | ||||||
| 	Pending      int      `json:"pending_size"` |  | ||||||
| 	InMsgs       int64    `json:"in_msgs"` |  | ||||||
| 	OutMsgs      int64    `json:"out_msgs"` |  | ||||||
| 	InBytes      int64    `json:"in_bytes"` |  | ||||||
| 	OutBytes     int64    `json:"out_bytes"` |  | ||||||
| 	NumSubs      uint32   `json:"subscriptions"` |  | ||||||
| 	Subs         []string `json:"subscriptions_list,omitempty"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // HandleRoutez process HTTP requests for route information. |  | ||||||
| func (s *Server) HandleRoutez(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	rs := &Routez{Routes: []*RouteInfo{}} |  | ||||||
| 	rs.Now = time.Now() |  | ||||||
| 
 |  | ||||||
| 	subs, _ := strconv.Atoi(r.URL.Query().Get("subs")) |  | ||||||
| 
 |  | ||||||
| 	// Walk the list |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 
 |  | ||||||
| 	s.httpReqStats[RoutezPath]++ |  | ||||||
| 	rs.NumRoutes = len(s.routes) |  | ||||||
| 
 |  | ||||||
| 	for _, r := range s.routes { |  | ||||||
| 		r.mu.Lock() |  | ||||||
| 		ri := &RouteInfo{ |  | ||||||
| 			Rid:          r.cid, |  | ||||||
| 			RemoteID:     r.route.remoteID, |  | ||||||
| 			DidSolicit:   r.route.didSolicit, |  | ||||||
| 			IsConfigured: r.route.routeType == Explicit, |  | ||||||
| 			InMsgs:       atomic.LoadInt64(&r.inMsgs), |  | ||||||
| 			OutMsgs:      r.outMsgs, |  | ||||||
| 			InBytes:      atomic.LoadInt64(&r.inBytes), |  | ||||||
| 			OutBytes:     r.outBytes, |  | ||||||
| 			NumSubs:      uint32(len(r.subs)), |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if subs == 1 { |  | ||||||
| 			sublist := make([]*subscription, 0, len(r.subs)) |  | ||||||
| 			for _, sub := range r.subs { |  | ||||||
| 				sublist = append(sublist, sub) |  | ||||||
| 			} |  | ||||||
| 			ri.Subs = castToSliceString(sublist) |  | ||||||
| 		} |  | ||||||
| 		r.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 		if ip, ok := r.nc.(*net.TCPConn); ok { |  | ||||||
| 			addr := ip.RemoteAddr().(*net.TCPAddr) |  | ||||||
| 			ri.Port = addr.Port |  | ||||||
| 			ri.IP = addr.IP.String() |  | ||||||
| 		} |  | ||||||
| 		rs.Routes = append(rs.Routes, ri) |  | ||||||
| 	} |  | ||||||
| 	s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	b, err := json.MarshalIndent(rs, "", "  ") |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error marshalling response to /routez request: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Handle response |  | ||||||
| 	ResponseHandler(w, r, b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // HandleSubsz processes HTTP requests for subjects stats. |  | ||||||
| func (s *Server) HandleSubsz(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	s.httpReqStats[SubszPath]++ |  | ||||||
| 	s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	st := &Subsz{s.sl.Stats()} |  | ||||||
| 	b, err := json.MarshalIndent(st, "", "  ") |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error marshalling response to /subscriptionsz request: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Handle response |  | ||||||
| 	ResponseHandler(w, r, b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // HandleStacksz processes HTTP requests for getting stacks |  | ||||||
| func (s *Server) HandleStacksz(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	// Do not get any lock here that would prevent getting the stacks |  | ||||||
| 	// if we were to have a deadlock somewhere. |  | ||||||
| 	var defaultBuf [defaultStackBufSize]byte |  | ||||||
| 	size := defaultStackBufSize |  | ||||||
| 	buf := defaultBuf[:size] |  | ||||||
| 	n := 0 |  | ||||||
| 	for { |  | ||||||
| 		n = runtime.Stack(buf, true) |  | ||||||
| 		if n < size { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		size *= 2 |  | ||||||
| 		buf = make([]byte, size) |  | ||||||
| 	} |  | ||||||
| 	// Handle response |  | ||||||
| 	ResponseHandler(w, r, buf[:n]) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Varz will output server information on the monitoring port at /varz. |  | ||||||
| type Varz struct { |  | ||||||
| 	*Info |  | ||||||
| 	*Options |  | ||||||
| 	Port             int               `json:"port"` |  | ||||||
| 	MaxPayload       int               `json:"max_payload"` |  | ||||||
| 	Start            time.Time         `json:"start"` |  | ||||||
| 	Now              time.Time         `json:"now"` |  | ||||||
| 	Uptime           string            `json:"uptime"` |  | ||||||
| 	Mem              int64             `json:"mem"` |  | ||||||
| 	Cores            int               `json:"cores"` |  | ||||||
| 	CPU              float64           `json:"cpu"` |  | ||||||
| 	Connections      int               `json:"connections"` |  | ||||||
| 	TotalConnections uint64            `json:"total_connections"` |  | ||||||
| 	Routes           int               `json:"routes"` |  | ||||||
| 	Remotes          int               `json:"remotes"` |  | ||||||
| 	InMsgs           int64             `json:"in_msgs"` |  | ||||||
| 	OutMsgs          int64             `json:"out_msgs"` |  | ||||||
| 	InBytes          int64             `json:"in_bytes"` |  | ||||||
| 	OutBytes         int64             `json:"out_bytes"` |  | ||||||
| 	SlowConsumers    int64             `json:"slow_consumers"` |  | ||||||
| 	Subscriptions    uint32            `json:"subscriptions"` |  | ||||||
| 	HTTPReqStats     map[string]uint64 `json:"http_req_stats"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type usage struct { |  | ||||||
| 	CPU   float32 |  | ||||||
| 	Cores int |  | ||||||
| 	Mem   int64 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func myUptime(d time.Duration) string { |  | ||||||
| 	// Just use total seconds for uptime, and display days / years |  | ||||||
| 	tsecs := d / time.Second |  | ||||||
| 	tmins := tsecs / 60 |  | ||||||
| 	thrs := tmins / 60 |  | ||||||
| 	tdays := thrs / 24 |  | ||||||
| 	tyrs := tdays / 365 |  | ||||||
| 
 |  | ||||||
| 	if tyrs > 0 { |  | ||||||
| 		return fmt.Sprintf("%dy%dd%dh%dm%ds", tyrs, tdays%365, thrs%24, tmins%60, tsecs%60) |  | ||||||
| 	} |  | ||||||
| 	if tdays > 0 { |  | ||||||
| 		return fmt.Sprintf("%dd%dh%dm%ds", tdays, thrs%24, tmins%60, tsecs%60) |  | ||||||
| 	} |  | ||||||
| 	if thrs > 0 { |  | ||||||
| 		return fmt.Sprintf("%dh%dm%ds", thrs, tmins%60, tsecs%60) |  | ||||||
| 	} |  | ||||||
| 	if tmins > 0 { |  | ||||||
| 		return fmt.Sprintf("%dm%ds", tmins, tsecs%60) |  | ||||||
| 	} |  | ||||||
| 	return fmt.Sprintf("%ds", tsecs) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // HandleRoot will show basic info and links to others handlers. |  | ||||||
| func (s *Server) HandleRoot(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	// This feels dumb to me, but is required: https://code.google.com/p/go/issues/detail?id=4799 |  | ||||||
| 	if r.URL.Path != "/" { |  | ||||||
| 		http.NotFound(w, r) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	s.httpReqStats[RootPath]++ |  | ||||||
| 	s.mu.Unlock() |  | ||||||
| 	fmt.Fprintf(w, `<html lang="en"> |  | ||||||
|    <head> |  | ||||||
|     <link rel="shortcut icon" href="http://nats.io/img/favicon.ico"> |  | ||||||
|     <style type="text/css"> |  | ||||||
|       body { font-family: "Century Gothic", CenturyGothic, AppleGothic, sans-serif; font-size: 22; } |  | ||||||
|       a { margin-left: 32px; } |  | ||||||
|     </style> |  | ||||||
|   </head> |  | ||||||
|   <body> |  | ||||||
|     <img src="http://nats.io/img/logo.png" alt="NATS"> |  | ||||||
|     <br/> |  | ||||||
| 	<a href=/varz>varz</a><br/> |  | ||||||
| 	<a href=/connz>connz</a><br/> |  | ||||||
| 	<a href=/routez>routez</a><br/> |  | ||||||
| 	<a href=/subsz>subsz</a><br/> |  | ||||||
|     <br/> |  | ||||||
|     <a href=http://nats.io/documentation/server/gnatsd-monitoring/>help</a> |  | ||||||
|   </body> |  | ||||||
| </html>`) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // HandleVarz will process HTTP requests for server information. |  | ||||||
| func (s *Server) HandleVarz(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 	v := &Varz{Info: &s.info, Options: s.opts, MaxPayload: s.opts.MaxPayload, Start: s.start} |  | ||||||
| 	v.Now = time.Now() |  | ||||||
| 	v.Uptime = myUptime(time.Since(s.start)) |  | ||||||
| 	v.Port = v.Info.Port |  | ||||||
| 
 |  | ||||||
| 	updateUsage(v) |  | ||||||
| 
 |  | ||||||
| 	s.mu.Lock() |  | ||||||
| 	v.Connections = len(s.clients) |  | ||||||
| 	v.TotalConnections = s.totalClients |  | ||||||
| 	v.Routes = len(s.routes) |  | ||||||
| 	v.Remotes = len(s.remotes) |  | ||||||
| 	v.InMsgs = s.inMsgs |  | ||||||
| 	v.InBytes = s.inBytes |  | ||||||
| 	v.OutMsgs = s.outMsgs |  | ||||||
| 	v.OutBytes = s.outBytes |  | ||||||
| 	v.SlowConsumers = s.slowConsumers |  | ||||||
| 	v.Subscriptions = s.sl.Count() |  | ||||||
| 	s.httpReqStats[VarzPath]++ |  | ||||||
| 	// Need a copy here since s.httpReqStas can change while doing |  | ||||||
| 	// the marshaling down below. |  | ||||||
| 	v.HTTPReqStats = make(map[string]uint64, len(s.httpReqStats)) |  | ||||||
| 	for key, val := range s.httpReqStats { |  | ||||||
| 		v.HTTPReqStats[key] = val |  | ||||||
| 	} |  | ||||||
| 	s.mu.Unlock() |  | ||||||
| 
 |  | ||||||
| 	b, err := json.MarshalIndent(v, "", "  ") |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error marshalling response to /varz request: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Handle response |  | ||||||
| 	ResponseHandler(w, r, b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Grab RSS and PCPU |  | ||||||
| func updateUsage(v *Varz) { |  | ||||||
| 	var rss, vss int64 |  | ||||||
| 	var pcpu float64 |  | ||||||
| 
 |  | ||||||
| 	pse.ProcUsage(&pcpu, &rss, &vss) |  | ||||||
| 
 |  | ||||||
| 	v.Mem = rss |  | ||||||
| 	v.CPU = pcpu |  | ||||||
| 	v.Cores = numCores |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ResponseHandler handles responses for monitoring routes |  | ||||||
| func ResponseHandler(w http.ResponseWriter, r *http.Request, data []byte) { |  | ||||||
| 	// Get callback from request |  | ||||||
| 	callback := r.URL.Query().Get("callback") |  | ||||||
| 	// If callback is not empty then |  | ||||||
| 	if callback != "" { |  | ||||||
| 		// Response for JSONP |  | ||||||
| 		w.Header().Set("Content-Type", "application/javascript") |  | ||||||
| 		fmt.Fprintf(w, "%s(%s)", callback, data) |  | ||||||
| 	} else { |  | ||||||
| 		// Otherwise JSON |  | ||||||
| 		w.Header().Set("Content-Type", "application/json") |  | ||||||
| 		w.Write(data) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										50
									
								
								vendor/github.com/nats-io/gnatsd/server/monitor_sort_opts.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/nats-io/gnatsd/server/monitor_sort_opts.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,50 +0,0 @@ | ||||||
| // Copyright 2013-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| // SortOpt is a helper type to sort by ConnInfo values |  | ||||||
| type SortOpt string |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	byCid      SortOpt = "cid" |  | ||||||
| 	bySubs             = "subs" |  | ||||||
| 	byPending          = "pending" |  | ||||||
| 	byOutMsgs          = "msgs_to" |  | ||||||
| 	byInMsgs           = "msgs_from" |  | ||||||
| 	byOutBytes         = "bytes_to" |  | ||||||
| 	byInBytes          = "bytes_from" |  | ||||||
| 	byLast             = "last" |  | ||||||
| 	byIdle             = "idle" |  | ||||||
| 	byUptime           = "uptime" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // IsValid determines if a sort option is valid |  | ||||||
| func (s SortOpt) IsValid() bool { |  | ||||||
| 	switch s { |  | ||||||
| 	case "", byCid, bySubs, byPending, byOutMsgs, byInMsgs, byOutBytes, byInBytes, byLast, byIdle, byUptime: |  | ||||||
| 		return true |  | ||||||
| 	default: |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Pair type is internally used. |  | ||||||
| type Pair struct { |  | ||||||
| 	Key *client |  | ||||||
| 	Val int64 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Pairs type is internally used. |  | ||||||
| type Pairs []Pair |  | ||||||
| 
 |  | ||||||
| func (d Pairs) Len() int { |  | ||||||
| 	return len(d) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d Pairs) Swap(i, j int) { |  | ||||||
| 	d[i], d[j] = d[j], d[i] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d Pairs) Less(i, j int) bool { |  | ||||||
| 	return d[i].Val < d[j].Val |  | ||||||
| } |  | ||||||
							
								
								
									
										802
									
								
								vendor/github.com/nats-io/gnatsd/server/opts.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										802
									
								
								vendor/github.com/nats-io/gnatsd/server/opts.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,802 +0,0 @@ | ||||||
| // Copyright 2012-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"crypto/tls" |  | ||||||
| 	"crypto/x509" |  | ||||||
| 	"fmt" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net" |  | ||||||
| 	"net/url" |  | ||||||
| 	"os" |  | ||||||
| 	"strconv" |  | ||||||
| 	"strings" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/nats-io/gnatsd/conf" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // For multiple accounts/users. |  | ||||||
| type User struct { |  | ||||||
| 	Username    string       `json:"user"` |  | ||||||
| 	Password    string       `json:"password"` |  | ||||||
| 	Permissions *Permissions `json:"permissions"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Authorization are the allowed subjects on a per |  | ||||||
| // publish or subscribe basis. |  | ||||||
| type Permissions struct { |  | ||||||
| 	Publish   []string `json:"publish"` |  | ||||||
| 	Subscribe []string `json:"subscribe"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Options for clusters. |  | ||||||
| type ClusterOpts struct { |  | ||||||
| 	Host        string      `json:"addr"` |  | ||||||
| 	Port        int         `json:"cluster_port"` |  | ||||||
| 	Username    string      `json:"-"` |  | ||||||
| 	Password    string      `json:"-"` |  | ||||||
| 	AuthTimeout float64     `json:"auth_timeout"` |  | ||||||
| 	TLSTimeout  float64     `json:"-"` |  | ||||||
| 	TLSConfig   *tls.Config `json:"-"` |  | ||||||
| 	ListenStr   string      `json:"-"` |  | ||||||
| 	NoAdvertise bool        `json:"-"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Options block for gnatsd server. |  | ||||||
| type Options struct { |  | ||||||
| 	Host           string        `json:"addr"` |  | ||||||
| 	Port           int           `json:"port"` |  | ||||||
| 	Trace          bool          `json:"-"` |  | ||||||
| 	Debug          bool          `json:"-"` |  | ||||||
| 	NoLog          bool          `json:"-"` |  | ||||||
| 	NoSigs         bool          `json:"-"` |  | ||||||
| 	Logtime        bool          `json:"-"` |  | ||||||
| 	MaxConn        int           `json:"max_connections"` |  | ||||||
| 	Users          []*User       `json:"-"` |  | ||||||
| 	Username       string        `json:"-"` |  | ||||||
| 	Password       string        `json:"-"` |  | ||||||
| 	Authorization  string        `json:"-"` |  | ||||||
| 	PingInterval   time.Duration `json:"ping_interval"` |  | ||||||
| 	MaxPingsOut    int           `json:"ping_max"` |  | ||||||
| 	HTTPHost       string        `json:"http_host"` |  | ||||||
| 	HTTPPort       int           `json:"http_port"` |  | ||||||
| 	HTTPSPort      int           `json:"https_port"` |  | ||||||
| 	AuthTimeout    float64       `json:"auth_timeout"` |  | ||||||
| 	MaxControlLine int           `json:"max_control_line"` |  | ||||||
| 	MaxPayload     int           `json:"max_payload"` |  | ||||||
| 	Cluster        ClusterOpts   `json:"cluster"` |  | ||||||
| 	ProfPort       int           `json:"-"` |  | ||||||
| 	PidFile        string        `json:"-"` |  | ||||||
| 	LogFile        string        `json:"-"` |  | ||||||
| 	Syslog         bool          `json:"-"` |  | ||||||
| 	RemoteSyslog   string        `json:"-"` |  | ||||||
| 	Routes         []*url.URL    `json:"-"` |  | ||||||
| 	RoutesStr      string        `json:"-"` |  | ||||||
| 	TLSTimeout     float64       `json:"tls_timeout"` |  | ||||||
| 	TLS            bool          `json:"-"` |  | ||||||
| 	TLSVerify      bool          `json:"-"` |  | ||||||
| 	TLSCert        string        `json:"-"` |  | ||||||
| 	TLSKey         string        `json:"-"` |  | ||||||
| 	TLSCaCert      string        `json:"-"` |  | ||||||
| 	TLSConfig      *tls.Config   `json:"-"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Configuration file authorization section. |  | ||||||
| type authorization struct { |  | ||||||
| 	// Singles |  | ||||||
| 	user string |  | ||||||
| 	pass string |  | ||||||
| 	// Multiple Users |  | ||||||
| 	users              []*User |  | ||||||
| 	timeout            float64 |  | ||||||
| 	defaultPermissions *Permissions |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TLSConfigOpts holds the parsed tls config information, |  | ||||||
| // used with flag parsing |  | ||||||
| type TLSConfigOpts struct { |  | ||||||
| 	CertFile string |  | ||||||
| 	KeyFile  string |  | ||||||
| 	CaFile   string |  | ||||||
| 	Verify   bool |  | ||||||
| 	Timeout  float64 |  | ||||||
| 	Ciphers  []uint16 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var tlsUsage = ` |  | ||||||
| TLS configuration is specified in the tls section of a configuration file: |  | ||||||
| 
 |  | ||||||
| e.g. |  | ||||||
| 
 |  | ||||||
|     tls { |  | ||||||
|         cert_file: "./certs/server-cert.pem" |  | ||||||
|         key_file:  "./certs/server-key.pem" |  | ||||||
|         ca_file:   "./certs/ca.pem" |  | ||||||
|         verify:    true |  | ||||||
| 
 |  | ||||||
|         cipher_suites: [ |  | ||||||
|             "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", |  | ||||||
|             "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" |  | ||||||
|         ] |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| Available cipher suites include: |  | ||||||
| ` |  | ||||||
| 
 |  | ||||||
| // ProcessConfigFile processes a configuration file. |  | ||||||
| // FIXME(dlc): Hacky |  | ||||||
| func ProcessConfigFile(configFile string) (*Options, error) { |  | ||||||
| 	opts := &Options{} |  | ||||||
| 
 |  | ||||||
| 	if configFile == "" { |  | ||||||
| 		return opts, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	m, err := conf.ParseFile(configFile) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for k, v := range m { |  | ||||||
| 		switch strings.ToLower(k) { |  | ||||||
| 		case "listen": |  | ||||||
| 			hp, err := parseListen(v) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			opts.Host = hp.host |  | ||||||
| 			opts.Port = hp.port |  | ||||||
| 		case "port": |  | ||||||
| 			opts.Port = int(v.(int64)) |  | ||||||
| 		case "host", "net": |  | ||||||
| 			opts.Host = v.(string) |  | ||||||
| 		case "debug": |  | ||||||
| 			opts.Debug = v.(bool) |  | ||||||
| 		case "trace": |  | ||||||
| 			opts.Trace = v.(bool) |  | ||||||
| 		case "logtime": |  | ||||||
| 			opts.Logtime = v.(bool) |  | ||||||
| 		case "authorization": |  | ||||||
| 			am := v.(map[string]interface{}) |  | ||||||
| 			auth, err := parseAuthorization(am) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			opts.Username = auth.user |  | ||||||
| 			opts.Password = auth.pass |  | ||||||
| 			opts.AuthTimeout = auth.timeout |  | ||||||
| 			// Check for multiple users defined |  | ||||||
| 			if auth.users != nil { |  | ||||||
| 				if auth.user != "" { |  | ||||||
| 					return nil, fmt.Errorf("Can not have a single user/pass and a users array") |  | ||||||
| 				} |  | ||||||
| 				opts.Users = auth.users |  | ||||||
| 			} |  | ||||||
| 		case "http": |  | ||||||
| 			hp, err := parseListen(v) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			opts.HTTPHost = hp.host |  | ||||||
| 			opts.HTTPPort = hp.port |  | ||||||
| 		case "https": |  | ||||||
| 			hp, err := parseListen(v) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			opts.HTTPHost = hp.host |  | ||||||
| 			opts.HTTPSPort = hp.port |  | ||||||
| 		case "http_port", "monitor_port": |  | ||||||
| 			opts.HTTPPort = int(v.(int64)) |  | ||||||
| 		case "https_port": |  | ||||||
| 			opts.HTTPSPort = int(v.(int64)) |  | ||||||
| 		case "cluster": |  | ||||||
| 			cm := v.(map[string]interface{}) |  | ||||||
| 			if err := parseCluster(cm, opts); err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 		case "logfile", "log_file": |  | ||||||
| 			opts.LogFile = v.(string) |  | ||||||
| 		case "syslog": |  | ||||||
| 			opts.Syslog = v.(bool) |  | ||||||
| 		case "remote_syslog": |  | ||||||
| 			opts.RemoteSyslog = v.(string) |  | ||||||
| 		case "pidfile", "pid_file": |  | ||||||
| 			opts.PidFile = v.(string) |  | ||||||
| 		case "prof_port": |  | ||||||
| 			opts.ProfPort = int(v.(int64)) |  | ||||||
| 		case "max_control_line": |  | ||||||
| 			opts.MaxControlLine = int(v.(int64)) |  | ||||||
| 		case "max_payload": |  | ||||||
| 			opts.MaxPayload = int(v.(int64)) |  | ||||||
| 		case "max_connections", "max_conn": |  | ||||||
| 			opts.MaxConn = int(v.(int64)) |  | ||||||
| 		case "ping_interval": |  | ||||||
| 			opts.PingInterval = time.Duration(int(v.(int64))) * time.Second |  | ||||||
| 		case "ping_max": |  | ||||||
| 			opts.MaxPingsOut = int(v.(int64)) |  | ||||||
| 		case "tls": |  | ||||||
| 			tlsm := v.(map[string]interface{}) |  | ||||||
| 			tc, err := parseTLS(tlsm) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			if opts.TLSConfig, err = GenTLSConfig(tc); err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			opts.TLSTimeout = tc.Timeout |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return opts, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // hostPort is simple struct to hold parsed listen/addr strings. |  | ||||||
| type hostPort struct { |  | ||||||
| 	host string |  | ||||||
| 	port int |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // parseListen will parse listen option which is replacing host/net and port |  | ||||||
| func parseListen(v interface{}) (*hostPort, error) { |  | ||||||
| 	hp := &hostPort{} |  | ||||||
| 	switch v.(type) { |  | ||||||
| 	// Only a port |  | ||||||
| 	case int64: |  | ||||||
| 		hp.port = int(v.(int64)) |  | ||||||
| 	case string: |  | ||||||
| 		host, port, err := net.SplitHostPort(v.(string)) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, fmt.Errorf("Could not parse address string %q", v) |  | ||||||
| 		} |  | ||||||
| 		hp.port, err = strconv.Atoi(port) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, fmt.Errorf("Could not parse port %q", port) |  | ||||||
| 		} |  | ||||||
| 		hp.host = host |  | ||||||
| 	} |  | ||||||
| 	return hp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // parseCluster will parse the cluster config. |  | ||||||
| func parseCluster(cm map[string]interface{}, opts *Options) error { |  | ||||||
| 	for mk, mv := range cm { |  | ||||||
| 		switch strings.ToLower(mk) { |  | ||||||
| 		case "listen": |  | ||||||
| 			hp, err := parseListen(mv) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			opts.Cluster.Host = hp.host |  | ||||||
| 			opts.Cluster.Port = hp.port |  | ||||||
| 		case "port": |  | ||||||
| 			opts.Cluster.Port = int(mv.(int64)) |  | ||||||
| 		case "host", "net": |  | ||||||
| 			opts.Cluster.Host = mv.(string) |  | ||||||
| 		case "authorization": |  | ||||||
| 			am := mv.(map[string]interface{}) |  | ||||||
| 			auth, err := parseAuthorization(am) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if auth.users != nil { |  | ||||||
| 				return fmt.Errorf("Cluster authorization does not allow multiple users") |  | ||||||
| 			} |  | ||||||
| 			opts.Cluster.Username = auth.user |  | ||||||
| 			opts.Cluster.Password = auth.pass |  | ||||||
| 			opts.Cluster.AuthTimeout = auth.timeout |  | ||||||
| 		case "routes": |  | ||||||
| 			ra := mv.([]interface{}) |  | ||||||
| 			opts.Routes = make([]*url.URL, 0, len(ra)) |  | ||||||
| 			for _, r := range ra { |  | ||||||
| 				routeURL := r.(string) |  | ||||||
| 				url, err := url.Parse(routeURL) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return fmt.Errorf("error parsing route url [%q]", routeURL) |  | ||||||
| 				} |  | ||||||
| 				opts.Routes = append(opts.Routes, url) |  | ||||||
| 			} |  | ||||||
| 		case "tls": |  | ||||||
| 			tlsm := mv.(map[string]interface{}) |  | ||||||
| 			tc, err := parseTLS(tlsm) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if opts.Cluster.TLSConfig, err = GenTLSConfig(tc); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			// For clusters, we will force strict verification. We also act |  | ||||||
| 			// as both client and server, so will mirror the rootCA to the |  | ||||||
| 			// clientCA pool. |  | ||||||
| 			opts.Cluster.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert |  | ||||||
| 			opts.Cluster.TLSConfig.RootCAs = opts.Cluster.TLSConfig.ClientCAs |  | ||||||
| 			opts.Cluster.TLSTimeout = tc.Timeout |  | ||||||
| 		case "no_advertise": |  | ||||||
| 			opts.Cluster.NoAdvertise = mv.(bool) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to parse Authorization configs. |  | ||||||
| func parseAuthorization(am map[string]interface{}) (*authorization, error) { |  | ||||||
| 	auth := &authorization{} |  | ||||||
| 	for mk, mv := range am { |  | ||||||
| 		switch strings.ToLower(mk) { |  | ||||||
| 		case "user", "username": |  | ||||||
| 			auth.user = mv.(string) |  | ||||||
| 		case "pass", "password": |  | ||||||
| 			auth.pass = mv.(string) |  | ||||||
| 		case "timeout": |  | ||||||
| 			at := float64(1) |  | ||||||
| 			switch mv.(type) { |  | ||||||
| 			case int64: |  | ||||||
| 				at = float64(mv.(int64)) |  | ||||||
| 			case float64: |  | ||||||
| 				at = mv.(float64) |  | ||||||
| 			} |  | ||||||
| 			auth.timeout = at |  | ||||||
| 		case "users": |  | ||||||
| 			users, err := parseUsers(mv) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			auth.users = users |  | ||||||
| 		case "default_permission", "default_permissions": |  | ||||||
| 			pm, ok := mv.(map[string]interface{}) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("Expected default permissions to be a map/struct, got %+v", mv) |  | ||||||
| 			} |  | ||||||
| 			permissions, err := parseUserPermissions(pm) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			auth.defaultPermissions = permissions |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Now check for permission defaults with multiple users, etc. |  | ||||||
| 		if auth.users != nil && auth.defaultPermissions != nil { |  | ||||||
| 			for _, user := range auth.users { |  | ||||||
| 				if user.Permissions == nil { |  | ||||||
| 					user.Permissions = auth.defaultPermissions |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 	return auth, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to parse multiple users array with optional permissions. |  | ||||||
| func parseUsers(mv interface{}) ([]*User, error) { |  | ||||||
| 	// Make sure we have an array |  | ||||||
| 	uv, ok := mv.([]interface{}) |  | ||||||
| 	if !ok { |  | ||||||
| 		return nil, fmt.Errorf("Expected users field to be an array, got %v", mv) |  | ||||||
| 	} |  | ||||||
| 	users := []*User{} |  | ||||||
| 	for _, u := range uv { |  | ||||||
| 		// Check its a map/struct |  | ||||||
| 		um, ok := u.(map[string]interface{}) |  | ||||||
| 		if !ok { |  | ||||||
| 			return nil, fmt.Errorf("Expected user entry to be a map/struct, got %v", u) |  | ||||||
| 		} |  | ||||||
| 		user := &User{} |  | ||||||
| 		for k, v := range um { |  | ||||||
| 			switch strings.ToLower(k) { |  | ||||||
| 			case "user", "username": |  | ||||||
| 				user.Username = v.(string) |  | ||||||
| 			case "pass", "password": |  | ||||||
| 				user.Password = v.(string) |  | ||||||
| 			case "permission", "permissions", "authroization": |  | ||||||
| 				pm, ok := v.(map[string]interface{}) |  | ||||||
| 				if !ok { |  | ||||||
| 					return nil, fmt.Errorf("Expected user permissions to be a map/struct, got %+v", v) |  | ||||||
| 				} |  | ||||||
| 				permissions, err := parseUserPermissions(pm) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return nil, err |  | ||||||
| 				} |  | ||||||
| 				user.Permissions = permissions |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		// Check to make sure we have at least username and password |  | ||||||
| 		if user.Username == "" || user.Password == "" { |  | ||||||
| 			return nil, fmt.Errorf("User entry requires a user and a password") |  | ||||||
| 		} |  | ||||||
| 		users = append(users, user) |  | ||||||
| 	} |  | ||||||
| 	return users, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to parse user/account permissions |  | ||||||
| func parseUserPermissions(pm map[string]interface{}) (*Permissions, error) { |  | ||||||
| 	p := &Permissions{} |  | ||||||
| 	for k, v := range pm { |  | ||||||
| 		switch strings.ToLower(k) { |  | ||||||
| 		case "pub", "publish": |  | ||||||
| 			subjects, err := parseSubjects(v) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			p.Publish = subjects |  | ||||||
| 		case "sub", "subscribe": |  | ||||||
| 			subjects, err := parseSubjects(v) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			p.Subscribe = subjects |  | ||||||
| 		default: |  | ||||||
| 			return nil, fmt.Errorf("Unknown field %s parsing permissions", k) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return p, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to parse subject singeltons and/or arrays |  | ||||||
| func parseSubjects(v interface{}) ([]string, error) { |  | ||||||
| 	var subjects []string |  | ||||||
| 	switch v.(type) { |  | ||||||
| 	case string: |  | ||||||
| 		subjects = append(subjects, v.(string)) |  | ||||||
| 	case []string: |  | ||||||
| 		subjects = v.([]string) |  | ||||||
| 	case []interface{}: |  | ||||||
| 		for _, i := range v.([]interface{}) { |  | ||||||
| 			subject, ok := i.(string) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("Subject in permissions array cannot be cast to string") |  | ||||||
| 			} |  | ||||||
| 			subjects = append(subjects, subject) |  | ||||||
| 		} |  | ||||||
| 	default: |  | ||||||
| 		return nil, fmt.Errorf("Expected subject permissions to be a subject, or array of subjects, got %T", v) |  | ||||||
| 	} |  | ||||||
| 	return checkSubjectArray(subjects) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to validate subjects, etc for account permissioning. |  | ||||||
| func checkSubjectArray(sa []string) ([]string, error) { |  | ||||||
| 	for _, s := range sa { |  | ||||||
| 		if !IsValidSubject(s) { |  | ||||||
| 			return nil, fmt.Errorf("Subject %q is not a valid subject", s) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return sa, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // PrintTLSHelpAndDie prints TLS usage and exits. |  | ||||||
| func PrintTLSHelpAndDie() { |  | ||||||
| 	fmt.Printf("%s\n", tlsUsage) |  | ||||||
| 	for k := range cipherMap { |  | ||||||
| 		fmt.Printf("    %s\n", k) |  | ||||||
| 	} |  | ||||||
| 	fmt.Printf("\n") |  | ||||||
| 	os.Exit(0) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func parseCipher(cipherName string) (uint16, error) { |  | ||||||
| 
 |  | ||||||
| 	cipher, exists := cipherMap[cipherName] |  | ||||||
| 	if !exists { |  | ||||||
| 		return 0, fmt.Errorf("Unrecognized cipher %s", cipherName) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return cipher, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Helper function to parse TLS configs. |  | ||||||
| func parseTLS(tlsm map[string]interface{}) (*TLSConfigOpts, error) { |  | ||||||
| 	tc := TLSConfigOpts{} |  | ||||||
| 	for mk, mv := range tlsm { |  | ||||||
| 		switch strings.ToLower(mk) { |  | ||||||
| 		case "cert_file": |  | ||||||
| 			certFile, ok := mv.(string) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("error parsing tls config, expected 'cert_file' to be filename") |  | ||||||
| 			} |  | ||||||
| 			tc.CertFile = certFile |  | ||||||
| 		case "key_file": |  | ||||||
| 			keyFile, ok := mv.(string) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("error parsing tls config, expected 'key_file' to be filename") |  | ||||||
| 			} |  | ||||||
| 			tc.KeyFile = keyFile |  | ||||||
| 		case "ca_file": |  | ||||||
| 			caFile, ok := mv.(string) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("error parsing tls config, expected 'ca_file' to be filename") |  | ||||||
| 			} |  | ||||||
| 			tc.CaFile = caFile |  | ||||||
| 		case "verify": |  | ||||||
| 			verify, ok := mv.(bool) |  | ||||||
| 			if !ok { |  | ||||||
| 				return nil, fmt.Errorf("error parsing tls config, expected 'verify' to be a boolean") |  | ||||||
| 			} |  | ||||||
| 			tc.Verify = verify |  | ||||||
| 		case "cipher_suites": |  | ||||||
| 			ra := mv.([]interface{}) |  | ||||||
| 			if len(ra) == 0 { |  | ||||||
| 				return nil, fmt.Errorf("error parsing tls config, 'cipher_suites' cannot be empty") |  | ||||||
| 			} |  | ||||||
| 			tc.Ciphers = make([]uint16, 0, len(ra)) |  | ||||||
| 			for _, r := range ra { |  | ||||||
| 				cipher, err := parseCipher(r.(string)) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return nil, err |  | ||||||
| 				} |  | ||||||
| 				tc.Ciphers = append(tc.Ciphers, cipher) |  | ||||||
| 			} |  | ||||||
| 		case "timeout": |  | ||||||
| 			at := float64(0) |  | ||||||
| 			switch mv.(type) { |  | ||||||
| 			case int64: |  | ||||||
| 				at = float64(mv.(int64)) |  | ||||||
| 			case float64: |  | ||||||
| 				at = mv.(float64) |  | ||||||
| 			} |  | ||||||
| 			tc.Timeout = at |  | ||||||
| 		default: |  | ||||||
| 			return nil, fmt.Errorf("error parsing tls config, unknown field [%q]", mk) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// If cipher suites were not specified then use the defaults |  | ||||||
| 	if tc.Ciphers == nil { |  | ||||||
| 		tc.Ciphers = defaultCipherSuites() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &tc, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GenTLSConfig loads TLS related configuration parameters. |  | ||||||
| func GenTLSConfig(tc *TLSConfigOpts) (*tls.Config, error) { |  | ||||||
| 
 |  | ||||||
| 	// Now load in cert and private key |  | ||||||
| 	cert, err := tls.LoadX509KeyPair(tc.CertFile, tc.KeyFile) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, fmt.Errorf("error parsing X509 certificate/key pair: %v", err) |  | ||||||
| 	} |  | ||||||
| 	cert.Leaf, err = x509.ParseCertificate(cert.Certificate[0]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, fmt.Errorf("error parsing certificate: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Create TLSConfig |  | ||||||
| 	// We will determine the cipher suites that we prefer. |  | ||||||
| 	config := tls.Config{ |  | ||||||
| 		Certificates:             []tls.Certificate{cert}, |  | ||||||
| 		PreferServerCipherSuites: true, |  | ||||||
| 		MinVersion:               tls.VersionTLS12, |  | ||||||
| 		CipherSuites:             tc.Ciphers, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Require client certificates as needed |  | ||||||
| 	if tc.Verify { |  | ||||||
| 		config.ClientAuth = tls.RequireAndVerifyClientCert |  | ||||||
| 	} |  | ||||||
| 	// Add in CAs if applicable. |  | ||||||
| 	if tc.CaFile != "" { |  | ||||||
| 		rootPEM, err := ioutil.ReadFile(tc.CaFile) |  | ||||||
| 		if err != nil || rootPEM == nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		pool := x509.NewCertPool() |  | ||||||
| 		ok := pool.AppendCertsFromPEM([]byte(rootPEM)) |  | ||||||
| 		if !ok { |  | ||||||
| 			return nil, fmt.Errorf("failed to parse root ca certificate") |  | ||||||
| 		} |  | ||||||
| 		config.ClientCAs = pool |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &config, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MergeOptions will merge two options giving preference to the flagOpts |  | ||||||
| // if the item is present. |  | ||||||
| func MergeOptions(fileOpts, flagOpts *Options) *Options { |  | ||||||
| 	if fileOpts == nil { |  | ||||||
| 		return flagOpts |  | ||||||
| 	} |  | ||||||
| 	if flagOpts == nil { |  | ||||||
| 		return fileOpts |  | ||||||
| 	} |  | ||||||
| 	// Merge the two, flagOpts override |  | ||||||
| 	opts := *fileOpts |  | ||||||
| 
 |  | ||||||
| 	if flagOpts.Port != 0 { |  | ||||||
| 		opts.Port = flagOpts.Port |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Host != "" { |  | ||||||
| 		opts.Host = flagOpts.Host |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Username != "" { |  | ||||||
| 		opts.Username = flagOpts.Username |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Password != "" { |  | ||||||
| 		opts.Password = flagOpts.Password |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Authorization != "" { |  | ||||||
| 		opts.Authorization = flagOpts.Authorization |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.HTTPPort != 0 { |  | ||||||
| 		opts.HTTPPort = flagOpts.HTTPPort |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Debug { |  | ||||||
| 		opts.Debug = true |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Trace { |  | ||||||
| 		opts.Trace = true |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Logtime { |  | ||||||
| 		opts.Logtime = true |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.LogFile != "" { |  | ||||||
| 		opts.LogFile = flagOpts.LogFile |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.PidFile != "" { |  | ||||||
| 		opts.PidFile = flagOpts.PidFile |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.ProfPort != 0 { |  | ||||||
| 		opts.ProfPort = flagOpts.ProfPort |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Cluster.ListenStr != "" { |  | ||||||
| 		opts.Cluster.ListenStr = flagOpts.Cluster.ListenStr |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.Cluster.NoAdvertise { |  | ||||||
| 		opts.Cluster.NoAdvertise = true |  | ||||||
| 	} |  | ||||||
| 	if flagOpts.RoutesStr != "" { |  | ||||||
| 		mergeRoutes(&opts, flagOpts) |  | ||||||
| 	} |  | ||||||
| 	return &opts |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RoutesFromStr parses route URLs from a string |  | ||||||
| func RoutesFromStr(routesStr string) []*url.URL { |  | ||||||
| 	routes := strings.Split(routesStr, ",") |  | ||||||
| 	if len(routes) == 0 { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 	routeUrls := []*url.URL{} |  | ||||||
| 	for _, r := range routes { |  | ||||||
| 		r = strings.TrimSpace(r) |  | ||||||
| 		u, _ := url.Parse(r) |  | ||||||
| 		routeUrls = append(routeUrls, u) |  | ||||||
| 	} |  | ||||||
| 	return routeUrls |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // This will merge the flag routes and override anything that was present. |  | ||||||
| func mergeRoutes(opts, flagOpts *Options) { |  | ||||||
| 	routeUrls := RoutesFromStr(flagOpts.RoutesStr) |  | ||||||
| 	if routeUrls == nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	opts.Routes = routeUrls |  | ||||||
| 	opts.RoutesStr = flagOpts.RoutesStr |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // RemoveSelfReference removes this server from an array of routes |  | ||||||
| func RemoveSelfReference(clusterPort int, routes []*url.URL) ([]*url.URL, error) { |  | ||||||
| 	var cleanRoutes []*url.URL |  | ||||||
| 	cport := strconv.Itoa(clusterPort) |  | ||||||
| 
 |  | ||||||
| 	selfIPs := getInterfaceIPs() |  | ||||||
| 	for _, r := range routes { |  | ||||||
| 		host, port, err := net.SplitHostPort(r.Host) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if cport == port && isIPInList(selfIPs, getURLIP(host)) { |  | ||||||
| 			Noticef("Self referencing IP found: ", r) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		cleanRoutes = append(cleanRoutes, r) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return cleanRoutes, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func isIPInList(list1 []net.IP, list2 []net.IP) bool { |  | ||||||
| 	for _, ip1 := range list1 { |  | ||||||
| 		for _, ip2 := range list2 { |  | ||||||
| 			if ip1.Equal(ip2) { |  | ||||||
| 				return true |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getURLIP(ipStr string) []net.IP { |  | ||||||
| 	ipList := []net.IP{} |  | ||||||
| 
 |  | ||||||
| 	ip := net.ParseIP(ipStr) |  | ||||||
| 	if ip != nil { |  | ||||||
| 		ipList = append(ipList, ip) |  | ||||||
| 		return ipList |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	hostAddr, err := net.LookupHost(ipStr) |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error looking up host with route hostname: %v", err) |  | ||||||
| 		return ipList |  | ||||||
| 	} |  | ||||||
| 	for _, addr := range hostAddr { |  | ||||||
| 		ip = net.ParseIP(addr) |  | ||||||
| 		if ip != nil { |  | ||||||
| 			ipList = append(ipList, ip) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return ipList |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getInterfaceIPs() []net.IP { |  | ||||||
| 	var localIPs []net.IP |  | ||||||
| 
 |  | ||||||
| 	interfaceAddr, err := net.InterfaceAddrs() |  | ||||||
| 	if err != nil { |  | ||||||
| 		Errorf("Error getting self referencing address: %v", err) |  | ||||||
| 		return localIPs |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for i := 0; i < len(interfaceAddr); i++ { |  | ||||||
| 		interfaceIP, _, _ := net.ParseCIDR(interfaceAddr[i].String()) |  | ||||||
| 		if net.ParseIP(interfaceIP.String()) != nil { |  | ||||||
| 			localIPs = append(localIPs, interfaceIP) |  | ||||||
| 		} else { |  | ||||||
| 			Errorf("Error parsing self referencing address: %v", err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return localIPs |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func processOptions(opts *Options) { |  | ||||||
| 	// Setup non-standard Go defaults |  | ||||||
| 	if opts.Host == "" { |  | ||||||
| 		opts.Host = DEFAULT_HOST |  | ||||||
| 	} |  | ||||||
| 	if opts.HTTPHost == "" { |  | ||||||
| 		// Default to same bind from server if left undefined |  | ||||||
| 		opts.HTTPHost = opts.Host |  | ||||||
| 	} |  | ||||||
| 	if opts.Port == 0 { |  | ||||||
| 		opts.Port = DEFAULT_PORT |  | ||||||
| 	} else if opts.Port == RANDOM_PORT { |  | ||||||
| 		// Choose randomly inside of net.Listen |  | ||||||
| 		opts.Port = 0 |  | ||||||
| 	} |  | ||||||
| 	if opts.MaxConn == 0 { |  | ||||||
| 		opts.MaxConn = DEFAULT_MAX_CONNECTIONS |  | ||||||
| 	} |  | ||||||
| 	if opts.PingInterval == 0 { |  | ||||||
| 		opts.PingInterval = DEFAULT_PING_INTERVAL |  | ||||||
| 	} |  | ||||||
| 	if opts.MaxPingsOut == 0 { |  | ||||||
| 		opts.MaxPingsOut = DEFAULT_PING_MAX_OUT |  | ||||||
| 	} |  | ||||||
| 	if opts.TLSTimeout == 0 { |  | ||||||
| 		opts.TLSTimeout = float64(TLS_TIMEOUT) / float64(time.Second) |  | ||||||
| 	} |  | ||||||
| 	if opts.AuthTimeout == 0 { |  | ||||||
| 		opts.AuthTimeout = float64(AUTH_TIMEOUT) / float64(time.Second) |  | ||||||
| 	} |  | ||||||
| 	if opts.Cluster.Host == "" { |  | ||||||
| 		opts.Cluster.Host = DEFAULT_HOST |  | ||||||
| 	} |  | ||||||
| 	if opts.Cluster.TLSTimeout == 0 { |  | ||||||
| 		opts.Cluster.TLSTimeout = float64(TLS_TIMEOUT) / float64(time.Second) |  | ||||||
| 	} |  | ||||||
| 	if opts.Cluster.AuthTimeout == 0 { |  | ||||||
| 		opts.Cluster.AuthTimeout = float64(AUTH_TIMEOUT) / float64(time.Second) |  | ||||||
| 	} |  | ||||||
| 	if opts.MaxControlLine == 0 { |  | ||||||
| 		opts.MaxControlLine = MAX_CONTROL_LINE_SIZE |  | ||||||
| 	} |  | ||||||
| 	if opts.MaxPayload == 0 { |  | ||||||
| 		opts.MaxPayload = MAX_PAYLOAD_SIZE |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										738
									
								
								vendor/github.com/nats-io/gnatsd/server/parser.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										738
									
								
								vendor/github.com/nats-io/gnatsd/server/parser.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,738 +0,0 @@ | ||||||
| // Copyright 2012-2014 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package server |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type pubArg struct { |  | ||||||
| 	subject []byte |  | ||||||
| 	reply   []byte |  | ||||||
| 	sid     []byte |  | ||||||
| 	szb     []byte |  | ||||||
| 	size    int |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type parseState struct { |  | ||||||
| 	state   int |  | ||||||
| 	as      int |  | ||||||
| 	drop    int |  | ||||||
| 	pa      pubArg |  | ||||||
| 	argBuf  []byte |  | ||||||
| 	msgBuf  []byte |  | ||||||
| 	scratch [MAX_CONTROL_LINE_SIZE]byte |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Parser constants |  | ||||||
| const ( |  | ||||||
| 	OP_START = iota |  | ||||||
| 	OP_PLUS |  | ||||||
| 	OP_PLUS_O |  | ||||||
| 	OP_PLUS_OK |  | ||||||
| 	OP_MINUS |  | ||||||
| 	OP_MINUS_E |  | ||||||
| 	OP_MINUS_ER |  | ||||||
| 	OP_MINUS_ERR |  | ||||||
| 	OP_MINUS_ERR_SPC |  | ||||||
| 	MINUS_ERR_ARG |  | ||||||
| 	OP_C |  | ||||||
| 	OP_CO |  | ||||||
| 	OP_CON |  | ||||||
| 	OP_CONN |  | ||||||
| 	OP_CONNE |  | ||||||
| 	OP_CONNEC |  | ||||||
| 	OP_CONNECT |  | ||||||
| 	CONNECT_ARG |  | ||||||
| 	OP_P |  | ||||||
| 	OP_PU |  | ||||||
| 	OP_PUB |  | ||||||
| 	OP_PUB_SPC |  | ||||||
| 	PUB_ARG |  | ||||||
| 	OP_PI |  | ||||||
| 	OP_PIN |  | ||||||
| 	OP_PING |  | ||||||
| 	OP_PO |  | ||||||
| 	OP_PON |  | ||||||
| 	OP_PONG |  | ||||||
| 	MSG_PAYLOAD |  | ||||||
| 	MSG_END |  | ||||||
| 	OP_S |  | ||||||
| 	OP_SU |  | ||||||
| 	OP_SUB |  | ||||||
| 	OP_SUB_SPC |  | ||||||
| 	SUB_ARG |  | ||||||
| 	OP_U |  | ||||||
| 	OP_UN |  | ||||||
| 	OP_UNS |  | ||||||
| 	OP_UNSU |  | ||||||
| 	OP_UNSUB |  | ||||||
| 	OP_UNSUB_SPC |  | ||||||
| 	UNSUB_ARG |  | ||||||
| 	OP_M |  | ||||||
| 	OP_MS |  | ||||||
| 	OP_MSG |  | ||||||
| 	OP_MSG_SPC |  | ||||||
| 	MSG_ARG |  | ||||||
| 	OP_I |  | ||||||
| 	OP_IN |  | ||||||
| 	OP_INF |  | ||||||
| 	OP_INFO |  | ||||||
| 	INFO_ARG |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func (c *client) parse(buf []byte) error { |  | ||||||
| 	var i int |  | ||||||
| 	var b byte |  | ||||||
| 
 |  | ||||||
| 	mcl := MAX_CONTROL_LINE_SIZE |  | ||||||
| 	if c.srv != nil && c.srv.opts != nil { |  | ||||||
| 		mcl = c.srv.opts.MaxControlLine |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// snapshot this, and reset when we receive a |  | ||||||
| 	// proper CONNECT if needed. |  | ||||||
| 	authSet := c.isAuthTimerSet() |  | ||||||
| 
 |  | ||||||
| 	// Move to loop instead of range syntax to allow jumping of i |  | ||||||
| 	for i = 0; i < len(buf); i++ { |  | ||||||
| 		b = buf[i] |  | ||||||
| 
 |  | ||||||
| 		switch c.state { |  | ||||||
| 		case OP_START: |  | ||||||
| 			if b != 'C' && b != 'c' && authSet { |  | ||||||
| 				goto authErr |  | ||||||
| 			} |  | ||||||
| 			switch b { |  | ||||||
| 			case 'P', 'p': |  | ||||||
| 				c.state = OP_P |  | ||||||
| 			case 'S', 's': |  | ||||||
| 				c.state = OP_S |  | ||||||
| 			case 'U', 'u': |  | ||||||
| 				c.state = OP_U |  | ||||||
| 			case 'M', 'm': |  | ||||||
| 				if c.typ == CLIENT { |  | ||||||
| 					goto parseErr |  | ||||||
| 				} else { |  | ||||||
| 					c.state = OP_M |  | ||||||
| 				} |  | ||||||
| 			case 'C', 'c': |  | ||||||
| 				c.state = OP_C |  | ||||||
| 			case 'I', 'i': |  | ||||||
| 				c.state = OP_I |  | ||||||
| 			case '+': |  | ||||||
| 				c.state = OP_PLUS |  | ||||||
| 			case '-': |  | ||||||
| 				c.state = OP_MINUS |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_P: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'U', 'u': |  | ||||||
| 				c.state = OP_PU |  | ||||||
| 			case 'I', 'i': |  | ||||||
| 				c.state = OP_PI |  | ||||||
| 			case 'O', 'o': |  | ||||||
| 				c.state = OP_PO |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PU: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'B', 'b': |  | ||||||
| 				c.state = OP_PUB |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PUB: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				c.state = OP_PUB_SPC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PUB_SPC: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = PUB_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case PUB_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processPub(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.as, c.state = OP_START, i+1, MSG_PAYLOAD |  | ||||||
| 				// If we don't have a saved buffer then jump ahead with |  | ||||||
| 				// the index. If this overruns what is left we fall out |  | ||||||
| 				// and process split buffer. |  | ||||||
| 				if c.msgBuf == nil { |  | ||||||
| 					i = c.as + c.pa.size - LEN_CR_LF |  | ||||||
| 				} |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case MSG_PAYLOAD: |  | ||||||
| 			if c.msgBuf != nil { |  | ||||||
| 				// copy as much as we can to the buffer and skip ahead. |  | ||||||
| 				toCopy := c.pa.size - len(c.msgBuf) |  | ||||||
| 				avail := len(buf) - i |  | ||||||
| 				if avail < toCopy { |  | ||||||
| 					toCopy = avail |  | ||||||
| 				} |  | ||||||
| 				if toCopy > 0 { |  | ||||||
| 					start := len(c.msgBuf) |  | ||||||
| 					// This is needed for copy to work. |  | ||||||
| 					c.msgBuf = c.msgBuf[:start+toCopy] |  | ||||||
| 					copy(c.msgBuf[start:], buf[i:i+toCopy]) |  | ||||||
| 					// Update our index |  | ||||||
| 					i = (i + toCopy) - 1 |  | ||||||
| 				} else { |  | ||||||
| 					// Fall back to append if needed. |  | ||||||
| 					c.msgBuf = append(c.msgBuf, b) |  | ||||||
| 				} |  | ||||||
| 				if len(c.msgBuf) >= c.pa.size { |  | ||||||
| 					c.state = MSG_END |  | ||||||
| 				} |  | ||||||
| 			} else if i-c.as >= c.pa.size { |  | ||||||
| 				c.state = MSG_END |  | ||||||
| 			} |  | ||||||
| 		case MSG_END: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\n': |  | ||||||
| 				if c.msgBuf != nil { |  | ||||||
| 					c.msgBuf = append(c.msgBuf, b) |  | ||||||
| 				} else { |  | ||||||
| 					c.msgBuf = buf[c.as : i+1] |  | ||||||
| 				} |  | ||||||
| 				// strict check for proto |  | ||||||
| 				if len(c.msgBuf) != c.pa.size+LEN_CR_LF { |  | ||||||
| 					goto parseErr |  | ||||||
| 				} |  | ||||||
| 				c.processMsg(c.msgBuf) |  | ||||||
| 				c.argBuf, c.msgBuf = nil, nil |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, OP_START |  | ||||||
| 			default: |  | ||||||
| 				if c.msgBuf != nil { |  | ||||||
| 					c.msgBuf = append(c.msgBuf, b) |  | ||||||
| 				} |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 		case OP_S: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'U', 'u': |  | ||||||
| 				c.state = OP_SU |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_SU: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'B', 'b': |  | ||||||
| 				c.state = OP_SUB |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_SUB: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				c.state = OP_SUB_SPC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_SUB_SPC: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = SUB_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case SUB_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 					c.argBuf = nil |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processSub(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, OP_START |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case OP_U: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_UN |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_UN: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'S', 's': |  | ||||||
| 				c.state = OP_UNS |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_UNS: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'U', 'u': |  | ||||||
| 				c.state = OP_UNSU |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_UNSU: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'B', 'b': |  | ||||||
| 				c.state = OP_UNSUB |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_UNSUB: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				c.state = OP_UNSUB_SPC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_UNSUB_SPC: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = UNSUB_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case UNSUB_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 					c.argBuf = nil |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processUnsub(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, OP_START |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case OP_PI: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_PIN |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PIN: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'G', 'g': |  | ||||||
| 				c.state = OP_PING |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PING: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\n': |  | ||||||
| 				c.processPing() |  | ||||||
| 				c.drop, c.state = 0, OP_START |  | ||||||
| 			} |  | ||||||
| 		case OP_PO: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_PON |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PON: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'G', 'g': |  | ||||||
| 				c.state = OP_PONG |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PONG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\n': |  | ||||||
| 				c.processPong() |  | ||||||
| 				c.drop, c.state = 0, OP_START |  | ||||||
| 			} |  | ||||||
| 		case OP_C: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'O', 'o': |  | ||||||
| 				c.state = OP_CO |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CO: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_CON |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CON: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_CONN |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CONN: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'E', 'e': |  | ||||||
| 				c.state = OP_CONNE |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CONNE: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'C', 'c': |  | ||||||
| 				c.state = OP_CONNEC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CONNEC: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'T', 't': |  | ||||||
| 				c.state = OP_CONNECT |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_CONNECT: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = CONNECT_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case CONNECT_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 					c.argBuf = nil |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processConnect(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.state = 0, OP_START |  | ||||||
| 				// Reset notion on authSet |  | ||||||
| 				authSet = c.isAuthTimerSet() |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case OP_M: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'S', 's': |  | ||||||
| 				c.state = OP_MS |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MS: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'G', 'g': |  | ||||||
| 				c.state = OP_MSG |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MSG: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				c.state = OP_MSG_SPC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MSG_SPC: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = MSG_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case MSG_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processMsgArgs(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, MSG_PAYLOAD |  | ||||||
| 
 |  | ||||||
| 				// jump ahead with the index. If this overruns |  | ||||||
| 				// what is left we fall out and process split |  | ||||||
| 				// buffer. |  | ||||||
| 				i = c.as + c.pa.size - 1 |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case OP_I: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'N', 'n': |  | ||||||
| 				c.state = OP_IN |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_IN: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'F', 'f': |  | ||||||
| 				c.state = OP_INF |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_INF: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'O', 'o': |  | ||||||
| 				c.state = OP_INFO |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_INFO: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = INFO_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case INFO_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 					c.argBuf = nil |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				if err := c.processInfo(arg); err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, OP_START |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		case OP_PLUS: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'O', 'o': |  | ||||||
| 				c.state = OP_PLUS_O |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PLUS_O: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'K', 'k': |  | ||||||
| 				c.state = OP_PLUS_OK |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_PLUS_OK: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\n': |  | ||||||
| 				c.drop, c.state = 0, OP_START |  | ||||||
| 			} |  | ||||||
| 		case OP_MINUS: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'E', 'e': |  | ||||||
| 				c.state = OP_MINUS_E |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MINUS_E: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'R', 'r': |  | ||||||
| 				c.state = OP_MINUS_ER |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MINUS_ER: |  | ||||||
| 			switch b { |  | ||||||
| 			case 'R', 'r': |  | ||||||
| 				c.state = OP_MINUS_ERR |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MINUS_ERR: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				c.state = OP_MINUS_ERR_SPC |  | ||||||
| 			default: |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 		case OP_MINUS_ERR_SPC: |  | ||||||
| 			switch b { |  | ||||||
| 			case ' ', '\t': |  | ||||||
| 				continue |  | ||||||
| 			default: |  | ||||||
| 				c.state = MINUS_ERR_ARG |  | ||||||
| 				c.as = i |  | ||||||
| 			} |  | ||||||
| 		case MINUS_ERR_ARG: |  | ||||||
| 			switch b { |  | ||||||
| 			case '\r': |  | ||||||
| 				c.drop = 1 |  | ||||||
| 			case '\n': |  | ||||||
| 				var arg []byte |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					arg = c.argBuf |  | ||||||
| 					c.argBuf = nil |  | ||||||
| 				} else { |  | ||||||
| 					arg = buf[c.as : i-c.drop] |  | ||||||
| 				} |  | ||||||
| 				c.processErr(string(arg)) |  | ||||||
| 				c.drop, c.as, c.state = 0, i+1, OP_START |  | ||||||
| 			default: |  | ||||||
| 				if c.argBuf != nil { |  | ||||||
| 					c.argBuf = append(c.argBuf, b) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			goto parseErr |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Check for split buffer scenarios for any ARG state. |  | ||||||
| 	if c.state == SUB_ARG || c.state == UNSUB_ARG || c.state == PUB_ARG || |  | ||||||
| 		c.state == MSG_ARG || c.state == MINUS_ERR_ARG || |  | ||||||
| 		c.state == CONNECT_ARG || c.state == INFO_ARG { |  | ||||||
| 		// Setup a holder buffer to deal with split buffer scenario. |  | ||||||
| 		if c.argBuf == nil { |  | ||||||
| 			c.argBuf = c.scratch[:0] |  | ||||||
| 			c.argBuf = append(c.argBuf, buf[c.as:i-c.drop]...) |  | ||||||
| 		} |  | ||||||
| 		// Check for violations of control line length here. Note that this is not |  | ||||||
| 		// exact at all but the performance hit is too great to be precise, and |  | ||||||
| 		// catching here should prevent memory exhaustion attacks. |  | ||||||
| 		if len(c.argBuf) > mcl { |  | ||||||
| 			c.sendErr("Maximum Control Line Exceeded") |  | ||||||
| 			c.closeConnection() |  | ||||||
| 			return ErrMaxControlLine |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Check for split msg |  | ||||||
| 	if (c.state == MSG_PAYLOAD || c.state == MSG_END) && c.msgBuf == nil { |  | ||||||
| 		// We need to clone the pubArg if it is still referencing the |  | ||||||
| 		// read buffer and we are not able to process the msg. |  | ||||||
| 		if c.argBuf == nil { |  | ||||||
| 			// Works also for MSG_ARG, when message comes from ROUTE. |  | ||||||
| 			c.clonePubArg() |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// If we will overflow the scratch buffer, just create a |  | ||||||
| 		// new buffer to hold the split message. |  | ||||||
| 		if c.pa.size > cap(c.scratch)-len(c.argBuf) { |  | ||||||
| 			lrem := len(buf[c.as:]) |  | ||||||
| 
 |  | ||||||
| 			// Consider it a protocol error when the remaining payload |  | ||||||
| 			// is larger than the reported size for PUB. It can happen |  | ||||||
| 			// when processing incomplete messages from rogue clients. |  | ||||||
| 			if lrem > c.pa.size+LEN_CR_LF { |  | ||||||
| 				goto parseErr |  | ||||||
| 			} |  | ||||||
| 			c.msgBuf = make([]byte, lrem, c.pa.size+LEN_CR_LF) |  | ||||||
| 			copy(c.msgBuf, buf[c.as:]) |  | ||||||
| 		} else { |  | ||||||
| 			c.msgBuf = c.scratch[len(c.argBuf):len(c.argBuf)] |  | ||||||
| 			c.msgBuf = append(c.msgBuf, (buf[c.as:])...) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| 
 |  | ||||||
| authErr: |  | ||||||
| 	c.authViolation() |  | ||||||
| 	return ErrAuthorization |  | ||||||
| 
 |  | ||||||
| parseErr: |  | ||||||
| 	c.sendErr("Unknown Protocol Operation") |  | ||||||
| 	snip := protoSnippet(i, buf) |  | ||||||
| 	err := fmt.Errorf("%s Parser ERROR, state=%d, i=%d: proto='%s...'", |  | ||||||
| 		c.typeString(), c.state, i, snip) |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func protoSnippet(start int, buf []byte) string { |  | ||||||
| 	stop := start + PROTO_SNIPPET_SIZE |  | ||||||
| 	bufSize := len(buf) |  | ||||||
| 	if start >= bufSize { |  | ||||||
| 		return `""` |  | ||||||
| 	} |  | ||||||
| 	if stop > bufSize { |  | ||||||
| 		stop = bufSize - 1 |  | ||||||
| 	} |  | ||||||
| 	return fmt.Sprintf("%q", buf[start:stop]) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // clonePubArg is used when the split buffer scenario has the pubArg in the existing read buffer, but |  | ||||||
| // we need to hold onto it into the next read. |  | ||||||
| func (c *client) clonePubArg() { |  | ||||||
| 	c.argBuf = c.scratch[:0] |  | ||||||
| 	c.argBuf = append(c.argBuf, c.pa.subject...) |  | ||||||
| 	c.argBuf = append(c.argBuf, c.pa.reply...) |  | ||||||
| 	c.argBuf = append(c.argBuf, c.pa.sid...) |  | ||||||
| 	c.argBuf = append(c.argBuf, c.pa.szb...) |  | ||||||
| 
 |  | ||||||
| 	c.pa.subject = c.argBuf[:len(c.pa.subject)] |  | ||||||
| 
 |  | ||||||
| 	if c.pa.reply != nil { |  | ||||||
| 		c.pa.reply = c.argBuf[len(c.pa.subject) : len(c.pa.subject)+len(c.pa.reply)] |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if c.pa.sid != nil { |  | ||||||
| 		c.pa.sid = c.argBuf[len(c.pa.subject)+len(c.pa.reply) : len(c.pa.subject)+len(c.pa.reply)+len(c.pa.sid)] |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	c.pa.szb = c.argBuf[len(c.pa.subject)+len(c.pa.reply)+len(c.pa.sid):] |  | ||||||
| } |  | ||||||
							
								
								
									
										23
									
								
								vendor/github.com/nats-io/gnatsd/server/pse/pse_darwin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/nats-io/gnatsd/server/pse/pse_darwin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,23 +0,0 @@ | ||||||
| // Copyright 2015-2016 Apcera Inc. All rights reserved. |  | ||||||
| 
 |  | ||||||
| package pse |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"os" |  | ||||||
| 	"os/exec" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func ProcUsage(pcpu *float64, rss, vss *int64) error { |  | ||||||
| 	pidStr := fmt.Sprintf("%d", os.Getpid()) |  | ||||||
| 	out, err := exec.Command("ps", "o", "pcpu=,rss=,vsz=", "-p", pidStr).Output() |  | ||||||
| 	if err != nil { |  | ||||||
| 		*rss, *vss = -1, -1 |  | ||||||
| 		return errors.New(fmt.Sprintf("ps call failed:%v", err)) |  | ||||||
| 	} |  | ||||||
| 	fmt.Sscanf(string(out), "%f %d %d", pcpu, rss, vss) |  | ||||||
| 	*rss *= 1024 // 1k blocks, want bytes. |  | ||||||
| 	*vss *= 1024 // 1k blocks, want bytes. |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue