Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package google-osconfig-agent for 
openSUSE:Factory checked in at 2025-09-16 18:19:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/google-osconfig-agent (Old)
 and      /work/SRC/openSUSE:Factory/.google-osconfig-agent.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "google-osconfig-agent"

Tue Sep 16 18:19:42 2025 rev:42 rq:1305177 version:20250902.01

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/google-osconfig-agent/google-osconfig-agent.changes  
    2025-08-12 17:06:01.166881954 +0200
+++ 
/work/SRC/openSUSE:Factory/.google-osconfig-agent.new.1977/google-osconfig-agent.changes
    2025-09-16 18:20:43.308964917 +0200
@@ -1,0 +2,21 @@
+Tue Sep 16 12:12:32 UTC 2025 - John Paul Adrian Glaubitz 
<[email protected]>
+
+- Update to version 20250902.01
+  * Bump github.com/googleapis/enterprise-certificate-proxy (#829)
+- from version 20250902.00
+  * update github.com/go-jose/go-jose/v4 (#869)
+  * Upgrade scalibr and other deps (#866)
+- from version 20250901.00
+  * Fix possibility of path traversal for zip and tar archival (#868)
+- from version 20250825.00
+  * set CODEOWNERS file as required by org (#863)
+- from version 20250819.00
+  * Fix/rhel10 build centos image (#860)
+- from version 20250814.00
+  * Fix/rhel10 build image (#859)
+- from version 20250813.00
+  * Fix: Add RHEL 10 support to RPM startup script (#858)
+- from version 20250811.00
+  * Remove old/sles-15-sp4-sap as image is deprecated (#857)
+
+-------------------------------------------------------------------

Old:
----
  osconfig-20250729.00.tar.gz

New:
----
  osconfig-20250902.01.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ google-osconfig-agent.spec ++++++
--- /var/tmp/diff_new_pack.clIz0o/_old  2025-09-16 18:20:45.561059691 +0200
+++ /var/tmp/diff_new_pack.clIz0o/_new  2025-09-16 18:20:45.581060533 +0200
@@ -24,7 +24,7 @@
 %global import_path     %{provider_prefix}
 
 Name:           google-osconfig-agent
-Version:        20250729.00
+Version:        20250902.01
 Release:        0
 Summary:        Google Cloud Guest Agent
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.clIz0o/_old  2025-09-16 18:20:45.973077030 +0200
+++ /var/tmp/diff_new_pack.clIz0o/_new  2025-09-16 18:20:46.009078546 +0200
@@ -3,8 +3,8 @@
     <param name="url">https://github.com/GoogleCloudPlatform/osconfig</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="versionformat">20250729.00</param>
-    <param name="revision">20250729.00</param>
+    <param name="versionformat">20250902.01</param>
+    <param name="revision">20250902.01</param>
     <param name="changesgenerate">enable</param>
   </service>
   <service name="recompress" mode="disabled">
@@ -15,7 +15,7 @@
     <param name="basename">osconfig</param>
   </service>
   <service name="go_modules" mode="disabled">
-    <param name="archive">osconfig-20250729.00.tar.gz</param>
+    <param name="archive">osconfig-20250902.01.tar.gz</param>
   </service>
 </services>
 

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.clIz0o/_old  2025-09-16 18:20:46.217087299 +0200
+++ /var/tmp/diff_new_pack.clIz0o/_new  2025-09-16 18:20:46.257088982 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/GoogleCloudPlatform/osconfig</param>
-              <param 
name="changesrevision">6d3741d26882e1585233a875d67f466904b2ba0c</param></service></servicedata>
+              <param 
name="changesrevision">8b93921c4a641333548ff98eda2e8d71356850cb</param></service></servicedata>
 (No newline at EOF)
 

++++++ osconfig-20250729.00.tar.gz -> osconfig-20250902.01.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/CODEOWNERS 
new/osconfig-20250902.01/CODEOWNERS
--- old/osconfig-20250729.00/CODEOWNERS 1970-01-01 01:00:00.000000000 +0100
+++ new/osconfig-20250902.01/CODEOWNERS 2025-09-02 16:24:05.000000000 +0200
@@ -0,0 +1,4 @@
+@burov
+@ekremenetskii
+@paulinakania
+@zoltak-g
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/agentconfig/agentconfig.go 
new/osconfig-20250902.01/agentconfig/agentconfig.go
--- old/osconfig-20250729.00/agentconfig/agentconfig.go 2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/agentconfig/agentconfig.go 2025-09-02 
16:24:05.000000000 +0200
@@ -213,7 +213,7 @@
 }
 
 type universeJSON struct {
-       UniverseDomain string `json:"universe-domain"`
+       UniverseDomain string `json:"universeDomain"`
 }
 
 type attributesJSON struct {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/agentconfig/agentconfig_test.go 
new/osconfig-20250902.01/agentconfig/agentconfig_test.go
--- old/osconfig-20250729.00/agentconfig/agentconfig_test.go    2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/agentconfig/agentconfig_test.go    2025-09-02 
16:24:05.000000000 +0200
@@ -233,7 +233,7 @@
                        fmt.Fprintln(w, `{"instance": {"id": 12345,"name": 
"name","zone": "fakezone","attributes": {"osconfig-endpoint": 
"{zone}-dev.osconfig.googleapis.com"}}}`)
                case 1:
                        w.Header().Set("Etag", "etag-1")
-                       fmt.Fprintln(w, `{"universe": {"universe-domain": 
"domain.com"}, "instance": {"id": 12345,"name": "name","zone": 
"fakezone","attributes": {"osconfig-endpoint": 
"{zone}-dev.osconfig.googleapis.com"}}}`)
+                       fmt.Fprintln(w, `{"universe": {"universeDomain": 
"domain.com"}, "instance": {"id": 12345,"name": "name","zone": 
"fakezone","attributes": {"osconfig-endpoint": 
"{zone}-dev.osconfig.googleapis.com"}}}`)
                }
        }))
        defer ts.Close()
@@ -277,7 +277,7 @@
                switch request {
                case 0:
                        w.Header().Set("Etag", "etag-0")
-                       fmt.Fprintln(w, `{"universe":{"universe-domain": 
"domain.com"}}`)
+                       fmt.Fprintln(w, `{"universe":{"universeDomain": 
"domain.com"}}`)
                case 1:
                        w.Header().Set("Etag", "etag-1")
                        fmt.Fprintln(w, `{"instance": {"zone": "fake-zone"}}`)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/e2e_tests/utils/utils.go 
new/osconfig-20250902.01/e2e_tests/utils/utils.go
--- old/osconfig-20250729.00/e2e_tests/utils/utils.go   2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/e2e_tests/utils/utils.go   2025-09-02 
16:24:05.000000000 +0200
@@ -382,9 +382,7 @@
 
        // TODO: enable SUSE tests to use testing pkgs after Artifact Registry 
supports zypper installation from private repos
        if config.AgentRepo() != "testing" {
-               imgsMap = map[string]string{
-                       "old/sles-15-sp4-sap": 
"projects/suse-sap-cloud/global/images/sles-15-sp4-sap",
-               }
+               imgsMap = map[string]string{}
        }
        return imgsMap
 }()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/go.mod 
new/osconfig-20250902.01/go.mod
--- old/osconfig-20250729.00/go.mod     2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/go.mod     2025-09-02 16:24:05.000000000 +0200
@@ -14,18 +14,18 @@
        github.com/go-ole/go-ole v1.3.0
        github.com/golang/mock v1.6.0
        github.com/google/go-cmp v0.7.0
-       github.com/google/osv-scalibr v0.2.0
+       github.com/google/osv-scalibr v0.2.1
        github.com/kr/pretty v0.3.1
        github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
-       github.com/ulikunitz/xz v0.5.12
+       github.com/ulikunitz/xz v0.5.15
        golang.org/x/crypto v0.38.0
        golang.org/x/oauth2 v0.27.0
        golang.org/x/sys v0.33.0
        google.golang.org/api v0.214.0
        google.golang.org/genproto v0.0.0-20241118233622-e639e219e697
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241209162323-e6fa225c2576
-       google.golang.org/grpc v1.70.0
-       google.golang.org/protobuf v1.36.5
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250218202821-56aae31c358a
+       google.golang.org/grpc v1.72.0
+       google.golang.org/protobuf v1.36.6
 )
 
 require (
@@ -46,14 +46,14 @@
        github.com/AdamKorcz/go-118-fuzz-build 
v0.0.0-20230306123547-8075edf89bb0 // indirect
        github.com/BurntSushi/toml v1.3.2 // indirect
        github.com/CycloneDX/cyclonedx-go v0.9.0 // indirect
-       
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.25.0 // indirect
+       
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.26.0 // indirect
        
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric 
v0.49.0 // indirect
        
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping
 v0.49.0 // indirect
        github.com/Microsoft/go-winio v0.6.2 // indirect
        github.com/Microsoft/hcsshim v0.11.7 // indirect
        github.com/anchore/go-struct-converter 
v0.0.0-20230627203149-c72ef8859ca9 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
-       github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
+       github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect
        github.com/containerd/cgroups v1.1.0 // indirect
        github.com/containerd/containerd v1.7.27 // indirect
        github.com/containerd/containerd/api v1.8.0 // indirect
@@ -70,18 +70,20 @@
        github.com/distribution/reference v0.6.0 // indirect
        github.com/docker/cli v25.0.3+incompatible // indirect
        github.com/docker/distribution v2.8.3+incompatible // indirect
-       github.com/docker/docker v25.0.6+incompatible // indirect
+       github.com/docker/docker v28.0.4+incompatible // indirect
        github.com/docker/docker-credential-helpers v0.8.1 // indirect
+       github.com/docker/go-connections v0.4.0 // indirect
        github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // 
indirect
+       github.com/docker/go-units v0.5.0 // indirect
        github.com/edsrzf/mmap-go v1.1.0 // indirect
-       github.com/envoyproxy/go-control-plane/envoy v1.32.3 // indirect
-       github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 // indirect
+       github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
        github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect
        github.com/erikvarga/go-rpmdb v0.0.0-20240208180226-b97e041ef9af // 
indirect
        github.com/felixge/httpsnoop v1.0.4 // indirect
        github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
        github.com/go-git/go-billy/v5 v5.6.2 // indirect
        github.com/go-git/go-git/v5 v5.14.0 // indirect
+       github.com/go-jose/go-jose/v4 v4.0.5 // indirect
        github.com/go-logr/logr v1.4.2 // indirect
        github.com/go-logr/stdr v1.2.2 // indirect
        github.com/gobwas/glob v0.2.3 // indirect
@@ -92,7 +94,7 @@
        github.com/google/go-containerregistry v0.19.1 // indirect
        github.com/google/s2a-go v0.1.9 // indirect
        github.com/google/uuid v1.6.0 // indirect
-       github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
+       github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
        github.com/googleapis/gax-go/v2 v2.14.0 // indirect
        github.com/groob/plist v0.1.1 // indirect
        github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // 
indirect
@@ -101,6 +103,7 @@
        github.com/kr/text v0.2.0 // indirect
        github.com/mattn/go-sqlite3 v1.14.28 // indirect
        github.com/mitchellh/go-homedir v1.1.0 // indirect
+       github.com/moby/docker-image-spec v1.3.1 // indirect
        github.com/moby/locker v1.0.1 // indirect
        github.com/moby/sys/mountinfo v0.6.2 // indirect
        github.com/moby/sys/sequential v0.5.0 // indirect
@@ -121,16 +124,18 @@
        github.com/sirupsen/logrus v1.9.3 // indirect
        github.com/spdx/gordf v0.0.0-20221230105357-b735bd5aac89 // indirect
        github.com/spdx/tools-golang v0.5.3 // indirect
+       github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
        github.com/tidwall/gjson v1.18.0 // indirect
        github.com/tidwall/jsonc v0.3.2 // indirect
        github.com/tidwall/match v1.1.1 // indirect
        github.com/tidwall/pretty v1.2.0 // indirect
        github.com/vbatts/tar-split v0.11.5 // indirect
+       github.com/zeebo/errs v1.4.0 // indirect
        go.chromium.org/luci v0.0.0-20201204084249-3e81ee3e83fe // indirect
        go.etcd.io/bbolt v1.3.10 // indirect
        go.opencensus.io v0.24.0 // indirect
        go.opentelemetry.io/auto/sdk v1.1.0 // indirect
-       go.opentelemetry.io/contrib/detectors/gcp v1.32.0 // indirect
+       go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect
        
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.57.0 // indirect
        go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 
// indirect
        go.opentelemetry.io/otel v1.35.0 // indirect
@@ -139,14 +144,13 @@
        go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
        go.opentelemetry.io/otel/trace v1.35.0 // indirect
        go.uber.org/multierr v1.11.0 // indirect
-       golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
        golang.org/x/mod v0.21.0 // indirect
        golang.org/x/net v0.40.0 // indirect
        golang.org/x/sync v0.14.0 // indirect
        golang.org/x/text v0.25.0 // indirect
        golang.org/x/time v0.12.0 // indirect
        golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20241202173237-19429a94021a // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20250218202821-56aae31c358a // indirect
        gopkg.in/ini.v1 v1.67.0 // indirect
        gopkg.in/warnings.v0 v0.1.2 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/go.sum 
new/osconfig-20250902.01/go.sum
--- old/osconfig-20250729.00/go.sum     2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/go.sum     2025-09-02 16:24:05.000000000 +0200
@@ -74,6 +74,8 @@
 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod 
h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
 github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 
h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA=
 github.com/AdamKorcz/go-118-fuzz-build 
v0.0.0-20230306123547-8075edf89bb0/go.mod 
h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU=
+github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c 
h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
+github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod 
h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.3.2 
h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 github.com/BurntSushi/toml v1.3.2/go.mod 
h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
@@ -82,8 +84,8 @@
 github.com/CycloneDX/cyclonedx-go v0.9.0/go.mod 
h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKcTwu8u0ccsACEsw=
 github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20221216194522-f549ad6a1730 
h1:l4Hin8i/7I1R0cvWBP+z6JdRxU4yJWFbcXvJ8mKKC70=
 github.com/GoogleCloudPlatform/guest-logging-go 
v0.0.0-20221216194522-f549ad6a1730/go.mod 
h1:3F/urXs15KEI7RBGoOsK9/jCCJPBKHxyZH/Nzc7uldo=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp 
v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A=
 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric 
v0.49.0 h1:o90wcURuxekmXrtxmYWTyNla0+ZEHhud6DI1ZTxd1vI=
 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric 
v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw=
 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock 
v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g=
@@ -104,6 +106,8 @@
 github.com/beevik/etree v1.1.0/go.mod 
h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
 github.com/bradleyjkemp/cupaloy/v2 v2.8.0 
h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M=
 github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod 
h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0=
+github.com/cenkalti/backoff/v4 v4.2.1 
h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod 
h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.3.0 
h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 github.com/cespare/xxhash/v2 v2.3.0/go.mod 
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -112,8 +116,8 @@
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod 
h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod 
h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 
h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
-github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod 
h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
+github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 
h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk=
+github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod 
h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
 github.com/containerd/cgroups v1.1.0 
h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
 github.com/containerd/cgroups v1.1.0/go.mod 
h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
 github.com/containerd/containerd v1.7.27 
h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
@@ -149,12 +153,16 @@
 github.com/docker/cli v25.0.3+incompatible/go.mod 
h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 github.com/docker/distribution v2.8.3+incompatible 
h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
 github.com/docker/distribution v2.8.3+incompatible/go.mod 
h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v25.0.6+incompatible 
h1:5cPwbwriIcsua2REJe8HqQV+6WlWc1byg2QSXzBxBGg=
-github.com/docker/docker v25.0.6+incompatible/go.mod 
h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v28.0.4+incompatible 
h1:JNNkBctYKurkw6FrHfKqY0nKIDf5nrbxjVBtS+cdcok=
+github.com/docker/docker v28.0.4+incompatible/go.mod 
h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.8.1 
h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
 github.com/docker/docker-credential-helpers v0.8.1/go.mod 
h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
+github.com/docker/go-connections v0.4.0 
h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
+github.com/docker/go-connections v0.4.0/go.mod 
h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c 
h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
 github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod 
h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
+github.com/docker/go-units v0.5.0 
h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod 
h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/dustin/go-humanize v1.0.1 
h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
 github.com/dustin/go-humanize v1.0.1/go.mod 
h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/edsrzf/mmap-go v1.1.0 
h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
@@ -164,8 +172,8 @@
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod 
h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 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/envoy v1.32.3 
h1:hVEaommgvzTjTd4xCaFd+kEQ2iYBtGxP6luyLrx6uOk=
-github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod 
h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE=
+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/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 v0.1.0/go.mod 
h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
@@ -186,6 +194,8 @@
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod 
h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod 
h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod 
h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-jose/go-jose/v4 v4.0.5 
h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
+github.com/go-jose/go-jose/v4 v4.0.5/go.mod 
h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
 github.com/go-logr/logr v1.2.2/go.mod 
h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
 github.com/go-logr/logr v1.4.2/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -198,6 +208,8 @@
 github.com/gobwas/glob v0.2.3/go.mod 
h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod 
h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/gohugoio/hashstructure v0.5.0 
h1:G2fjSBU36RdwEJBWJ+919ERvOVqAg9tfcYp47K9swqg=
+github.com/gohugoio/hashstructure v0.5.0/go.mod 
h1:Ser0TniXuu/eauYmrwM4o64EBvySxNzITEOLlm4igec=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc=
 github.com/golang/glog v1.2.4/go.mod 
h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
@@ -248,13 +260,15 @@
 github.com/google/go-cmp v0.7.0/go.mod 
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/go-containerregistry v0.19.1 
h1:yMQ62Al6/V0Z7CqIrrS1iYoA5/oQCm88DeNujc7C1KY=
 github.com/google/go-containerregistry v0.19.1/go.mod 
h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI=
+github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932 
h1:5/4TSDzpDnHQ8rKEEQBjRlYx77mHOvXu08oGchxej7o=
+github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932/go.mod 
h1:cC6EdPbj/17GFCPDK39NRarlMI+kt+O60S12cNB5J9Y=
 github.com/google/go-querystring v1.0.0/go.mod 
h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/martian v2.1.0+incompatible 
h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod 
h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/martian/v3 v3.3.3 
h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
 github.com/google/martian/v3 v3.3.3/go.mod 
h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
-github.com/google/osv-scalibr v0.2.0 
h1:nzekkAmZXIeNnLN+saBX6jJ5nzTCP/jVgU/zqyYIWEc=
-github.com/google/osv-scalibr v0.2.0/go.mod 
h1:dipibNd3fpUxqJTeh76c4yS5feBa+CGLxytd77K6Ja0=
+github.com/google/osv-scalibr v0.2.1 
h1:d1SpwzXfNiRafUMNpei3tQg8dDLSWe7JAPNEHxhzxDk=
+github.com/google/osv-scalibr v0.2.1/go.mod 
h1:gTmbCPgh9ooYnU55N32qPxHgFubkxgiDxsoCAMQc2Nc=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod 
h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod 
h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod 
h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
@@ -268,8 +282,8 @@
 github.com/google/uuid v1.1.2/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.4 
h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
-github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod 
h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6 
h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod 
h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod 
h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod 
h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gax-go/v2 v2.14.0 
h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
@@ -280,6 +294,8 @@
 github.com/gorilla/sessions v1.2.0/go.mod 
h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 github.com/groob/plist v0.1.1 h1:JUsmXVPGJ0HqG4Ta1z3HYbO0XwOHsgc0PqahpvgU5Q0=
 github.com/groob/plist v0.1.1/go.mod 
h1:itkABA+w2cw7x5nYUS/pLRef6ludkZKOigbROmCTaFw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 
h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod 
h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
 github.com/hashicorp/golang-lru v0.5.0/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.3/go.mod 
h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
@@ -310,6 +326,8 @@
 github.com/mattn/go-sqlite3 v1.14.28/go.mod 
h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 github.com/mitchellh/go-homedir v1.1.0 
h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod 
h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/moby/docker-image-spec v1.3.1 
h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod 
h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
 github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
 github.com/moby/locker v1.0.1/go.mod 
h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
 github.com/moby/sys/mountinfo v0.6.2 
h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78=
@@ -322,6 +340,12 @@
 github.com/moby/sys/user v0.3.0/go.mod 
h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
 github.com/moby/sys/userns v0.1.0 
h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
 github.com/moby/sys/userns v0.1.0/go.mod 
h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
+github.com/moby/term v0.0.0-20221205130635-1aeaba878587 
h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA=
+github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod 
h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 
h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod 
h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+github.com/morikuni/aec v1.0.0/go.mod 
h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 github.com/opencontainers/go-digest v1.0.0 
h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod 
h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.1.0 
h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -369,6 +393,8 @@
 github.com/spdx/gordf v0.0.0-20221230105357-b735bd5aac89/go.mod 
h1:uKWaldnbMnjsSAXRurWqqrdyZen1R7kxl8TkmWk2OyM=
 github.com/spdx/tools-golang v0.5.3 
h1:ialnHeEYUC4+hkm5vJm4qz2x+oEJbS0mAMFrNXdQraY=
 github.com/spdx/tools-golang v0.5.3/go.mod 
h1:/ETOahiAo96Ob0/RAIBmFZw6XN0yTnyr/uFZm2NTMhI=
+github.com/spiffe/go-spiffe/v2 v2.5.0 
h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
+github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod 
h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod 
h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0/go.mod 
h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -393,8 +419,8 @@
 github.com/tidwall/match v1.1.1/go.mod 
h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
 github.com/tidwall/pretty v1.2.0 
h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
 github.com/tidwall/pretty v1.2.0/go.mod 
h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
-github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
-github.com/ulikunitz/xz v0.5.12/go.mod 
h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
+github.com/ulikunitz/xz v0.5.15/go.mod 
h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/urfave/cli/v2 v2.2.0/go.mod 
h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
 github.com/vbatts/tar-split v0.11.5 
h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts=
 github.com/vbatts/tar-split v0.11.5/go.mod 
h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk=
@@ -409,6 +435,8 @@
 github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
+github.com/zeebo/errs v1.4.0/go.mod 
h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
 go.chromium.org/luci v0.0.0-20200722211809-bab0c30be68b/go.mod 
h1:MIQewVTLvOvc0UioV0JNqTNO/RspKFS0XEeoKrOxsdM=
 go.chromium.org/luci v0.0.0-20201204084249-3e81ee3e83fe 
h1:qIWCxSxxiH4294whxeqOxsQ9KaW7CW0gGa3tqluP2NA=
 go.chromium.org/luci v0.0.0-20201204084249-3e81ee3e83fe/go.mod 
h1:MIQewVTLvOvc0UioV0JNqTNO/RspKFS0XEeoKrOxsdM=
@@ -423,14 +451,18 @@
 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/contrib/detectors/gcp v1.32.0 
h1:P78qWqkLSShicHmAzfECaTgvslqHxblNE9j62Ws1NK8=
-go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod 
h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU=
+go.opentelemetry.io/contrib/detectors/gcp v1.34.0 
h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao=
+go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod 
h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 
h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod 
h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94=
 go.opentelemetry.io/otel v1.35.0 
h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
 go.opentelemetry.io/otel v1.35.0/go.mod 
h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 
h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod 
h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 
h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod 
h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 
h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc=
 go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod 
h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I=
 go.opentelemetry.io/otel/metric v1.35.0 
h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
@@ -441,6 +473,8 @@
 go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod 
h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
 go.opentelemetry.io/otel/trace v1.35.0 
h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
 go.opentelemetry.io/otel/trace v1.35.0/go.mod 
h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/proto/otlp v1.0.0 
h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
+go.opentelemetry.io/proto/otlp v1.0.0/go.mod 
h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod 
h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -464,8 +498,6 @@
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod 
h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod 
h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod 
h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 
h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
-golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod 
h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod 
h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -701,10 +733,10 @@
 google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod 
h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
 google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 
h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk=
 google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod 
h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
-google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a 
h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20241202173237-19429a94021a/go.mod 
h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 
h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20241209162323-e6fa225c2576/go.mod 
h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
+google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a 
h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20250218202821-56aae31c358a/go.mod 
h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a 
h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250218202821-56aae31c358a/go.mod 
h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
 google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod 
h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod 
h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -717,8 +749,8 @@
 google.golang.org/grpc v1.28.0/go.mod 
h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
 google.golang.org/grpc v1.29.1/go.mod 
h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 google.golang.org/grpc v1.33.2/go.mod 
h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
-google.golang.org/grpc v1.70.0/go.mod 
h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
+google.golang.org/grpc v1.72.0/go.mod 
h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -731,8 +763,8 @@
 google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod 
h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.27.1/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.5 
h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-google.golang.org/protobuf v1.36.5/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.6 
h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod 
h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c 
h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/main.go 
new/osconfig-20250902.01/main.go
--- old/osconfig-20250729.00/main.go    2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/main.go    2025-09-02 16:24:05.000000000 +0200
@@ -98,7 +98,7 @@
 
 func run(ctx context.Context) {
        // Setup logging.
-       opts := logger.LogOpts{LoggerName: "OSConfigAgent", UserAgent: 
agentconfig.UserAgent(), DisableLocalLogging: 
agentconfig.DisableLocalLogging(), DisableCloudLogging: 
agentconfig.DisableCloudLogging()}
+       opts := logger.LogOpts{LoggerName: "OSConfigAgent", UserAgent: 
agentconfig.UserAgent(), DisableLocalLogging: agentconfig.DisableLocalLogging()}
        if agentconfig.Stdout() {
                opts.Writers = []io.Writer{os.Stdout}
        }
@@ -114,6 +114,7 @@
        opts.Debug = agentconfig.Debug()
        clog.DebugEnabled = agentconfig.Debug()
        opts.ProjectName = agentconfig.ProjectID()
+       opts.DisableCloudLogging = agentconfig.DisableCloudLogging()
 
        if err := logger.Init(ctx, opts); err != nil {
                fmt.Printf("Error initializing logger: %v", err)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/osconfig-20250729.00/packagebuild/daisy_startupscript_rpm.sh 
new/osconfig-20250902.01/packagebuild/daisy_startupscript_rpm.sh
--- old/osconfig-20250729.00/packagebuild/daisy_startupscript_rpm.sh    
2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/packagebuild/daisy_startupscript_rpm.sh    
2025-09-02 16:24:05.000000000 +0200
@@ -69,6 +69,13 @@
   fi
 fi
 
+
+if [[ ${VERSION_ID} = 10 ]]; then
+  echo "Enabling CRB repo for el10"
+  dnf config-manager --set-enabled crb
+fi
+
+
 try_command yum install -y $GIT rpmdevtools yum-utils python3-devel
 
 git_checkout "$REPO_OWNER" "$REPO_NAME" "$GIT_REF"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/osconfig-20250729.00/packagebuild/workflows/build_el10.wf.json 
new/osconfig-20250902.01/packagebuild/workflows/build_el10.wf.json
--- old/osconfig-20250729.00/packagebuild/workflows/build_el10.wf.json  
2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/packagebuild/workflows/build_el10.wf.json  
2025-09-02 16:24:05.000000000 +0200
@@ -28,7 +28,7 @@
         "Path": "./build_package.wf.json",
         "Vars": {
           "type": "rpm",
-          "sourceImage": "projects/rhel-cloud/global/images/family/rhel-9",
+          "sourceImage": 
"projects/bct-prod-images/global/images/family/centos-stream-10",
           "gcs_path": "${gcs_path}",
           "repo_owner": "${repo_owner}",
           "repo_name": "${repo_name}",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/osconfig-20250729.00/packagebuild/workflows/build_el10_arm64.wf.json 
new/osconfig-20250902.01/packagebuild/workflows/build_el10_arm64.wf.json
--- old/osconfig-20250729.00/packagebuild/workflows/build_el10_arm64.wf.json    
2025-07-29 12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/packagebuild/workflows/build_el10_arm64.wf.json    
2025-09-02 16:24:05.000000000 +0200
@@ -28,7 +28,7 @@
         "Path": "./build_package.wf.json",
         "Vars": {
           "type": "rpm",
-          "sourceImage": 
"projects/rhel-cloud/global/images/family/rhel-9-arm64",
+          "sourceImage": 
"projects/bct-prod-images/global/images/family/centos-stream-10-arm64",
           "gcs_path": "${gcs_path}",
           "repo_owner": "${repo_owner}",
           "repo_name": "${repo_name}",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/packages/scalibr.go 
new/osconfig-20250902.01/packages/scalibr.go
--- old/osconfig-20250729.00/packages/scalibr.go        2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/packages/scalibr.go        2025-09-02 
16:24:05.000000000 +0200
@@ -11,13 +11,13 @@
        "github.com/google/osv-scalibr/extractor"
        fslist "github.com/google/osv-scalibr/extractor/filesystem/list"
        scalibrcos "github.com/google/osv-scalibr/extractor/filesystem/os/cos"
-       scalibrdpkg "github.com/google/osv-scalibr/extractor/filesystem/os/dpkg"
+       dpkgmetadata 
"github.com/google/osv-scalibr/extractor/filesystem/os/dpkg/metadata"
        scalibrrpm "github.com/google/osv-scalibr/extractor/filesystem/os/rpm"
        scalibrfs "github.com/google/osv-scalibr/fs"
        "github.com/google/osv-scalibr/plugin"
 )
 
-func pkgInfoFromDpkgExtractorPackage(pkg *extractor.Package, metadata 
*scalibrdpkg.Metadata) *PkgInfo {
+func pkgInfoFromDpkgExtractorPackage(pkg *extractor.Package, metadata 
*dpkgmetadata.Metadata) *PkgInfo {
        source := Source{Name: metadata.SourceName, Version: 
metadata.SourceVersion}
        if source.Name == "" {
                source.Name = pkg.Name
@@ -72,7 +72,7 @@
 func pkgInfosFromExtractorPackages(ctx context.Context, scan 
*scalibr.ScanResult, osinfo *osinfo.OSInfo) Packages {
        var packages Packages
        for _, pkg := range scan.Inventory.Packages {
-               if metadata, ok := pkg.Metadata.(*scalibrdpkg.Metadata); ok {
+               if metadata, ok := pkg.Metadata.(*dpkgmetadata.Metadata); ok {
                        packages.Deb = append(packages.Deb, 
pkgInfoFromDpkgExtractorPackage(pkg, metadata))
                } else if metadata, ok := pkg.Metadata.(*scalibrrpm.Metadata); 
ok {
                        packages.Rpm = append(packages.Rpm, 
pkgInfoFromRpmExtractorPackage(pkg, metadata))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/packages/scalibr_test.go 
new/osconfig-20250902.01/packages/scalibr_test.go
--- old/osconfig-20250729.00/packages/scalibr_test.go   2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/packages/scalibr_test.go   2025-09-02 
16:24:05.000000000 +0200
@@ -12,7 +12,7 @@
        scalibr "github.com/google/osv-scalibr"
        "github.com/google/osv-scalibr/extractor"
        scalibrcos "github.com/google/osv-scalibr/extractor/filesystem/os/cos"
-       scalibrdpkg "github.com/google/osv-scalibr/extractor/filesystem/os/dpkg"
+       dpkgmetadata 
"github.com/google/osv-scalibr/extractor/filesystem/os/dpkg/metadata"
        scalibrrpm "github.com/google/osv-scalibr/extractor/filesystem/os/rpm"
        "github.com/google/osv-scalibr/inventory"
 )
@@ -29,11 +29,11 @@
                        pkgs: []*extractor.Package{
                                {
                                        Name: "7zip", Version: "24.09+dfsg-4",
-                                       Metadata: 
&scalibrdpkg.Metadata{PackageName: "7zip", Status: "install ok installed", 
SourceName: "", SourceVersion: "", PackageVersion: "24.09+dfsg-4", OSID: 
"debian", OSVersionCodename: "rodete", OSVersionID: "", Maintainer: "YOKOTA 
Hiroshi <[email protected]>", Architecture: "amd64"},
+                                       Metadata: 
&dpkgmetadata.Metadata{PackageName: "7zip", Status: "install ok installed", 
SourceName: "", SourceVersion: "", PackageVersion: "24.09+dfsg-4", OSID: 
"debian", OSVersionCodename: "rodete", OSVersionID: "", Maintainer: "YOKOTA 
Hiroshi <[email protected]>", Architecture: "amd64"},
                                },
                                {
                                        Name: "llvm-16", Version: 
"1:16.0.6-27+build3",
-                                       Metadata: 
&scalibrdpkg.Metadata{PackageName: "llvm-16", Status: "install ok installed", 
SourceName: "llvm-toolchain-16", SourceVersion: "", PackageVersion: 
"1:16.0.6-27+build3", OSID: "debian", OSVersionCodename: "rodete", OSVersionID: 
"", Maintainer: "LLVM Packaging Team <[email protected]>", 
Architecture: "amd64"},
+                                       Metadata: 
&dpkgmetadata.Metadata{PackageName: "llvm-16", Status: "install ok installed", 
SourceName: "llvm-toolchain-16", SourceVersion: "", PackageVersion: 
"1:16.0.6-27+build3", OSID: "debian", OSVersionCodename: "rodete", OSVersionID: 
"", Maintainer: "LLVM Packaging Team <[email protected]>", 
Architecture: "amd64"},
                                },
                        },
                        want: Packages{Deb: []*PkgInfo{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/policies/apt.go 
new/osconfig-20250902.01/policies/apt.go
--- old/osconfig-20250729.00/policies/apt.go    2025-07-29 12:04:47.000000000 
+0200
+++ new/osconfig-20250902.01/policies/apt.go    2025-09-02 16:24:05.000000000 
+0200
@@ -39,6 +39,8 @@
        agentendpointpb.AptRepository_DEB_SRC: "deb-src",
 }
 
+var osInfoProvider osinfo.Provider = osinfo.NewProvider()
+
 const aptGPGFile = "/etc/apt/trusted.gpg.d/osconfig_agent_managed.gpg"
 
 func isArmoredGPGKey(keyData []byte) bool {
@@ -85,8 +87,8 @@
        return false
 }
 
-func readInstanceOsInfo() (string, float64, error) {
-       oi, err := osinfo.Get()
+func readInstanceOsInfo(ctx context.Context) (string, float64, error) {
+       oi, err := osInfoProvider.GetOSInfo(ctx)
        if err != nil {
                return "", 0, fmt.Errorf("error getting osinfo: %v", err)
        }
@@ -99,8 +101,8 @@
        return oi.ShortName, osVersion, nil
 }
 
-func shouldUseSignedBy() bool {
-       osShortName, osVersion, err := readInstanceOsInfo()
+func shouldUseSignedBy(ctx context.Context) bool {
+       osShortName, osVersion, err := readInstanceOsInfo(ctx)
        if err != nil {
                return false // Default to not using signed-by approach
        }
@@ -181,7 +183,7 @@
        var buf bytes.Buffer
        buf.WriteString("# Repo file managed by Google OSConfig agent\n")
 
-       shouldUseSignedByBool := shouldUseSignedBy()
+       shouldUseSignedByBool := shouldUseSignedBy(ctx)
        for _, repo := range repos {
                line := getAptRepoLine(repo, shouldUseSignedByBool)
                buf.WriteString(line + "\n")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/policies/apt_test.go 
new/osconfig-20250902.01/policies/apt_test.go
--- old/osconfig-20250729.00/policies/apt_test.go       2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/policies/apt_test.go       2025-09-02 
16:24:05.000000000 +0200
@@ -24,6 +24,7 @@
        "testing"
 
        "cloud.google.com/go/osconfig/agentendpoint/apiv1beta/agentendpointpb"
+       "github.com/GoogleCloudPlatform/osconfig/osinfo"
 )
 
 func runAptRepositories(ctx context.Context, repos 
[]*agentendpointpb.AptRepository) (string, error) {
@@ -47,37 +48,75 @@
 }
 
 func TestAptRepositories(t *testing.T) {
+       debian10 := func() (string, string, string) {
+               return "debian", "Debian", "10"
+       }
+
+       debian12 := func() (string, string, string) {
+               return "debian", "Debian", "12"
+       }
+
        tests := []struct {
-               desc  string
-               repos []*agentendpointpb.AptRepository
-               want  string
+               name                   string
+               repos                  []*agentendpointpb.AptRepository
+               nameAndVersionProvider func() (string, string, string)
+               want                   string
        }{
-               {"no repos", []*agentendpointpb.AptRepository{}, "# Repo file 
managed by Google OSConfig agent\n"},
                {
-                       "1 repo",
-                       []*agentendpointpb.AptRepository{
+                       name:                   "No repositories",
+                       nameAndVersionProvider: debian10,
+                       repos:                  
[]*agentendpointpb.AptRepository{},
+                       want:                   "# Repo file managed by Google 
OSConfig agent\n"},
+               {
+                       name:                   "1 repositoy, Debian 10",
+                       nameAndVersionProvider: debian10,
+                       repos: []*agentendpointpb.AptRepository{
                                {Uri: "http://repo1-url/";, Distribution: 
"distribution", Components: []string{"component1"}},
                        },
-                       "# Repo file managed by Google OSConfig agent\n\ndeb 
http://repo1-url/ distribution component1\n",
+                       want: "# Repo file managed by Google OSConfig 
agent\n\ndeb http://repo1-url/ distribution component1\n",
+               },
+               {
+                       name:                   "1 repositoy, Debian 12",
+                       nameAndVersionProvider: debian12,
+                       repos: []*agentendpointpb.AptRepository{
+                               {Uri: "http://repo1-url/";, Distribution: 
"distribution", Components: []string{"component1"}},
+                       },
+                       want: "# Repo file managed by Google OSConfig 
agent\n\ndeb [signed-by=/etc/apt/trusted.gpg.d/osconfig_agent_managed.gpg] 
http://repo1-url/ distribution component1\n",
+               },
+               {
+                       name:                   "2 repos, Debian 10",
+                       nameAndVersionProvider: debian10,
+                       repos: []*agentendpointpb.AptRepository{
+                               {Uri: "http://repo1-url/";, Distribution: 
"distribution", Components: []string{"component1"}, ArchiveType: 
agentendpointpb.AptRepository_DEB_SRC},
+                               {Uri: "http://repo2-url/";, Distribution: 
"distribution", Components: []string{"component1", "component2"}, ArchiveType: 
agentendpointpb.AptRepository_DEB},
+                       },
+                       want: "# Repo file managed by Google OSConfig 
agent\n\ndeb-src http://repo1-url/ distribution component1\n\ndeb 
http://repo2-url/ distribution component1 component2\n",
                },
                {
-                       "2 repos",
-                       []*agentendpointpb.AptRepository{
+                       name:                   "2 repos, Debian 12",
+                       nameAndVersionProvider: debian12,
+                       repos: []*agentendpointpb.AptRepository{
                                {Uri: "http://repo1-url/";, Distribution: 
"distribution", Components: []string{"component1"}, ArchiveType: 
agentendpointpb.AptRepository_DEB_SRC},
                                {Uri: "http://repo2-url/";, Distribution: 
"distribution", Components: []string{"component1", "component2"}, ArchiveType: 
agentendpointpb.AptRepository_DEB},
                        },
-                       "# Repo file managed by Google OSConfig 
agent\n\ndeb-src http://repo1-url/ distribution component1\n\ndeb 
http://repo2-url/ distribution component1 component2\n",
+                       want: "# Repo file managed by Google OSConfig 
agent\n\ndeb-src [signed-by=/etc/apt/trusted.gpg.d/osconfig_agent_managed.gpg] 
http://repo1-url/ distribution component1\n\ndeb 
[signed-by=/etc/apt/trusted.gpg.d/osconfig_agent_managed.gpg] http://repo2-url/ 
distribution component1 component2\n",
                },
        }
 
        for _, tt := range tests {
+               osInfoProviderActual := osInfoProvider
+               defer func() { osInfoProvider = osInfoProviderActual }()
+
+               osInfoStub := stubOsInfoProvider{nameVersionProvider: 
tt.nameAndVersionProvider}
+               osInfoProvider = osInfoStub
+
                got, err := runAptRepositories(context.Background(), tt.repos)
                if err != nil {
                        t.Fatal(err)
                }
 
                if got != tt.want {
-                       t.Errorf("%s: got:\n%q\nwant:\n%q", tt.desc, got, 
tt.want)
+                       t.Errorf("%s: got:\n%q\nwant:\n%q", tt.name, got, 
tt.want)
                }
        }
 }
@@ -107,7 +146,7 @@
 
 func TestUseSignedBy(t *testing.T) {
        tests := []struct {
-               desc string
+               name string
                repo *agentendpointpb.AptRepository
                want string
        }{
@@ -128,7 +167,25 @@
                aptRepoLine := getAptRepoLine(tt.repo, useSignedBy)
 
                if aptRepoLine != tt.want {
-                       t.Errorf("%s: got:\n%q\nwant:\n%q", tt.desc, 
aptRepoLine, tt.want)
+                       t.Errorf("%s: got:\n%q\nwant:\n%q", tt.name, 
aptRepoLine, tt.want)
                }
        }
 }
+
+type stubOsInfoProvider struct {
+       nameVersionProvider func() (string, string, string)
+}
+
+func (s stubOsInfoProvider) GetOSInfo(ctx context.Context) (osinfo.OSInfo, 
error) {
+       short, long, version := s.nameVersionProvider()
+
+       return osinfo.OSInfo{
+               Hostname:      "test",
+               LongName:      long,
+               ShortName:     short,
+               Version:       version,
+               KernelVersion: "test",
+               KernelRelease: "test",
+               Architecture:  "x86_64",
+       }, nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/policies/recipes/steps.go 
new/osconfig-20250902.01/policies/recipes/steps.go
--- old/osconfig-20250729.00/policies/recipes/steps.go  2025-07-29 
12:04:47.000000000 +0200
+++ new/osconfig-20250902.01/policies/recipes/steps.go  2025-09-02 
16:24:05.000000000 +0200
@@ -46,6 +46,8 @@
        agentendpointpb.SoftwareRecipe_Step_RunScript_POWERSHELL:              
".ps1",
 }
 
+var chown = chownFunc
+
 func stepCopyFile(step *agentendpointpb.SoftwareRecipe_Step_CopyFile, 
artifacts map[string]string, runEnvs []string, stepDir string) error {
        dest, err := util.NormPath(step.Destination)
        if err != nil {
@@ -127,6 +129,55 @@
        return strings.HasSuffix(name, "/")
 }
 
+func ensureSymlinkBelongsToDir(dirPath string, symlink string) error {
+       dirAbs, err := filepath.Abs(dirPath)
+       if err != nil {
+               return err
+       }
+       symlinkAbs, err := filepath.Abs(symlink)
+       if err != nil {
+               return err
+       }
+
+       evaluatedSymlinkAbs, err := filepath.EvalSymlinks(symlinkAbs)
+       if err != nil {
+               return err
+       }
+
+       rel, err := filepath.Rel(dirAbs, evaluatedSymlinkAbs)
+       if err != nil {
+               return err
+       }
+
+       if strings.HasPrefix(rel, "..") {
+               return fmt.Errorf("symlink %s, does not belongs to dir %s, rel 
%s", symlink, dirPath, rel)
+       }
+
+       return nil
+}
+
+func ensureFilePathBelongsToDir(dirPath string, filePath string) error {
+       dirAbs, err := filepath.Abs(dirPath)
+       if err != nil {
+               return err
+       }
+       fileAbs, err := filepath.Abs(filePath)
+       if err != nil {
+               return err
+       }
+
+       rel, err := filepath.Rel(dirAbs, fileAbs)
+       if err != nil {
+               return err
+       }
+
+       if strings.HasPrefix(rel, "..") {
+               return fmt.Errorf("path %s, does not belongs to dir %s, rel 
%s", filePath, dirPath, rel)
+       }
+
+       return nil
+}
+
 func extractZip(zipPath string, dst string) error {
        zr, err := zip.OpenReader(zipPath)
        if err != nil {
@@ -134,12 +185,17 @@
        }
        defer zr.Close()
 
-       // Check for conflicts
+       // Check that we can extract zip
        for _, f := range zr.File {
-               filen, err := 
util.NormPath(util.SanitizePath(filepath.Join(dst, f.Name)))
+               filen, err := util.NormPath(filepath.Join(dst, f.Name))
                if err != nil {
                        return err
                }
+
+               if err := ensureFilePathBelongsToDir(dst, filen); err != nil {
+                       return fmt.Errorf("unable to extract zip archive %s: 
%w", zipPath, err)
+               }
+
                stat, err := os.Stat(filen)
                if os.IsNotExist(err) {
                        continue
@@ -151,12 +207,12 @@
                        // it's ok if directories already exist
                        continue
                }
-               return fmt.Errorf("file exists: %s", filen)
+               return fmt.Errorf("unable to extract zip archive %s: file %s is 
already exists", zipPath, filen)
        }
 
        // Create files.
        for _, f := range zr.File {
-               filen, err := 
util.NormPath(util.SanitizePath(filepath.Join(dst, f.Name)))
+               filen, err := util.NormPath(filepath.Join(dst, f.Name))
                if err != nil {
                        return err
                }
@@ -240,6 +296,11 @@
                if err != nil {
                        return err
                }
+
+               if err := ensureFilePathBelongsToDir(dst, filen); err != nil {
+                       return err
+               }
+
                stat, err := os.Stat(filen)
                if os.IsNotExist(err) {
                        continue
@@ -270,7 +331,7 @@
        tr := tar.NewReader(decompressed)
 
        if err := checkForConflicts(tr, dst); err != nil {
-               return err
+               return fmt.Errorf("unable to extract tar archive %s: %s", 
tarName, err)
        }
 
        file.Seek(0, 0)
@@ -289,10 +350,15 @@
                if err != nil {
                        return err
                }
-               filen, err := util.NormPath(filepath.Join(dst, 
util.SanitizePath(header.Name)))
+               filen, err := util.NormPath(filepath.Join(dst, header.Name))
                if err != nil {
                        return err
                }
+
+               if err := ensureFilePathBelongsToDir(dst, filen); err != nil {
+                       return err
+               }
+
                filedir := filepath.Dir(filen)
 
                if err := os.MkdirAll(filedir, 0700); err != nil {
@@ -324,11 +390,23 @@
                                return err
                        }
                case tar.TypeLink:
+                       if err := ensureSymlinkBelongsToDir(dst, 
header.Linkname); err != nil {
+                               clog.Infof(ctx,
+                                       "link %s resolved outside of 
destination %s, for the security reason it is not allowed", header.Linkname, 
dst)
+                               continue
+                       }
+
                        if err := os.Link(header.Linkname, filen); err != nil {
                                return err
                        }
                        continue
                case tar.TypeSymlink:
+                       if err := ensureSymlinkBelongsToDir(dst, 
header.Linkname); err != nil {
+                               clog.Infof(ctx,
+                                       "symlink %s resolved outside of 
destination %s, for the security reason it is not allowed", header.Linkname, 
dst)
+                               continue
+                       }
+
                        if err := os.Symlink(header.Linkname, filen); err != 
nil {
                                return err
                        }
@@ -506,7 +584,7 @@
        return err
 }
 
-func chown(file string, uid, gid int) error {
+func chownFunc(file string, uid, gid int) error {
        // os.Chown unsupported on windows
        if runtime.GOOS == "windows" {
                return nil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/osconfig-20250729.00/policies/recipes/steps_test.go 
new/osconfig-20250902.01/policies/recipes/steps_test.go
--- old/osconfig-20250729.00/policies/recipes/steps_test.go     1970-01-01 
01:00:00.000000000 +0100
+++ new/osconfig-20250902.01/policies/recipes/steps_test.go     2025-09-02 
16:24:05.000000000 +0200
@@ -0,0 +1,218 @@
+package recipes
+
+import (
+       "archive/tar"
+       "archive/zip"
+       "context"
+       "fmt"
+       "os"
+       "path/filepath"
+       "regexp"
+       "testing"
+       "time"
+
+       "cloud.google.com/go/osconfig/agentendpoint/apiv1beta/agentendpointpb"
+)
+
+type fileEntry struct {
+       name    string
+       content []byte
+}
+
+func Test_extractTar(t *testing.T) {
+       chownActual := chownFunc
+       chown = func(string, int, int) error {
+               return nil
+       }
+
+       defer func() { chown = chownActual }()
+
+       tests := []struct {
+               name          string
+               entries       []fileEntry
+               wantErrRegexp *regexp.Regexp
+       }{
+               {
+                       name: "base case scenario",
+                       entries: []fileEntry{
+                               {
+                                       name: "test1", content: []byte("test1"),
+                               },
+                               {
+                                       name: "test2", content: []byte("test2"),
+                               },
+                       },
+                       wantErrRegexp: nil,
+               },
+               {
+                       name: "tar with vulnerable path, fail with expected 
error",
+                       entries: []fileEntry{
+                               {
+                                       name: "../test1", content: 
[]byte("test1"),
+                               },
+                               {
+                                       name: "test2", content: []byte("test2"),
+                               },
+                       },
+                       wantErrRegexp: regexp.MustCompile("^unable to extract 
tar archive /tmp/[0-9]+/extractTar.tar: path /tmp/test1, does not belongs to 
dir /tmp/[0-9]+, rel ../test1$"),
+               },
+               {
+                       name: "tar with advance vulnerable path, fail with 
expected error",
+                       entries: []fileEntry{
+                               {
+                                       name: "....//test1", content: 
[]byte("test1"),
+                               },
+                               {
+                                       name: "test2", content: []byte("test2"),
+                               },
+                       },
+                       wantErrRegexp: regexp.MustCompile("^unable to extract 
tar archive /tmp/[0-9]+/extractTar.tar: path /tmp/[0-9]+/..../test1, does not 
belongs to dir /tmp/[0-9]+, rel ..../test1$"),
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+
+                       tmpDir, tmpFile, err := getTempDirAndFile(t, 
"extractTar.tar")
+                       if err != nil {
+                               t.Errorf("unable to create tmp file: %s", err)
+                       }
+
+                       ensureTar(t, tmpFile.Name(), tt.entries)
+
+                       ctx := context.Background()
+                       err = extractTar(ctx, tmpFile.Name(), tmpDir, 
agentendpointpb.SoftwareRecipe_Step_ExtractArchive_TAR)
+                       if tt.wantErrRegexp == nil && err == nil {
+                               return
+                       }
+
+                       msg := fmt.Sprintf("%s", err)
+                       if !tt.wantErrRegexp.MatchString(msg) {
+                               t.Errorf("Unexpecte error, expect message to 
match regexp %s, got %s", tt.wantErrRegexp, err)
+                       }
+               })
+
+       }
+}
+func Test_extractZip(t *testing.T) {
+       tests := []struct {
+               name          string
+               entries       []fileEntry
+               wantErrRegexp *regexp.Regexp
+       }{
+               {
+                       name: "base case scenario",
+                       entries: []fileEntry{
+                               {
+                                       name: "test1", content: []byte("test1"),
+                               },
+                               {
+                                       name: "test2", content: []byte("test2"),
+                               },
+                       },
+                       wantErrRegexp: nil,
+               },
+               {
+                       name: "zip with vulnerable path, fail with expected 
error",
+                       entries: []fileEntry{
+                               {
+                                       name: "../test1", content: 
[]byte("test1"),
+                               },
+                               {
+                                       name: "test2", content: []byte("test2"),
+                               },
+                       },
+                       wantErrRegexp: regexp.MustCompile("^unable to extract 
zip archive /tmp/[0-9]+/extractZip.zip: path /tmp/test1, does not belongs to 
dir /tmp/[0-9]+, rel ../test1$"),
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+
+                       tmpDir, tmpFile, err := getTempDirAndFile(t, 
"extractZip.zip")
+                       if err != nil {
+                               t.Errorf("unable to create tmp file: %s", err)
+                       }
+
+                       ensureZip(t, tmpFile.Name(), tt.entries)
+
+                       err = extractZip(tmpFile.Name(), tmpDir)
+                       if tt.wantErrRegexp == nil && err == nil {
+                               return
+                       }
+
+                       msg := fmt.Sprintf("%s", err)
+                       if !tt.wantErrRegexp.MatchString(msg) {
+                               t.Errorf("Unexpecte error, expect message to 
match regexp %s, got %s", tt.wantErrRegexp, err)
+                       }
+               })
+
+       }
+}
+
+func getTempDirAndFile(t *testing.T, fileName string) (dir string, file 
*os.File, err error) {
+       tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", 
time.Now().UnixNano()))
+       if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
+               t.Errorf("unable to create tmp dir: %s", err)
+               return "", nil, err
+       }
+
+       tmpFile, err := os.OpenFile(filepath.Join(tmpDir, fileName), 
os.O_CREATE|os.O_RDWR, os.ModePerm)
+       if err != nil {
+               t.Errorf("unable to create tmp file: %s", err)
+               return "", nil, err
+       }
+
+       return tmpDir, tmpFile, nil
+}
+
+func ensureZip(t *testing.T, dst string, entries []fileEntry) {
+       fd, err := os.OpenFile(dst, os.O_RDWR, os.ModePerm)
+       if err != nil {
+               t.Errorf("unable to open file: %s", err)
+       }
+       w := zip.NewWriter(fd)
+
+       for _, entry := range entries {
+               f, err := w.Create(entry.name)
+               if err != nil {
+                       t.Errorf("unable to create file: %s", err)
+               }
+
+               if _, err = f.Write(entry.content); err != nil {
+                       t.Errorf("unable to write content to file: %s", err)
+               }
+       }
+
+       if err := w.Close(); err != err {
+               t.Errorf("unable to close file: %s", err)
+       }
+}
+
+func ensureTar(t *testing.T, dst string, entries []fileEntry) {
+       fd, err := os.OpenFile(dst, os.O_RDWR, os.ModePerm)
+       if err != nil {
+               t.Errorf("unable to open file: %s", err)
+       }
+       w := tar.NewWriter(fd)
+
+       for _, entry := range entries {
+               hdr := &tar.Header{
+                       Name: entry.name,
+                       Mode: 0600,
+                       Size: int64(len(entry.content)),
+               }
+
+               if err := w.WriteHeader(hdr); err != nil {
+                       t.Errorf("unable to create file: %s", err)
+               }
+
+               if _, err = w.Write(entry.content); err != nil {
+                       t.Errorf("unable to write content to file: %s", err)
+               }
+       }
+
+       if err := w.Close(); err != err {
+               t.Errorf("unable to close file: %s", err)
+       }
+}

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/google-osconfig-agent/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.google-osconfig-agent.new.1977/vendor.tar.gz 
differ: char 13, line 1

Reply via email to