Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package google-guest-agent for openSUSE:Factory checked in at 2026-04-22 16:56:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/google-guest-agent (Old) and /work/SRC/openSUSE:Factory/.google-guest-agent.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-guest-agent" Wed Apr 22 16:56:33 2026 rev:59 rq:1348533 version:20260402.00 Changes: -------- --- /work/SRC/openSUSE:Factory/google-guest-agent/google-guest-agent.changes 2026-01-20 21:05:43.874966911 +0100 +++ /work/SRC/openSUSE:Factory/.google-guest-agent.new.11940/google-guest-agent.changes 2026-04-22 16:56:34.756508941 +0200 @@ -1,0 +2,16 @@ +Tue Apr 07 19:42:40 UTC 2026 - Robert Schweikert <[email protected]> + +- Update to version 20260402.00: (bsc#1257010) + * Backport oslogin changes for sles16 to legacy agent (#603) + * Bump go.opentelemetry.io/otel/sdk from 1.37.0 to 1.40.0 (#596) + * Bump google.golang.org/grpc from 1.75.0 to 1.79.3 (#602) + * Actually finally fix the RPM spec (#601) + * Correct guest telemetry build target (#600) + * Add packaging for new telemetry extension (#599) + * Implement new scheduled job for routes monitor (#598) + * Add packaging changes for locally bundled extensions feature support (#593) + * Ensure the uninstall script handles GCE metadata endpoint unavailability. (#591) + * Disable certificates when security keys are enabled (#588) + * Move sourcing of per-user configs to the end of sshd_config, fixing 2FA logins. (#590) + +------------------------------------------------------------------- Old: ---- guest-agent-20260108.00.tar.gz New: ---- guest-agent-20260402.00.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ google-guest-agent.spec ++++++ --- /var/tmp/diff_new_pack.V1KfUD/_old 2026-04-22 16:56:35.752550169 +0200 +++ /var/tmp/diff_new_pack.V1KfUD/_new 2026-04-22 16:56:35.756550334 +0200 @@ -1,6 +1,7 @@ # # spec file for package google-guest-agent # +# Copyright (c) 2026 SUSE LLC # Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties @@ -24,7 +25,7 @@ %global import_path %{provider_prefix} Name: google-guest-agent -Version: 20260108.00 +Version: 20260402.00 Release: 0 Summary: Google Cloud Guest Agent License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.V1KfUD/_old 2026-04-22 16:56:35.820552982 +0200 +++ /var/tmp/diff_new_pack.V1KfUD/_new 2026-04-22 16:56:35.824553149 +0200 @@ -3,8 +3,8 @@ <param name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="versionformat">20260108.00</param> - <param name="revision">20260108.00</param> + <param name="versionformat">20260402.00</param> + <param name="revision">20260402.00</param> <param name="changesgenerate">enable</param> </service> <service name="recompress" mode="disabled"> @@ -15,7 +15,7 @@ <param name="basename">guest-agent</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">guest-agent-20260108.00.tar.gz</param> + <param name="archive">guest-agent-20260402.00.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.V1KfUD/_old 2026-04-22 16:56:35.868554970 +0200 +++ /var/tmp/diff_new_pack.V1KfUD/_new 2026-04-22 16:56:35.872555135 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param> - <param name="changesrevision">ec2658bcfb52cde8a27e7fcd31325c42ca57fdd8</param></service></servicedata> + <param name="changesrevision">41196f1f67f02da1c1604770e851ad327a7ce848</param></service></servicedata> (No newline at EOF) ++++++ guest-agent-20260108.00.tar.gz -> guest-agent-20260402.00.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/go.mod new/guest-agent-20260402.00/go.mod --- old/guest-agent-20260108.00/go.mod 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/go.mod 2026-04-02 20:13:07.000000000 +0200 @@ -17,34 +17,34 @@ github.com/kardianos/service v1.2.4 github.com/robfig/cron/v3 v3.0.1 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 - golang.org/x/crypto v0.45.0 - golang.org/x/sys v0.38.0 + golang.org/x/crypto v0.46.0 + golang.org/x/sys v0.40.0 google.golang.org/api v0.248.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + google.golang.org/grpc v1.79.3 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 software.sslmate.com/src/go-pkcs12 v0.6.0 ) require ( - cel.dev/expr v0.24.0 // indirect + cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.121.6 // indirect cloud.google.com/go/auth v0.16.5 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.8.0 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/logging v1.13.0 // indirect cloud.google.com/go/longrunning v0.6.7 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect - github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-jose/go-jose/v4 v4.1.2 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/go-configfs-tsm v0.3.3 // indirect @@ -57,22 +57,22 @@ github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.37.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/sdk v1.37.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/otel v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect + go.opentelemetry.io/otel/sdk v1.40.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/text v0.32.0 // indirect golang.org/x/time v0.12.0 // indirect google.golang.org/genproto v0.0.0-20250826171959-ef028d996bc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/go.sum new/guest-agent-20260402.00/go.sum --- old/guest-agent-20260108.00/go.sum 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/go.sum 2026-04-02 20:13:07.000000000 +0200 @@ -1,5 +1,7 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI= @@ -8,6 +10,8 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= @@ -24,6 +28,8 @@ github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250819203904-a74b641fa7fd/go.mod h1:GR/7nZ6CacsFrX0pUGeFEzCo7nZDnyJnboi9zUsr2yA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= @@ -36,22 +42,31 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -113,34 +128,60 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.37.0 h1:B+WbN9RPsvobe6q4vP6KgM8/9plR/HNjgGBrfcOlweA= go.opentelemetry.io/contrib/detectors/gcp v1.37.0/go.mod h1:K5zQ3TT7p2ru9Qkzk0bKtCql0RGkPj9pRjpXgZJZ+rU= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -149,30 +190,45 @@ golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg= golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= @@ -183,12 +239,20 @@ google.golang.org/genproto v0.0.0-20250826171959-ef028d996bc1/go.mod h1:Jz9LrroM7Mcm+a0QrLh4UpZ1B/WhjIbqwEcUf4y08nQ= google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1 h1:APHvLLYBhtZvsbnpkfknDZ7NyH4z5+ub/I0u8L3Oz6g= google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1/go.mod h1:xUjFWUnWDpZ/C0Gu0qloASKFb6f8/QXiiXhSPFsD668= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA= google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/addresses.go new/guest-agent-20260402.00/google_guest_agent/addresses.go --- old/guest-agent-20260108.00/google_guest_agent/addresses.go 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/addresses.go 2026-04-02 20:13:07.000000000 +0200 @@ -26,6 +26,7 @@ "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/cfg" network "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/network/manager" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run" + "github.com/GoogleCloudPlatform/guest-agent/metadata" "github.com/GoogleCloudPlatform/guest-logging-go/logger" ) @@ -261,6 +262,12 @@ func (a *addressMgr) Set(ctx context.Context) error { config := cfg.Get() + // Make sure the monitor job is skipped until the address manager is finished. + routesMonitorJob.ShouldSkip.Store(true) + defer func() { + routesMonitorJob.ShouldSkip.Store(false) + }() + if runtime.GOOS == "windows" { a.applyWSFCFilter(config) } @@ -278,8 +285,17 @@ return nil } + // Run the route setup. + setupRoutes(ctx, newMetadata, config) + + return nil +} + +// setupRoutes runs the route setup. +func setupRoutes(ctx context.Context, metadata *metadata.Descriptor, config *cfg.Sections) { logger.Debugf("Add routes for aliases, forwarded IP and target-instance IPs") // Add routes for IP aliases, forwarded and target-instance IPs. + var routesChanged bool for _, ni := range newMetadata.Instance.NetworkInterfaces { iface, err := network.GetInterfaceByMAC(ni.Mac) if err != nil { @@ -354,6 +370,7 @@ msg += fmt.Sprintf(" removing %q", toRm) } logger.Infof("%v", msg) + routesChanged = true } var registryEntries []string @@ -416,9 +433,12 @@ } } } - logger.Infof("Completed adding/removing routes for aliases, forwarded IP and target-instance IPs") - - return nil + // Only log the routes addition/removal if we actually added/removed a route. + if routesChanged { + logger.Infof("Completed adding/removing routes for aliases, forwarded IP and target-instance IPs") + } else { + logger.Debugf("No routes changed") + } } // isIPv6 returns true if the IP address is an IPv6 address. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/addresses_monitor.go new/guest-agent-20260402.00/google_guest_agent/addresses_monitor.go --- old/guest-agent-20260108.00/google_guest_agent/addresses_monitor.go 1970-01-01 01:00:00.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/addresses_monitor.go 2026-04-02 20:13:07.000000000 +0200 @@ -0,0 +1,83 @@ +// Copyright 2026 Google LLC +// +// 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 +// +// http://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 main + +import ( + "context" + "sync" + "sync/atomic" + "time" + + "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/cfg" + "github.com/GoogleCloudPlatform/guest-agent/metadata" + "github.com/GoogleCloudPlatform/guest-logging-go/logger" +) + +const ( + // monitorID is the ID of the routes monitor scheduled job. + monitorID = "routes_monitor" + // routesMonitorFallbackMonitor is the fallback routes monitor interval to use + // if the user-specified interval is invalid. + fallbackInterval = 10 * time.Second +) + +// routesMonitor is the routes monitor scheduled job implementation. +type routesMonitor struct { + // mds is the metadata descriptor to use for monitoring routes. + mds *metadata.Descriptor + // mdsMu is the mutex protecting the mds descriptor. + mdsMu sync.Mutex + // ShouldSkip indicates whether the next run of the monitor should be skipped. + ShouldSkip atomic.Bool +} + +// ID returns the job id. +func (*routesMonitor) ID() string { + return monitorID +} + +// Interval returns the interval at which job should be rescheduled and +// a bool determining if job should be scheduled starting now. +// If false, first run will be at time now+interval. +func (*routesMonitor) Interval() (time.Duration, bool) { + interval, err := time.ParseDuration(cfg.Get().Routes.MonitorInterval) + if err != nil { + logger.Infof("Invalid routes monitor interval (err %v), using fallback of %v", err, fallbackInterval) + interval = fallbackInterval + } + return interval, false +} + +// ShouldEnable specifies if the job should be enabled for scheduling. +func (*routesMonitor) ShouldEnable(context.Context) bool { + return cfg.Get().Routes.EnableMonitor +} + +// Run triggers the job for single execution. It returns error if any +// and a bool stating if scheduler should continue or stop scheduling. +func (m *routesMonitor) Run(ctx context.Context) (bool, error) { + // Skip the routes setup if the setup should be skipped. This variable + // should be reset by the job or manager that originally set this to + // true so that the monitor isn't indefinitely skipped. + if m.ShouldSkip.Load() { + return true, nil + } + + m.mdsMu.Lock() + defer m.mdsMu.Unlock() + + setupRoutes(ctx, m.mds, cfg.Get()) + return true, nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/cfg/cfg.go new/guest-agent-20260402.00/google_guest_agent/cfg/cfg.go --- old/guest-agent-20260108.00/google_guest_agent/cfg/cfg.go 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/cfg/cfg.go 2026-04-02 20:13:07.000000000 +0200 @@ -101,6 +101,10 @@ disable-https-mds-setup = true enable-https-mds-native-cert-store = false +[Routes] +enable_monitor = false +monitor_interval = 10s + [Snapshots] enabled = false snapshot_service_ip = 169.254.169.254 @@ -175,6 +179,9 @@ // MDS defines the MDS configuration options. MDS *MDS `ini:"MDS,omitempty"` + // Routes defines configuration options specific to the routes monitor. + Routes *Routes `ini:"Routes,omitempty"` + // Snpashots defines the snapshot listener configuration and behavior i.e. the server address and port. Snapshots *Snapshots `ini:"Snapshots,omitempty"` @@ -291,6 +298,12 @@ VlanSetupEnabled bool `ini:"vlan_setup_enabled,omitempty"` } +// Routes contains the configurations of the Routes section. +type Routes struct { + EnableMonitor bool `ini:"enable_monitor,omitempty"` + MonitorInterval string `ini:"monitor_interval,omitempty"` +} + // Snapshots contains the configurations of Snapshots section. type Snapshots struct { Enabled bool `ini:"enabled,omitempty"` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/main.go new/guest-agent-20260402.00/google_guest_agent/main.go --- old/guest-agent-20260108.00/google_guest_agent/main.go 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/main.go 2026-04-02 20:13:07.000000000 +0200 @@ -54,6 +54,7 @@ osInfo osinfo.OSInfo mdsClient *metadata.Client addressManager = &addressMgr{} + routesMonitorJob = &routesMonitor{} ) const ( @@ -142,6 +143,8 @@ func runUpdate(ctx context.Context) { var wg sync.WaitGroup + + // Run all registered managers. for _, mgr := range availableManagers() { wg.Add(1) go func(mgr manager) { @@ -149,6 +152,11 @@ runManager(ctx, mgr) }(mgr) } + + // Update the MDS used by the routes monitor. + routesMonitorJob.mdsMu.Lock() + routesMonitorJob.mds = newMetadata + routesMonitorJob.mdsMu.Unlock() wg.Wait() } @@ -215,6 +223,10 @@ // knownJobs is list of default jobs that run on a pre-defined schedule. knownJobs := []scheduler.Job{telemetry.New(mdsClient, programName, version)} + if cfg.Get().Routes.EnableMonitor { + // Only add this to the known jobs if the job is enabled. + knownJobs = append(knownJobs, routesMonitorJob) + } scheduler.ScheduleJobs(ctx, knownJobs, false) eventManager := events.Get() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/oslogin.go new/guest-agent-20260402.00/google_guest_agent/oslogin.go --- old/guest-agent-20260108.00/google_guest_agent/oslogin.go 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/oslogin.go 2026-04-02 20:13:07.000000000 +0200 @@ -30,9 +30,17 @@ "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/sshca" "github.com/GoogleCloudPlatform/guest-agent/metadata" + "github.com/GoogleCloudPlatform/guest-agent/utils" "github.com/GoogleCloudPlatform/guest-logging-go/logger" ) +const ( + defaultSSHDConfigPath = "/etc/ssh/sshd_config" + defaultNSSwitchConfigPath = "/etc/nsswitch.conf" + defaultPAMConfigPath = "/etc/pam.d/sshd" + defaultGroupConfigPath = "/etc/security/group.conf" +) + var ( googleComment = "# Added by Google Compute Engine OS Login." googleBlockStart = "#### Google OS Login control. Do not edit this section. ####" @@ -45,6 +53,14 @@ deprecatedConfigDirectives = map[string][]string{ "/etc/pam.d/su": {"account [success=bad ignore=ignore] pam_oslogin_login.so"}, } + + // sles16Map contains mapping of files to be copied from /usr to /etc for SLES 16. + sles16Map = map[string]string{ + "/usr/etc/ssh/sshd_config": defaultSSHDConfigPath, + "/usr/etc/nsswitch.conf": defaultNSSwitchConfigPath, + "/usr/lib/pam.d/sshd": defaultPAMConfigPath, + "/usr/etc/security/group.conf": defaultGroupConfigPath, + } ) type osloginMgr struct{} @@ -123,6 +139,28 @@ return runtime.GOOS == "windows", nil } +func setupSles16OSLoginDirs() error { + isSles16 := strings.Contains(osInfo.OS, "sles") || strings.Contains(osInfo.OS, "opensuse") + if !isSles16 || osInfo.Version.Major != 16 { + logger.Infof("Skipping OSLogin SLES 16 specific setup on %q %d", osInfo.OS, osInfo.Version.Major) + return nil + } + + for k, v := range sles16Map { + if utils.FileExists(v, utils.TypeFile) { + logger.Infof("File %q already exists, skipping copy from %q", v, k) + continue + } + + logger.Infof("Copying file %q -> %q", k, v) + if err := utils.CopyFile(k, v, 0644); err != nil { + return fmt.Errorf("failed to copy %q -> %q: %w", k, v, err) + } + } + + return nil +} + func (o *osloginMgr) Set(ctx context.Context) error { // We need to know if it was previously enabled for the clearing of // metadata-based SSH keys. @@ -135,6 +173,7 @@ logger.Infof("Enabling OS Login") newMetadata.Instance.Attributes.SSHKeys = nil newMetadata.Project.Attributes.SSHKeys = nil + setupSles16OSLoginDirs() (&accountsMgr{}).Set(ctx) } else if !enable && oldEnable { logger.Infof("Disabling OS Login") @@ -309,7 +348,6 @@ } authorizedKeysUser := "AuthorizedKeysCommandUser root" sourcePerUserConfigs := "Include /var/google-users.d/*" - matchAllAgain := "Match all" // Certificate based authentication. authorizedPrincipalsCommand := "AuthorizedPrincipalsCommand /usr/bin/google_authorized_principals %u %k" @@ -327,25 +365,32 @@ filtered := filterGoogleLines(string(sshConfig)) if enable { - osLoginBlock := []string{googleBlockStart} - + headerBlock := []string{googleBlockStart} // Metadata overrides the config file. - if reqCerts { - osLoginBlock = append(osLoginBlock, trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser) + if reqCerts && !skey { + headerBlock = append(headerBlock, trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser) } else { - if cfg.Get().OSLogin.CertAuthentication { - osLoginBlock = append(osLoginBlock, trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser) + if cfg.Get().OSLogin.CertAuthentication && !skey { + headerBlock = append(headerBlock, trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser) } - osLoginBlock = append(osLoginBlock, authorizedKeysCommand, authorizedKeysUser) + headerBlock = append(headerBlock, authorizedKeysCommand, authorizedKeysUser) } if twofactor { - osLoginBlock = append(osLoginBlock, twoFactorAuthMethods, challengeResponseEnable) + headerBlock = append(headerBlock, twoFactorAuthMethods, challengeResponseEnable) } - osLoginBlock = append(osLoginBlock, sourcePerUserConfigs, matchAllAgain, googleBlockEnd) - filtered = append(osLoginBlock, filtered...) + headerBlock = append(headerBlock, googleBlockEnd) + + // Put the header block ahead of the user's existing config. + filtered = append(headerBlock, filtered...) + + // Start a footer block for Match blocks, including per-user configs from + // /var/google-users.d and the exception for service accounts when 2FA is enabled. + filtered = append(filtered, googleBlockStart, sourcePerUserConfigs) if twofactor { - filtered = append(filtered, googleBlockStart, matchblock1, matchblock2, googleBlockEnd) + filtered = append(filtered, matchblock1, matchblock2) } + // End the footer, marking the end of the sshd_config file. + filtered = append(filtered, googleBlockEnd) } return strings.Join(filtered, "\n") + "\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/google_guest_agent/oslogin_test.go new/guest-agent-20260402.00/google_guest_agent/oslogin_test.go --- old/guest-agent-20260108.00/google_guest_agent/oslogin_test.go 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/google_guest_agent/oslogin_test.go 2026-04-02 20:13:07.000000000 +0200 @@ -17,12 +17,17 @@ import ( "encoding/json" "fmt" + "os" + "path/filepath" "strings" "testing" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/cfg" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/events/sshtrustedca" + "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/osinfo" "github.com/GoogleCloudPlatform/guest-agent/metadata" + "github.com/GoogleCloudPlatform/guest-agent/utils" + "github.com/google/go-cmp/cmp" ) func TestFilterGoogleLines(t *testing.T) { @@ -208,7 +213,6 @@ trustedUserCAKeys := "TrustedUserCAKeys " + sshtrustedca.DefaultPipePath twoFactorAuthMethods := "AuthenticationMethods publickey,keyboard-interactive" includePerUserConfigs := "Include /var/google-users.d/*" - matchAllAgain := "Match all" matchblock1 := `Match User sa_*` matchblock2 := ` AuthenticationMethods publickey` @@ -233,11 +237,10 @@ authorizedKeysUser, twoFactorAuthMethods, challengeResponseEnable, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", googleBlockStart, + includePerUserConfigs, matchblock1, matchblock2, googleBlockEnd, @@ -262,11 +265,10 @@ authorizedKeysUser, twoFactorAuthMethods, challengeResponseEnable, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", googleBlockStart, + includePerUserConfigs, matchblock1, matchblock2, googleBlockEnd, @@ -294,12 +296,11 @@ authorizedKeysUser, twoFactorAuthMethods, challengeResponseEnable, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line3", googleBlockStart, + includePerUserConfigs, matchblock1, matchblock2, googleBlockEnd, @@ -324,12 +325,11 @@ authorizedKeysUser, twoFactorAuthMethods, challengeResponseEnable, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line3", googleBlockStart, + includePerUserConfigs, matchblock1, matchblock2, googleBlockEnd, @@ -353,11 +353,12 @@ authorizedPrincipalsUser, authorizedKeysCommand, authorizedKeysUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, @@ -375,11 +376,12 @@ googleBlockStart, authorizedKeysCommand, authorizedKeysUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, @@ -436,21 +438,45 @@ }, want: []string{ googleBlockStart, - trustedUserCAKeys, - authorizedPrincipalsCommand, - authorizedPrincipalsUser, authorizedKeysCommandSk, authorizedKeysUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, skey: true, reqCerts: false, + cfgCert: false, + }, + { + // Skey enablement disables certificates. + contents: []string{ + "line1", + "line2", + googleBlockStart, + "line3", + googleBlockEnd, + }, + want: []string{ + googleBlockStart, + authorizedKeysCommandSk, + authorizedKeysUser, + googleBlockEnd, + "line1", + "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, + }, + enable: true, + twofactor: false, + skey: true, + reqCerts: true, cfgCert: true, }, { @@ -466,11 +492,12 @@ googleBlockStart, authorizedKeysCommandSk, authorizedKeysUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, @@ -492,11 +519,12 @@ trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, @@ -518,11 +546,12 @@ trustedUserCAKeys, authorizedPrincipalsCommand, authorizedPrincipalsUser, - includePerUserConfigs, - matchAllAgain, googleBlockEnd, "line1", "line2", + googleBlockStart, + includePerUserConfigs, + googleBlockEnd, }, enable: true, twofactor: false, @@ -779,3 +808,136 @@ } } } + +func TestSetupUsrEtcOSLoginDirs(t *testing.T) { + oldSles16Map := sles16Map + oldOsinfoRead := osInfo + t.Cleanup(func() { + sles16Map = oldSles16Map + osInfo = oldOsinfoRead + }) + + wantMap := map[string]string{ + "/usr/etc/ssh/sshd_config": "/etc/ssh/sshd_config", + "/usr/etc/nsswitch.conf": "/etc/nsswitch.conf", + "/usr/lib/pam.d/sshd": "/etc/pam.d/sshd", + "/usr/etc/security/group.conf": "/etc/security/group.conf", + } + if diff := cmp.Diff(wantMap, sles16Map); diff != "" { + t.Fatalf("sles16Map unexpected diff (-want +got):\n%s", diff) + } + + tests := []struct { + name string + info osinfo.OSInfo + createSrc bool + createDst bool + dstContent string + dstShouldExist bool + prevSetup bool + }{ + { + name: "debian12-no-copy", + info: osinfo.OSInfo{OS: "debian", Version: osinfo.Ver{Major: 12}}, + createSrc: true, + createDst: false, + dstShouldExist: false, + }, + { + name: "sles15-no-copy", + info: osinfo.OSInfo{OS: "sles", Version: osinfo.Ver{Major: 15}}, + createSrc: true, + createDst: false, + dstShouldExist: false, + }, + { + name: "opensuse15-no-copy", + info: osinfo.OSInfo{OS: "opensuse", Version: osinfo.Ver{Major: 15}}, + createSrc: true, + createDst: false, + dstShouldExist: false, + }, + { + name: "sles16-copy", + info: osinfo.OSInfo{OS: "sles", Version: osinfo.Ver{Major: 16}}, + createSrc: true, + createDst: false, + dstShouldExist: true, + dstContent: "test", + }, + { + name: "opensuse16-copy", + info: osinfo.OSInfo{OS: "opensuse", Version: osinfo.Ver{Major: 16}}, + createSrc: true, + createDst: false, + dstShouldExist: true, + dstContent: "test", + }, + { + name: "sles16-no-copy-if-exists", + info: osinfo.OSInfo{OS: "sles", Version: osinfo.Ver{Major: 16}}, + createSrc: false, + createDst: true, + dstContent: "exists", + dstShouldExist: true, + }, + { + name: "sles16-no-copy-if-already-setup", + info: osinfo.OSInfo{OS: "sles", Version: osinfo.Ver{Major: 16}}, + createSrc: false, + createDst: true, + dstContent: "exists", + dstShouldExist: true, + prevSetup: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + usrDir := t.TempDir() + etcDir := t.TempDir() + src := filepath.Join(usrDir, "nsswitch.conf") + dst := filepath.Join(etcDir, "nsswitch.conf") + sles16Map = map[string]string{ + src: dst, + } + + if err := os.MkdirAll(filepath.Dir(src), 0755); err != nil { + t.Fatalf("Failed to create dir for %s: %v", src, err) + } + if tt.createSrc { + if err := os.WriteFile(src, []byte("test"), 0644); err != nil { + t.Fatalf("Failed to write to %s: %v", src, err) + } + } + + if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { + t.Fatalf("Failed to create dir for %s: %v", dst, err) + } + if tt.createDst { + if err := os.WriteFile(dst, []byte(tt.dstContent), 0644); err != nil { + t.Fatalf("Failed to write to %s: %v", dst, err) + } + } + + osInfo = tt.info + + if err := setupSles16OSLoginDirs(); err != nil { + t.Fatalf("setupSles16OSLoginDirs() returned err: %v, want nil", err) + } + + if got := utils.FileExists(dst, utils.TypeFile); got != tt.dstShouldExist { + t.Errorf("Destination file %s exists: %t, want: %t", dst, got, tt.dstShouldExist) + } + if tt.dstShouldExist { + got, err := os.ReadFile(dst) + if err != nil { + t.Fatalf("Failed to read destination file %s: %v", dst, err) + } + if string(got) != tt.dstContent { + t.Errorf("Destination file %s content changed to %s, want %s", dst, string(got), tt.dstContent) + } + } + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/packaging/debian/rules new/guest-agent-20260402.00/packaging/debian/rules --- old/guest-agent-20260108.00/packaging/debian/rules 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/packaging/debian/rules 2026-04-02 20:13:07.000000000 +0200 @@ -25,13 +25,17 @@ install -p -m 0644 gce-workload-cert-refresh.timer debian/google-guest-agent/lib/systemd/system/ install -p -m 0755 google_metadata_script_runner_adapt debian/google-guest-agent/usr/bin/ if [ -d google-guest-agent ]; then\ - install -d debian/google-guest-agent/usr/lib/google/guest_agent;\ + install -d debian/google-guest-agent/usr/lib/google/guest_agent/GuestAgentCorePlugin;\ + install -p -m 0644 google-guest-agent/build/configs/usr/lib/google/guest_agent/GuestAgentCorePlugin/manifest.binpb debian/google-guest-agent/usr/lib/google/guest_agent/GuestAgentCorePlugin/manifest.binpb;\ install -p -m 0755 google-guest-agent/cmd/gce_metadata_script_runner/gce_metadata_script_runner debian/google-guest-agent/usr/bin/gce_metadata_script_runner;\ install -p -m 0755 google-guest-agent/cmd/google_guest_compat_manager/google_guest_compat_manager debian/google-guest-agent/usr/bin/google_guest_compat_manager;\ install -p -m 0755 google-guest-agent/cmd/google_guest_agent/google_guest_agent debian/google-guest-agent/usr/bin/google_guest_agent_manager;\ install -p -m 0755 google-guest-agent/cmd/ggactl/ggactl_plugin debian/google-guest-agent/usr/bin/ggactl_plugin;\ - install -p -m 0755 google-guest-agent/cmd/core_plugin/core_plugin debian/google-guest-agent/usr/lib/google/guest_agent/core_plugin;\ + install -p -m 0755 google-guest-agent/cmd/core_plugin/core_plugin debian/google-guest-agent/usr/lib/google/guest_agent/GuestAgentCorePlugin/core_plugin;\ install -p -m 0755 google-guest-agent/cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner debian/google-guest-agent/usr/bin/gce_compat_metadata_script_runner;\ + install -d debian/google-guest-agent/usr/lib/google/guest_agent/GuestTelemetryExtension;\ + install -p -m 0644 google-guest-agent/build/configs/usr/lib/google/guest_agent/GuestTelemetryExtension/manifest.binpb debian/google-guest-agent/usr/lib/google/guest_agent/GuestTelemetryExtension/manifest.binpb;\ + install -p -m 0755 google-guest-agent/cmd/guest_telemetry_extension/guest_telemetry debian/google-guest-agent/usr/lib/google/guest_agent/GuestTelemetryExtension/guest_telemetry;\ fi override_dh_golang: @@ -46,6 +50,7 @@ VERSION=$(VERSION) make -C google-guest-agent cmd/core_plugin/core_plugin;\ VERSION=$(VERSION) make -C google-guest-agent cmd/gce_metadata_script_runner/gce_metadata_script_runner;\ VERSION=$(VERSION) make -C google-guest-agent cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner;\ + make -C google-guest-agent cmd/guest_telemetry_extension/guest_telemetry;\ fi override_dh_installinit: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/packaging/googet/agent_uninstall.ps1 new/guest-agent-20260402.00/packaging/googet/agent_uninstall.ps1 --- old/guest-agent-20260108.00/packaging/googet/agent_uninstall.ps1 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/packaging/googet/agent_uninstall.ps1 2026-04-02 20:13:07.000000000 +0200 @@ -12,26 +12,76 @@ # See the License for the specific language governing permissions and # limitations under the License. -if (Get-Service GCEAgent -ErrorAction SilentlyContinue) { - Stop-Service GCEAgent -Verbose - & sc.exe delete GCEAgent -} - $compat_manager = 'GCEWindowsCompatManager' $name = 'GCEAgentManager' $cleanup_exe = "C:\Program Files\Google\Compute Engine\agent\ggactl_plugin.exe" -# Stop and Delete compat manager. -if (Get-Service $compat_manager -ErrorAction SilentlyContinue) { - Stop-Service $compat_manager -Verbose - & sc.exe delete $compat_manager +function Invoke-CommandWithTimeout { + param( + [string]$FilePath, + [string[]]$ArgumentList, + [int]$TimeoutSeconds = 10 + ) + try { + $p = Start-Process -FilePath $FilePath -ArgumentList $ArgumentList -PassThru -NoNewWindow + try { + Wait-Process -InputObject $p -Timeout $TimeoutSeconds -ErrorAction Stop + } catch [System.TimeoutException] { + Write-Warning "Command '$FilePath' with args '$ArgumentList' timed out after $TimeoutSeconds seconds. Killing..." + Stop-Process -InputObject $p -Force -ErrorAction SilentlyContinue + } + } catch { + Write-Warning "Failed to run or wait for '$FilePath': $_" + } } +function Remove-ServiceSafely { + param ( + [string]$ServiceName + ) + $service = Get-Service $ServiceName -ErrorAction SilentlyContinue + if ($service) { + if ($service.Status -ne 'Stopped') { + try { + Stop-Service $ServiceName -Force -ErrorAction Stop + } catch { + Write-Warning "Failed to stop service $ServiceName : $_" + } + } + try { + $output = & sc.exe delete $ServiceName 2>&1 + if ($LASTEXITCODE -ne 0) { + Write-Warning "sc.exe delete failed for $ServiceName : $output" + } + } catch { + Write-Warning "Failed to delete service $ServiceName : $_" + } + } +} + +# Stop and delete GCEAgent. +Remove-ServiceSafely -ServiceName 'GCEAgent' + +# Stop and Delete compat manager. +Remove-ServiceSafely -ServiceName $compat_manager + # Stop Guest Agent Manager, cleanup all plugins (if present) and delete the service. -if (Get-Service $name -ErrorAction SilentlyContinue) { - Stop-Service $name -Verbose - & $cleanup_exe coreplugin stop - & $cleanup_exe dynamic-cleanup - & sc.exe delete $name +# We attempt cleanup even if the service is missing, just in case. +if (Test-Path $cleanup_exe) { + Invoke-CommandWithTimeout -FilePath $cleanup_exe -ArgumentList "coreplugin","stop" + Invoke-CommandWithTimeout -FilePath $cleanup_exe -ArgumentList "dynamic-cleanup" +} + +Remove-ServiceSafely -ServiceName $name + +# Fallback cleanup for runtime data directory +$runtimeDataDir = "C:\ProgramData\Google\Compute Engine\google-guest-agent" +if (Test-Path $runtimeDataDir) { + try { + Write-Verbose "Removing runtime data directory: $runtimeDataDir" + Remove-Item -Path $runtimeDataDir -Recurse -Force -ErrorAction SilentlyContinue + } catch { + Write-Warning "Failed to remove runtime data directory: $_" + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/packaging/googet/google-compute-engine-windows.goospec new/guest-agent-20260402.00/packaging/googet/google-compute-engine-windows.goospec --- old/guest-agent-20260108.00/packaging/googet/google-compute-engine-windows.goospec 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/packaging/googet/google-compute-engine-windows.goospec 2026-04-02 20:13:07.000000000 +0200 @@ -7,7 +7,10 @@ "description": "Google Compute Engine Windows agent", "source": "https://github.com/GoogleCloudPlatform/guest-agent/", "files": { - "CorePlugin.exe": "<ProgramFiles>/Google/Compute Engine/agent/CorePlugin.exe", + "CorePlugin.exe": "<ProgramFiles>/Google/Compute Engine/agent/GuestAgentCorePlugin/CorePlugin.exe", + "core_plugin.manifest.binpb": "<ProgramFiles>/Google/Compute Engine/agent/GuestAgentCorePlugin/manifest.binpb", + "GuestTelemetry.exe": "<ProgramFiles>/Google/Compute Engine/agent/GuestTelemetryExtension/GuestTelemetry.exe", + "guesttelemetryextension.manifest.binpb": "<ProgramFiles>/Google/Compute Engine/agent/GuestTelemetryExtension/manifest.binpb", "google_metadata_script_runner_adapt.ps1": "<ProgramFiles>/Google/Compute Engine/agent/google_metadata_script_runner_adapt.ps1", "GCEMetadataScriptRunner.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEMetadataScriptRunner.exe", "GCEWindowsAgentManager.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEWindowsAgentManager.exe", @@ -45,6 +48,9 @@ "sources": [{ "include": [ "CorePlugin.exe", + "core_plugin.manifest.binpb", + "guesttelemetryextension.manifest.binpb", + "GuestTelemetry.exe", "ggactl_plugin.exe", "GCEWindowsAgent.exe", "GCECompatMetadataScripts.exe", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/packaging/googet/windows_agent_build.sh new/guest-agent-20260402.00/packaging/googet/windows_agent_build.sh --- old/guest-agent-20260108.00/packaging/googet/windows_agent_build.sh 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/packaging/googet/windows_agent_build.sh 2026-04-02 20:13:07.000000000 +0200 @@ -40,6 +40,9 @@ echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > GCECompatMetadataScripts.exe echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > GCEAuthorizedKeys.exe echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > GCEAuthorizedKeysNew.exe + echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > core_plugin.manifest.binpb + echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > GuestTelemetry.exe + echo "This is a placeholder file so guest agent package build without error. Package will have actual Guest Agent Manager executable instead if both repos are cloned side-by-side." > guesttelemetryextension.manifest.binpb exit 0 fi @@ -53,6 +56,9 @@ GOOS=windows VERSION=$version make cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner GOOS=windows VERSION=$version make cmd/google_authorized_keys_compat/google_authorized_keys_compat GOOS=windows VERSION=$version make cmd/google_authorized_keys/google_authorized_keys +# No version for the telemetry extension since it'll be updated on a different schedule than +# all the other guest agent components. So the version should be defined as part of its manifest file. +GOOS=windows make cmd/guest_telemetry_extension/guest_telemetry cp cmd/google_guest_agent/google_guest_agent $BUILD_DIR/GCEWindowsAgentManager.exe cp cmd/ggactl/ggactl_plugin $BUILD_DIR/ggactl_plugin.exe @@ -60,6 +66,9 @@ cp cmd/core_plugin/core_plugin $BUILD_DIR/CorePlugin.exe cp cmd/gce_metadata_script_runner/gce_metadata_script_runner $BUILD_DIR/GCEMetadataScriptRunner.exe cp cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner $BUILD_DIR/GCECompatMetadataScripts.exe +cp build/configs/usr/lib/google/guest_agent/GuestAgentCorePlugin/manifest.windows.binpb $BUILD_DIR/core_plugin.manifest.binpb +cp build/configs/usr/lib/google/guest_agent/GuestTelemetryExtension/manifest.windows.binpb $BUILD_DIR/guesttelemetryextension.manifest.binpb +cp cmd/guest_telemetry_extension/guest_telemetry $BUILD_DIR/GuestTelemetry.exe if [[ -f cmd/google_authorized_keys_compat/google_authorized_keys_compat ]]; then cp $BUILD_DIR/GCEAuthorizedKeysCommand.exe $BUILD_DIR/GCEAuthorizedKeys.exe diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20260108.00/packaging/google-guest-agent.spec new/guest-agent-20260402.00/packaging/google-guest-agent.spec --- old/guest-agent-20260108.00/packaging/google-guest-agent.spec 2026-01-08 21:52:14.000000000 +0100 +++ new/guest-agent-20260402.00/packaging/google-guest-agent.spec 2026-04-02 20:13:07.000000000 +0200 @@ -68,6 +68,7 @@ VERSION=%{version} make cmd/core_plugin/core_plugin VERSION=%{version} make cmd/gce_metadata_script_runner/gce_metadata_script_runner VERSION=%{version} make cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner + make cmd/guest_telemetry_extension/guest_telemetry;\ popd %endif @@ -85,13 +86,17 @@ # Compat agent, it will become google_guest_agent after the full package transition. %if 0%{?build_plugin_manager} -install -d %{buildroot}%{_exec_prefix}/lib/google/guest_agent +install -d %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestAgentCorePlugin install -p -m 0755 %{name}-extra-%{version}/cmd/gce_metadata_script_runner/gce_metadata_script_runner %{buildroot}%{_bindir}/gce_metadata_script_runner install -p -m 0755 %{name}-extra-%{version}/cmd/google_guest_agent/google_guest_agent %{buildroot}%{_bindir}/google_guest_agent_manager install -p -m 0755 %{name}-extra-%{version}/cmd/ggactl/ggactl_plugin %{buildroot}%{_bindir}/ggactl_plugin install -p -m 0755 %{name}-extra-%{version}/cmd/google_guest_compat_manager/google_guest_compat_manager %{buildroot}%{_bindir}/google_guest_compat_manager -install -p -m 0755 %{name}-extra-%{version}/cmd/core_plugin/core_plugin %{buildroot}%{_exec_prefix}/lib/google/guest_agent/core_plugin +install -p -m 0755 %{name}-extra-%{version}/cmd/core_plugin/core_plugin %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestAgentCorePlugin/core_plugin +install -p -m 0644 %{name}-extra-%{version}/build/configs/usr/lib/google/guest_agent/GuestAgentCorePlugin/manifest.binpb %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestAgentCorePlugin/manifest.binpb install -p -m 0755 %{name}-extra-%{version}/cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner %{buildroot}%{_bindir}/gce_compat_metadata_script_runner +install -d %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestTelemetryExtension +install -p -m 0644 %{name}-extra-%{version}/build/configs/usr/lib/google/guest_agent/GuestTelemetryExtension/manifest.binpb %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestTelemetryExtension/manifest.binpb +install -p -m 0755 %{name}-extra-%{version}/cmd/guest_telemetry_extension/guest_telemetry %{buildroot}%{_exec_prefix}/lib/google/guest_agent/GuestTelemetryExtension/guest_telemetry %endif %if 0%{?el6} @@ -128,7 +133,10 @@ %{_bindir}/gce_compat_metadata_script_runner %{_bindir}/google_guest_agent_manager %{_bindir}/ggactl_plugin -%{_exec_prefix}/lib/google/guest_agent/core_plugin +%{_exec_prefix}/lib/google/guest_agent/GuestAgentCorePlugin/core_plugin +%{_exec_prefix}/lib/google/guest_agent/GuestAgentCorePlugin/manifest.binpb +%{_exec_prefix}/lib/google/guest_agent/GuestTelemetryExtension/guest_telemetry +%{_exec_prefix}/lib/google/guest_agent/GuestTelemetryExtension/manifest.binpb %endif %{_bindir}/google_metadata_script_runner ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/google-guest-agent/vendor.tar.gz /work/SRC/openSUSE:Factory/.google-guest-agent.new.11940/vendor.tar.gz differ: char 13, line 1
