diff --git a/Makefile b/Makefile index d5b31ac1ad..c445f5c711 100644 --- a/Makefile +++ b/Makefile @@ -249,6 +249,12 @@ QEMU_TPM_DEVICE_riscv64=tpm-tis QEMU_OPTS_TPM_Y_$(ZARCH)=-chardev socket,id=chrtpm,path=$(CURRENT_SWTPM)/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device $(QEMU_TPM_DEVICE_$(ZARCH)),tpmdev=tpm0 QEMU_OPTS_TPM=$(QEMU_OPTS_TPM_$(TPM:%=Y)_$(ZARCH)) +ifneq ($(TAP),) +QEMU_OPTS_eth1=-netdev tap,id=eth1,ifname=$(TAP),script="" -device virtio-net-pci,netdev=eth1,romfile="" +else +QEMU_OPTS_eth1=-netdev user,id=eth1,net=$(QEMU_OPTS_NET2),dhcpstart=$(QEMU_OPTS_NET2_FIRST_IP) -device virtio-net-pci,netdev=eth1,romfile="" +endif + QEMU_OPTS_amd64=-smbios type=1,serial=$(QEMU_EVE_SERIAL) QEMU_OPTS_arm64=-smbios type=1,serial=$(QEMU_EVE_SERIAL) -drive file=fat:rw:$(dir $(DEVICETREE_DTB)),label=QEMU_DTB,format=vvfat QEMU_OPTS_riscv64=-kernel $(UBOOT_IMG)/u-boot.bin -device virtio-blk,drive=uefi-disk @@ -259,7 +265,7 @@ QEMU_OPTS_COMMON= -m $(QEMU_MEMORY) -smp 4 $(QEMU_OPTS_BIOS) \ -global ICH9-LPC.noreboot=false -watchdog-action reset \ -rtc base=utc,clock=rt \ -netdev user,id=eth0,net=$(QEMU_OPTS_NET1),dhcpstart=$(QEMU_OPTS_NET1_FIRST_IP),hostfwd=tcp::$(SSH_PORT)-:22$(QEMU_TFTP_OPTS) -device virtio-net-pci,netdev=eth0,romfile="" \ - -netdev user,id=eth1,net=$(QEMU_OPTS_NET2),dhcpstart=$(QEMU_OPTS_NET2_FIRST_IP) -device virtio-net-pci,netdev=eth1,romfile="" \ + $(QEMU_OPTS_eth1) \ -device nec-usb-xhci,id=xhci \ -qmp unix:$(CURDIR)/qmp.sock,server,wait=off QEMU_OPTS_CONF_PART=$(shell [ -d "$(CONF_PART)" ] && echo '-drive file=fat:rw:$(CONF_PART),format=raw') diff --git a/pkg/pillar/cmd/diag/diag.go b/pkg/pillar/cmd/diag/diag.go index 8c1d98e301..72af3f148b 100644 --- a/pkg/pillar/cmd/diag/diag.go +++ b/pkg/pillar/cmd/diag/diag.go @@ -961,8 +961,8 @@ func printOutput(ctx *diagContext, caller string) { } ctx.ph.Print("INFO: %s: Static Domain Name: %s\n", ifname, port.DomainName) - ctx.ph.Print("INFO: %s: Static NTP server: %s\n", - ifname, port.NtpServer.String()) + ctx.ph.Print("INFO: %s: Static NTP server: %+v\n", + ifname, port.ConfiguredNtpServers) } printProxy(ctx, port, ifname) if port.HasError() { diff --git a/pkg/pillar/cmd/zedagent/handlemetrics.go b/pkg/pillar/cmd/zedagent/handlemetrics.go index f7efbc201c..74a85b2e7a 100644 --- a/pkg/pillar/cmd/zedagent/handlemetrics.go +++ b/pkg/pillar/cmd/zedagent/handlemetrics.go @@ -1106,10 +1106,7 @@ func PublishAppInfoToZedCloud(ctx *zedagentContext, uuid string, networkInfo.DevName = *proto.String(name) niStatus := appIfnameToNetworkInstance(ctx, aiStatus, ifname) if niStatus != nil { - for _, ntpServer := range niStatus.NTPServers { - networkInfo.NtpServers = append(networkInfo.NtpServers, - ntpServer.String()) - } + networkInfo.NtpServers = append(networkInfo.NtpServers, niStatus.NTPServers...) networkInfo.DefaultRouters = []string{niStatus.Gateway.String()} networkInfo.Dns = &info.ZInfoDNS{ DNSservers: []string{}, diff --git a/pkg/pillar/cmd/zedagent/parseconfig.go b/pkg/pillar/cmd/zedagent/parseconfig.go index be8ccad25e..5ee30a01c8 100644 --- a/pkg/pillar/cmd/zedagent/parseconfig.go +++ b/pkg/pillar/cmd/zedagent/parseconfig.go @@ -1380,10 +1380,11 @@ func parseOneSystemAdapterConfig(getconfigCtx *getconfigContext, port.WirelessCfg = network.WirelessCfg port.Gateway = network.Gateway port.DomainName = network.DomainName - port.NTPServer = network.NTPServer + port.NTPServers = network.NTPServers port.DNSServers = network.DNSServers // Need to be careful since zedcloud can feed us bad Dhcp type port.Dhcp = network.Dhcp + port.IgnoreDhcpNtpServers = network.IgnoreDhcpNtpServers switch port.Dhcp { case types.DhcpTypeStatic: if sysAdapter.Addr == "" { @@ -2260,12 +2261,18 @@ func parseIpspecNetworkXObject(ipspec *zconfig.Ipspec, config *types.NetworkXObj return fmt.Errorf("invalid gateway IP (%s)", g) } } - if n := ipspec.GetNtp(); n != "" { - config.NTPServer = net.ParseIP(n) - if config.NTPServer == nil { - return fmt.Errorf("invalid NTP IP (%s)", n) - } + + ntpServers := append([]string{ipspec.GetNtp()}, ipspec.GetMoreNtp()...) + if len(ntpServers) > 0 && ntpServers[0] != "" { + config.NTPServers = ntpServers + } + + config.IgnoreDhcpNtpServers = false + dhcpOptionsIgnore := ipspec.GetDhcpOptionsIgnore() + if dhcpOptionsIgnore != nil { + config.IgnoreDhcpNtpServers = dhcpOptionsIgnore.NtpServerExclusively } + for _, dsStr := range ipspec.GetDns() { ds := net.ParseIP(dsStr) if ds == nil { @@ -2293,11 +2300,11 @@ func parseIpspec(ipspec *zconfig.Ipspec, config.DomainName = ipspec.GetDomain() // Parse NTP Server + if config.NtpServers == nil { + config.NtpServers = make([]string, 0) + } if n := ipspec.GetNtp(); n != "" { - config.NtpServer = net.ParseIP(n) - if config.NtpServer == nil { - return fmt.Errorf("invalid NTP IP (%s)", n) - } + config.NtpServers = append(config.NtpServers, n) } // Parse Dns Servers for _, dsStr := range ipspec.GetDns() { diff --git a/pkg/pillar/cmd/zedagent/parseconfig_test.go b/pkg/pillar/cmd/zedagent/parseconfig_test.go index 7af5a84ccf..a71e53e6d4 100644 --- a/pkg/pillar/cmd/zedagent/parseconfig_test.go +++ b/pkg/pillar/cmd/zedagent/parseconfig_test.go @@ -147,7 +147,7 @@ func TestParsePhysicalNetworkAdapters(t *testing.T) { g.Expect(port.DhcpConfig.AddrSubnet).To(BeEmpty()) g.Expect(port.DhcpConfig.DNSServers).To(BeEmpty()) g.Expect(port.DhcpConfig.Gateway).To(BeNil()) - g.Expect(port.DhcpConfig.NTPServer).To(BeNil()) + g.Expect(port.DhcpConfig.NTPServers).To(BeNil()) g.Expect(port.ProxyConfig.Proxies).To(BeEmpty()) g.Expect(port.L2LinkConfig.L2Type).To(Equal(types.L2LinkTypeNone)) g.Expect(port.WirelessCfg.WType).To(Equal(types.WirelessTypeNone)) diff --git a/pkg/pillar/cmd/zedagent/reportinfo.go b/pkg/pillar/cmd/zedagent/reportinfo.go index 60b3e27a2f..75a7ac5a75 100644 --- a/pkg/pillar/cmd/zedagent/reportinfo.go +++ b/pkg/pillar/cmd/zedagent/reportinfo.go @@ -641,7 +641,7 @@ func PublishDeviceInfoToZedCloud(ctx *zedagentContext, dest destinationBitset) { // device returns a runtime error. Similarly, we only support enforced application network // interface order for the KVM hypervisor. If enabled for application deployed under Xen // or Kubevirt hypervisor, EVE returns error and the application will not be started. - ReportDeviceInfo.ApiCapability = info.APICapability_API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER + ReportDeviceInfo.ApiCapability = info.APICapability_API_CAPABILITY_NTPS_FQDN // Report if there is a local override of profile if ctx.getconfigCtx.sideController.currentProfile != @@ -885,8 +885,10 @@ func encodeNetInfo(port types.NetworkPortStatus) *info.ZInfoNetwork { networkInfo.Proxy = encodeProxyStatus(&port.ProxyConfig) networkInfo.NtpServers = []string{} - for _, server := range port.NtpServers { - networkInfo.NtpServers = append(networkInfo.NtpServers, server.String()) + if !port.IgnoreDhcpNtpServers { + for _, server := range port.DhcpNtpServers { + networkInfo.NtpServers = append(networkInfo.NtpServers, server.String()) + } } return networkInfo } @@ -1035,12 +1037,25 @@ func encodeNetworkPortStatus(ctx *zedagentContext, devicePort.Up = port.Up devicePort.Mtu = uint32(port.MTU) devicePort.Domainname = port.DomainName - // TODO: modify EVE APIs and allow to publish full list of NTP servers - if port.NtpServer != nil { - devicePort.NtpServer = port.NtpServer.String() - } else if len(port.NtpServers) > 0 { - devicePort.NtpServer = port.NtpServers[0].String() + ntpServers := make([]string, 0) + if port.ConfiguredNtpServers != nil { + ntpServers = append(ntpServers, port.ConfiguredNtpServers...) + } + if len(port.DhcpNtpServers) > 0 && !port.IgnoreDhcpNtpServers { + ntpServers = append(ntpServers, port.DhcpNtpServers[0].String()) + if len(port.DhcpNtpServers) > 1 { + for _, ntpServer := range port.DhcpNtpServers[1:] { + ntpServers = append(ntpServers, ntpServer.String()) + } + } + } + if len(ntpServers) > 0 { + devicePort.NtpServer = ntpServers[0] + } + if len(ntpServers) > 1 { + devicePort.MoreNtpServers = ntpServers[1:] } + devicePort.Proxy = encodeProxyStatus(&port.ProxyConfig) devicePort.MacAddr = port.MacAddr.String() for _, ipAddr := range port.AddrInfoList { @@ -1143,7 +1158,13 @@ func encodeNetworkPortConfig(ctx *zedagentContext, dp.DefaultRouters = make([]string, 0) dp.DefaultRouters = append(dp.DefaultRouters, npc.Gateway.String()) - dp.NtpServer = npc.NTPServer.String() + if npc.NTPServers != nil && len(npc.NTPServers) > 0 { + dp.NtpServer = npc.NTPServers[0] + + if len(npc.NTPServers) > 1 { + dp.MoreNtpServers = append(dp.MoreNtpServers, npc.NTPServers[1:]...) + } + } dp.Dns = new(info.ZInfoDNS) dp.Dns.DNSdomain = npc.DomainName diff --git a/pkg/pillar/cmd/zedrouter/networkinstance.go b/pkg/pillar/cmd/zedrouter/networkinstance.go index ad76ac3562..3e9d01cf43 100644 --- a/pkg/pillar/cmd/zedrouter/networkinstance.go +++ b/pkg/pillar/cmd/zedrouter/networkinstance.go @@ -10,6 +10,7 @@ import ( "net" "strings" + "github.com/lf-edge/eve/pkg/pillar/devicenetwork" "github.com/lf-edge/eve/pkg/pillar/nireconciler" "github.com/lf-edge/eve/pkg/pillar/nistate" "github.com/lf-edge/eve/pkg/pillar/types" @@ -92,6 +93,41 @@ func (z *zedrouter) getNIBridgeConfig( } } +func (z *zedrouter) attachNTPServersToPortConfigs(portConfigs []nireconciler.Port) { + for i := range portConfigs { + pc := &portConfigs[i] + ntpServerIPs, ntpServerDomainsOrIPs := types.GetNTPServers(*z.deviceNetworkStatus, pc.IfName) + + ntpServers := make([]net.IP, 0, len(ntpServerDomainsOrIPs)) + for _, ntpServer := range ntpServerDomainsOrIPs { + ip := net.ParseIP(ntpServer) + if ip != nil { + ntpServers = append(ntpServers, ip) + continue + } + z.pubSub.StillRunning(agentName, warningTime, errorTime) + dnsResponses, err := devicenetwork.ResolveWithPortsLambda( + ntpServer, + *z.deviceNetworkStatus, + devicenetwork.ResolveCacheWrap(devicenetwork.ResolveWithSrcIP), + ) + if err != nil { + z.log.Warnf("could not resolve '%s': %v", ntpServer, err) + } + + for _, dnsResponse := range dnsResponses { + ntpServers = append(ntpServers, dnsResponse.IP) + } + } + + ntpServers = append(ntpServers, ntpServerIPs...) + generics.FilterDuplicatesFn(ntpServers, netutils.EqualIPs) + + pc.NTPServers = ntpServers + } +} + +// NTP servers are set separately with z.attachNTPServersToPortConfigs func (z *zedrouter) getNIPortConfig( status *types.NetworkInstanceStatus) (portConfigs []nireconciler.Port) { if len(status.Ports) == 0 { @@ -111,7 +147,6 @@ func (z *zedrouter) getNIPortConfig( MTU: port.MTU, DhcpType: port.Dhcp, DNSServers: types.GetDNSServers(*z.deviceNetworkStatus, port.IfName), - NTPServers: types.GetNTPServers(*z.deviceNetworkStatus, port.IfName), }) } return portConfigs @@ -124,12 +159,12 @@ func (z *zedrouter) updateNIPorts(niConfig types.NetworkInstanceConfig, var ( newPorts []*types.NetworkPortStatus validatedPortLLs []string - newNTPServers []net.IP + newNTPServers []string errorMsgs []string ) - if niStatus.NtpServer != nil { + if niStatus.NtpServers != nil { // The NTP server explicitly configured for the NI. - newNTPServers = append(newNTPServers, niStatus.NtpServer) + newNTPServers = append(newNTPServers, niStatus.NtpServers...) } if niStatus.PortLabel != "" { newPorts = z.deviceNetworkStatus.LookupPortsByLabel(niStatus.PortLabel) @@ -205,23 +240,26 @@ func (z *zedrouter) updateNIPorts(niConfig types.NetworkInstanceConfig, } // Port is valid for this network instance. validatedPortLLs = append(validatedPortLLs, port.Logicallabel) - if port.NtpServer != nil { + if port.ConfiguredNtpServers != nil { // The NTP server explicitly configured for the port. - newNTPServers = append(newNTPServers, port.NtpServer) + newNTPServers = append(newNTPServers, port.ConfiguredNtpServers...) } // NTP servers received via DHCP. - newNTPServers = append(newNTPServers, port.NtpServers...) + if !port.IgnoreDhcpNtpServers { + for _, dhcpNtpserver := range port.DhcpNtpServers { + newNTPServers = append(newNTPServers, dhcpNtpserver.String()) + } + } } if niStatus.PortLabel != "" && len(newPorts) == 0 { // This is potentially a transient state, wait for DNS update. errorMsgs = append(errorMsgs, fmt.Sprintf("no port is matching label '%s'", niStatus.PortLabel)) } - newNTPServers = generics.FilterDuplicatesFn(newNTPServers, netutils.EqualIPs) + newNTPServers = generics.FilterDuplicates(newNTPServers) changed = changed || !generics.EqualSets(niStatus.Ports, validatedPortLLs) niStatus.Ports = validatedPortLLs - changed = changed || !generics.EqualSetsFn(niStatus.NTPServers, newNTPServers, - netutils.EqualIPs) + changed = changed || !generics.EqualSets(niStatus.NTPServers, newNTPServers) niStatus.NTPServers = newNTPServers // Update BridgeMac for Switch NI bridge created by NIM. if z.niBridgeIsCreatedByNIM(niConfig) { @@ -492,8 +530,10 @@ func (z *zedrouter) updateNIRoutePort(route types.IPRouteConfig, port string, func (z *zedrouter) doActivateNetworkInstance(config types.NetworkInstanceConfig, status *types.NetworkInstanceStatus) { // Create network instance inside the network stack. + bridgeConfig := z.getNIBridgeConfig(status) + z.attachNTPServersToPortConfigs(bridgeConfig.Ports) niRecStatus, err := z.niReconciler.AddNI( - z.runCtx, config, z.getNIBridgeConfig(status)) + z.runCtx, config, bridgeConfig) if err != nil { z.log.Errorf("Failed to activate network instance %s: %v", status.UUID, err) status.ReconcileErr.SetErrorNow(err.Error()) @@ -537,8 +577,10 @@ func (z *zedrouter) doInactivateNetworkInstance(status *types.NetworkInstanceSta func (z *zedrouter) doUpdateActivatedNetworkInstance(config types.NetworkInstanceConfig, status *types.NetworkInstanceStatus) { + bridgeConfig := z.getNIBridgeConfig(status) + z.attachNTPServersToPortConfigs(bridgeConfig.Ports) niRecStatus, err := z.niReconciler.UpdateNI( - z.runCtx, config, z.getNIBridgeConfig(status)) + z.runCtx, config, bridgeConfig) if err != nil { z.log.Errorf("Failed to update activated network instance %s: %v", status.UUID, err) diff --git a/pkg/pillar/cmd/zedrouter/pubsubhandlers.go b/pkg/pillar/cmd/zedrouter/pubsubhandlers.go index 713bd78b91..8d7fd71042 100644 --- a/pkg/pillar/cmd/zedrouter/pubsubhandlers.go +++ b/pkg/pillar/cmd/zedrouter/pubsubhandlers.go @@ -547,6 +547,19 @@ func (z *zedrouter) handleAppNetworkModify(ctxArg interface{}, key string, configArg interface{}, oldConfigArg interface{}) { newConfig := configArg.(types.AppNetworkConfig) oldConfig := oldConfigArg.(types.AppNetworkConfig) + + // re-activate network instances of edge apps in order to resolve NTP servers again + for _, appNetConfig := range newConfig.AppNetAdapterList { + appNetStatus := z.lookupNetworkInstanceStatus(appNetConfig.Network.String()) + if appNetStatus == nil { + continue + } + if appNetStatus.Activated { + appNetConfig := z.lookupNetworkInstanceConfig(appNetStatus.Key()) + z.doUpdateActivatedNetworkInstance(*appNetConfig, appNetStatus) + } + } + status := z.lookupAppNetworkStatus(key) z.log.Functionf("handleAppNetworkModify(%v) for %s", newConfig.UUIDandVersion, newConfig.DisplayName) diff --git a/pkg/pillar/devicenetwork/dns.go b/pkg/pillar/devicenetwork/dns.go index f1f07db06e..698e90c156 100644 --- a/pkg/pillar/devicenetwork/dns.go +++ b/pkg/pillar/devicenetwork/dns.go @@ -5,6 +5,7 @@ package devicenetwork import ( "fmt" + "math" "net" "os" "path/filepath" @@ -96,6 +97,50 @@ func ResolveWithSrcIP(domain string, dnsServerIP net.IP, srcIP net.IP) ([]DNSRes return response, nil } +type cachedDNSResponses struct { + dnsResponses []DNSResponse + validUntil time.Time +} + +type cachedDNSResponseKey struct { + domain string + srcIP string +} + +var resolveCache = map[cachedDNSResponseKey]cachedDNSResponses{} + +// ResolveCacheWrap wraps around a resolve func (e.g. ResolveWithSrcIP) and caches DNS entries +func ResolveCacheWrap(resolve func(string, net.IP, net.IP) ([]DNSResponse, error)) func(domain string, dnsServerIP net.IP, srcIP net.IP) ([]DNSResponse, error) { + return func(domain string, dnsServerIP net.IP, srcIP net.IP) ([]DNSResponse, error) { + + cacheKey := cachedDNSResponseKey{ + domain: domain, + srcIP: srcIP.String(), + } + dnsResponses, found := resolveCache[cacheKey] + if !found || !dnsResponses.validUntil.After(time.Now()) { + dnsResponses, err := resolve(domain, dnsServerIP, srcIP) + if err == nil { + minValidUntil := uint32(math.MaxUint32) + for _, dnsResponse := range dnsResponses { + if dnsResponse.TTL < uint32(minValidUntil) { + minValidUntil = dnsResponse.TTL + } + } + validUntil := time.Now().Add(time.Duration(minValidUntil * uint32(time.Second))) + resolveCache[cacheKey] = cachedDNSResponses{ + dnsResponses: dnsResponses, + validUntil: validUntil, + } + } + + return dnsResponses, err + } + + return dnsResponses.dnsResponses, nil + } +} + // ResolveWithPortsLambda resolves a domain by using source IPs and dns servers from DeviceNetworkStatus // As a resolver func ResolveWithSrcIP can be used func ResolveWithPortsLambda(domain string, diff --git a/pkg/pillar/devicenetwork/dns_test.go b/pkg/pillar/devicenetwork/dns_test.go index b1d200ccea..715f4cd2f2 100644 --- a/pkg/pillar/devicenetwork/dns_test.go +++ b/pkg/pillar/devicenetwork/dns_test.go @@ -244,3 +244,44 @@ func TestResolveWithPortsLambdaWithErrors(t *testing.T) { t.Errorf("expected empty response, but got: %+v", res) } } + +func TestResolveCacheWrap(t *testing.T) { + t.Parallel() + called := 0 + + cw := devicenetwork.ResolveCacheWrap(func(domain string, dnsServerIP, srcIP net.IP) ([]devicenetwork.DNSResponse, error) { + called++ + return []devicenetwork.DNSResponse{ + { + IP: []byte{127, 0, 0, 1}, + TTL: 2, + }, + }, nil + }) + + cw("localhost", net.IP{8, 8, 8, 8}, net.IP{0, 0, 0, 0}) + + if called != 1 { + t.Fatalf("resolver func should have been called once, but called=%d", called) + } + + cw("localhost", net.IP{8, 8, 8, 8}, net.IP{0, 0, 0, 0}) + + if called != 1 { + t.Fatalf("resolver func should have been called once, but called=%d", called) + } + + time.Sleep(5 * time.Second) + cw("localhost", net.IP{8, 8, 8, 8}, net.IP{0, 0, 0, 0}) + if called != 2 { + t.Fatalf("resolver func should have been called twice, but called=%d", called) + } + + // Check different srcIPs + called = 0 + cw("localhost1", net.IP{8, 8, 8, 8}, net.IP{0, 0, 0, 0}) + cw("localhost1", net.IP{8, 8, 8, 8}, net.IP{1, 2, 3, 4}) + if called != 2 { + t.Fatalf("resolver func should have been called twice because different src IPs, but called=%d", called) + } +} diff --git a/pkg/pillar/dpcmanager/dns.go b/pkg/pillar/dpcmanager/dns.go index 0d86a53ca3..5c98bac9e1 100644 --- a/pkg/pillar/dpcmanager/dns.go +++ b/pkg/pillar/dpcmanager/dns.go @@ -66,7 +66,8 @@ func (m *DpcManager) updateDNS() { // Start with any statically assigned values; update below m.deviceNetStatus.Ports[ix].DomainName = port.DomainName m.deviceNetStatus.Ports[ix].DNSServers = port.DNSServers - m.deviceNetStatus.Ports[ix].NtpServer = port.NTPServer + m.deviceNetStatus.Ports[ix].ConfiguredNtpServers = port.NTPServers + m.deviceNetStatus.Ports[ix].IgnoreDhcpNtpServers = port.IgnoreDhcpNtpServers // Prefer errors recorded by DPC verification. // New errors are recorded from this function only when there is none yet // (HasError() == false). @@ -269,7 +270,7 @@ func (m *DpcManager) getDHCPInfo(port *types.NetworkPortStatus) error { if dhcpInfo.Subnet != nil { port.Subnet = *dhcpInfo.Subnet } - port.NtpServers = dhcpInfo.NtpServers + port.DhcpNtpServers = dhcpInfo.NtpServers return nil } diff --git a/pkg/pillar/dpcmanager/dpcmanager_test.go b/pkg/pillar/dpcmanager/dpcmanager_test.go index 0b1a5880a4..43dae8af46 100644 --- a/pkg/pillar/dpcmanager/dpcmanager_test.go +++ b/pkg/pillar/dpcmanager/dpcmanager_test.go @@ -1031,8 +1031,8 @@ func TestDNS(test *testing.T) { t.Expect(eth0State.DomainName).To(Equal("eth-test-domain")) t.Expect(eth0State.DNSServers).To(HaveLen(1)) t.Expect(eth0State.DNSServers[0].String()).To(Equal("8.8.8.8")) - t.Expect(eth0State.NtpServers).To(HaveLen(1)) - t.Expect(eth0State.NtpServers[0].String()).To(Equal("132.163.96.5")) + t.Expect(eth0State.DhcpNtpServers).To(HaveLen(1)) + t.Expect(eth0State.DhcpNtpServers[0].String()).To(Equal("132.163.96.5")) t.Expect(eth0State.Subnet.String()).To(Equal("192.168.10.0/24")) t.Expect(eth0State.MacAddr.String()).To(Equal("02:00:00:00:00:01")) t.Expect(eth0State.Up).To(BeTrue()) @@ -1054,8 +1054,8 @@ func TestDNS(test *testing.T) { t.Expect(eth1State.DomainName).To(Equal("eth-test-domain")) t.Expect(eth1State.DNSServers).To(HaveLen(1)) t.Expect(eth1State.DNSServers[0].String()).To(Equal("1.1.1.1")) - t.Expect(eth1State.NtpServers).To(HaveLen(1)) - t.Expect(eth1State.NtpServers[0].String()).To(Equal("132.163.96.6")) + t.Expect(eth1State.DhcpNtpServers).To(HaveLen(1)) + t.Expect(eth1State.DhcpNtpServers[0].String()).To(Equal("132.163.96.6")) t.Expect(eth1State.Subnet.String()).To(Equal("172.20.1.0/24")) t.Expect(eth1State.MacAddr.String()).To(Equal("02:00:00:00:00:02")) t.Expect(eth1State.Up).To(BeTrue()) @@ -1647,7 +1647,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(eth0State.IsL3Port).To(BeFalse()) t.Expect(eth0State.DomainName).To(BeEmpty()) t.Expect(eth0State.DNSServers).To(BeEmpty()) - t.Expect(eth0State.NtpServers).To(BeEmpty()) + t.Expect(eth0State.DhcpNtpServers).To(BeEmpty()) t.Expect(eth0State.Subnet.IP).To(BeNil()) t.Expect(eth0State.MacAddr.String()).To(Equal("02:00:00:00:00:01")) t.Expect(eth0State.Up).To(BeTrue()) @@ -1664,7 +1664,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(eth1State.IsL3Port).To(BeFalse()) t.Expect(eth1State.DomainName).To(BeEmpty()) t.Expect(eth1State.DNSServers).To(BeEmpty()) - t.Expect(eth1State.NtpServers).To(BeEmpty()) + t.Expect(eth1State.DhcpNtpServers).To(BeEmpty()) t.Expect(eth1State.Subnet.IP).To(BeNil()) t.Expect(eth1State.MacAddr.String()).To(Equal("02:00:00:00:00:02")) t.Expect(eth1State.Up).To(BeTrue()) @@ -1680,7 +1680,7 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(bond0State.IsL3Port).To(BeFalse()) t.Expect(bond0State.DomainName).To(BeEmpty()) t.Expect(bond0State.DNSServers).To(BeEmpty()) - t.Expect(bond0State.NtpServers).To(BeEmpty()) + t.Expect(bond0State.DhcpNtpServers).To(BeEmpty()) t.Expect(bond0State.Subnet.IP).To(BeNil()) t.Expect(bond0State.MacAddr.String()).To(Equal("02:00:00:00:00:03")) t.Expect(bond0State.Up).To(BeTrue()) @@ -1698,8 +1698,8 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan100State.DomainName).To(Equal("vlan100-test-domain")) t.Expect(vlan100State.DNSServers).To(HaveLen(1)) t.Expect(vlan100State.DNSServers[0].String()).To(Equal("8.8.8.8")) - t.Expect(vlan100State.NtpServers).To(HaveLen(1)) - t.Expect(vlan100State.NtpServers[0].String()).To(Equal("132.163.96.5")) + t.Expect(vlan100State.DhcpNtpServers).To(HaveLen(1)) + t.Expect(vlan100State.DhcpNtpServers[0].String()).To(Equal("132.163.96.5")) t.Expect(vlan100State.Subnet.String()).To(Equal("192.168.10.0/24")) t.Expect(vlan100State.MacAddr.String()).To(Equal("02:00:00:00:00:04")) t.Expect(vlan100State.Up).To(BeTrue()) @@ -1718,8 +1718,8 @@ func TestVlansAndBonds(test *testing.T) { t.Expect(vlan200State.DomainName).To(Equal("vlan200-test-domain")) t.Expect(vlan200State.DNSServers).To(HaveLen(1)) t.Expect(vlan200State.DNSServers[0].String()).To(Equal("1.1.1.1")) - t.Expect(vlan200State.NtpServers).To(HaveLen(1)) - t.Expect(vlan200State.NtpServers[0].String()).To(Equal("132.163.96.6")) + t.Expect(vlan200State.DhcpNtpServers).To(HaveLen(1)) + t.Expect(vlan200State.DhcpNtpServers[0].String()).To(Equal("132.163.96.6")) t.Expect(vlan200State.Subnet.String()).To(Equal("172.20.1.0/24")) t.Expect(vlan200State.MacAddr.String()).To(Equal("02:00:00:00:00:05")) t.Expect(vlan200State.Up).To(BeTrue()) diff --git a/pkg/pillar/dpcreconciler/genericitems/dhcpcd.go b/pkg/pillar/dpcreconciler/genericitems/dhcpcd.go index eb3116d059..03bf3466c9 100644 --- a/pkg/pillar/dpcreconciler/genericitems/dhcpcd.go +++ b/pkg/pillar/dpcreconciler/genericitems/dhcpcd.go @@ -324,13 +324,14 @@ func (c *DhcpcdConfigurator) dhcpcdArgs(config types.DhcpConfig) (op string, arg fmt.Sprintf("domain_name_servers=%s", strings.Join(dnsServers, " "))) } - if config.NTPServer != nil && !config.NTPServer.IsUnspecified() { - args = append(args, "--static", - fmt.Sprintf("ntp_servers=%s", - config.NTPServer.String())) + if config.NTPServers != nil { + for _, ntpServer := range config.NTPServers { + args = append(args, "--static", fmt.Sprintf("ntp_servers=%s", ntpServer)) + args = append(args, extras...) + } } - args = append(args, extras...) } + return op, args } diff --git a/pkg/pillar/dpcreconciler/genericitems/dhcpcd_test.go b/pkg/pillar/dpcreconciler/genericitems/dhcpcd_test.go index a12e04d1a3..c70dbcd5bf 100644 --- a/pkg/pillar/dpcreconciler/genericitems/dhcpcd_test.go +++ b/pkg/pillar/dpcreconciler/genericitems/dhcpcd_test.go @@ -25,7 +25,7 @@ func TestDhcpcdEqual(t *testing.T) { AddrSubnet: "192.168.1.44/24", // irrelevant Gateway: net.ParseIP("192.168.1.1"), // irrelevant DomainName: "mydomain", // irrelevant - NTPServer: net.ParseIP("192.168.1.1"), // irrelevant + NTPServers: []string{"192.168.1.1"}, // irrelevant Type: types.NetworkTypeIpv4Only, // must match }, }, @@ -93,7 +93,7 @@ func TestDhcpcdEqual(t *testing.T) { Dhcp: types.DhcpTypeStatic, AddrSubnet: "192.168.1.44/24", DomainName: "mydomain", - NTPServer: net.ParseIP("192.168.1.1"), + NTPServers: []string{"192.168.1.1"}, DNSServers: []net.IP{net.ParseIP("8.8.8.8")}, Type: types.NetworkTypeIpv4Only, // irrelevant }, @@ -103,7 +103,7 @@ func TestDhcpcdEqual(t *testing.T) { Dhcp: types.DhcpTypeStatic, AddrSubnet: "192.168.1.44/24", DomainName: "mydomain", - NTPServer: net.ParseIP("192.168.1.1"), + NTPServers: []string{"192.168.1.1"}, DNSServers: []net.IP{net.ParseIP("8.8.8.8")}, Type: types.NetworkTypeIPv4, // irrelevant }, @@ -117,7 +117,7 @@ func TestDhcpcdEqual(t *testing.T) { Dhcp: types.DhcpTypeStatic, AddrSubnet: "192.168.1.44/24", DomainName: "mydomain", - NTPServer: net.ParseIP("192.168.1.1"), + NTPServers: []string{"192.168.1.1"}, DNSServers: []net.IP{net.ParseIP("8.8.8.8")}, // does not match }, }, @@ -126,7 +126,7 @@ func TestDhcpcdEqual(t *testing.T) { Dhcp: types.DhcpTypeStatic, AddrSubnet: "192.168.1.44/24", DomainName: "mydomain", - NTPServer: net.ParseIP("192.168.1.1"), + NTPServers: []string{"192.168.1.1"}, DNSServers: []net.IP{net.ParseIP("1.1.1.1")}, // does not match }, }, diff --git a/pkg/pillar/go.mod b/pkg/pillar/go.mod index 5194d3f3f5..7d31a6cfe2 100644 --- a/pkg/pillar/go.mod +++ b/pkg/pillar/go.mod @@ -29,7 +29,7 @@ require ( github.com/jaypipes/ghw v0.8.0 github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.5.0 github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80 - github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c + github.com/lf-edge/eve-api/go v0.0.0-20241213165007-1a8f9be485b1 github.com/lf-edge/eve-libs v0.0.0-20241210085709-fc89dcac7f3c github.com/lf-edge/eve/pkg/kube/cnirpc v0.0.0-20240315102754-0f6d1f182e0d github.com/lf-edge/go-qemu v0.0.0-20231121152149-4c467eda0c56 diff --git a/pkg/pillar/go.sum b/pkg/pillar/go.sum index 61606b29cd..bb920150fd 100644 --- a/pkg/pillar/go.sum +++ b/pkg/pillar/go.sum @@ -1434,6 +1434,8 @@ github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80 h1:kiqB1Rk github.com/lf-edge/edge-containers v0.0.0-20240207093504-5dfda0619b80/go.mod h1:4yXdumKdTzF0URMtxOl8Xnzdxnoy1QR+2dzfOr4CIZY= github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c h1:axc1BfKlb6MmvbxPhCMW427b+Wxn7u/5PxdqbvYmm6k= github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c/go.mod h1:ot6MhAhBXapUDl/hXklaX4kY88T3uC4PTg0D2wD8DzA= +github.com/lf-edge/eve-api/go v0.0.0-20241213165007-1a8f9be485b1 h1:FEWskrHaPtLaymwKB9QLNvc79S7DxnE+4v3NGSNJZp0= +github.com/lf-edge/eve-api/go v0.0.0-20241213165007-1a8f9be485b1/go.mod h1:ot6MhAhBXapUDl/hXklaX4kY88T3uC4PTg0D2wD8DzA= github.com/lf-edge/eve-libs v0.0.0-20241210085709-fc89dcac7f3c h1:PN0cNV+Rwq6T358PYyuaFr3MU9xjUCPTHtUwepMACac= github.com/lf-edge/eve-libs v0.0.0-20241210085709-fc89dcac7f3c/go.mod h1:32koNJxwKDrVL7rBLy35QzjIuMvGy6+BmLjf8Y38MQU= github.com/lf-edge/eve/pkg/kube/cnirpc v0.0.0-20240315102754-0f6d1f182e0d h1:tUBb9M6u42LXwHAYHyh22wJeUUQlTpDkXwRXalpRqbo= diff --git a/pkg/pillar/nireconciler/linux_config.go b/pkg/pillar/nireconciler/linux_config.go index 6d392f33e0..d95da14fa1 100644 --- a/pkg/pillar/nireconciler/linux_config.go +++ b/pkg/pillar/nireconciler/linux_config.go @@ -1130,18 +1130,15 @@ func (r *LinuxNIReconciler) getIntendedDnsmasqCfg(niID uuid.UUID) (items []dg.It } // Combine NTP servers assigned to the port(s) together with those statically // configured for the network instance. - var ntpServers []net.IP + ntpServerIPs := make([]net.IP, 0) for _, port := range ni.bridge.Ports { - ntpServers = append(ntpServers, port.NTPServers...) + ntpServerIPs = append(ntpServerIPs, port.NTPServers...) } - if ni.config.NtpServer != nil { - ntpServers = append(ntpServers, ni.config.NtpServer) - } - ntpServers = generics.FilterDuplicatesFn(ntpServers, netutils.EqualIPs) + generics.FilterDuplicatesFn(ntpServerIPs, netutils.EqualIPs) var propagateRoutes []generic.IPRoute // Use DHCP to propagate host routes towards user-configured NTP and DNS servers. if bridgeIP != nil { - for _, ntpServer := range ntpServers { + for _, ntpServer := range ntpServerIPs { propagateRoutes = append(propagateRoutes, generic.IPRoute{ DstNetwork: netutils.HostSubnet(ntpServer), Gateway: bridgeIP.IP, @@ -1228,7 +1225,7 @@ func (r *LinuxNIReconciler) getIntendedDnsmasqCfg(niID uuid.UUID) (items []dg.It WithDefaultRoute: withDefaultRoute, DomainName: ni.config.DomainName, DNSServers: ni.config.DnsServers, - NTPServers: ntpServers, + NTPServers: ntpServerIPs, PropagateRoutes: propagateRoutes, MTU: ni.bridge.MTU, } diff --git a/pkg/pillar/scripts/device-steps.sh b/pkg/pillar/scripts/device-steps.sh index f21fc5da54..5d66e53967 100755 --- a/pkg/pillar/scripts/device-steps.sh +++ b/pkg/pillar/scripts/device-steps.sh @@ -81,14 +81,14 @@ get_ntp_servers_from_nim() { # Select static NTP sources ntp_static=$(jq -r -c \ '.Ports[] | - select(.NtpServer != null and .NtpServer != "") | - .NtpServer' $INPUTFILE) + select (.ConfiguredNtpServers != null) | + .ConfiguredNtpServers | .[]' $INPUTFILE) # Select dynamic (from DHCP) NTP sources ntp_dynamic=$(jq -r -c \ '.Ports[] | - select(.NtpServers != null) | - .NtpServers | .[]' $INPUTFILE) + select(.DhcpNtpServers != null and .IgnoreDhcpNtpServers == false) | + .DhcpNtpServers | .[]' $INPUTFILE) # Concat all in one string # shellcheck disable=SC3037 diff --git a/pkg/pillar/types/dns.go b/pkg/pillar/types/dns.go index e648e4d04d..4eba63cb74 100644 --- a/pkg/pillar/types/dns.go +++ b/pkg/pillar/types/dns.go @@ -15,6 +15,7 @@ import ( "github.com/lf-edge/eve/pkg/pillar/base" "github.com/lf-edge/eve/pkg/pillar/utils/generics" "github.com/lf-edge/eve/pkg/pillar/utils/netutils" + "github.com/sirupsen/logrus" ) // DeviceNetworkStatus is published to microservices which needs to know about ports and IP addresses @@ -46,22 +47,23 @@ type NetworkPortStatus struct { // InvalidConfig is used to flag port config which failed parsing or (static) validation // checks, such as: malformed IP address, undefined required field, IP address not inside // the subnet, etc. - InvalidConfig bool - Cost uint8 - Dhcp DhcpType - Type NetworkType // IPv4 or IPv6 or Dual stack - Subnet net.IPNet - NtpServer net.IP // This comes from network configuration - DomainName string - DNSServers []net.IP // If not set we use Gateway as DNS server - NtpServers []net.IP // This comes from DHCP done on uplink port - AddrInfoList []AddrInfo - Up bool - MacAddr net.HardwareAddr - DefaultRouters []net.IP - MTU uint16 - WirelessCfg WirelessConfig - WirelessStatus WirelessStatus + InvalidConfig bool + Cost uint8 + Dhcp DhcpType + Type NetworkType // IPv4 or IPv6 or Dual stack + Subnet net.IPNet + ConfiguredNtpServers []string // This comes from network configuration + IgnoreDhcpNtpServers bool + DomainName string + DNSServers []net.IP // If not set we use Gateway as DNS server + DhcpNtpServers []net.IP // This comes from DHCP done on uplink port + AddrInfoList []AddrInfo + Up bool + MacAddr net.HardwareAddr + DefaultRouters []net.IP + MTU uint16 + WirelessCfg WirelessConfig + WirelessStatus WirelessStatus ProxyConfig L2LinkConfig // TestResults provides recording of failure and success @@ -236,7 +238,7 @@ func (status DeviceNetworkStatus) MostlyEqual(status2 DeviceNetworkStatus) bool } if p1.Dhcp != p2.Dhcp || !netutils.EqualIPNets(&p1.Subnet, &p2.Subnet) || - !p1.NtpServer.Equal(p2.NtpServer) || + !generics.EqualSets(p1.ConfiguredNtpServers, p2.ConfiguredNtpServers) || p1.DomainName != p2.DomainName { return false } @@ -560,22 +562,34 @@ func GetDNSServers(dns DeviceNetworkStatus, ifname string) []net.IP { } // GetNTPServers returns all, or the ones on one interface if ifname is set -func GetNTPServers(dns DeviceNetworkStatus, ifname string) []net.IP { - var servers []net.IP +// Duplicate entries ared filtered out, but no DNS resolution happens, i.e. +// 1.2.3.4.nip.io and 1.2.3.4 can be in the list at the same time +func GetNTPServers(dns DeviceNetworkStatus, ifname string) ([]net.IP, []string) { + var serverDomainsOrIPs []string + var serverIPs []net.IP for _, us := range dns.Ports { if ifname != "" && ifname != us.IfName { continue } // NTP servers received via DHCP. - servers = append(servers, us.NtpServers...) + if !us.IgnoreDhcpNtpServers { + for _, ntpServer := range us.DhcpNtpServers { + // from golang/src/net/ip.go + if len(ntpServer) != net.IPv4len && len(ntpServer) != net.IPv6len { + logrus.Warnf("parsing ntp server '%v' failed", ntpServer) + continue + } + serverIPs = append(serverIPs, ntpServer) + } + } // Add statically configured NTP server as well. - if us.NtpServer != nil { - servers = append(servers, us.NtpServer) + if us.ConfiguredNtpServers != nil { + serverDomainsOrIPs = append(serverDomainsOrIPs, us.ConfiguredNtpServers...) } } // Avoid duplicates. - servers = generics.FilterDuplicatesFn(servers, netutils.EqualIPs) - return servers + serverDomainsOrIPs = generics.FilterDuplicates(serverDomainsOrIPs) + return serverIPs, serverDomainsOrIPs } // CountLocalIPv4AddrAnyNoLinkLocalIf is like CountLocalAddrAnyNoLinkLocalIf but diff --git a/pkg/pillar/types/dpc.go b/pkg/pillar/types/dpc.go index 82b18e085f..f282896158 100644 --- a/pkg/pillar/types/dpc.go +++ b/pkg/pillar/types/dpc.go @@ -594,6 +594,7 @@ type NetworkPortConfig struct { WirelessCfg WirelessConfig // TestResults - Errors from parsing plus success/failure from testing TestResults + IgnoreDhcpNtpServers bool } // EVE-defined port labels. @@ -683,7 +684,7 @@ type DhcpConfig struct { AddrSubnet string // In CIDR e.g., 192.168.1.44/24 Gateway net.IP DomainName string - NTPServer net.IP + NTPServers []string DNSServers []net.IP // If not set we use Gateway as DNS server Type NetworkType // IPv4 or IPv6 or Dual stack } @@ -1059,19 +1060,20 @@ func (config DevicePortConfigList) LogKey() string { // from protobuf API into DevicePortConfig. // XXX replace by inline once we have device model type NetworkXObjectConfig struct { - UUID uuid.UUID - Type NetworkType - Dhcp DhcpType // If DhcpTypeStatic or DhcpTypeClient use below - Subnet net.IPNet - Gateway net.IP - DomainName string - NTPServer net.IP - DNSServers []net.IP // If not set we use Gateway as DNS server - DhcpRange IPRange - DNSNameToIPList []DNSNameToIP // Used for DNS and ACL ipset - Proxy *ProxyConfig - WirelessCfg WirelessConfig - MTU uint16 + UUID uuid.UUID + Type NetworkType + Dhcp DhcpType // If DhcpTypeStatic or DhcpTypeClient use below + Subnet net.IPNet + Gateway net.IP + DomainName string + NTPServers []string + IgnoreDhcpNtpServers bool + DNSServers []net.IP // If not set we use Gateway as DNS server + DhcpRange IPRange + DNSNameToIPList []DNSNameToIP // Used for DNS and ACL ipset + Proxy *ProxyConfig + WirelessCfg WirelessConfig + MTU uint16 // Any errors from the parser // ErrorAndTime provides SetErrorNow() and ClearError() ErrorAndTime diff --git a/pkg/pillar/types/zedroutertypes.go b/pkg/pillar/types/zedroutertypes.go index 93b6868b99..7558f06202 100644 --- a/pkg/pillar/types/zedroutertypes.go +++ b/pkg/pillar/types/zedroutertypes.go @@ -709,7 +709,7 @@ type NetworkInstanceConfig struct { Subnet net.IPNet Gateway net.IP DomainName string - NtpServer net.IP + NtpServers []string DnsServers []net.IP // If not set we use Gateway as DNS server DhcpRange IPRange DnsNameToIPList []DNSNameToIP // Used for DNS and ACL ipset @@ -980,7 +980,7 @@ type NetworkInstanceStatus struct { // List of NTP servers published to applications connected to this network instance. // This includes the NTP server from the NI config (if any) and all NTP servers // associated with ports used by the network instance for external connectivity. - NTPServers []net.IP + NTPServers []string // The intended state of the routing table. // Includes user-configured static routes and potentially also automatically // generated default route. diff --git a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go index 50bc6f1214..cf38d2cd94 100644 --- a/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go +++ b/pkg/pillar/vendor/github.com/lf-edge/eve-api/go/info/info.pb.go @@ -1031,6 +1031,7 @@ const ( APICapability_API_CAPABILITY_MTU APICapability = 8 // Allows to set MTU for network adapters and network instances APICapability_API_CAPABILITY_ADAPTER_USER_LABELS APICapability = 9 // Supports user-defined shared network adapter labels APICapability_API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER APICapability = 10 // EVE is able to enforce the user-defined order of application network interfaces + APICapability_API_CAPABILITY_NTPS_FQDN APICapability = 11 // Allow to set NTP server via FQDN instead of only IP and allow setting several NTP servers ) // Enum value maps for APICapability. @@ -1047,6 +1048,7 @@ var ( 8: "API_CAPABILITY_MTU", 9: "API_CAPABILITY_ADAPTER_USER_LABELS", 10: "API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER", + 11: "API_CAPABILITY_NTPS_FQDN", } APICapability_value = map[string]int32{ "API_CAPABILITY_UNSPECIFIED": 0, @@ -1060,6 +1062,7 @@ var ( "API_CAPABILITY_MTU": 8, "API_CAPABILITY_ADAPTER_USER_LABELS": 9, "API_CAPABILITY_ENFORCED_NET_INTERFACE_ORDER": 10, + "API_CAPABILITY_NTPS_FQDN": 11, } ) @@ -9706,7 +9709,7 @@ var file_info_info_proto_rawDesc = []byte{ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x45, 0x58, 0x54, 0x34, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x5a, 0x46, 0x53, 0x10, 0x02, 0x2a, 0x96, + 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x5a, 0x46, 0x53, 0x10, 0x02, 0x2a, 0xb4, 0x03, 0x0a, 0x0d, 0x41, 0x50, 0x49, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, @@ -9732,150 +9735,152 @@ var file_info_info_proto_rawDesc = []byte{ 0x42, 0x45, 0x4c, 0x53, 0x10, 0x09, 0x12, 0x2f, 0x0a, 0x2b, 0x41, 0x50, 0x49, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x45, 0x4e, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x0a, 0x2a, 0xb9, 0x03, 0x0a, 0x0a, 0x42, 0x6f, 0x6f, 0x74, - 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, - 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, - 0x5f, 0x43, 0x4d, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, - 0x0a, 0x14, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, - 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x42, - 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, - 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x57, 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x48, 0x55, 0x4e, 0x47, 0x10, 0x08, 0x12, - 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, - 0x41, 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x50, 0x49, 0x44, 0x10, 0x09, 0x12, 0x16, 0x0a, - 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x52, - 0x4e, 0x45, 0x4c, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, - 0x0b, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, - 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x4f, 0x46, 0x46, - 0x5f, 0x43, 0x4d, 0x44, 0x10, 0x0e, 0x12, 0x1b, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x10, 0xff, 0x01, 0x2a, 0xbe, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x0a, - 0x1c, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, - 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, - 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, - 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x4d, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x50, 0x49, 0x5f, 0x43, + 0x41, 0x50, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x54, 0x50, 0x53, 0x5f, 0x46, + 0x51, 0x44, 0x4e, 0x10, 0x0b, 0x2a, 0xb9, 0x03, 0x0a, 0x0a, 0x42, 0x6f, 0x6f, 0x74, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x43, + 0x4d, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, + 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x4c, 0x4c, + 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, + 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x4f, 0x4f, + 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x4f, 0x4d, 0x10, 0x07, 0x12, 0x1d, + 0x0a, 0x19, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, 0x41, + 0x54, 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x48, 0x55, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x1c, 0x0a, + 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, 0x41, 0x54, + 0x43, 0x48, 0x44, 0x4f, 0x47, 0x5f, 0x50, 0x49, 0x44, 0x10, 0x09, 0x12, 0x16, 0x0a, 0x12, 0x42, + 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, + 0x4c, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0b, 0x12, + 0x17, 0x0a, 0x13, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0c, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x57, 0x45, 0x52, 0x4f, 0x46, 0x46, 0x5f, 0x43, + 0x4d, 0x44, 0x10, 0x0e, 0x12, 0x1b, 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0xff, + 0x01, 0x2a, 0xbe, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x1c, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, - 0x4b, 0x45, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, - 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x53, 0x50, 0x41, - 0x43, 0x45, 0x10, 0x03, 0x2a, 0xb5, 0x02, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, - 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x2a, 0x0a, + 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, + 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x4d, 0x41, 0x49, + 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x45, + 0x44, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, + 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, + 0x10, 0x03, 0x2a, 0xb5, 0x02, 0x0a, 0x10, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, 0x45, 0x53, + 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x54, + 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x24, - 0x0a, 0x20, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x5f, 0x57, 0x41, - 0x49, 0x54, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x45, 0x53, - 0x43, 0x52, 0x4f, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x41, - 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x04, 0x12, 0x28, - 0x0a, 0x24, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x43, 0x52, 0x4f, - 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x54, 0x54, 0x45, - 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, + 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, + 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x50, 0x4d, 0x5f, 0x45, 0x53, 0x43, 0x52, + 0x4f, 0x57, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, + 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, - 0x13, 0x41, 0x70, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x43, 0x52, 0x4f, 0x57, 0x5f, + 0x57, 0x41, 0x49, 0x54, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x54, + 0x54, 0x45, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, 0x13, 0x41, + 0x70, 0x70, 0x49, 0x6e, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, + 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, + 0x4e, 0x45, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x01, 0x12, - 0x29, 0x0a, 0x25, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, - 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x0c, 0x57, 0x69, - 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x49, - 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x57, 0x49, 0x52, - 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, - 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x2a, 0x71, 0x0a, - 0x0c, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x57, 0x4e, 0x4c, - 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x4f, 0x57, 0x4e, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, - 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, - 0x43, 0x4b, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x06, - 0x2a, 0xcb, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x53, 0x55, 0x42, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x4f, 0x57, 0x4e, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, - 0x01, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x49, 0x4e, 0x50, 0x52, - 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, - 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, - 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, - 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x50, 0x44, - 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x4b, - 0x0a, 0x0c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, - 0x0a, 0x19, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, - 0x18, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, - 0x50, 0x50, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x2a, 0xb8, 0x01, 0x0a, 0x16, - 0x5a, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x26, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, + 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x01, 0x12, 0x29, 0x0a, + 0x25, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x44, + 0x41, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x0c, 0x57, 0x69, 0x72, 0x65, + 0x6c, 0x65, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x49, 0x52, 0x45, + 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x57, 0x49, 0x52, 0x45, 0x4c, + 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, 0x01, 0x12, + 0x1a, 0x0a, 0x16, 0x57, 0x49, 0x52, 0x45, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x0c, 0x42, + 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, 0x41, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x06, 0x2a, 0xcb, + 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x73, 0x65, 0x4f, 0x73, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x4f, 0x57, 0x4e, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, + 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, + 0x14, 0x0a, 0x10, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, + 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, + 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x45, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x5f, 0x44, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x4b, 0x0a, 0x0c, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, + 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, + 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x50, + 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, 0x2a, 0xb8, 0x01, 0x0a, 0x16, 0x5a, 0x49, + 0x6e, 0x66, 0x6f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x26, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, + 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x24, 0x0a, 0x20, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, + 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, + 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, - 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x5a, 0x5f, 0x49, 0x4e, - 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, - 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, - 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x0d, 0x5a, 0x49, 0x6e, 0x66, 0x6f, - 0x56, 0x70, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, - 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x50, - 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, - 0x0a, 0x0f, 0x56, 0x50, 0x4e, 0x5f, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, - 0x44, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x56, 0x50, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, - 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x52, 0x45, - 0x4b, 0x45, 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x5a, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x5a, - 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, - 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, - 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, - 0x2a, 0x9e, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, - 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, - 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x4c, 0x4f, 0x57, - 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4c, - 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4d, - 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x5f, 0x52, - 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, - 0x04, 0x42, 0x39, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, - 0x65, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, - 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, + 0x23, 0x0a, 0x1f, 0x5a, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, + 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, + 0x57, 0x4e, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x0d, 0x5a, 0x49, 0x6e, 0x66, 0x6f, 0x56, 0x70, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x49, + 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x50, 0x4e, 0x5f, + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, + 0x56, 0x50, 0x4e, 0x5f, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, + 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x56, 0x50, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, + 0x45, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x52, 0x45, 0x4b, 0x45, + 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x56, 0x50, 0x4e, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x5a, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1e, 0x0a, 0x1a, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x17, 0x0a, 0x13, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x5a, 0x4e, 0x45, + 0x54, 0x49, 0x4e, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x49, + 0x4e, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x5a, 0x4e, 0x45, 0x54, 0x49, 0x4e, 0x53, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x9e, + 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x52, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, + 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, + 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, + 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x4f, 0x43, + 0x5f, 0x52, 0x45, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, + 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x5f, 0x52, 0x45, 0x4c, + 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x04, 0x42, + 0x39, 0x0a, 0x13, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6f, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/pkg/pillar/vendor/modules.txt b/pkg/pillar/vendor/modules.txt index d871b85967..1e29ffe782 100644 --- a/pkg/pillar/vendor/modules.txt +++ b/pkg/pillar/vendor/modules.txt @@ -638,7 +638,7 @@ github.com/leodido/go-urn github.com/lf-edge/edge-containers/pkg/registry github.com/lf-edge/edge-containers/pkg/resolver github.com/lf-edge/edge-containers/pkg/tgz -# github.com/lf-edge/eve-api/go v0.0.0-20241202084032-46c0a58dc84c +# github.com/lf-edge/eve-api/go v0.0.0-20241213165007-1a8f9be485b1 ## explicit; go 1.20 github.com/lf-edge/eve-api/go/attest github.com/lf-edge/eve-api/go/auth