mirror of
https://github.com/openziti/ziti.git
synced 2026-09-10 00:35:41 +00:00
Add support for tracking network interfaces on routers and identities. Fixes #3082. Add network discover to router. Fixes #3083
This commit is contained in:
+183
@@ -1,3 +1,186 @@
|
||||
# Release 1.6.3
|
||||
|
||||
## What's New
|
||||
|
||||
* Router Network Interface Discovery
|
||||
|
||||
## Router Interface Discovery
|
||||
|
||||
Routers can now discover their network interfaces and publish this information to the
|
||||
controller.
|
||||
|
||||
This feature will be used in the future to allow controller side configuration of
|
||||
router link listeners and edge listeners.
|
||||
|
||||
### Update Router Configuration
|
||||
|
||||
There is new router configuration to manage this:
|
||||
|
||||
```
|
||||
interfaceDiscovery:
|
||||
# This feature is enabled by default, but can be disabled by setting this to true
|
||||
disabled: false
|
||||
|
||||
# How often to poll for interface changes. Defaults to 1 minute
|
||||
checkInterval: 1m
|
||||
|
||||
# How often to report the current set of interfaces, when nothing has changed.
|
||||
# This is a failsafe reporting mechanism, in the very unlikely event that an
|
||||
# earlier change report was lost or disregarded due to distributed controller
|
||||
# eventual consistency
|
||||
minReportInterval: 24h
|
||||
```
|
||||
|
||||
### Update REST APIs
|
||||
|
||||
Network interfaces, where reported, can now be viewed on the following endpoints.
|
||||
|
||||
* routers
|
||||
* edge-routers
|
||||
* identities (if the router is an ER/T, with an associated identities)
|
||||
|
||||
At some point in the future, we expect to allow SDKs to also optionally report their
|
||||
network interfaces as well. Those will be available via the `identities` REST API.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
$ ziti fabric list routers 'name="edge-router-1"' -j | jq
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "./routers/oLvcT6VepI"
|
||||
},
|
||||
"terminators": {
|
||||
"href": "./routers/oLvcT6VepI/terminators"
|
||||
}
|
||||
},
|
||||
"createdAt": "2025-03-24T04:35:59.077Z",
|
||||
"id": "oLvcT6VepI",
|
||||
"tags": {},
|
||||
"updatedAt": "2025-06-11T14:29:22.083Z",
|
||||
"connected": false,
|
||||
"cost": 0,
|
||||
"disabled": false,
|
||||
"fingerprint": "b7b03c55be77df0ec57e49d8fe2610e0b99fa61c",
|
||||
"interfaces": [
|
||||
{
|
||||
"addresses": [
|
||||
"192.168.3.29/24",
|
||||
"aaaa::aaaa:aaaa:aaaa:aaaa/64"
|
||||
],
|
||||
"hardwareAddress": "aa:aa:aa:aa:aa:aa",
|
||||
"index": 4,
|
||||
"isBroadcast": true,
|
||||
"isLoopback": false,
|
||||
"isMulticast": true,
|
||||
"isRunning": true,
|
||||
"isUp": true,
|
||||
"mtu": 1500,
|
||||
"name": "wifi0"
|
||||
},
|
||||
{
|
||||
"addresses": null,
|
||||
"hardwareAddress": "aa:aa:aa:aa:aa:aa",
|
||||
"index": 2,
|
||||
"isBroadcast": true,
|
||||
"isLoopback": false,
|
||||
"isMulticast": true,
|
||||
"isRunning": false,
|
||||
"isUp": true,
|
||||
"mtu": 1500,
|
||||
"name": "eth1"
|
||||
},
|
||||
{
|
||||
"addresses": [
|
||||
"192.168.1.2/24",
|
||||
"aaaa::aaaa:aaa:aaaa:aaaa/64"
|
||||
],
|
||||
"hardwareAddress": "aa:aa:aa:aa:aa:aa",
|
||||
"index": 16,
|
||||
"isBroadcast": true,
|
||||
"isLoopback": false,
|
||||
"isMulticast": true,
|
||||
"isRunning": true,
|
||||
"isUp": true,
|
||||
"mtu": 1500,
|
||||
"name": "eth0"
|
||||
},
|
||||
{
|
||||
"addresses": [
|
||||
"127.0.0.1/8",
|
||||
"::1/128"
|
||||
],
|
||||
"hardwareAddress": "",
|
||||
"index": 1,
|
||||
"isBroadcast": false,
|
||||
"isLoopback": true,
|
||||
"isMulticast": false,
|
||||
"isRunning": true,
|
||||
"isUp": true,
|
||||
"mtu": 65536,
|
||||
"name": "lo"
|
||||
}
|
||||
],
|
||||
"listenerAddresses": null,
|
||||
"name": "edge-router-1",
|
||||
"noTraversal": false
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"filterableFields": [
|
||||
"id",
|
||||
"isSystem",
|
||||
"name",
|
||||
"fingerprint",
|
||||
"cost",
|
||||
"createdAt",
|
||||
"updatedAt",
|
||||
"tags",
|
||||
"noTraversal",
|
||||
"disabled",
|
||||
"connected"
|
||||
],
|
||||
"pagination": {
|
||||
"limit": 10,
|
||||
"offset": 0,
|
||||
"totalCount": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note that addresses have been sanitized.
|
||||
|
||||
|
||||
## Component Updates and Bug Fixes
|
||||
|
||||
* github.com/openziti/channel/v4: [v4.2.0 -> v4.2.5](https://github.com/openziti/channel/compare/v4.2.0...v4.2.5)
|
||||
* github.com/openziti/edge-api: [v0.26.45 -> v0.26.46](https://github.com/openziti/edge-api/compare/v0.26.45...v0.26.46)
|
||||
* [Issue #155](https://github.com/openziti/edge-api/issues/155) - Add network interface list to routers and identities
|
||||
|
||||
* github.com/openziti/foundation/v2: [v2.0.63 -> v2.0.66](https://github.com/openziti/foundation/compare/v2.0.63...v2.0.66)
|
||||
* github.com/openziti/identity: [v1.0.101 -> v1.0.105](https://github.com/openziti/identity/compare/v1.0.101...v1.0.105)
|
||||
* github.com/openziti/sdk-golang: [v1.1.1 -> v1.1.2](https://github.com/openziti/sdk-golang/compare/v1.1.1...v1.1.2)
|
||||
* [Issue #742](https://github.com/openziti/sdk-golang/issues/742) - Additional CtrlId and GetDestinationType for inspect support
|
||||
* [Issue #739](https://github.com/openziti/sdk-golang/issues/739) - go-jose v2.6.3 CVE-2025-27144 resolution
|
||||
* [Issue #735](https://github.com/openziti/sdk-golang/issues/735) - Ensure Authenticate can't be called in parallel
|
||||
|
||||
* github.com/openziti/storage: [v0.4.11 -> v0.4.17](https://github.com/openziti/storage/compare/v0.4.11...v0.4.17)
|
||||
* [Issue #106](https://github.com/openziti/storage/issues/106) - panic in TypedBucket.GetList
|
||||
|
||||
* github.com/openziti/transport/v2: [v2.0.171 -> v2.0.175](https://github.com/openziti/transport/compare/v2.0.171...v2.0.175)
|
||||
* github.com/openziti/xweb/v2: [v2.3.2 -> v2.3.3](https://github.com/openziti/xweb/compare/v2.3.2...v2.3.3)
|
||||
* github.com/openziti/ziti: [v1.6.2 -> v1.6.3](https://github.com/openziti/ziti/compare/v1.6.2...v1.6.3)
|
||||
* [Issue #3082](https://github.com/openziti/ziti/issues/3082) - Add network interfaces to controller data model
|
||||
* [Issue #3083](https://github.com/openziti/ziti/issues/3083) - Add optional network interface discovery to routers
|
||||
* [Issue #2862](https://github.com/openziti/ziti/issues/2862) - Large scale data-flow test
|
||||
* [Issue #3102](https://github.com/openziti/ziti/issues/3102) - Implement remote control for ziti-traffic-test/loop4
|
||||
* [Issue #3098](https://github.com/openziti/ziti/issues/3098) - Implement circuit validation API and CLI
|
||||
|
||||
|
||||
# Release 1.6.2
|
||||
|
||||
## What's New
|
||||
|
||||
+191
-68
@@ -949,6 +949,7 @@ type Router struct {
|
||||
NoTraversal bool `protobuf:"varint,5,opt,name=noTraversal,proto3" json:"noTraversal,omitempty"`
|
||||
Disabled bool `protobuf:"varint,6,opt,name=disabled,proto3" json:"disabled,omitempty"`
|
||||
Tags map[string]*TagValue `protobuf:"bytes,7,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
|
||||
Interfaces []*Interface `protobuf:"bytes,8,rep,name=interfaces,proto3" json:"interfaces,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Router) Reset() {
|
||||
@@ -1032,6 +1033,13 @@ func (x *Router) GetTags() map[string]*TagValue {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Router) GetInterfaces() []*Interface {
|
||||
if x != nil {
|
||||
return x.Interfaces
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Terminator struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@@ -1191,6 +1199,93 @@ func (x *Terminator) GetSourceCtrl() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
type Interface struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||
HardwareAddress string `protobuf:"bytes,2,opt,name=hardwareAddress,proto3" json:"hardwareAddress,omitempty"`
|
||||
Mtu int64 `protobuf:"varint,3,opt,name=mtu,proto3" json:"mtu,omitempty"`
|
||||
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
|
||||
Flags uint64 `protobuf:"varint,5,opt,name=flags,proto3" json:"flags,omitempty"`
|
||||
Addresses []string `protobuf:"bytes,6,rep,name=addresses,proto3" json:"addresses,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Interface) Reset() {
|
||||
*x = Interface{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_cmd_proto_msgTypes[14]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Interface) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Interface) ProtoMessage() {}
|
||||
|
||||
func (x *Interface) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_cmd_proto_msgTypes[14]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Interface.ProtoReflect.Descriptor instead.
|
||||
func (*Interface) Descriptor() ([]byte, []int) {
|
||||
return file_cmd_proto_rawDescGZIP(), []int{14}
|
||||
}
|
||||
|
||||
func (x *Interface) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Interface) GetHardwareAddress() string {
|
||||
if x != nil {
|
||||
return x.HardwareAddress
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Interface) GetMtu() int64 {
|
||||
if x != nil {
|
||||
return x.Mtu
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetIndex() int64 {
|
||||
if x != nil {
|
||||
return x.Index
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetFlags() uint64 {
|
||||
if x != nil {
|
||||
return x.Flags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetAddresses() []string {
|
||||
if x != nil {
|
||||
return x.Addresses
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_cmd_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_cmd_proto_rawDesc = []byte{
|
||||
@@ -1296,7 +1391,7 @@ var file_cmd_proto_rawDesc = []byte{
|
||||
0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a,
|
||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a,
|
||||
0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61,
|
||||
0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa3,
|
||||
0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdb,
|
||||
0x02, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
|
||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,
|
||||
@@ -1310,53 +1405,67 @@ var file_cmd_proto_rawDesc = []byte{
|
||||
0x64, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||
0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04,
|
||||
0x74, 0x61, 0x67, 0x73, 0x1a, 0x4e, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72,
|
||||
0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
|
||||
0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62,
|
||||
0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
||||
0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x05, 0x0a, 0x0a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
|
||||
0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49,
|
||||
0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a,
|
||||
0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
|
||||
0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
|
||||
0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
|
||||
0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18,
|
||||
0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49,
|
||||
0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63,
|
||||
0x72, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61,
|
||||
0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73,
|
||||
0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a,
|
||||
0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||
0x0d, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a,
|
||||
0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||
0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65,
|
||||
0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74,
|
||||
0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61,
|
||||
0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21,
|
||||
0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72,
|
||||
0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72,
|
||||
0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49,
|
||||
0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x12,
|
||||
0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28,
|
||||
0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x28, 0x0a, 0x0f, 0x73,
|
||||
0x61, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0e,
|
||||
0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x73, 0x61, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x63, 0x65,
|
||||
0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43,
|
||||
0x74, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63,
|
||||
0x65, 0x43, 0x74, 0x72, 0x6c, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74,
|
||||
0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
|
||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
|
||||
0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
|
||||
0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
|
||||
0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x15, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54,
|
||||
0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
|
||||
0x38, 0x01, 0x2a, 0xc3, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79,
|
||||
0x74, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
|
||||
0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e,
|
||||
0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
|
||||
0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x09,
|
||||
0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76,
|
||||
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a, 0x69, 0x74,
|
||||
0x69, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75,
|
||||
0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x05, 0x0a,
|
||||
0x0a, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69,
|
||||
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73,
|
||||
0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
|
||||
0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x75,
|
||||
0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x75,
|
||||
0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
|
||||
0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12,
|
||||
0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73,
|
||||
0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69,
|
||||
0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73,
|
||||
0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28,
|
||||
0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65,
|
||||
0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
||||
0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65,
|
||||
0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65,
|
||||
0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74,
|
||||
0x61, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63,
|
||||
0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72,
|
||||
0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08,
|
||||
0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73,
|
||||
0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x6d,
|
||||
0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2e,
|
||||
0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
|
||||
0x16, 0x0a, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x53, 0x79, 0x73,
|
||||
0x74, 0x65, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x79, 0x73,
|
||||
0x74, 0x65, 0x6d, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x61, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x63,
|
||||
0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x73, 0x61,
|
||||
0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a,
|
||||
0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x74, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x74, 0x72, 0x6c, 0x1a, 0x3b, 0x0a,
|
||||
0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
|
||||
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52,
|
||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x09, 0x54, 0x61,
|
||||
0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c,
|
||||
0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e,
|
||||
0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
|
||||
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f,
|
||||
0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x41,
|
||||
0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65,
|
||||
0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14,
|
||||
0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x66,
|
||||
0x6c, 0x61, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
|
||||
0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
|
||||
0x65, 0x73, 0x2a, 0xc3, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79,
|
||||
0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
|
||||
0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x4c, 0x6f,
|
||||
0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x10, 0x82, 0x10, 0x12, 0x16, 0x0a,
|
||||
@@ -1397,7 +1506,7 @@ func file_cmd_proto_rawDescGZIP() []byte {
|
||||
}
|
||||
|
||||
var file_cmd_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
|
||||
var file_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
|
||||
var file_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
|
||||
var file_cmd_proto_goTypes = []interface{}{
|
||||
(ContentType)(0), // 0: ziti.cmd.pb.ContentType
|
||||
(CommandType)(0), // 1: ziti.cmd.pb.CommandType
|
||||
@@ -1415,14 +1524,15 @@ var file_cmd_proto_goTypes = []interface{}{
|
||||
(*Service)(nil), // 13: ziti.cmd.pb.Service
|
||||
(*Router)(nil), // 14: ziti.cmd.pb.Router
|
||||
(*Terminator)(nil), // 15: ziti.cmd.pb.Terminator
|
||||
nil, // 16: ziti.cmd.pb.ChangeContext.AttributesEntry
|
||||
nil, // 17: ziti.cmd.pb.Service.TagsEntry
|
||||
nil, // 18: ziti.cmd.pb.Router.TagsEntry
|
||||
nil, // 19: ziti.cmd.pb.Terminator.PeerDataEntry
|
||||
nil, // 20: ziti.cmd.pb.Terminator.TagsEntry
|
||||
(*Interface)(nil), // 16: ziti.cmd.pb.Interface
|
||||
nil, // 17: ziti.cmd.pb.ChangeContext.AttributesEntry
|
||||
nil, // 18: ziti.cmd.pb.Service.TagsEntry
|
||||
nil, // 19: ziti.cmd.pb.Router.TagsEntry
|
||||
nil, // 20: ziti.cmd.pb.Terminator.PeerDataEntry
|
||||
nil, // 21: ziti.cmd.pb.Terminator.TagsEntry
|
||||
}
|
||||
var file_cmd_proto_depIdxs = []int32{
|
||||
16, // 0: ziti.cmd.pb.ChangeContext.attributes:type_name -> ziti.cmd.pb.ChangeContext.AttributesEntry
|
||||
17, // 0: ziti.cmd.pb.ChangeContext.attributes:type_name -> ziti.cmd.pb.ChangeContext.AttributesEntry
|
||||
2, // 1: ziti.cmd.pb.AddPeerRequest.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
2, // 2: ziti.cmd.pb.RemovePeerRequest.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
2, // 3: ziti.cmd.pb.TransferLeadershipRequest.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
@@ -1430,18 +1540,19 @@ var file_cmd_proto_depIdxs = []int32{
|
||||
2, // 5: ziti.cmd.pb.UpdateEntityCommand.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
2, // 6: ziti.cmd.pb.DeleteEntityCommand.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
2, // 7: ziti.cmd.pb.DeleteTerminatorsBatchCommand.ctx:type_name -> ziti.cmd.pb.ChangeContext
|
||||
17, // 8: ziti.cmd.pb.Service.tags:type_name -> ziti.cmd.pb.Service.TagsEntry
|
||||
18, // 9: ziti.cmd.pb.Router.tags:type_name -> ziti.cmd.pb.Router.TagsEntry
|
||||
19, // 10: ziti.cmd.pb.Terminator.peerData:type_name -> ziti.cmd.pb.Terminator.PeerDataEntry
|
||||
20, // 11: ziti.cmd.pb.Terminator.tags:type_name -> ziti.cmd.pb.Terminator.TagsEntry
|
||||
12, // 12: ziti.cmd.pb.Service.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
12, // 13: ziti.cmd.pb.Router.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
12, // 14: ziti.cmd.pb.Terminator.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
15, // [15:15] is the sub-list for method output_type
|
||||
15, // [15:15] is the sub-list for method input_type
|
||||
15, // [15:15] is the sub-list for extension type_name
|
||||
15, // [15:15] is the sub-list for extension extendee
|
||||
0, // [0:15] is the sub-list for field type_name
|
||||
18, // 8: ziti.cmd.pb.Service.tags:type_name -> ziti.cmd.pb.Service.TagsEntry
|
||||
19, // 9: ziti.cmd.pb.Router.tags:type_name -> ziti.cmd.pb.Router.TagsEntry
|
||||
16, // 10: ziti.cmd.pb.Router.interfaces:type_name -> ziti.cmd.pb.Interface
|
||||
20, // 11: ziti.cmd.pb.Terminator.peerData:type_name -> ziti.cmd.pb.Terminator.PeerDataEntry
|
||||
21, // 12: ziti.cmd.pb.Terminator.tags:type_name -> ziti.cmd.pb.Terminator.TagsEntry
|
||||
12, // 13: ziti.cmd.pb.Service.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
12, // 14: ziti.cmd.pb.Router.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
12, // 15: ziti.cmd.pb.Terminator.TagsEntry.value:type_name -> ziti.cmd.pb.TagValue
|
||||
16, // [16:16] is the sub-list for method output_type
|
||||
16, // [16:16] is the sub-list for method input_type
|
||||
16, // [16:16] is the sub-list for extension type_name
|
||||
16, // [16:16] is the sub-list for extension extendee
|
||||
0, // [0:16] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_cmd_proto_init() }
|
||||
@@ -1618,6 +1729,18 @@ func file_cmd_proto_init() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_cmd_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Interface); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
file_cmd_proto_msgTypes[10].OneofWrappers = []interface{}{
|
||||
(*TagValue_BoolValue)(nil),
|
||||
@@ -1631,7 +1754,7 @@ func file_cmd_proto_init() {
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_cmd_proto_rawDesc,
|
||||
NumEnums: 2,
|
||||
NumMessages: 19,
|
||||
NumMessages: 20,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
||||
@@ -111,6 +111,7 @@ message Router {
|
||||
bool noTraversal = 5;
|
||||
bool disabled = 6;
|
||||
map<string, TagValue> tags = 7;
|
||||
repeated Interface interfaces = 8;
|
||||
}
|
||||
|
||||
message Terminator {
|
||||
@@ -130,3 +131,12 @@ message Terminator {
|
||||
uint32 savedPrecedence = 14;
|
||||
string sourceCtrl = 15;
|
||||
}
|
||||
|
||||
message Interface {
|
||||
string name = 1;
|
||||
string hardwareAddress = 2;
|
||||
int64 mtu = 3;
|
||||
int64 index = 4;
|
||||
uint64 flags = 5;
|
||||
repeated string addresses = 6;
|
||||
}
|
||||
+319
-137
@@ -58,6 +58,7 @@ const (
|
||||
ContentType_DecommissionRouterRequestType ContentType = 1043
|
||||
ContentType_PeerStateChangeRequestType ContentType = 1050
|
||||
ContentType_UpdateClusterLeaderRequestType ContentType = 1051
|
||||
ContentType_UpdateRouterInterfaces ContentType = 1052
|
||||
)
|
||||
|
||||
// Enum value maps for ContentType.
|
||||
@@ -92,6 +93,7 @@ var (
|
||||
1043: "DecommissionRouterRequestType",
|
||||
1050: "PeerStateChangeRequestType",
|
||||
1051: "UpdateClusterLeaderRequestType",
|
||||
1052: "UpdateRouterInterfaces",
|
||||
}
|
||||
ContentType_value = map[string]int32{
|
||||
"Zero": 0,
|
||||
@@ -123,6 +125,7 @@ var (
|
||||
"DecommissionRouterRequestType": 1043,
|
||||
"PeerStateChangeRequestType": 1050,
|
||||
"UpdateClusterLeaderRequestType": 1051,
|
||||
"UpdateRouterInterfaces": 1052,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -2366,6 +2369,140 @@ func (x *RouterMetadata) GetCapabilities() []RouterCapability {
|
||||
return nil
|
||||
}
|
||||
|
||||
type Interface struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||
HardwareAddress string `protobuf:"bytes,2,opt,name=hardwareAddress,proto3" json:"hardwareAddress,omitempty"`
|
||||
Mtu int64 `protobuf:"varint,3,opt,name=mtu,proto3" json:"mtu,omitempty"`
|
||||
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
|
||||
Flags uint64 `protobuf:"varint,5,opt,name=flags,proto3" json:"flags,omitempty"`
|
||||
Addresses []string `protobuf:"bytes,6,rep,name=addresses,proto3" json:"addresses,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Interface) Reset() {
|
||||
*x = Interface{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[30]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Interface) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Interface) ProtoMessage() {}
|
||||
|
||||
func (x *Interface) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[30]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Interface.ProtoReflect.Descriptor instead.
|
||||
func (*Interface) Descriptor() ([]byte, []int) {
|
||||
return file_ctrl_proto_rawDescGZIP(), []int{30}
|
||||
}
|
||||
|
||||
func (x *Interface) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Interface) GetHardwareAddress() string {
|
||||
if x != nil {
|
||||
return x.HardwareAddress
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Interface) GetMtu() int64 {
|
||||
if x != nil {
|
||||
return x.Mtu
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetIndex() int64 {
|
||||
if x != nil {
|
||||
return x.Index
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetFlags() uint64 {
|
||||
if x != nil {
|
||||
return x.Flags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Interface) GetAddresses() []string {
|
||||
if x != nil {
|
||||
return x.Addresses
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type RouterInterfacesUpdate struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Interfaces []*Interface `protobuf:"bytes,1,rep,name=interfaces,proto3" json:"interfaces,omitempty"`
|
||||
}
|
||||
|
||||
func (x *RouterInterfacesUpdate) Reset() {
|
||||
*x = RouterInterfacesUpdate{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[31]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *RouterInterfacesUpdate) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*RouterInterfacesUpdate) ProtoMessage() {}
|
||||
|
||||
func (x *RouterInterfacesUpdate) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[31]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use RouterInterfacesUpdate.ProtoReflect.Descriptor instead.
|
||||
func (*RouterInterfacesUpdate) Descriptor() ([]byte, []int) {
|
||||
return file_ctrl_proto_rawDescGZIP(), []int{31}
|
||||
}
|
||||
|
||||
func (x *RouterInterfacesUpdate) GetInterfaces() []*Interface {
|
||||
if x != nil {
|
||||
return x.Interfaces
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type RouterLinks_RouterLink struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@@ -2382,7 +2519,7 @@ type RouterLinks_RouterLink struct {
|
||||
func (x *RouterLinks_RouterLink) Reset() {
|
||||
*x = RouterLinks_RouterLink{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[35]
|
||||
mi := &file_ctrl_proto_msgTypes[37]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@@ -2395,7 +2532,7 @@ func (x *RouterLinks_RouterLink) String() string {
|
||||
func (*RouterLinks_RouterLink) ProtoMessage() {}
|
||||
|
||||
func (x *RouterLinks_RouterLink) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[35]
|
||||
mi := &file_ctrl_proto_msgTypes[37]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@@ -2467,7 +2604,7 @@ type Route_Egress struct {
|
||||
func (x *Route_Egress) Reset() {
|
||||
*x = Route_Egress{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[37]
|
||||
mi := &file_ctrl_proto_msgTypes[39]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@@ -2480,7 +2617,7 @@ func (x *Route_Egress) String() string {
|
||||
func (*Route_Egress) ProtoMessage() {}
|
||||
|
||||
func (x *Route_Egress) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[37]
|
||||
mi := &file_ctrl_proto_msgTypes[39]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@@ -2537,7 +2674,7 @@ type Route_Forward struct {
|
||||
func (x *Route_Forward) Reset() {
|
||||
*x = Route_Forward{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[38]
|
||||
mi := &file_ctrl_proto_msgTypes[40]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@@ -2550,7 +2687,7 @@ func (x *Route_Forward) String() string {
|
||||
func (*Route_Forward) ProtoMessage() {}
|
||||
|
||||
func (x *Route_Forward) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[38]
|
||||
mi := &file_ctrl_proto_msgTypes[40]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@@ -2599,7 +2736,7 @@ type InspectResponse_InspectValue struct {
|
||||
func (x *InspectResponse_InspectValue) Reset() {
|
||||
*x = InspectResponse_InspectValue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_ctrl_proto_msgTypes[41]
|
||||
mi := &file_ctrl_proto_msgTypes[43]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@@ -2612,7 +2749,7 @@ func (x *InspectResponse_InspectValue) String() string {
|
||||
func (*InspectResponse_InspectValue) ProtoMessage() {}
|
||||
|
||||
func (x *InspectResponse_InspectValue) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_ctrl_proto_msgTypes[41]
|
||||
mi := &file_ctrl_proto_msgTypes[43]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@@ -2938,98 +3075,116 @@ var file_ctrl_proto_rawDesc = []byte{
|
||||
0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x7a,
|
||||
0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61,
|
||||
0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2a, 0xa8, 0x06, 0x0a, 0x0b, 0x43,
|
||||
0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65,
|
||||
0x72, 0x6f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52,
|
||||
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x0d, 0x0a,
|
||||
0x08, 0x44, 0x69, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, 0x12, 0x16, 0x0a, 0x11,
|
||||
0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70,
|
||||
0x65, 0x10, 0xeb, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70,
|
||||
0x65, 0x10, 0xec, 0x07, 0x12, 0x0e, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70,
|
||||
0x65, 0x10, 0xed, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0xee, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
|
||||
0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67,
|
||||
0x6c, 0x65, 0x50, 0x69, 0x70, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x72,
|
||||
0x61, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x07, 0x12,
|
||||
0x20, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
|
||||
0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3,
|
||||
0x07, 0x12, 0x20, 0x0a, 0x1b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69,
|
||||
0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65,
|
||||
0x10, 0xf4, 0x07, 0x12, 0x17, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x07, 0x12, 0x18, 0x0a, 0x13,
|
||||
0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0xf6, 0x07, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61,
|
||||
0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x55,
|
||||
0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52,
|
||||
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x07, 0x12, 0x11, 0x0a,
|
||||
0x0c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x07,
|
||||
0x12, 0x1c, 0x0a, 0x17, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
|
||||
0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8a, 0x08, 0x12, 0x14,
|
||||
0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x54, 0x79, 0x70,
|
||||
0x65, 0x10, 0x8b, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8c, 0x08, 0x12, 0x1c, 0x0a, 0x17, 0x55,
|
||||
0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x74, 0x72, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
|
||||
0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8d, 0x08, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x65, 0x6d,
|
||||
0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8e, 0x08, 0x12, 0x1d, 0x0a, 0x18,
|
||||
0x51, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8f, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x44,
|
||||
0x65, 0x71, 0x75, 0x69, 0x65, 0x73, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x90, 0x08, 0x12, 0x25, 0x0a, 0x20,
|
||||
0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74,
|
||||
0x6f, 0x72, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65,
|
||||
0x10, 0x91, 0x08, 0x12, 0x26, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54,
|
||||
0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0x92, 0x08, 0x12, 0x22, 0x0a, 0x1d, 0x44,
|
||||
0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x75, 0x74, 0x65,
|
||||
0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x93, 0x08, 0x12,
|
||||
0x1f, 0x0a, 0x1a, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e,
|
||||
0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x9a, 0x08,
|
||||
0x12, 0x23, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
|
||||
0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79,
|
||||
0x70, 0x65, 0x10, 0x9b, 0x08, 0x2a, 0x67, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
|
||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x6f, 0x6e, 0x65, 0x48,
|
||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x65,
|
||||
0x6e, 0x65, 0x72, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14,
|
||||
0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x65,
|
||||
0x61, 0x64, 0x65, 0x72, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
|
||||
0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0c, 0x2a, 0x3a,
|
||||
0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
|
||||
0x74, 0x79, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
|
||||
0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x61,
|
||||
0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0c, 0x53, 0x65,
|
||||
0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x6e,
|
||||
0x75, 0x73, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x12, 0x0a,
|
||||
0x0e, 0x4e, 0x65, 0x77, 0x43, 0x74, 0x72, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x10,
|
||||
0x01, 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50,
|
||||
0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66,
|
||||
0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72,
|
||||
0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02,
|
||||
0x2a, 0x52, 0x0a, 0x17, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e,
|
||||
0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x0e, 0x55,
|
||||
0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12,
|
||||
0x15, 0x0a, 0x11, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e,
|
||||
0x61, 0x74, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x53, 0x74, 0x61,
|
||||
0x74, 0x65, 0x10, 0x02, 0x2a, 0x83, 0x01, 0x0a, 0x0c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75,
|
||||
0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73,
|
||||
0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73,
|
||||
0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b,
|
||||
0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x77, 0x61,
|
||||
0x72, 0x64, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x6e, 0x6b,
|
||||
0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64,
|
||||
0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x69, 0x6e, 0x6b, 0x44,
|
||||
0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x05, 0x2a, 0x28, 0x0a, 0x08, 0x44, 0x65,
|
||||
0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x10,
|
||||
0x00, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x69,
|
||||
0x6e, 0x6b, 0x10, 0x02, 0x2a, 0x34, 0x0a, 0x09, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
|
||||
0x65, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x10, 0x00, 0x12, 0x0d,
|
||||
0x0a, 0x09, 0x55, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x10, 0x01, 0x12, 0x0b, 0x0a,
|
||||
0x07, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69,
|
||||
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74,
|
||||
0x69, 0x2f, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x2f, 0x63, 0x74, 0x72, 0x6c,
|
||||
0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f,
|
||||
0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x41,
|
||||
0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65,
|
||||
0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14,
|
||||
0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x66,
|
||||
0x6c, 0x61, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65,
|
||||
0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
|
||||
0x65, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0a,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
|
||||
0x32, 0x17, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e,
|
||||
0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72,
|
||||
0x66, 0x61, 0x63, 0x65, 0x73, 0x2a, 0xc5, 0x06, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
||||
0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12,
|
||||
0x17, 0x0a, 0x12, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
||||
0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x0d, 0x0a, 0x08, 0x44, 0x69, 0x61, 0x6c,
|
||||
0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, 0x12, 0x16, 0x0a, 0x11, 0x4c, 0x69, 0x6e, 0x6b, 0x43,
|
||||
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12,
|
||||
0x0e, 0x0a, 0x09, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x07, 0x12,
|
||||
0x0e, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x07, 0x12,
|
||||
0x10, 0x0a, 0x0b, 0x55, 0x6e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee,
|
||||
0x07, 0x12, 0x10, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x79, 0x70, 0x65,
|
||||
0x10, 0xef, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x50, 0x69, 0x70,
|
||||
0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79,
|
||||
0x70, 0x65, 0x10, 0xf0, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x45, 0x76,
|
||||
0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x43, 0x72,
|
||||
0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65,
|
||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x07, 0x12, 0x20, 0x0a, 0x1b,
|
||||
0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72,
|
||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x07, 0x12, 0x17,
|
||||
0x0a, 0x12, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x54, 0x79, 0x70, 0x65, 0x10, 0xf5, 0x07, 0x12, 0x18, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x70, 0x65,
|
||||
0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6,
|
||||
0x07, 0x12, 0x23, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72,
|
||||
0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0xf9, 0x07, 0x12, 0x20, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
|
||||
0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
|
||||
0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfa, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74,
|
||||
0x69, 0x6e, 0x67, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfc, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x43,
|
||||
0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8a, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75,
|
||||
0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0x8b, 0x08, 0x12,
|
||||
0x15, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0x8c, 0x08, 0x12, 0x1c, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
|
||||
0x43, 0x74, 0x72, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x54, 0x79, 0x70,
|
||||
0x65, 0x10, 0x8d, 0x08, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65,
|
||||
0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x54, 0x79, 0x70, 0x65, 0x10, 0x8e, 0x08, 0x12, 0x1d, 0x0a, 0x18, 0x51, 0x75, 0x69, 0x65, 0x73,
|
||||
0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0x8f, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x44, 0x65, 0x71, 0x75, 0x69, 0x65,
|
||||
0x73, 0x63, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x54, 0x79, 0x70, 0x65, 0x10, 0x90, 0x08, 0x12, 0x25, 0x0a, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64,
|
||||
0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x56, 0x32,
|
||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x91, 0x08, 0x12, 0x26,
|
||||
0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e,
|
||||
0x61, 0x74, 0x6f, 0x72, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54,
|
||||
0x79, 0x70, 0x65, 0x10, 0x92, 0x08, 0x12, 0x22, 0x0a, 0x1d, 0x44, 0x65, 0x63, 0x6f, 0x6d, 0x6d,
|
||||
0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
|
||||
0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x93, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x65,
|
||||
0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x9a, 0x08, 0x12, 0x23, 0x0a, 0x1e, 0x55,
|
||||
0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64,
|
||||
0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x9b, 0x08,
|
||||
0x12, 0x1b, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72,
|
||||
0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x10, 0x9c, 0x08, 0x2a, 0x67, 0x0a,
|
||||
0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12,
|
||||
0x0e, 0x0a, 0x0a, 0x4e, 0x6f, 0x6e, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x00, 0x12,
|
||||
0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x48, 0x65, 0x61, 0x64,
|
||||
0x65, 0x72, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x4d, 0x65,
|
||||
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x10, 0x0b, 0x12, 0x16,
|
||||
0x0a, 0x12, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x65,
|
||||
0x61, 0x64, 0x65, 0x72, 0x10, 0x0c, 0x2a, 0x3a, 0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72,
|
||||
0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x61,
|
||||
0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x12,
|
||||
0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74,
|
||||
0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70,
|
||||
0x65, 0x73, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74,
|
||||
0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x43, 0x74, 0x72, 0x6c,
|
||||
0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x10, 0x01, 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72,
|
||||
0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63,
|
||||
0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c,
|
||||
0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
|
||||
0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x17, 0x54, 0x65, 0x72, 0x6d,
|
||||
0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, 0x61,
|
||||
0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x69,
|
||||
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x6e, 0x6b, 0x6e, 0x6f,
|
||||
0x77, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0c,
|
||||
0x0a, 0x08, 0x42, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x10, 0x02, 0x2a, 0x83, 0x01, 0x0a,
|
||||
0x0c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x10, 0x0a,
|
||||
0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12,
|
||||
0x0f, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x01,
|
||||
0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x02, 0x12,
|
||||
0x10, 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10,
|
||||
0x03, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x77, 0x6e, 0x65,
|
||||
0x72, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x04, 0x12,
|
||||
0x11, 0x0a, 0x0d, 0x4c, 0x69, 0x6e, 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65,
|
||||
0x10, 0x05, 0x2a, 0x28, 0x0a, 0x08, 0x44, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09,
|
||||
0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, 0x64,
|
||||
0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x10, 0x02, 0x2a, 0x34, 0x0a, 0x09,
|
||||
0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x65, 0x61,
|
||||
0x6c, 0x74, 0x68, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x68, 0x65, 0x61, 0x6c,
|
||||
0x74, 0x68, 0x79, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64,
|
||||
0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
|
||||
0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63,
|
||||
0x2f, 0x70, 0x62, 0x2f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -3045,7 +3200,7 @@ func file_ctrl_proto_rawDescGZIP() []byte {
|
||||
}
|
||||
|
||||
var file_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 9)
|
||||
var file_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 42)
|
||||
var file_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 44)
|
||||
var file_ctrl_proto_goTypes = []interface{}{
|
||||
(ContentType)(0), // 0: ziti.ctrl.pb.ContentType
|
||||
(ControlHeaders)(0), // 1: ziti.ctrl.pb.ControlHeaders
|
||||
@@ -3086,52 +3241,55 @@ var file_ctrl_proto_goTypes = []interface{}{
|
||||
(*PeerStateChange)(nil), // 36: ziti.ctrl.pb.PeerStateChange
|
||||
(*PeerStateChanges)(nil), // 37: ziti.ctrl.pb.PeerStateChanges
|
||||
(*RouterMetadata)(nil), // 38: ziti.ctrl.pb.RouterMetadata
|
||||
nil, // 39: ziti.ctrl.pb.Settings.DataEntry
|
||||
nil, // 40: ziti.ctrl.pb.CircuitRequest.PeerDataEntry
|
||||
nil, // 41: ziti.ctrl.pb.CircuitConfirmation.IdleTimesEntry
|
||||
nil, // 42: ziti.ctrl.pb.CreateTerminatorRequest.PeerDataEntry
|
||||
nil, // 43: ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry
|
||||
(*RouterLinks_RouterLink)(nil), // 44: ziti.ctrl.pb.RouterLinks.RouterLink
|
||||
nil, // 45: ziti.ctrl.pb.Context.FieldsEntry
|
||||
(*Route_Egress)(nil), // 46: ziti.ctrl.pb.Route.Egress
|
||||
(*Route_Forward)(nil), // 47: ziti.ctrl.pb.Route.Forward
|
||||
nil, // 48: ziti.ctrl.pb.Route.TagsEntry
|
||||
nil, // 49: ziti.ctrl.pb.Route.Egress.PeerDataEntry
|
||||
(*InspectResponse_InspectValue)(nil), // 50: ziti.ctrl.pb.InspectResponse.InspectValue
|
||||
(*Interface)(nil), // 39: ziti.ctrl.pb.Interface
|
||||
(*RouterInterfacesUpdate)(nil), // 40: ziti.ctrl.pb.RouterInterfacesUpdate
|
||||
nil, // 41: ziti.ctrl.pb.Settings.DataEntry
|
||||
nil, // 42: ziti.ctrl.pb.CircuitRequest.PeerDataEntry
|
||||
nil, // 43: ziti.ctrl.pb.CircuitConfirmation.IdleTimesEntry
|
||||
nil, // 44: ziti.ctrl.pb.CreateTerminatorRequest.PeerDataEntry
|
||||
nil, // 45: ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry
|
||||
(*RouterLinks_RouterLink)(nil), // 46: ziti.ctrl.pb.RouterLinks.RouterLink
|
||||
nil, // 47: ziti.ctrl.pb.Context.FieldsEntry
|
||||
(*Route_Egress)(nil), // 48: ziti.ctrl.pb.Route.Egress
|
||||
(*Route_Forward)(nil), // 49: ziti.ctrl.pb.Route.Forward
|
||||
nil, // 50: ziti.ctrl.pb.Route.TagsEntry
|
||||
nil, // 51: ziti.ctrl.pb.Route.Egress.PeerDataEntry
|
||||
(*InspectResponse_InspectValue)(nil), // 52: ziti.ctrl.pb.InspectResponse.InspectValue
|
||||
}
|
||||
var file_ctrl_proto_depIdxs = []int32{
|
||||
39, // 0: ziti.ctrl.pb.Settings.data:type_name -> ziti.ctrl.pb.Settings.DataEntry
|
||||
40, // 1: ziti.ctrl.pb.CircuitRequest.peerData:type_name -> ziti.ctrl.pb.CircuitRequest.PeerDataEntry
|
||||
41, // 2: ziti.ctrl.pb.CircuitConfirmation.idleTimes:type_name -> ziti.ctrl.pb.CircuitConfirmation.IdleTimesEntry
|
||||
42, // 3: ziti.ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.ctrl.pb.CreateTerminatorRequest.PeerDataEntry
|
||||
41, // 0: ziti.ctrl.pb.Settings.data:type_name -> ziti.ctrl.pb.Settings.DataEntry
|
||||
42, // 1: ziti.ctrl.pb.CircuitRequest.peerData:type_name -> ziti.ctrl.pb.CircuitRequest.PeerDataEntry
|
||||
43, // 2: ziti.ctrl.pb.CircuitConfirmation.idleTimes:type_name -> ziti.ctrl.pb.CircuitConfirmation.IdleTimesEntry
|
||||
44, // 3: ziti.ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.ctrl.pb.CreateTerminatorRequest.PeerDataEntry
|
||||
4, // 4: ziti.ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.ctrl.pb.TerminatorPrecedence
|
||||
15, // 5: ziti.ctrl.pb.ValidateTerminatorsRequest.terminators:type_name -> ziti.ctrl.pb.Terminator
|
||||
15, // 6: ziti.ctrl.pb.ValidateTerminatorsV2Request.terminators:type_name -> ziti.ctrl.pb.Terminator
|
||||
5, // 7: ziti.ctrl.pb.RouterTerminatorState.reason:type_name -> ziti.ctrl.pb.TerminatorInvalidReason
|
||||
43, // 8: ziti.ctrl.pb.ValidateTerminatorsV2Response.states:type_name -> ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry
|
||||
45, // 8: ziti.ctrl.pb.ValidateTerminatorsV2Response.states:type_name -> ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry
|
||||
4, // 9: ziti.ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.ctrl.pb.TerminatorPrecedence
|
||||
22, // 10: ziti.ctrl.pb.LinkConnected.conns:type_name -> ziti.ctrl.pb.LinkConn
|
||||
44, // 11: ziti.ctrl.pb.RouterLinks.links:type_name -> ziti.ctrl.pb.RouterLinks.RouterLink
|
||||
46, // 11: ziti.ctrl.pb.RouterLinks.links:type_name -> ziti.ctrl.pb.RouterLinks.RouterLink
|
||||
6, // 12: ziti.ctrl.pb.Fault.subject:type_name -> ziti.ctrl.pb.FaultSubject
|
||||
45, // 13: ziti.ctrl.pb.Context.fields:type_name -> ziti.ctrl.pb.Context.FieldsEntry
|
||||
46, // 14: ziti.ctrl.pb.Route.egress:type_name -> ziti.ctrl.pb.Route.Egress
|
||||
47, // 15: ziti.ctrl.pb.Route.forwards:type_name -> ziti.ctrl.pb.Route.Forward
|
||||
47, // 13: ziti.ctrl.pb.Context.fields:type_name -> ziti.ctrl.pb.Context.FieldsEntry
|
||||
48, // 14: ziti.ctrl.pb.Route.egress:type_name -> ziti.ctrl.pb.Route.Egress
|
||||
49, // 15: ziti.ctrl.pb.Route.forwards:type_name -> ziti.ctrl.pb.Route.Forward
|
||||
26, // 16: ziti.ctrl.pb.Route.context:type_name -> ziti.ctrl.pb.Context
|
||||
48, // 17: ziti.ctrl.pb.Route.tags:type_name -> ziti.ctrl.pb.Route.TagsEntry
|
||||
50, // 18: ziti.ctrl.pb.InspectResponse.values:type_name -> ziti.ctrl.pb.InspectResponse.InspectValue
|
||||
50, // 17: ziti.ctrl.pb.Route.tags:type_name -> ziti.ctrl.pb.Route.TagsEntry
|
||||
52, // 18: ziti.ctrl.pb.InspectResponse.values:type_name -> ziti.ctrl.pb.InspectResponse.InspectValue
|
||||
32, // 19: ziti.ctrl.pb.Listeners.listeners:type_name -> ziti.ctrl.pb.Listener
|
||||
8, // 20: ziti.ctrl.pb.PeerStateChange.state:type_name -> ziti.ctrl.pb.PeerState
|
||||
32, // 21: ziti.ctrl.pb.PeerStateChange.listeners:type_name -> ziti.ctrl.pb.Listener
|
||||
36, // 22: ziti.ctrl.pb.PeerStateChanges.changes:type_name -> ziti.ctrl.pb.PeerStateChange
|
||||
2, // 23: ziti.ctrl.pb.RouterMetadata.capabilities:type_name -> ziti.ctrl.pb.RouterCapability
|
||||
18, // 24: ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry.value:type_name -> ziti.ctrl.pb.RouterTerminatorState
|
||||
49, // 25: ziti.ctrl.pb.Route.Egress.peerData:type_name -> ziti.ctrl.pb.Route.Egress.PeerDataEntry
|
||||
7, // 26: ziti.ctrl.pb.Route.Forward.dstType:type_name -> ziti.ctrl.pb.DestType
|
||||
27, // [27:27] is the sub-list for method output_type
|
||||
27, // [27:27] is the sub-list for method input_type
|
||||
27, // [27:27] is the sub-list for extension type_name
|
||||
27, // [27:27] is the sub-list for extension extendee
|
||||
0, // [0:27] is the sub-list for field type_name
|
||||
39, // 24: ziti.ctrl.pb.RouterInterfacesUpdate.interfaces:type_name -> ziti.ctrl.pb.Interface
|
||||
18, // 25: ziti.ctrl.pb.ValidateTerminatorsV2Response.StatesEntry.value:type_name -> ziti.ctrl.pb.RouterTerminatorState
|
||||
51, // 26: ziti.ctrl.pb.Route.Egress.peerData:type_name -> ziti.ctrl.pb.Route.Egress.PeerDataEntry
|
||||
7, // 27: ziti.ctrl.pb.Route.Forward.dstType:type_name -> ziti.ctrl.pb.DestType
|
||||
28, // [28:28] is the sub-list for method output_type
|
||||
28, // [28:28] is the sub-list for method input_type
|
||||
28, // [28:28] is the sub-list for extension type_name
|
||||
28, // [28:28] is the sub-list for extension extendee
|
||||
0, // [0:28] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_ctrl_proto_init() }
|
||||
@@ -3500,8 +3658,20 @@ func file_ctrl_proto_init() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RouterLinks_RouterLink); i {
|
||||
file_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Interface); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RouterInterfacesUpdate); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@@ -3513,6 +3683,18 @@ func file_ctrl_proto_init() {
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RouterLinks_RouterLink); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Route_Egress); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
@@ -3524,7 +3706,7 @@ func file_ctrl_proto_init() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
|
||||
file_ctrl_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Route_Forward); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
@@ -3536,7 +3718,7 @@ func file_ctrl_proto_init() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_ctrl_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
|
||||
file_ctrl_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*InspectResponse_InspectValue); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
@@ -3555,7 +3737,7 @@ func file_ctrl_proto_init() {
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_ctrl_proto_rawDesc,
|
||||
NumEnums: 9,
|
||||
NumMessages: 42,
|
||||
NumMessages: 44,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
||||
@@ -42,6 +42,8 @@ enum ContentType {
|
||||
|
||||
PeerStateChangeRequestType = 1050;
|
||||
UpdateClusterLeaderRequestType = 1051;
|
||||
|
||||
UpdateRouterInterfaces = 1052;
|
||||
}
|
||||
|
||||
enum ControlHeaders {
|
||||
@@ -292,4 +294,17 @@ message PeerStateChanges {
|
||||
|
||||
message RouterMetadata {
|
||||
repeated RouterCapability capabilities = 1;
|
||||
}
|
||||
|
||||
message Interface {
|
||||
string name = 1;
|
||||
string hardwareAddress = 2;
|
||||
int64 mtu = 3;
|
||||
int64 index = 4;
|
||||
uint64 flags = 5;
|
||||
repeated string addresses = 6;
|
||||
}
|
||||
|
||||
message RouterInterfacesUpdate {
|
||||
repeated Interface interfaces = 1;
|
||||
}
|
||||
@@ -113,3 +113,7 @@ func (request *PeerStateChanges) GetContentType() int32 {
|
||||
func (request *UpdateClusterLeader) GetContentType() int32 {
|
||||
return int32(ContentType_UpdateClusterLeaderRequestType)
|
||||
}
|
||||
|
||||
func (request *RouterInterfacesUpdate) GetContentType() int32 {
|
||||
return int32(ContentType_UpdateRouterInterfaces)
|
||||
}
|
||||
|
||||
+1022
-886
File diff suppressed because it is too large
Load Diff
@@ -195,6 +195,15 @@ message ApiAddress {
|
||||
string Version = 2;
|
||||
}
|
||||
|
||||
message Interface {
|
||||
string name = 1;
|
||||
string hardwareAddress = 2;
|
||||
int64 mtu = 3;
|
||||
int64 index = 4;
|
||||
uint64 flags = 5;
|
||||
repeated string addresses = 6;
|
||||
}
|
||||
|
||||
// Edge Routers
|
||||
message EdgeRouter {
|
||||
string id = 1;
|
||||
@@ -212,6 +221,7 @@ message EdgeRouter {
|
||||
uint32 cost = 13;
|
||||
bool noTraversal = 14;
|
||||
bool disabled = 15;
|
||||
repeated Interface interfaces = 16;
|
||||
}
|
||||
|
||||
message ReEnrollEdgeRouterCmd {
|
||||
@@ -328,6 +338,7 @@ message Identity {
|
||||
optional google.protobuf.Timestamp disabledAt = 18;
|
||||
optional google.protobuf.Timestamp disabledUntil = 19;
|
||||
repeated ServiceConfig serviceConfigs = 20;
|
||||
repeated Interface interfaces = 21;
|
||||
}
|
||||
|
||||
message CreateIdentityWithEnrollmentsCmd {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package api_impl
|
||||
|
||||
import (
|
||||
"github.com/openziti/foundation/v2/util"
|
||||
"github.com/openziti/ziti/controller/api"
|
||||
"github.com/openziti/ziti/controller/model"
|
||||
"github.com/openziti/ziti/controller/network"
|
||||
@@ -135,5 +136,21 @@ func (RouterModelMapper) ToApi(n *network.Network, _ api.RequestContext, router
|
||||
}
|
||||
}
|
||||
|
||||
for _, intf := range router.Interfaces {
|
||||
apiIntf := &rest_model.Interface{
|
||||
HardwareAddress: &intf.HardwareAddress,
|
||||
Index: &intf.Index,
|
||||
IsBroadcast: util.Ptr(intf.IsBroadcast()),
|
||||
IsLoopback: util.Ptr(intf.IsLoopback()),
|
||||
IsMulticast: util.Ptr(intf.IsMulticast()),
|
||||
IsRunning: util.Ptr(intf.IsRunning()),
|
||||
IsUp: util.Ptr(intf.IsUp()),
|
||||
Mtu: &intf.MTU,
|
||||
Name: &intf.Name,
|
||||
Addresses: intf.Addresses,
|
||||
}
|
||||
ret.Interfaces = append(ret.Interfaces, apiIntf)
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
@@ -180,7 +180,6 @@ func (store *edgeRouterStoreImpl) FillEntity(entity *EdgeRouter, bucket *boltz.T
|
||||
|
||||
entity.RoleAttributes = bucket.GetStringList(FieldRoleAttributes)
|
||||
entity.AppData = bucket.GetMap(FieldEdgeRouterAppData)
|
||||
|
||||
}
|
||||
|
||||
func (store *edgeRouterStoreImpl) PersistEntity(entity *EdgeRouter, ctx *boltz.PersistContext) {
|
||||
|
||||
@@ -112,6 +112,7 @@ type Identity struct {
|
||||
DisabledUntil *time.Time `json:"disabledUntil"`
|
||||
Disabled bool `json:"disabled"`
|
||||
ServiceConfigs map[string]map[string]string `json:"serviceConfigs"`
|
||||
Interfaces []*Interface `json:"interfaces"`
|
||||
}
|
||||
|
||||
func (entity *Identity) GetEntityType() string {
|
||||
@@ -268,6 +269,7 @@ func (store *identityStoreImpl) FillEntity(entity *Identity, bucket *boltz.Typed
|
||||
}
|
||||
|
||||
store.fillServiceConfig(entity, bucket)
|
||||
entity.Interfaces = loadInterfaces(bucket)
|
||||
}
|
||||
|
||||
func (store *identityStoreImpl) fillServiceConfig(entity *Identity, entityBucket *boltz.TypedBucket) {
|
||||
@@ -383,6 +385,7 @@ func (store *identityStoreImpl) PersistEntity(entity *Identity, ctx *boltz.Persi
|
||||
}
|
||||
|
||||
store.persistServiceConfigs(entity, ctx)
|
||||
storeInterfaces(entity.Interfaces, ctx)
|
||||
}
|
||||
|
||||
func (store *identityStoreImpl) persistServiceConfigs(entity *Identity, ctx *boltz.PersistContext) {
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package db
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/openziti/storage/boltz"
|
||||
"net"
|
||||
)
|
||||
|
||||
const (
|
||||
FieldInterfaces = "interfaces"
|
||||
FieldInterfaceHardwareAddress = "addr"
|
||||
FieldInterfaceMtu = "mtu"
|
||||
FieldInterfaceIndex = "index"
|
||||
FieldInterfaceFlags = "flags"
|
||||
FieldInterfaceAddresses = "addrs"
|
||||
)
|
||||
|
||||
type Interface struct {
|
||||
Name string `json:"name"`
|
||||
HardwareAddress string `json:"hardwareAddress"`
|
||||
MTU int64 `json:"mtu"`
|
||||
Index int64 `json:"index"`
|
||||
Flags uint64 `json:"flags"`
|
||||
Addresses []string `json:"addresses"`
|
||||
}
|
||||
|
||||
func (self *Interface) IsUp() bool {
|
||||
return self.IsFlagSet(net.FlagUp)
|
||||
}
|
||||
|
||||
func (self *Interface) IsRunning() bool {
|
||||
return self.IsFlagSet(net.FlagRunning)
|
||||
}
|
||||
|
||||
func (self *Interface) IsLoopback() bool {
|
||||
return self.IsFlagSet(net.FlagLoopback)
|
||||
}
|
||||
|
||||
func (self *Interface) IsBroadcast() bool {
|
||||
return self.IsFlagSet(net.FlagBroadcast)
|
||||
}
|
||||
|
||||
func (self *Interface) IsMulticast() bool {
|
||||
return self.IsFlagSet(net.FlagMulticast)
|
||||
}
|
||||
|
||||
func (self *Interface) IsFlagSet(f net.Flags) bool {
|
||||
return net.Flags(self.Flags)&f == f
|
||||
}
|
||||
|
||||
func (self *Interface) MarshalJSON() ([]byte, error) {
|
||||
result := map[string]any{}
|
||||
result["name"] = self.Name
|
||||
result["hardwareAddress"] = self.HardwareAddress
|
||||
result["mtu"] = self.MTU
|
||||
result["index"] = self.Index
|
||||
result["isBroadcast"] = self.IsBroadcast()
|
||||
result["isLoopback"] = self.IsLoopback()
|
||||
result["isMulticast"] = self.IsMulticast()
|
||||
result["isRunning"] = self.IsRunning()
|
||||
result["isUp"] = self.IsUp()
|
||||
result["addresses"] = self.Addresses
|
||||
|
||||
return json.Marshal(result)
|
||||
}
|
||||
|
||||
func (self *Interface) toBoltMap() map[string]any {
|
||||
result := map[string]any{}
|
||||
result[FieldName] = self.Name
|
||||
result[FieldInterfaceHardwareAddress] = self.HardwareAddress
|
||||
result[FieldInterfaceMtu] = self.MTU
|
||||
result[FieldInterfaceIndex] = self.Index
|
||||
result[FieldInterfaceFlags] = int64(self.Flags)
|
||||
|
||||
addresses := make([]any, len(self.Addresses))
|
||||
for i, address := range self.Addresses {
|
||||
addresses[i] = address
|
||||
}
|
||||
result[FieldInterfaceAddresses] = addresses
|
||||
return result
|
||||
}
|
||||
|
||||
func (self *Interface) FillEntity(bucket *boltz.TypedBucket) {
|
||||
self.Name = bucket.GetStringOrError(FieldName)
|
||||
self.HardwareAddress = bucket.GetStringOrError(FieldInterfaceHardwareAddress)
|
||||
self.MTU = bucket.GetInt64WithDefault(FieldInterfaceMtu, 0)
|
||||
self.Index = bucket.GetInt64WithDefault(FieldInterfaceIndex, 0)
|
||||
self.Flags = uint64(bucket.GetInt64WithDefault(FieldInterfaceFlags, 0))
|
||||
addresses := bucket.GetList(FieldInterfaceAddresses)
|
||||
for _, address := range addresses {
|
||||
self.Addresses = append(self.Addresses, address.(string))
|
||||
}
|
||||
}
|
||||
|
||||
func loadInterfaces(bucket *boltz.TypedBucket) []*Interface {
|
||||
var result []*Interface
|
||||
if interfacesBucket := bucket.GetBucket(FieldInterfaces); interfacesBucket != nil {
|
||||
err := interfacesBucket.ForEachTypedBucket(func(_ string, intfBucket *boltz.TypedBucket) error {
|
||||
intf := &Interface{}
|
||||
intf.FillEntity(intfBucket)
|
||||
result = append(result, intf)
|
||||
return bucket.Err
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
bucket.SetError(err)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func storeInterfaces(interfaces []*Interface, ctx *boltz.PersistContext) {
|
||||
if ctx.ProceedWithSet(FieldInterfaces) {
|
||||
m := map[string]any{}
|
||||
for idx, v := range interfaces {
|
||||
m[fmt.Sprintf("%d.%s", idx, v.Name)] = v.toBoltMap()
|
||||
}
|
||||
ctx.SetMap(FieldInterfaces, m)
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
"github.com/openziti/storage/ast"
|
||||
"github.com/openziti/storage/boltz"
|
||||
"go.etcd.io/bbolt"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -32,11 +33,12 @@ const (
|
||||
|
||||
type Router struct {
|
||||
boltz.BaseExtEntity
|
||||
Name string `json:"name"`
|
||||
Fingerprint *string `json:"fingerprint"`
|
||||
Cost uint16 `json:"cost"`
|
||||
NoTraversal bool `json:"noTraversal"`
|
||||
Disabled bool `json:"disabled"`
|
||||
Name string `json:"name"`
|
||||
Fingerprint *string `json:"fingerprint"`
|
||||
Cost uint16 `json:"cost"`
|
||||
NoTraversal bool `json:"noTraversal"`
|
||||
Disabled bool `json:"disabled"`
|
||||
Interfaces []*Interface `json:"interfaces"`
|
||||
}
|
||||
|
||||
func (entity *Router) GetEntityType() string {
|
||||
@@ -93,6 +95,7 @@ func (self *routerStoreImpl) FillEntity(entity *Router, bucket *boltz.TypedBucke
|
||||
entity.Cost = uint16(bucket.GetInt32WithDefault(FieldRouterCost, 0))
|
||||
entity.NoTraversal = bucket.GetBoolWithDefault(FieldRouterNoTraversal, false)
|
||||
entity.Disabled = bucket.GetBoolWithDefault(FieldRouterDisabled, false)
|
||||
entity.Interfaces = loadInterfaces(bucket)
|
||||
}
|
||||
|
||||
func (self *routerStoreImpl) PersistEntity(entity *Router, ctx *boltz.PersistContext) {
|
||||
@@ -102,6 +105,13 @@ func (self *routerStoreImpl) PersistEntity(entity *Router, ctx *boltz.PersistCon
|
||||
ctx.SetInt32(FieldRouterCost, int32(entity.Cost))
|
||||
ctx.SetBool(FieldRouterNoTraversal, entity.NoTraversal)
|
||||
ctx.SetBool(FieldRouterDisabled, entity.Disabled)
|
||||
storeInterfaces(entity.Interfaces, ctx)
|
||||
}
|
||||
|
||||
func (self *routerStoreImpl) UpdateInterfaces(entity *Router, interfaces map[string]*Interface, ctx *boltz.PersistContext) {
|
||||
now := time.Now()
|
||||
ctx.Bucket.SetTimeP(boltz.FieldUpdatedAt, &now, nil)
|
||||
|
||||
}
|
||||
|
||||
func (store *routerStoreImpl) GetNameIndex() boltz.ReadIndex {
|
||||
|
||||
@@ -73,6 +73,7 @@ func (self *bindHandler) BindChannel(binding channel.Binding) error {
|
||||
binding.AddTypedReceiveHandler(newQuiesceRouterHandler(self.router, self.network))
|
||||
binding.AddTypedReceiveHandler(newDequiesceRouterHandler(self.router, self.network))
|
||||
binding.AddTypedReceiveHandler(newDecommissionRouterHandler(self.router, self.network))
|
||||
binding.AddTypedReceiveHandler(newUpdateRouterInterfacesHandler(self.router, self.network))
|
||||
binding.AddTypedReceiveHandler(newPingHandler())
|
||||
binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{
|
||||
Type: int32(ctrl_pb.ContentType_ValidateTerminatorsV2ResponseType),
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package handler_ctrl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/michaelquigley/pfxlog"
|
||||
"github.com/openziti/channel/v4"
|
||||
"github.com/openziti/ziti/common/handler_common"
|
||||
"github.com/openziti/ziti/common/pb/ctrl_pb"
|
||||
"github.com/openziti/ziti/controller/model"
|
||||
"github.com/openziti/ziti/controller/network"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
type updateRouterInterfacesHandler struct {
|
||||
baseHandler
|
||||
}
|
||||
|
||||
func newUpdateRouterInterfacesHandler(r *model.Router, network *network.Network) *updateRouterInterfacesHandler {
|
||||
return &updateRouterInterfacesHandler{
|
||||
baseHandler: baseHandler{
|
||||
router: r,
|
||||
network: network,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (self *updateRouterInterfacesHandler) ContentType() int32 {
|
||||
return int32(ctrl_pb.ContentType_UpdateRouterInterfaces)
|
||||
}
|
||||
|
||||
func (self *updateRouterInterfacesHandler) HandleReceive(msg *channel.Message, ch channel.Channel) {
|
||||
log := pfxlog.ContextLogger(ch.Label()).Entry
|
||||
|
||||
request := &ctrl_pb.RouterInterfacesUpdate{}
|
||||
if err := proto.Unmarshal(msg.Body, request); err != nil {
|
||||
log.WithError(err).Error("could not unmarshal update router interfaces request")
|
||||
return
|
||||
}
|
||||
|
||||
go self.updateRouterInterfaces(msg, ch, request)
|
||||
}
|
||||
|
||||
func (self *updateRouterInterfacesHandler) updateRouterInterfaces(msg *channel.Message, ch channel.Channel, request *ctrl_pb.RouterInterfacesUpdate) {
|
||||
log := pfxlog.Logger().WithField("routerId", self.router.Id)
|
||||
|
||||
var interfaces []*model.Interface
|
||||
for _, intf := range request.Interfaces {
|
||||
interfaces = append(interfaces, &model.Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
MTU: intf.Mtu,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
ctx := self.newChangeContext(ch, "fabric.create.terminator")
|
||||
err := self.network.Managers.Router.UpdateRouterInterfaces(self.router.Id, interfaces, ctx)
|
||||
if err != nil {
|
||||
log.WithError(err).Error("could not update router interfaces")
|
||||
handler_common.SendFailure(msg, ch, fmt.Errorf("failed to update router network interfaces (%w)", err).Error())
|
||||
} else {
|
||||
log.Debug("router network interfaces updated")
|
||||
handler_common.SendSuccess(msg, ch, "success")
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"github.com/openziti/foundation/v2/util"
|
||||
"github.com/openziti/foundation/v2/versions"
|
||||
|
||||
"strings"
|
||||
@@ -164,6 +165,22 @@ func MapEdgeRouterToRestModel(ae *env.AppEnv, router *model.EdgeRouter) (*rest_m
|
||||
UnverifiedCertPem: router.UnverifiedCertPem,
|
||||
}
|
||||
|
||||
for _, intf := range router.Interfaces {
|
||||
apiIntf := &rest_model.Interface{
|
||||
HardwareAddress: &intf.HardwareAddress,
|
||||
Index: &intf.Index,
|
||||
IsBroadcast: util.Ptr(intf.IsBroadcast()),
|
||||
IsLoopback: util.Ptr(intf.IsLoopback()),
|
||||
IsMulticast: util.Ptr(intf.IsMulticast()),
|
||||
IsRunning: util.Ptr(intf.IsRunning()),
|
||||
IsUp: util.Ptr(intf.IsUp()),
|
||||
Mtu: &intf.MTU,
|
||||
Name: &intf.Name,
|
||||
Addresses: intf.Addresses,
|
||||
}
|
||||
ret.Interfaces = append(ret.Interfaces, apiIntf)
|
||||
}
|
||||
|
||||
if !router.IsVerified {
|
||||
var enrollments []*model.Enrollment
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
"github.com/michaelquigley/pfxlog"
|
||||
"github.com/openziti/edge-api/rest_model"
|
||||
"github.com/openziti/foundation/v2/stringz"
|
||||
"github.com/openziti/foundation/v2/util"
|
||||
"github.com/openziti/sdk-golang/ziti"
|
||||
"github.com/openziti/ziti/controller/db"
|
||||
"github.com/openziti/ziti/controller/env"
|
||||
@@ -300,6 +301,23 @@ func MapIdentityToRestModel(ae *env.AppEnv, identity *model.Identity) (*rest_mod
|
||||
Type: ToEntityRef(identityType.Name, identityType, IdentityTypeLinkFactory),
|
||||
TypeID: &identityType.Id,
|
||||
}
|
||||
|
||||
for _, intf := range identity.Interfaces {
|
||||
apiIntf := &rest_model.Interface{
|
||||
HardwareAddress: &intf.HardwareAddress,
|
||||
Index: &intf.Index,
|
||||
IsBroadcast: util.Ptr(intf.IsBroadcast()),
|
||||
IsLoopback: util.Ptr(intf.IsLoopback()),
|
||||
IsMulticast: util.Ptr(intf.IsMulticast()),
|
||||
IsRunning: util.Ptr(intf.IsRunning()),
|
||||
IsUp: util.Ptr(intf.IsUp()),
|
||||
Mtu: &intf.MTU,
|
||||
Name: &intf.Name,
|
||||
Addresses: intf.Addresses,
|
||||
}
|
||||
ret.Interfaces = append(ret.Interfaces, apiIntf)
|
||||
}
|
||||
|
||||
fillInfo(ret, identity.EnvInfo, identity.SdkInfo)
|
||||
|
||||
ret.Authenticators = &rest_model.IdentityAuthenticators{}
|
||||
|
||||
@@ -458,6 +458,17 @@ func (self *EdgeRouterManager) EdgeRouterToProtobuf(entity *EdgeRouter) (*edge_c
|
||||
Disabled: entity.Disabled,
|
||||
}
|
||||
|
||||
for _, intf := range entity.Interfaces {
|
||||
msg.Interfaces = append(msg.Interfaces, &edge_cmd_pb.Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
Mtu: intf.MTU,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
@@ -475,7 +486,7 @@ func (self *EdgeRouterManager) ProtobufToEdgeRouter(msg *edge_cmd_pb.EdgeRouter)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &EdgeRouter{
|
||||
result := &EdgeRouter{
|
||||
BaseEntity: models.BaseEntity{
|
||||
Id: msg.Id,
|
||||
Tags: edge_cmd_pb.DecodeTags(msg.Tags),
|
||||
@@ -493,7 +504,20 @@ func (self *EdgeRouterManager) ProtobufToEdgeRouter(msg *edge_cmd_pb.EdgeRouter)
|
||||
Cost: uint16(msg.Cost),
|
||||
NoTraversal: msg.NoTraversal,
|
||||
Disabled: msg.Disabled,
|
||||
}, nil
|
||||
}
|
||||
|
||||
for _, intf := range msg.Interfaces {
|
||||
result.Interfaces = append(result.Interfaces, &Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
MTU: intf.Mtu,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (self *EdgeRouterManager) Unmarshall(bytes []byte) (*EdgeRouter, error) {
|
||||
|
||||
@@ -40,6 +40,7 @@ type EdgeRouter struct {
|
||||
Cost uint16
|
||||
NoTraversal bool
|
||||
Disabled bool
|
||||
Interfaces []*Interface
|
||||
}
|
||||
|
||||
func (self *EdgeRouter) GetName() string {
|
||||
@@ -54,6 +55,7 @@ func (entity *EdgeRouter) toBoltEntityForCreate(*bbolt.Tx, Env) (*db.EdgeRouter,
|
||||
Cost: entity.Cost,
|
||||
NoTraversal: entity.NoTraversal,
|
||||
Disabled: entity.Disabled,
|
||||
Interfaces: InterfacesToBolt(entity.Interfaces),
|
||||
},
|
||||
RoleAttributes: entity.RoleAttributes,
|
||||
IsVerified: false,
|
||||
@@ -73,6 +75,7 @@ func (entity *EdgeRouter) toBoltEntityForUpdate(*bbolt.Tx, Env, boltz.FieldCheck
|
||||
Cost: entity.Cost,
|
||||
NoTraversal: entity.NoTraversal,
|
||||
Disabled: entity.Disabled,
|
||||
Interfaces: InterfacesToBolt(entity.Interfaces),
|
||||
},
|
||||
RoleAttributes: entity.RoleAttributes,
|
||||
IsVerified: entity.IsVerified,
|
||||
@@ -98,6 +101,6 @@ func (entity *EdgeRouter) fillFrom(_ Env, _ *bbolt.Tx, boltEdgeRouter *db.EdgeRo
|
||||
entity.Cost = boltEdgeRouter.Cost
|
||||
entity.NoTraversal = boltEdgeRouter.NoTraversal
|
||||
entity.Disabled = boltEdgeRouter.Disabled
|
||||
|
||||
entity.Interfaces = InterfacesFromBolt(boltEdgeRouter.Interfaces)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -690,6 +690,17 @@ func (self *IdentityManager) IdentityToProtobuf(entity *Identity) (*edge_cmd_pb.
|
||||
}
|
||||
}
|
||||
|
||||
for _, intf := range entity.Interfaces {
|
||||
msg.Interfaces = append(msg.Interfaces, &edge_cmd_pb.Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
Mtu: intf.MTU,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
@@ -756,7 +767,7 @@ func (self *IdentityManager) ProtobufToIdentity(msg *edge_cmd_pb.Identity) (*Ide
|
||||
serviceMap[serviceConfig.ConfigTypeId] = serviceConfig.ConfigId
|
||||
}
|
||||
|
||||
return &Identity{
|
||||
result := &Identity{
|
||||
BaseEntity: models.BaseEntity{
|
||||
Id: msg.Id,
|
||||
Tags: edge_cmd_pb.DecodeTags(msg.Tags),
|
||||
@@ -779,7 +790,20 @@ func (self *IdentityManager) ProtobufToIdentity(msg *edge_cmd_pb.Identity) (*Ide
|
||||
DisabledAt: pbTimeToTimePtr(msg.DisabledAt),
|
||||
DisabledUntil: pbTimeToTimePtr(msg.DisabledUntil),
|
||||
ServiceConfigs: serviceConfigs,
|
||||
}, nil
|
||||
}
|
||||
|
||||
for _, intf := range msg.Interfaces {
|
||||
result.Interfaces = append(result.Interfaces, &Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
MTU: intf.Mtu,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (self *IdentityManager) Unmarshall(bytes []byte) (*Identity, error) {
|
||||
|
||||
@@ -96,6 +96,7 @@ type Identity struct {
|
||||
DisabledAt *time.Time
|
||||
DisabledUntil *time.Time
|
||||
ServiceConfigs map[string]map[string]string
|
||||
Interfaces []*Interface
|
||||
}
|
||||
|
||||
func (entity *Identity) toBoltEntityForCreate(_ *bbolt.Tx, env Env) (*db.Identity, error) {
|
||||
@@ -136,6 +137,7 @@ func (entity *Identity) toBoltEntityForCreate(_ *bbolt.Tx, env Env) (*db.Identit
|
||||
DisabledAt: entity.DisabledAt,
|
||||
DisabledUntil: entity.DisabledUntil,
|
||||
ServiceConfigs: entity.ServiceConfigs,
|
||||
Interfaces: InterfacesToBolt(entity.Interfaces),
|
||||
}
|
||||
|
||||
if entity.EnvInfo != nil {
|
||||
@@ -246,6 +248,7 @@ func (entity *Identity) toBoltEntityForUpdate(tx *bbolt.Tx, env Env, checker bol
|
||||
DisabledUntil: entity.DisabledUntil,
|
||||
IsAdmin: entity.IsAdmin,
|
||||
ServiceConfigs: entity.ServiceConfigs,
|
||||
Interfaces: InterfacesToBolt(entity.Interfaces),
|
||||
}
|
||||
|
||||
identityStore := env.GetManagers().Identity.GetStore()
|
||||
@@ -291,6 +294,7 @@ func (entity *Identity) fillFrom(env Env, _ *bbolt.Tx, boltIdentity *db.Identity
|
||||
entity.DisabledAt = boltIdentity.DisabledAt
|
||||
entity.Disabled = boltIdentity.Disabled
|
||||
entity.ServiceConfigs = boltIdentity.ServiceConfigs
|
||||
entity.Interfaces = InterfacesFromBolt(boltIdentity.Interfaces)
|
||||
fillModelInfo(entity, boltIdentity.EnvInfo, boltIdentity.SdkInfo)
|
||||
|
||||
return nil
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package model
|
||||
|
||||
import (
|
||||
"github.com/openziti/foundation/v2/stringz"
|
||||
"github.com/openziti/ziti/controller/db"
|
||||
"net"
|
||||
"sort"
|
||||
)
|
||||
|
||||
type Interface struct {
|
||||
Name string `json:"name"`
|
||||
HardwareAddress string `json:"hardwareAddress"`
|
||||
MTU int64 `json:"mtu"`
|
||||
Index int64 `json:"index"`
|
||||
Flags uint64 `json:"flags"`
|
||||
Addresses []string `json:"addresses"`
|
||||
}
|
||||
|
||||
func (self *Interface) IsUp() bool {
|
||||
return self.IsFlagSet(net.FlagUp)
|
||||
}
|
||||
|
||||
func (self *Interface) IsRunning() bool {
|
||||
return self.IsFlagSet(net.FlagRunning)
|
||||
}
|
||||
|
||||
func (self *Interface) IsLoopback() bool {
|
||||
return self.IsFlagSet(net.FlagLoopback)
|
||||
}
|
||||
|
||||
func (self *Interface) IsBroadcast() bool {
|
||||
return self.IsFlagSet(net.FlagBroadcast)
|
||||
}
|
||||
|
||||
func (self *Interface) IsMulticast() bool {
|
||||
return self.IsFlagSet(net.FlagMulticast)
|
||||
}
|
||||
|
||||
func (self *Interface) IsFlagSet(f net.Flags) bool {
|
||||
return net.Flags(self.Flags)&f == f
|
||||
}
|
||||
|
||||
func (entity *Interface) ToBolt() *db.Interface {
|
||||
return &db.Interface{
|
||||
Name: entity.Name,
|
||||
HardwareAddress: entity.HardwareAddress,
|
||||
MTU: entity.MTU,
|
||||
Index: entity.Index,
|
||||
Flags: entity.Flags,
|
||||
Addresses: entity.Addresses,
|
||||
}
|
||||
}
|
||||
|
||||
func InterfacesToBolt(val []*Interface) []*db.Interface {
|
||||
var result []*db.Interface
|
||||
for _, v := range val {
|
||||
result = append(result, v.ToBolt())
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func InterfaceFromBolt(entity *db.Interface) *Interface {
|
||||
return &Interface{
|
||||
Name: entity.Name,
|
||||
HardwareAddress: entity.HardwareAddress,
|
||||
MTU: entity.MTU,
|
||||
Index: entity.Index,
|
||||
Flags: entity.Flags,
|
||||
Addresses: entity.Addresses,
|
||||
}
|
||||
}
|
||||
|
||||
func InterfacesFromBolt(m []*db.Interface) []*Interface {
|
||||
var result []*Interface
|
||||
for _, v := range m {
|
||||
result = append(result, InterfaceFromBolt(v))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func didInterfacesChange(old, new []*Interface) bool {
|
||||
sort.Slice(old, func(i, j int) bool {
|
||||
return old[i].Name < old[j].Name
|
||||
})
|
||||
|
||||
sort.Slice(new, func(i, j int) bool {
|
||||
return new[i].Name < new[j].Name
|
||||
})
|
||||
|
||||
if len(old) != len(new) {
|
||||
return true
|
||||
}
|
||||
|
||||
for idx, iface := range old {
|
||||
if didInterfaceChange(iface, new[idx]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func didInterfaceChange(a, b *Interface) bool {
|
||||
changed := a.Name != b.Name ||
|
||||
a.Index != b.Index ||
|
||||
a.Flags != b.Flags ||
|
||||
a.MTU != b.MTU ||
|
||||
a.HardwareAddress != b.HardwareAddress
|
||||
|
||||
if changed {
|
||||
return true
|
||||
}
|
||||
|
||||
sort.Strings(a.Addresses)
|
||||
sort.Strings(b.Addresses)
|
||||
|
||||
return !stringz.EqualSlices(a.Addresses, b.Addresses)
|
||||
}
|
||||
@@ -230,6 +230,27 @@ func (self *RouterManager) ApplyUpdate(cmd *command.UpdateEntityCommand[*Router]
|
||||
return self.ApplyDequiesce(cmd, ctx)
|
||||
}
|
||||
|
||||
if cmd.UpdatedFields.IsUpdated(db.FieldInterfaces) {
|
||||
ctx.AddPreCommitAction(func(ctx boltz.MutateContext) error {
|
||||
er, _, err := self.env.GetStores().EdgeRouter.FindById(ctx.Tx(), cmd.Entity.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if er != nil && er.IsTunnelerEnabled {
|
||||
id, err := self.env.GetStores().Identity.LoadById(ctx.Tx(), cmd.Entity.Id)
|
||||
if err != nil {
|
||||
pfxlog.Logger().Error("er/t is missing associated identity")
|
||||
return nil
|
||||
}
|
||||
id.Interfaces = InterfacesToBolt(cmd.Entity.Interfaces)
|
||||
return self.env.GetStores().Identity.Update(ctx, id, fields.UpdatedFieldsMap{
|
||||
db.FieldInterfaces: struct{}{},
|
||||
})
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
return self.updateEntity(cmd.Entity, cmd.UpdatedFields, ctx)
|
||||
}
|
||||
|
||||
@@ -293,6 +314,24 @@ func (self *RouterManager) ApplyDequiesce(cmd *command.UpdateEntityCommand[*Rout
|
||||
})
|
||||
}
|
||||
|
||||
func (self *RouterManager) UpdateRouterInterfaces(routerId string, interfaces []*Interface, ctx *change.Context) error {
|
||||
r, err := self.Read(routerId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !didInterfacesChange(interfaces, r.Interfaces) {
|
||||
pfxlog.Logger().WithField("routerId", routerId).Debug("network interfaces submitted, but no change detected")
|
||||
return nil
|
||||
}
|
||||
|
||||
r.Interfaces = interfaces
|
||||
updatedFields := fields.UpdatedFieldsMap{
|
||||
db.FieldInterfaces: struct{}{},
|
||||
}
|
||||
return self.Update(r, updatedFields, ctx)
|
||||
}
|
||||
|
||||
func (self *RouterManager) UpdateTerminators(router *Router, ctx boltz.MutateContext, f func(terminator *db.Terminator) error) error {
|
||||
return self.GetDb().Update(ctx, func(ctx boltz.MutateContext) error {
|
||||
terminatorIds := self.Store.GetRelatedEntitiesIdList(ctx.Tx(), router.Id, db.EntityTypeTerminators)
|
||||
@@ -384,6 +423,17 @@ func (self *RouterManager) Marshall(entity *Router) ([]byte, error) {
|
||||
Tags: tags,
|
||||
}
|
||||
|
||||
for _, intf := range entity.Interfaces {
|
||||
msg.Interfaces = append(msg.Interfaces, &cmd_pb.Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
Mtu: intf.MTU,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return proto.Marshal(msg)
|
||||
}
|
||||
|
||||
@@ -399,7 +449,7 @@ func (self *RouterManager) Unmarshall(bytes []byte) (*Router, error) {
|
||||
fingerprint = &tmp
|
||||
}
|
||||
|
||||
return &Router{
|
||||
result := &Router{
|
||||
BaseEntity: models.BaseEntity{
|
||||
Id: msg.Id,
|
||||
Tags: cmd_pb.DecodeTags(msg.Tags),
|
||||
@@ -409,7 +459,20 @@ func (self *RouterManager) Unmarshall(bytes []byte) (*Router, error) {
|
||||
Cost: uint16(msg.Cost),
|
||||
NoTraversal: msg.NoTraversal,
|
||||
Disabled: msg.Disabled,
|
||||
}, nil
|
||||
}
|
||||
|
||||
for _, intf := range msg.Interfaces {
|
||||
result.Interfaces = append(result.Interfaces, &Interface{
|
||||
Name: intf.Name,
|
||||
HardwareAddress: intf.HardwareAddress,
|
||||
MTU: intf.Mtu,
|
||||
Index: intf.Index,
|
||||
Flags: intf.Flags,
|
||||
Addresses: intf.Addresses,
|
||||
})
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (self *RouterManager) ValidateRouterSdkTerminators(router *Router, cb func(detail *mgmt_pb.RouterSdkTerminatorsDetails)) {
|
||||
|
||||
@@ -49,6 +49,7 @@ type Router struct {
|
||||
NoTraversal bool
|
||||
Disabled bool
|
||||
Metadata *ctrl_pb.RouterMetadata
|
||||
Interfaces []*Interface
|
||||
}
|
||||
|
||||
func (entity *Router) GetLinks() []*Link {
|
||||
@@ -67,6 +68,7 @@ func (entity *Router) toBoltEntityForCreate(*bbolt.Tx, Env) (*db.Router, error)
|
||||
Cost: entity.Cost,
|
||||
NoTraversal: entity.NoTraversal,
|
||||
Disabled: entity.Disabled,
|
||||
Interfaces: InterfacesToBolt(entity.Interfaces),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -76,6 +78,7 @@ func (entity *Router) fillFrom(_ Env, _ *bbolt.Tx, boltRouter *db.Router) error
|
||||
entity.Cost = boltRouter.Cost
|
||||
entity.NoTraversal = boltRouter.NoTraversal
|
||||
entity.Disabled = boltRouter.Disabled
|
||||
entity.Interfaces = InterfacesFromBolt(boltRouter.Interfaces)
|
||||
entity.FillCommon(boltRouter)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,258 @@
|
||||
// Code generated by go-swagger; DO NOT EDIT.
|
||||
|
||||
//
|
||||
// Copyright NetFoundry Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// https://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// __ __ _
|
||||
// \ \ / / (_)
|
||||
// \ \ /\ / /_ _ _ __ _ __ _ _ __ __ _
|
||||
// \ \/ \/ / _` | '__| '_ \| | '_ \ / _` |
|
||||
// \ /\ / (_| | | | | | | | | | | (_| | : This file is generated, do not edit it.
|
||||
// \/ \/ \__,_|_| |_| |_|_|_| |_|\__, |
|
||||
// __/ |
|
||||
// |___/
|
||||
|
||||
package rest_model
|
||||
|
||||
// This file was generated by the swagger tool.
|
||||
// Editing this file might prove futile when you re-run the swagger generate command
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-openapi/errors"
|
||||
"github.com/go-openapi/strfmt"
|
||||
"github.com/go-openapi/swag"
|
||||
"github.com/go-openapi/validate"
|
||||
)
|
||||
|
||||
// Interface A resource describing a network interface
|
||||
//
|
||||
// swagger:model interface
|
||||
type Interface struct {
|
||||
|
||||
// addresses
|
||||
// Required: true
|
||||
Addresses []string `json:"addresses"`
|
||||
|
||||
// hardware address
|
||||
// Required: true
|
||||
HardwareAddress *string `json:"hardwareAddress"`
|
||||
|
||||
// index
|
||||
// Required: true
|
||||
// Minimum: 0
|
||||
Index *int64 `json:"index"`
|
||||
|
||||
// is broadcast
|
||||
// Required: true
|
||||
IsBroadcast *bool `json:"isBroadcast"`
|
||||
|
||||
// is loopback
|
||||
// Required: true
|
||||
IsLoopback *bool `json:"isLoopback"`
|
||||
|
||||
// is multicast
|
||||
// Required: true
|
||||
IsMulticast *bool `json:"isMulticast"`
|
||||
|
||||
// is running
|
||||
// Required: true
|
||||
IsRunning *bool `json:"isRunning"`
|
||||
|
||||
// is up
|
||||
// Required: true
|
||||
IsUp *bool `json:"isUp"`
|
||||
|
||||
// mtu
|
||||
// Required: true
|
||||
// Minimum: 0
|
||||
Mtu *int64 `json:"mtu"`
|
||||
|
||||
// name
|
||||
// Required: true
|
||||
Name *string `json:"name"`
|
||||
}
|
||||
|
||||
// Validate validates this interface
|
||||
func (m *Interface) Validate(formats strfmt.Registry) error {
|
||||
var res []error
|
||||
|
||||
if err := m.validateAddresses(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateHardwareAddress(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIndex(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIsBroadcast(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIsLoopback(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIsMulticast(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIsRunning(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateIsUp(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateMtu(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateName(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if len(res) > 0 {
|
||||
return errors.CompositeValidationError(res...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateAddresses(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("addresses", "body", m.Addresses); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateHardwareAddress(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("hardwareAddress", "body", m.HardwareAddress); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIndex(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("index", "body", m.Index); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := validate.MinimumInt("index", "body", *m.Index, 0, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIsBroadcast(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("isBroadcast", "body", m.IsBroadcast); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIsLoopback(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("isLoopback", "body", m.IsLoopback); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIsMulticast(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("isMulticast", "body", m.IsMulticast); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIsRunning(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("isRunning", "body", m.IsRunning); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateIsUp(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("isUp", "body", m.IsUp); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateMtu(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("mtu", "body", m.Mtu); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := validate.MinimumInt("mtu", "body", *m.Mtu, 0, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Interface) validateName(formats strfmt.Registry) error {
|
||||
|
||||
if err := validate.Required("name", "body", m.Name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ContextValidate validates this interface based on context it is used
|
||||
func (m *Interface) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalBinary interface implementation
|
||||
func (m *Interface) MarshalBinary() ([]byte, error) {
|
||||
if m == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return swag.WriteJSON(m)
|
||||
}
|
||||
|
||||
// UnmarshalBinary interface implementation
|
||||
func (m *Interface) UnmarshalBinary(b []byte) error {
|
||||
var res Interface
|
||||
if err := swag.ReadJSON(b, &res); err != nil {
|
||||
return err
|
||||
}
|
||||
*m = res
|
||||
return nil
|
||||
}
|
||||
@@ -63,6 +63,9 @@ type RouterDetail struct {
|
||||
// Required: true
|
||||
Fingerprint *string `json:"fingerprint"`
|
||||
|
||||
// interfaces
|
||||
Interfaces []*Interface `json:"interfaces"`
|
||||
|
||||
// listener addresses
|
||||
ListenerAddresses []*RouterListener `json:"listenerAddresses"`
|
||||
|
||||
@@ -97,6 +100,8 @@ func (m *RouterDetail) UnmarshalJSON(raw []byte) error {
|
||||
|
||||
Fingerprint *string `json:"fingerprint"`
|
||||
|
||||
Interfaces []*Interface `json:"interfaces"`
|
||||
|
||||
ListenerAddresses []*RouterListener `json:"listenerAddresses"`
|
||||
|
||||
Name *string `json:"name"`
|
||||
@@ -117,6 +122,8 @@ func (m *RouterDetail) UnmarshalJSON(raw []byte) error {
|
||||
|
||||
m.Fingerprint = dataAO1.Fingerprint
|
||||
|
||||
m.Interfaces = dataAO1.Interfaces
|
||||
|
||||
m.ListenerAddresses = dataAO1.ListenerAddresses
|
||||
|
||||
m.Name = dataAO1.Name
|
||||
@@ -146,6 +153,8 @@ func (m RouterDetail) MarshalJSON() ([]byte, error) {
|
||||
|
||||
Fingerprint *string `json:"fingerprint"`
|
||||
|
||||
Interfaces []*Interface `json:"interfaces"`
|
||||
|
||||
ListenerAddresses []*RouterListener `json:"listenerAddresses"`
|
||||
|
||||
Name *string `json:"name"`
|
||||
@@ -163,6 +172,8 @@ func (m RouterDetail) MarshalJSON() ([]byte, error) {
|
||||
|
||||
dataAO1.Fingerprint = m.Fingerprint
|
||||
|
||||
dataAO1.Interfaces = m.Interfaces
|
||||
|
||||
dataAO1.ListenerAddresses = m.ListenerAddresses
|
||||
|
||||
dataAO1.Name = m.Name
|
||||
@@ -204,6 +215,10 @@ func (m *RouterDetail) Validate(formats strfmt.Registry) error {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateInterfaces(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.validateListenerAddresses(formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
@@ -270,6 +285,33 @@ func (m *RouterDetail) validateFingerprint(formats strfmt.Registry) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *RouterDetail) validateInterfaces(formats strfmt.Registry) error {
|
||||
|
||||
if swag.IsZero(m.Interfaces) { // not required
|
||||
return nil
|
||||
}
|
||||
|
||||
for i := 0; i < len(m.Interfaces); i++ {
|
||||
if swag.IsZero(m.Interfaces[i]) { // not required
|
||||
continue
|
||||
}
|
||||
|
||||
if m.Interfaces[i] != nil {
|
||||
if err := m.Interfaces[i].Validate(formats); err != nil {
|
||||
if ve, ok := err.(*errors.Validation); ok {
|
||||
return ve.ValidateName("interfaces" + "." + strconv.Itoa(i))
|
||||
} else if ce, ok := err.(*errors.CompositeError); ok {
|
||||
return ce.ValidateName("interfaces" + "." + strconv.Itoa(i))
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *RouterDetail) validateListenerAddresses(formats strfmt.Registry) error {
|
||||
|
||||
if swag.IsZero(m.ListenerAddresses) { // not required
|
||||
@@ -344,6 +386,10 @@ func (m *RouterDetail) ContextValidate(ctx context.Context, formats strfmt.Regis
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.contextValidateInterfaces(ctx, formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
|
||||
if err := m.contextValidateListenerAddresses(ctx, formats); err != nil {
|
||||
res = append(res, err)
|
||||
}
|
||||
@@ -358,6 +404,26 @@ func (m *RouterDetail) ContextValidate(ctx context.Context, formats strfmt.Regis
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *RouterDetail) contextValidateInterfaces(ctx context.Context, formats strfmt.Registry) error {
|
||||
|
||||
for i := 0; i < len(m.Interfaces); i++ {
|
||||
|
||||
if m.Interfaces[i] != nil {
|
||||
if err := m.Interfaces[i].ContextValidate(ctx, formats); err != nil {
|
||||
if ve, ok := err.(*errors.Validation); ok {
|
||||
return ve.ValidateName("interfaces" + "." + strconv.Itoa(i))
|
||||
} else if ce, ok := err.(*errors.CompositeError); ok {
|
||||
return ce.ValidateName("interfaces" + "." + strconv.Itoa(i))
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *RouterDetail) contextValidateListenerAddresses(ctx context.Context, formats strfmt.Registry) error {
|
||||
|
||||
for i := 0; i < len(m.ListenerAddresses); i++ {
|
||||
|
||||
@@ -1832,6 +1832,57 @@ func init() {
|
||||
}
|
||||
}
|
||||
},
|
||||
"interface": {
|
||||
"description": "A resource describing a network interface",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name",
|
||||
"hardwareAddress",
|
||||
"mtu",
|
||||
"index",
|
||||
"isUp",
|
||||
"isRunning",
|
||||
"isLoopback",
|
||||
"isBroadcast",
|
||||
"isMulticast",
|
||||
"addresses"
|
||||
],
|
||||
"properties": {
|
||||
"addresses": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"hardwareAddress": {
|
||||
"type": "string"
|
||||
},
|
||||
"index": {
|
||||
"type": "integer"
|
||||
},
|
||||
"isBroadcast": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isLoopback": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isMulticast": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isRunning": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isUp": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"mtu": {
|
||||
"type": "integer"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"link": {
|
||||
"description": "A link to another resource",
|
||||
"type": "object",
|
||||
@@ -2127,6 +2178,12 @@ func init() {
|
||||
"fingerprint": {
|
||||
"type": "string"
|
||||
},
|
||||
"interfaces": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/interface"
|
||||
}
|
||||
},
|
||||
"listenerAddresses": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
@@ -7542,6 +7599,59 @@ func init() {
|
||||
}
|
||||
}
|
||||
},
|
||||
"interface": {
|
||||
"description": "A resource describing a network interface",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name",
|
||||
"hardwareAddress",
|
||||
"mtu",
|
||||
"index",
|
||||
"isUp",
|
||||
"isRunning",
|
||||
"isLoopback",
|
||||
"isBroadcast",
|
||||
"isMulticast",
|
||||
"addresses"
|
||||
],
|
||||
"properties": {
|
||||
"addresses": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"hardwareAddress": {
|
||||
"type": "string"
|
||||
},
|
||||
"index": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"isBroadcast": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isLoopback": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isMulticast": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isRunning": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"isUp": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"mtu": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"link": {
|
||||
"description": "A link to another resource",
|
||||
"type": "object",
|
||||
@@ -7839,6 +7949,12 @@ func init() {
|
||||
"fingerprint": {
|
||||
"type": "string"
|
||||
},
|
||||
"interfaces": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/interface"
|
||||
}
|
||||
},
|
||||
"listenerAddresses": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
||||
@@ -1384,6 +1384,45 @@ definitions:
|
||||
newLeaderId:
|
||||
type: string
|
||||
|
||||
interface:
|
||||
description: A resource describing a network interface
|
||||
type: object
|
||||
required:
|
||||
- name
|
||||
- hardwareAddress
|
||||
- mtu
|
||||
- index
|
||||
- isUp
|
||||
- isRunning
|
||||
- isLoopback
|
||||
- isBroadcast
|
||||
- isMulticast
|
||||
- addresses
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
hardwareAddress:
|
||||
type: string
|
||||
mtu:
|
||||
type: integer
|
||||
minimum: 0
|
||||
index:
|
||||
type: integer
|
||||
minimum: 0
|
||||
isUp:
|
||||
type: boolean
|
||||
isRunning:
|
||||
type: boolean
|
||||
isLoopback:
|
||||
type: boolean
|
||||
isBroadcast:
|
||||
type: boolean
|
||||
isMulticast:
|
||||
type: boolean
|
||||
addresses:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
|
||||
###################################################################
|
||||
# Errors
|
||||
@@ -1572,6 +1611,10 @@ definitions:
|
||||
$ref: '#/definitions/routerListener'
|
||||
versionInfo:
|
||||
$ref: '#/definitions/versionInfo'
|
||||
interfaces:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/definitions/interface'
|
||||
routerListener:
|
||||
type: object
|
||||
required:
|
||||
|
||||
@@ -84,12 +84,12 @@ ctrl:
|
||||
events:
|
||||
jsonLogger:
|
||||
subscriptions:
|
||||
- type: apiSession
|
||||
- type: authentication
|
||||
# - type: apiSession
|
||||
# - type: authentication
|
||||
# - type: circuit
|
||||
# - type: connect
|
||||
# - type: sdk
|
||||
# - type: entityChange
|
||||
- type: entityChange
|
||||
# include:
|
||||
# - services
|
||||
# - identities
|
||||
|
||||
@@ -53,18 +53,18 @@ require (
|
||||
github.com/mitchellh/mapstructure v1.5.0
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||
github.com/openziti/agent v1.0.27
|
||||
github.com/openziti/channel/v4 v4.2.1
|
||||
github.com/openziti/channel/v4 v4.2.5
|
||||
github.com/openziti/cobra-to-md v1.0.1
|
||||
github.com/openziti/edge-api v0.26.45
|
||||
github.com/openziti/foundation/v2 v2.0.65
|
||||
github.com/openziti/identity v1.0.103
|
||||
github.com/openziti/edge-api v0.26.46
|
||||
github.com/openziti/foundation/v2 v2.0.66
|
||||
github.com/openziti/identity v1.0.105
|
||||
github.com/openziti/jwks v1.0.6
|
||||
github.com/openziti/metrics v1.4.1
|
||||
github.com/openziti/runzmd v1.0.72
|
||||
github.com/openziti/sdk-golang v1.1.2
|
||||
github.com/openziti/secretstream v0.1.34
|
||||
github.com/openziti/storage v0.4.11
|
||||
github.com/openziti/transport/v2 v2.0.171
|
||||
github.com/openziti/storage v0.4.17
|
||||
github.com/openziti/transport/v2 v2.0.175
|
||||
github.com/openziti/x509-claims v1.0.3
|
||||
github.com/openziti/xweb/v2 v2.3.3
|
||||
github.com/openziti/ziti-db-explorer v1.1.3
|
||||
@@ -83,7 +83,7 @@ require (
|
||||
github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125
|
||||
github.com/xeipuuv/gojsonschema v1.2.0
|
||||
github.com/zitadel/oidc/v3 v3.39.0
|
||||
go.etcd.io/bbolt v1.4.0
|
||||
go.etcd.io/bbolt v1.4.1
|
||||
go.uber.org/atomic v1.11.0
|
||||
go4.org v0.0.0-20180809161055-417644f6feb5
|
||||
golang.org/x/crypto v0.38.0
|
||||
|
||||
@@ -587,18 +587,18 @@ github.com/openziti-incubator/cf v0.0.3 h1:JKs55DbaIxl87nI/Ra/3DHMiz5iaPpu8JjsuN
|
||||
github.com/openziti-incubator/cf v0.0.3/go.mod h1:6abCY06bCjKmK2I9kohij+cp9uXIPFiFwSCNZPdMk8E=
|
||||
github.com/openziti/agent v1.0.27 h1:TzF9v7fwHUU525GBy86t1vWRyKPdsP0NruqeoESbnXk=
|
||||
github.com/openziti/agent v1.0.27/go.mod h1:pjQ9jSOl+9ZR/0Y9+wOwJhGekYwyai2uKB3YCd0nulI=
|
||||
github.com/openziti/channel/v4 v4.2.1 h1:gbtO2tC8qjMiApSoCQyn7WbSCyI8xdwzB79IyrKmR3w=
|
||||
github.com/openziti/channel/v4 v4.2.1/go.mod h1:t42XcuNICtJSizetoZbmml3l5AE7d/LDCf29c+Ene4Q=
|
||||
github.com/openziti/channel/v4 v4.2.5 h1:FXH2uXZBkvzC25HL1ouw4xEt9BJltyCLlVr9Un2+R6M=
|
||||
github.com/openziti/channel/v4 v4.2.5/go.mod h1:FnLSH/N8PE0s2/Sv2aPt70rBc+C9cqebzo06RM6ATSg=
|
||||
github.com/openziti/cobra-to-md v1.0.1 h1:WRinNoIRmwWUSJm+pSNXMjOrtU48oxXDZgeCYQfVXxE=
|
||||
github.com/openziti/cobra-to-md v1.0.1/go.mod h1:FjCpk/yzHF7/r28oSTNr5P57yN5VolpdAtS/g7KNi2c=
|
||||
github.com/openziti/dilithium v0.3.5 h1:+envGNzxc3OyVPiuvtxivQmCsOjdZjtOMLpQBeMz7eM=
|
||||
github.com/openziti/dilithium v0.3.5/go.mod h1:XONq1iK6te/WwNzkgZHfIDHordMPqb0hMwJ8bs9EfSk=
|
||||
github.com/openziti/edge-api v0.26.45 h1:M5rR28yEIIpbVo7F7c5tF+z2qNKqvN55pK6bZqQHn+8=
|
||||
github.com/openziti/edge-api v0.26.45/go.mod h1:sYHVpm26Jr1u7VooNJzTb2b2nGSlmCHMnbGC8XfWSng=
|
||||
github.com/openziti/foundation/v2 v2.0.65 h1:Vvplj+4QjSk3P+M4+QfsT19j9Lt4xPHVPKTBLT1GQgw=
|
||||
github.com/openziti/foundation/v2 v2.0.65/go.mod h1:sAtu+ulsxJWJ2iZ16UMBZVocRB3beBpHOE6Wy5RuvJI=
|
||||
github.com/openziti/identity v1.0.103 h1:dJgaUEu0XdZ9fUe3FKpCj5itLLC/zdpr+6GqcCwW3l4=
|
||||
github.com/openziti/identity v1.0.103/go.mod h1:+0WHnWHvZUbsXkTkbt6a3Bcsat+90DZjMgaDZ7sKEUI=
|
||||
github.com/openziti/edge-api v0.26.46 h1:cFOGXTIMXmxTgcM/bGd50OqZES/yT37MriojGJxozzo=
|
||||
github.com/openziti/edge-api v0.26.46/go.mod h1:sYHVpm26Jr1u7VooNJzTb2b2nGSlmCHMnbGC8XfWSng=
|
||||
github.com/openziti/foundation/v2 v2.0.66 h1:gVONHcMd5VJ8McznzD0Mo9mOhs29gl91rBeTr8EYMOE=
|
||||
github.com/openziti/foundation/v2 v2.0.66/go.mod h1:sAtu+ulsxJWJ2iZ16UMBZVocRB3beBpHOE6Wy5RuvJI=
|
||||
github.com/openziti/identity v1.0.105 h1:PCMfXejubkzocGorha8ac5QAh3Gzg0fJ7UsECTETww8=
|
||||
github.com/openziti/identity v1.0.105/go.mod h1:pHhh5MXSh99McWQGVhgmR5x0KANVfogLcg5mTpRlbVA=
|
||||
github.com/openziti/jwks v1.0.6 h1:PR+9OVaMO8oHEoVQmHqeUBExWwLWyODEGJQK2DXHaqE=
|
||||
github.com/openziti/jwks v1.0.6/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ=
|
||||
github.com/openziti/metrics v1.4.1 h1:JMnfmW8liTzmqJpd7HDPCSvDDFg1UrE0WoLhW9XdIG8=
|
||||
@@ -609,10 +609,10 @@ github.com/openziti/sdk-golang v1.1.2 h1:Q7YqFcAjfkH9ZZp+yYPIAvEWt/DOhhOxBx1drXy
|
||||
github.com/openziti/sdk-golang v1.1.2/go.mod h1:sXLPdy/Q0Zor5ef08H+W60EEy6ofEDpeZFlP4SWwc4w=
|
||||
github.com/openziti/secretstream v0.1.34 h1:H2/g90s81vkTWwSodeHP7tkf9SZA6pp4L1rqR7UrZUk=
|
||||
github.com/openziti/secretstream v0.1.34/go.mod h1:LwKcXz+x1grnVn/kdWxLYO6LZOPqQgXNSkGUPvfjl7w=
|
||||
github.com/openziti/storage v0.4.11 h1:cF6Iys5H7gswOVRJL8RhZx6JhHsB4EIjFRrgbsPZOgY=
|
||||
github.com/openziti/storage v0.4.11/go.mod h1:aWlZ97qCV7qgTx2WjzpcIdJ+OAIloerJV/ys7X2kgxM=
|
||||
github.com/openziti/transport/v2 v2.0.171 h1:7vgQLANLXP4WNYuRxeOcCx++/t9QpmcDfwlRagtfigc=
|
||||
github.com/openziti/transport/v2 v2.0.171/go.mod h1:F4FIT6aH8QnHBC/2N/RcqbGRI5oT3+1ojvWyYldTNIw=
|
||||
github.com/openziti/storage v0.4.17 h1:zlAKf0Se3gb8HsO3VOh6G0RPS8CZ3mujhOjpQapPNuQ=
|
||||
github.com/openziti/storage v0.4.17/go.mod h1:t6jN4uvDuulBk9h8jblXUua0YvZV7VrQl5gsMXrzr1c=
|
||||
github.com/openziti/transport/v2 v2.0.175 h1:u6/po/Iy7k4Bgf4KAXuaRHjX/Ehepwqi71WxgwIBHJk=
|
||||
github.com/openziti/transport/v2 v2.0.175/go.mod h1:IIK7ECZUaDwZlxoxoe16sKrD8V+ZQyjq3J8CE5guJXM=
|
||||
github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0=
|
||||
github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE=
|
||||
github.com/openziti/xweb/v2 v2.3.3 h1:idnzpsN03b+xKIyYF59Cwfy2A0iGJqL3IjN51zLo2Ek=
|
||||
@@ -841,8 +841,8 @@ github.com/zitadel/oidc/v3 v3.39.0/go.mod h1:JwdgdU/WxkmBtWuE8/pEjAbDTWXxJGqBix/
|
||||
github.com/zitadel/schema v1.3.1 h1:QT3kwiRIRXXLVAs6gCK/u044WmUVh6IlbLXUsn6yRQU=
|
||||
github.com/zitadel/schema v1.3.1/go.mod h1:071u7D2LQacy1HAN+YnMd/mx1qVE2isb0Mjeqg46xnU=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk=
|
||||
go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
|
||||
go.etcd.io/bbolt v1.4.1 h1:5mOV+HWjIPLEAlUGMsveaUvK2+byZMFOzojoi7bh7uI=
|
||||
go.etcd.io/bbolt v1.4.1/go.mod h1:c8zu2BnXWTu2XM4XcICtbGSl9cFwsXtcf9zLt2OncM8=
|
||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||
|
||||
Vendored
+58
-7
@@ -31,10 +31,10 @@ import (
|
||||
"github.com/openziti/channel/v4"
|
||||
"github.com/openziti/foundation/v2/concurrenz"
|
||||
"github.com/openziti/identity"
|
||||
"github.com/openziti/sdk-golang/xgress"
|
||||
"github.com/openziti/transport/v2"
|
||||
"github.com/openziti/ziti/common/config"
|
||||
"github.com/openziti/ziti/common/pb/ctrl_pb"
|
||||
"github.com/openziti/sdk-golang/xgress"
|
||||
"github.com/pkg/errors"
|
||||
"gopkg.in/yaml.v2"
|
||||
yaml3 "gopkg.in/yaml.v3"
|
||||
@@ -91,6 +91,8 @@ const (
|
||||
DefaultConnectEventsFullSyncInterval = 5 * time.Minute
|
||||
MinConnectEventsFullSyncInterval = time.Second
|
||||
MaxConnectEventsFullSyncInterval = 24 * time.Hour
|
||||
|
||||
InterfaceDiscoveryMapKey = "interfaceDiscovery"
|
||||
)
|
||||
|
||||
// internalConfigKeys is used to distinguish internally defined configuration vs file configuration
|
||||
@@ -116,6 +118,12 @@ func LoadConfigMap(path string) (map[interface{}]interface{}, error) {
|
||||
return cfgmap, nil
|
||||
}
|
||||
|
||||
type InterfaceDiscoveryConfig struct {
|
||||
Disabled bool
|
||||
CheckInterval time.Duration
|
||||
MinReportInterval time.Duration
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
IdConfig *identity.Config
|
||||
Id *identity.TokenId
|
||||
@@ -170,12 +178,13 @@ type Config struct {
|
||||
InitialDelay time.Duration
|
||||
}
|
||||
}
|
||||
ConnectEvents ConnectEventsConfig
|
||||
Proxy *transport.ProxyConfiguration
|
||||
Plugins []string
|
||||
Edge *EdgeConfig
|
||||
Src map[interface{}]interface{}
|
||||
path string
|
||||
ConnectEvents ConnectEventsConfig
|
||||
Proxy *transport.ProxyConfiguration
|
||||
Plugins []string
|
||||
Edge *EdgeConfig
|
||||
IfaceDiscovery InterfaceDiscoveryConfig
|
||||
Src map[interface{}]interface{}
|
||||
path string
|
||||
}
|
||||
|
||||
func (config *Config) CurrentCtrlAddress() string {
|
||||
@@ -916,6 +925,48 @@ func LoadConfigWithOptions(path string, loadIdentity bool) (*Config, error) {
|
||||
pfxlog.Logger().Fatalf("one or more advertise addresses are invalid: %v", errs)
|
||||
}
|
||||
}
|
||||
|
||||
cfg.IfaceDiscovery.Disabled = false
|
||||
cfg.IfaceDiscovery.CheckInterval = time.Minute
|
||||
cfg.IfaceDiscovery.MinReportInterval = 24 * time.Hour
|
||||
|
||||
if value, found := cfgmap[InterfaceDiscoveryMapKey]; found {
|
||||
if subMap, ok := value.(map[interface{}]interface{}); !ok {
|
||||
return nil, errors.New("invalid interfaceDiscovery value, should be map")
|
||||
} else {
|
||||
if value, found := subMap["disabled"]; found {
|
||||
disabled := strings.EqualFold("true", fmt.Sprintf("%v", value))
|
||||
cfg.IfaceDiscovery.Disabled = disabled
|
||||
}
|
||||
|
||||
if value, found := subMap["checkInterval"]; found {
|
||||
if strVal, ok := value.(string); ok {
|
||||
interval, err := time.ParseDuration(strVal)
|
||||
if err != nil {
|
||||
return nil, errors.New("invalid value: interfaceDiscovery.checkInterval value should be a valid duration")
|
||||
} else {
|
||||
cfg.IfaceDiscovery.CheckInterval = interval
|
||||
}
|
||||
} else {
|
||||
return nil, errors.New("invalid value: interfaceDiscovery.checkInterval value should be a string representing a duration")
|
||||
}
|
||||
}
|
||||
|
||||
if value, found := subMap["minReportInterval"]; found {
|
||||
if strVal, ok := value.(string); ok {
|
||||
interval, err := time.ParseDuration(strVal)
|
||||
if err != nil {
|
||||
return nil, errors.New("invalid value: interfaceDiscovery.minReportInterval value should be a valid duration")
|
||||
} else {
|
||||
cfg.IfaceDiscovery.CheckInterval = interval
|
||||
}
|
||||
} else {
|
||||
return nil, errors.New("invalid value: interfaceDiscovery.minReportInterval value should be a string representing a duration")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
(c) Copyright NetFoundry Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package interfaces
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/michaelquigley/pfxlog"
|
||||
"github.com/openziti/channel/v4"
|
||||
"github.com/openziti/channel/v4/protobufs"
|
||||
"github.com/openziti/foundation/v2/stringz"
|
||||
"github.com/openziti/ziti/common/pb/ctrl_pb"
|
||||
"github.com/openziti/ziti/router/env"
|
||||
"net"
|
||||
"sort"
|
||||
"time"
|
||||
)
|
||||
|
||||
func StartInterfaceReporter(ctrls env.NetworkControllers, closeNotify <-chan struct{}, config env.InterfaceDiscoveryConfig) {
|
||||
if config.Disabled {
|
||||
return
|
||||
}
|
||||
|
||||
reporter := &InterfaceReporter{
|
||||
closeNotify: closeNotify,
|
||||
checkInterval: config.CheckInterval,
|
||||
minReportInterval: config.MinReportInterval,
|
||||
ctrls: ctrls,
|
||||
}
|
||||
|
||||
go reporter.run()
|
||||
}
|
||||
|
||||
type InterfaceReporter struct {
|
||||
closeNotify <-chan struct{}
|
||||
checkInterval time.Duration
|
||||
minReportInterval time.Duration
|
||||
currentInterfaces []*ctrl_pb.Interface
|
||||
lastReportTime time.Time
|
||||
ctrls env.NetworkControllers
|
||||
}
|
||||
|
||||
func (self *InterfaceReporter) run() {
|
||||
for {
|
||||
self.report()
|
||||
|
||||
select {
|
||||
case <-time.After(self.checkInterval): // using this instead of ticker, as we want to wait the time, not have ticks pile up
|
||||
case <-self.closeNotify:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (self *InterfaceReporter) report() {
|
||||
interfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
pfxlog.Logger().WithError(err).Error("failed to list network interfaces")
|
||||
return
|
||||
}
|
||||
|
||||
var reportInterfaces []*ctrl_pb.Interface
|
||||
for _, iface := range interfaces {
|
||||
v := &ctrl_pb.Interface{
|
||||
Name: iface.Name,
|
||||
HardwareAddress: iface.HardwareAddr.String(),
|
||||
Mtu: int64(iface.MTU),
|
||||
Index: int64(iface.Index),
|
||||
Flags: uint64(iface.Flags),
|
||||
}
|
||||
|
||||
addrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
pfxlog.Logger().WithError(err).WithField("interface", iface.Name).Error("failed to list interface addresses")
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
v.Addresses = append(v.Addresses, addr.String())
|
||||
}
|
||||
sort.Strings(v.Addresses)
|
||||
reportInterfaces = append(reportInterfaces, v)
|
||||
}
|
||||
|
||||
sort.Slice(reportInterfaces, func(i, j int) bool {
|
||||
return reportInterfaces[i].Name < reportInterfaces[j].Name
|
||||
})
|
||||
|
||||
changed := self.DidInterfacesChange(reportInterfaces)
|
||||
if changed || time.Since(self.lastReportTime) >= self.minReportInterval {
|
||||
self.reportUpdatedInterfaces(reportInterfaces, changed)
|
||||
}
|
||||
}
|
||||
|
||||
func (self *InterfaceReporter) DidInterfacesChange(interfaces []*ctrl_pb.Interface) bool {
|
||||
if len(interfaces) != len(self.currentInterfaces) {
|
||||
return true
|
||||
}
|
||||
|
||||
for idx, iface := range self.currentInterfaces {
|
||||
if self.DidInterfaceChange(iface, interfaces[idx]) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *InterfaceReporter) DidInterfaceChange(a, b *ctrl_pb.Interface) bool {
|
||||
changed := a.Name != b.Name ||
|
||||
a.Index != b.Index ||
|
||||
a.Flags != b.Flags ||
|
||||
a.Mtu != b.Mtu ||
|
||||
a.HardwareAddress != b.HardwareAddress
|
||||
|
||||
if changed {
|
||||
return true
|
||||
}
|
||||
|
||||
return !stringz.EqualSlices(a.Addresses, b.Addresses)
|
||||
}
|
||||
|
||||
func (self *InterfaceReporter) reportUpdatedInterfaces(interfaces []*ctrl_pb.Interface, changed bool) {
|
||||
log := pfxlog.Logger()
|
||||
req := &ctrl_pb.RouterInterfacesUpdate{
|
||||
Interfaces: interfaces,
|
||||
}
|
||||
|
||||
if changed {
|
||||
log.Infof("reporting %d interfaces because interfaces changed", len(req.Interfaces))
|
||||
} else {
|
||||
log.Infof("reporting %d interfaces because min report interval has passed", len(req.Interfaces))
|
||||
}
|
||||
|
||||
ctrlCh := self.ctrls.GetModelUpdateCtrlChannel()
|
||||
if ctrlCh == nil {
|
||||
log.Error("no controller available, unable to report updated interfaces")
|
||||
self.ctrls.AnyValidCtrlChannel() // wait for a controller to become available again
|
||||
return
|
||||
}
|
||||
|
||||
reply, err := protobufs.MarshalTyped(req).WithTimeout(self.ctrls.DefaultRequestTimeout()).SendForReply(ctrlCh)
|
||||
if err != nil {
|
||||
log.WithError(err).Error("failed to send update router interfaces request to controller")
|
||||
return
|
||||
}
|
||||
|
||||
result := channel.UnmarshalResult(reply)
|
||||
if result.Success {
|
||||
// don't update current until a controller has been notified
|
||||
self.currentInterfaces = interfaces
|
||||
self.lastReportTime = time.Now()
|
||||
log.Info("router interfaces updated successfully on controller")
|
||||
} else {
|
||||
log.WithError(errors.New(result.Message)).Error("failed to update router interfaces on controller")
|
||||
}
|
||||
}
|
||||
@@ -48,6 +48,7 @@ import (
|
||||
"github.com/openziti/ziti/router/handler_ctrl"
|
||||
"github.com/openziti/ziti/router/handler_link"
|
||||
"github.com/openziti/ziti/router/handler_xgress"
|
||||
"github.com/openziti/ziti/router/interfaces"
|
||||
"github.com/openziti/ziti/router/link"
|
||||
routerMetrics "github.com/openziti/ziti/router/metrics"
|
||||
"github.com/openziti/ziti/router/state"
|
||||
@@ -660,6 +661,8 @@ func (self *Router) startControlPlane() error {
|
||||
}
|
||||
}
|
||||
|
||||
interfaces.StartInterfaceReporter(self.ctrls, self.GetCloseNotify(), self.config.IfaceDiscovery)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Vendored
+3
@@ -53,3 +53,6 @@ link:
|
||||
- binding: transport
|
||||
bind: tls:127.0.0.1:6004
|
||||
advertise: tls:127.0.0.1:6004
|
||||
|
||||
interfaceDiscovery:
|
||||
disabled: true
|
||||
Vendored
+3
@@ -53,3 +53,6 @@ link:
|
||||
- binding: transport
|
||||
bind: tls:127.0.0.1:6005
|
||||
advertise: tls:127.0.0.1:6005
|
||||
|
||||
interfaceDiscovery:
|
||||
disabled: true
|
||||
+7
-7
@@ -12,23 +12,23 @@ require (
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/michaelquigley/pfxlog v0.6.10
|
||||
github.com/openziti/agent v1.0.27
|
||||
github.com/openziti/channel/v4 v4.2.1
|
||||
github.com/openziti/edge-api v0.26.45
|
||||
github.com/openziti/channel/v4 v4.2.5
|
||||
github.com/openziti/edge-api v0.26.46
|
||||
github.com/openziti/fablab v0.5.108
|
||||
github.com/openziti/foundation/v2 v2.0.66
|
||||
github.com/openziti/identity v1.0.103
|
||||
github.com/openziti/identity v1.0.105
|
||||
github.com/openziti/metrics v1.4.1
|
||||
github.com/openziti/sdk-golang v1.1.2
|
||||
github.com/openziti/storage v0.4.11
|
||||
github.com/openziti/transport/v2 v2.0.171
|
||||
github.com/openziti/ziti v1.5.4
|
||||
github.com/openziti/storage v0.4.17
|
||||
github.com/openziti/transport/v2 v2.0.175
|
||||
github.com/openziti/ziti v1.6.2
|
||||
github.com/orcaman/concurrent-map/v2 v2.0.1
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/stretchr/testify v1.10.0
|
||||
go.etcd.io/bbolt v1.4.0
|
||||
go.etcd.io/bbolt v1.4.1
|
||||
golang.org/x/net v0.40.0
|
||||
google.golang.org/protobuf v1.36.6
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
|
||||
+12
-12
@@ -604,20 +604,20 @@ github.com/openziti-incubator/cf v0.0.3 h1:JKs55DbaIxl87nI/Ra/3DHMiz5iaPpu8JjsuN
|
||||
github.com/openziti-incubator/cf v0.0.3/go.mod h1:6abCY06bCjKmK2I9kohij+cp9uXIPFiFwSCNZPdMk8E=
|
||||
github.com/openziti/agent v1.0.27 h1:TzF9v7fwHUU525GBy86t1vWRyKPdsP0NruqeoESbnXk=
|
||||
github.com/openziti/agent v1.0.27/go.mod h1:pjQ9jSOl+9ZR/0Y9+wOwJhGekYwyai2uKB3YCd0nulI=
|
||||
github.com/openziti/channel/v4 v4.2.1 h1:gbtO2tC8qjMiApSoCQyn7WbSCyI8xdwzB79IyrKmR3w=
|
||||
github.com/openziti/channel/v4 v4.2.1/go.mod h1:t42XcuNICtJSizetoZbmml3l5AE7d/LDCf29c+Ene4Q=
|
||||
github.com/openziti/channel/v4 v4.2.5 h1:FXH2uXZBkvzC25HL1ouw4xEt9BJltyCLlVr9Un2+R6M=
|
||||
github.com/openziti/channel/v4 v4.2.5/go.mod h1:FnLSH/N8PE0s2/Sv2aPt70rBc+C9cqebzo06RM6ATSg=
|
||||
github.com/openziti/cobra-to-md v1.0.1 h1:WRinNoIRmwWUSJm+pSNXMjOrtU48oxXDZgeCYQfVXxE=
|
||||
github.com/openziti/cobra-to-md v1.0.1/go.mod h1:FjCpk/yzHF7/r28oSTNr5P57yN5VolpdAtS/g7KNi2c=
|
||||
github.com/openziti/dilithium v0.3.5 h1:+envGNzxc3OyVPiuvtxivQmCsOjdZjtOMLpQBeMz7eM=
|
||||
github.com/openziti/dilithium v0.3.5/go.mod h1:XONq1iK6te/WwNzkgZHfIDHordMPqb0hMwJ8bs9EfSk=
|
||||
github.com/openziti/edge-api v0.26.45 h1:M5rR28yEIIpbVo7F7c5tF+z2qNKqvN55pK6bZqQHn+8=
|
||||
github.com/openziti/edge-api v0.26.45/go.mod h1:sYHVpm26Jr1u7VooNJzTb2b2nGSlmCHMnbGC8XfWSng=
|
||||
github.com/openziti/edge-api v0.26.46 h1:cFOGXTIMXmxTgcM/bGd50OqZES/yT37MriojGJxozzo=
|
||||
github.com/openziti/edge-api v0.26.46/go.mod h1:sYHVpm26Jr1u7VooNJzTb2b2nGSlmCHMnbGC8XfWSng=
|
||||
github.com/openziti/fablab v0.5.108 h1:3O8c+bO9s+QjLHA6BXwdVaBlEy1gZNkqP4Vo2s4yJBs=
|
||||
github.com/openziti/fablab v0.5.108/go.mod h1:yEqvqxPXG5o3krbeJ4ZhfpZWLrwYf3R9bEZdpMu2aKQ=
|
||||
github.com/openziti/foundation/v2 v2.0.66 h1:gVONHcMd5VJ8McznzD0Mo9mOhs29gl91rBeTr8EYMOE=
|
||||
github.com/openziti/foundation/v2 v2.0.66/go.mod h1:sAtu+ulsxJWJ2iZ16UMBZVocRB3beBpHOE6Wy5RuvJI=
|
||||
github.com/openziti/identity v1.0.103 h1:dJgaUEu0XdZ9fUe3FKpCj5itLLC/zdpr+6GqcCwW3l4=
|
||||
github.com/openziti/identity v1.0.103/go.mod h1:+0WHnWHvZUbsXkTkbt6a3Bcsat+90DZjMgaDZ7sKEUI=
|
||||
github.com/openziti/identity v1.0.105 h1:PCMfXejubkzocGorha8ac5QAh3Gzg0fJ7UsECTETww8=
|
||||
github.com/openziti/identity v1.0.105/go.mod h1:pHhh5MXSh99McWQGVhgmR5x0KANVfogLcg5mTpRlbVA=
|
||||
github.com/openziti/jwks v1.0.6 h1:PR+9OVaMO8oHEoVQmHqeUBExWwLWyODEGJQK2DXHaqE=
|
||||
github.com/openziti/jwks v1.0.6/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ=
|
||||
github.com/openziti/metrics v1.4.1 h1:JMnfmW8liTzmqJpd7HDPCSvDDFg1UrE0WoLhW9XdIG8=
|
||||
@@ -628,10 +628,10 @@ github.com/openziti/sdk-golang v1.1.2 h1:Q7YqFcAjfkH9ZZp+yYPIAvEWt/DOhhOxBx1drXy
|
||||
github.com/openziti/sdk-golang v1.1.2/go.mod h1:sXLPdy/Q0Zor5ef08H+W60EEy6ofEDpeZFlP4SWwc4w=
|
||||
github.com/openziti/secretstream v0.1.34 h1:H2/g90s81vkTWwSodeHP7tkf9SZA6pp4L1rqR7UrZUk=
|
||||
github.com/openziti/secretstream v0.1.34/go.mod h1:LwKcXz+x1grnVn/kdWxLYO6LZOPqQgXNSkGUPvfjl7w=
|
||||
github.com/openziti/storage v0.4.11 h1:cF6Iys5H7gswOVRJL8RhZx6JhHsB4EIjFRrgbsPZOgY=
|
||||
github.com/openziti/storage v0.4.11/go.mod h1:aWlZ97qCV7qgTx2WjzpcIdJ+OAIloerJV/ys7X2kgxM=
|
||||
github.com/openziti/transport/v2 v2.0.171 h1:7vgQLANLXP4WNYuRxeOcCx++/t9QpmcDfwlRagtfigc=
|
||||
github.com/openziti/transport/v2 v2.0.171/go.mod h1:F4FIT6aH8QnHBC/2N/RcqbGRI5oT3+1ojvWyYldTNIw=
|
||||
github.com/openziti/storage v0.4.17 h1:zlAKf0Se3gb8HsO3VOh6G0RPS8CZ3mujhOjpQapPNuQ=
|
||||
github.com/openziti/storage v0.4.17/go.mod h1:t6jN4uvDuulBk9h8jblXUua0YvZV7VrQl5gsMXrzr1c=
|
||||
github.com/openziti/transport/v2 v2.0.175 h1:u6/po/Iy7k4Bgf4KAXuaRHjX/Ehepwqi71WxgwIBHJk=
|
||||
github.com/openziti/transport/v2 v2.0.175/go.mod h1:IIK7ECZUaDwZlxoxoe16sKrD8V+ZQyjq3J8CE5guJXM=
|
||||
github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0=
|
||||
github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE=
|
||||
github.com/openziti/xweb/v2 v2.3.3 h1:idnzpsN03b+xKIyYF59Cwfy2A0iGJqL3IjN51zLo2Ek=
|
||||
@@ -855,8 +855,8 @@ github.com/zitadel/oidc/v3 v3.39.0/go.mod h1:JwdgdU/WxkmBtWuE8/pEjAbDTWXxJGqBix/
|
||||
github.com/zitadel/schema v1.3.1 h1:QT3kwiRIRXXLVAs6gCK/u044WmUVh6IlbLXUsn6yRQU=
|
||||
github.com/zitadel/schema v1.3.1/go.mod h1:071u7D2LQacy1HAN+YnMd/mx1qVE2isb0Mjeqg46xnU=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk=
|
||||
go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
|
||||
go.etcd.io/bbolt v1.4.1 h1:5mOV+HWjIPLEAlUGMsveaUvK2+byZMFOzojoi7bh7uI=
|
||||
go.etcd.io/bbolt v1.4.1/go.mod h1:c8zu2BnXWTu2XM4XcICtbGSl9cFwsXtcf9zLt2OncM8=
|
||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||
|
||||
Reference in New Issue
Block a user