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

Reply via email to