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 2025-04-04 18:10:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/google-guest-agent (Old) and /work/SRC/openSUSE:Factory/.google-guest-agent.new.1907 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-guest-agent" Fri Apr 4 18:10:03 2025 rev:44 rq:1267147 version:20250327.01 Changes: -------- --- /work/SRC/openSUSE:Factory/google-guest-agent/google-guest-agent.changes 2025-03-11 20:48:05.965171546 +0100 +++ /work/SRC/openSUSE:Factory/.google-guest-agent.new.1907/google-guest-agent.changes 2025-04-04 18:10:10.294818325 +0200 @@ -1,0 +2,121 @@ +Mon Mar 31 11:11:30 UTC 2025 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Update to version 20250327.01 (bsc#1239763, bsc#1239866) + * Remove error messages from gce_workload_cert_refresh and + metadata script runner (#527) +- from version 20250327.00 + * Update guest-logging-go dependency (#526) + * Add 'created-by' metadata, and pass it as option to logging library (#508) + * Revert "oslogin: Correctly handle newlines at the end of + modified files (#520)" (#523) + * Re-enable disabled services if the core plugin was enabled (#522) + * Enable guest services on package upgrade (#519) + * oslogin: Correctly handle newlines at the end of modified files (#520) + * Fix core plugin path (#518) + * Fix package build issues (#517) + * Fix dependencies ran go mod tidy -v (#515) + * Fix debian build path (#514) + * Bundle compat metadata script runner binary in package (#513) + * Bump golang.org/x/net from 0.27.0 to 0.36.0 (#512) + * Update startup/shutdown services to launch compat manager (#503) + * Bundle new gce metadata script runner binary in agent package (#502) + * Revert "Revert bundling new binaries in the package (#509)" (#511) +- from version 20250326.00 + * Re-enable disabled services if the core plugin was enabled (#521) +- from version 20250324.00 + * Enable guest services on package upgrade (#519) + * oslogin: Correctly handle newlines at the end of modified files (#520) + * Fix core plugin path (#518) + * Fix package build issues (#517) + * Fix dependencies ran go mod tidy -v (#515) + * Fix debian build path (#514) + * Bundle compat metadata script runner binary in package (#513) + * Bump golang.org/x/net from 0.27.0 to 0.36.0 (#512) + * Update startup/shutdown services to launch compat manager (#503) + * Bundle new gce metadata script runner binary in agent package (#502) + * Revert "Revert bundling new binaries in the package (#509)" (#511) + * Revert bundling new binaries in the package (#509) + * Fix typo in windows build script (#501) + * Include core plugin binary for all packages (#500) + * Update crypto library to fix CVE-2024-45337 (#499) + * Start packaging compat manager (#498) + * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492) + * scripts: introduce a wrapper to locally build deb package (#490) + * Introduce compat-manager systemd unit (#497) +- from version 20250317.00 + * Revert "Revert bundling new binaries in the package (#509)" (#511) + * Revert bundling new binaries in the package (#509) + * Fix typo in windows build script (#501) + * Include core plugin binary for all packages (#500) + * Update crypto library to fix CVE-2024-45337 (#499) + * Start packaging compat manager (#498) + * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492) + * scripts: introduce a wrapper to locally build deb package (#490) + * Introduce compat-manager systemd unit (#497) +- from version 20250312.00 + * Revert bundling new binaries in the package (#509) + * Fix typo in windows build script (#501) + * Include core plugin binary for all packages (#500) + * Update crypto library to fix CVE-2024-45337 (#499) + * Start packaging compat manager (#498) + * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492) + * scripts: introduce a wrapper to locally build deb package (#490) + * Introduce compat-manager systemd unit (#497) +- from version 20250305.00 + * Revert bundling new binaries in the package (#509) + * Fix typo in windows build script (#501) + * Include core plugin binary for all packages (#500) + * Update crypto library to fix CVE-2024-45337 (#499) + * Start packaging compat manager (#498) + * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492) + * scripts: introduce a wrapper to locally build deb package (#490) + * Introduce compat-manager systemd unit (#497) +- from version 20250304.01 + * Fix typo in windows build script (#501) +- from version 20250214.01 + * Include core plugin binary for all packages (#500) +- from version 20250214.00 + * Update crypto library to fix CVE-2024-45337 (#499) +- from version 20250212.00 + * Start packaging compat manager (#498) + * Start bundling ggactl_plugin_cleanup binary in all agent packages (#492) +- from version 20250211.00 + * scripts: introduce a wrapper to locally build deb package (#490) + * Introduce compat-manager systemd unit (#497) +- from version 20250207.00 + * vlan: toggle vlan configuration in debian packaging (#495) + * vlan: move config out of unstable section (#494) + * Add clarification to comments regarding invalid NICs and the + `invalid` tag. (#493) + * Include interfaces in lists even if it has an invalid MAC. (#489) + * Fix windows package build failures (#491) + * vlan: don't index based on the vlan ID (#486) + * Revert PR #482 (#488) + * Remove Amy and Zach from OWNERS (#487) + * Skip interfaces in interfaceNames() instead of erroring if there is an (#482) + * Fix Debian packaging if guest agent manager is not checked out (#485) +- from version 20250204.02 + * force concourse to move version forward. +- from version 20250204.01 + * vlan: toggle vlan configuration in debian packaging (#495) +- from version 20250204.00 + * vlan: move config out of unstable section (#494) + * Add clarification to comments regarding invalid NICs and the + `invalid` tag. (#493) +- from version 20250203.01 + * Include interfaces in lists even if it has an invalid MAC. (#489) +- from version 20250203.00 + * Fix windows package build failures (#491) + * vlan: don't index based on the vlan ID (#486) + * Revert PR #482 (#488) + * Remove Amy and Zach from OWNERS (#487) + * Skip interfaces in interfaceNames() instead of erroring if there is an (#482) + * Fix Debian packaging if guest agent manager is not checked out (#485) +- from version 20250122.00 + * networkd(vlan): remove the interface in addition to config (#468) + * Implement support for vlan dynamic removal, update dhclient to + remove only if configured (#465) + * Update logging library (#479) + * Remove Pat from owners file. (#478) + +------------------------------------------------------------------- Old: ---- guest-agent-20250116.00.tar.gz New: ---- guest-agent-20250327.01.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ google-guest-agent.spec ++++++ --- /var/tmp/diff_new_pack.KJJkzS/_old 2025-04-04 18:10:10.974846718 +0200 +++ /var/tmp/diff_new_pack.KJJkzS/_new 2025-04-04 18:10:10.978846884 +0200 @@ -24,7 +24,7 @@ %global import_path %{provider_prefix} Name: google-guest-agent -Version: 20250116.00 +Version: 20250327.01 Release: 0 Summary: Google Cloud Guest Agent License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.KJJkzS/_old 2025-04-04 18:10:11.014848387 +0200 +++ /var/tmp/diff_new_pack.KJJkzS/_new 2025-04-04 18:10:11.018848554 +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">20250116.00</param> - <param name="revision">20250116.00</param> + <param name="versionformat">20250327.01</param> + <param name="revision">20250327.01</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-20250116.00.tar.gz</param> + <param name="archive">guest-agent-20250327.01.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.KJJkzS/_old 2025-04-04 18:10:11.042849557 +0200 +++ /var/tmp/diff_new_pack.KJJkzS/_new 2025-04-04 18:10:11.046849724 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param> - <param name="changesrevision">4dbdb5da9cb233c43adcea8affd01bf5d291b9bd</param></service></servicedata> + <param name="changesrevision">bdc0a12cb28433745106c088c80a553ffff2d466</param></service></servicedata> (No newline at EOF) ++++++ guest-agent-20250116.00.tar.gz -> guest-agent-20250327.01.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/.gitignore new/guest-agent-20250327.01/.gitignore --- old/guest-agent-20250116.00/.gitignore 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,15 +0,0 @@ -# Ignore all built binaries. -**/gce_workload_cert_refresh -**/gce_workload_cert_refresh.exe -**/google_authorized_keys -**/google_authorized_keys.exe -**/google_guest_agent -**/google_guest_agent.exe -**/google_metadata_script_runner -**/google_metadata_script_runner.exe - -# Don't ignore new content to directories. -!**/gce_workload_cert_refresh/ -!**/google_authorized_keys/ -!**/google_guest_agent/ -!**/google_metadata_script_runner/ \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/OWNERS new/guest-agent-20250327.01/OWNERS --- old/guest-agent-20250116.00/OWNERS 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/OWNERS 2025-03-27 17:31:22.000000000 +0100 @@ -2,7 +2,6 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: - - a-crate - ajorg - bkatyl - chaitanyakulkarni28 @@ -13,4 +12,3 @@ - karnvadaliya - koln67 - lpleahy - - zmarano diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/build-deb.sh new/guest-agent-20250327.01/build-deb.sh --- old/guest-agent-20250116.00/build-deb.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/guest-agent-20250327.01/build-deb.sh 2025-03-27 17:31:22.000000000 +0100 @@ -0,0 +1,47 @@ +#!/bin/env bash +# +# This script wraps the steps required to locally build a deb package +# based on the in tree debian packaging (see invocation example bellow). +# +# After the build is finished the script will print out where the final +# artifact was generated. +# +# Invocation: +# VERSION=<version> RELEASE=<release> ./build-deb.sh +# + +BUILD_DIR=$(mktemp -d) +PKGNAME="google-guest-agent" + +if [ -z "${VERSION}" ]; then + echo "VERSION environment variable is not set" + exit 1 +fi + +if [ -z "${RELEASE}" ]; then + echo "RELEASE environment variable is not set" + exit 1 +fi + +TARBALL="${PKGNAME}_${VERSION}.orig.tar.gz" + +echo "Creating tarball: ${TARBALL}" +tar czvf "${BUILD_DIR}/${TARBALL}" --exclude .git --exclude packaging \ + --transform "s/^\./${PKGNAME}-${VERSION}/" . + +tar -C "$BUILD_DIR" -xzvf "${BUILD_DIR}/${TARBALL}" +PKGDIR="${BUILD_DIR}/${PKGNAME}-${VERSION}" + +cp -r packaging/debian "${BUILD_DIR}/${PKGNAME}-${VERSION}/" + +cd "${BUILD_DIR}/${PKGNAME}-${VERSION}" + +# We generate this to enable auto-versioning. +[[ -f debian/changelog ]] && rm debian/changelog + +dch --create -M -v 1:${VERSION}-${RELEASE} --package $PKGNAME -D stable \ + "Debian packaging for ${PKGNAME}" + +DEB_BUILD_OPTIONS="noautodbgsym nocheck" debuild -e "VERSION=${VERSION}" -e "RELEASE=${RELEASE}" -us -uc + +echo "Package built at: ${BUILD_DIR}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/gce_workload_cert_refresh/main.go new/guest-agent-20250327.01/gce_workload_cert_refresh/main.go --- old/guest-agent-20250116.00/gce_workload_cert_refresh/main.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/gce_workload_cert_refresh/main.go 2025-03-27 17:31:22.000000000 +0100 @@ -149,13 +149,16 @@ func main() { ctx := context.Background() - opts := logger.LogOpts{ LoggerName: programName, FormatFunction: logFormat, // No need for syslog. DisableLocalLogging: true, } + createdByBytes, err := getMetadata(ctx, "/instance/attributes/created-by") + if err == nil { + opts.MIG = string(createdByBytes) + } opts.Writers = []io.Writer{os.Stderr} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/go.mod new/guest-agent-20250327.01/go.mod --- old/guest-agent-20250116.00/go.mod 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/go.mod 2025-03-27 17:31:22.000000000 +0100 @@ -1,12 +1,12 @@ module github.com/GoogleCloudPlatform/guest-agent -go 1.20 +go 1.23.0 replace github.com/GoogleCloudPlatform/guest-agent/metadata => ../metadata require ( cloud.google.com/go/storage v1.31.0 - github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250108002221-76154e4b3bd9 + github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250327013322-4be06cdc8bd8 github.com/Microsoft/go-winio v0.6.1 github.com/go-ini/ini v1.66.6 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da @@ -17,8 +17,8 @@ github.com/kardianos/service v1.2.2 github.com/robfig/cron/v3 v3.0.1 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 - golang.org/x/crypto v0.25.0 - golang.org/x/sys v0.22.0 + golang.org/x/crypto v0.35.0 + golang.org/x/sys v0.30.0 google.golang.org/api v0.134.0 google.golang.org/grpc v1.57.1 google.golang.org/protobuf v1.33.0 @@ -44,10 +44,10 @@ github.com/pkg/errors v0.9.1 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.27.0 // indirect + golang.org/x/net v0.36.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/go.sum new/guest-agent-20250327.01/go.sum --- old/guest-agent-20250116.00/go.sum 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/go.sum 2025-03-27 17:31:22.000000000 +0100 @@ -15,8 +15,8 @@ cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250108002221-76154e4b3bd9 h1:7qCQS+ERyBX6NCxH857rhrxntIwyAIuIk9+s0iETYWU= -github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250108002221-76154e4b3bd9/go.mod h1:6ZqSUIZRAPR5dNMWJ+FwIarFFQ9t5qalaKQs20o6h+I= +github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250327013322-4be06cdc8bd8 h1:XHFUi3AVH/bsqoNIniftXTVgHYZuMalB/s/5LiLkf9c= +github.com/GoogleCloudPlatform/guest-logging-go v0.0.0-20250327013322-4be06cdc8bd8/go.mod h1:6ZqSUIZRAPR5dNMWJ+FwIarFFQ9t5qalaKQs20o6h+I= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -63,7 +63,9 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/certificate-transparency-go v1.1.2 h1:4hE0GEId6NAW28dFpC+LrRGwQX5dtmXQGDbg8+/MZOM= +github.com/google/certificate-transparency-go v1.1.2/go.mod h1:3OL+HKDqHPUfdKrHVQxO6T8nDLO0HF7LRTlkIWXaWvQ= github.com/google/go-attestation v0.4.4-0.20230613144338-a9b6eb1eb888 h1:HURgKPRPJSozDuMHpjdV+iyFVLhB6bi1JanhGgSzI1k= +github.com/google/go-attestation v0.4.4-0.20230613144338-a9b6eb1eb888/go.mod h1:xCfWZojUHwedNcs780T8cblW9XHss9XKD2s3U44FVbo= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -80,9 +82,11 @@ github.com/google/go-tpm-tools v0.4.0 h1:bYRZAUvQEmn11WTKCkTLRCCv4aTlOBgBBeqCK0ABT2A= github.com/google/go-tpm-tools v0.4.0/go.mod h1:G7PFUk8KKQzdYYGv/cpV9LB9sPT7czAAomnceugzNKQ= github.com/google/go-tspi v0.3.0 h1:ADtq8RKfP+jrTyIWIZDIYcKOMecRqNJFOew2IT0Inus= +github.com/google/go-tspi v0.3.0/go.mod h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI= github.com/google/logger v1.1.1 h1:+6Z2geNxc9G+4D4oDO9njjjn2d0wN5d7uOo0vOIW1NQ= github.com/google/logger v1.1.1/go.mod h1:BkeJZ+1FhQ+/d087r4dzojEg1u2ZX+ZqG1jTUrLM+zQ= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= @@ -124,13 +128,15 @@ go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -151,8 +157,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= @@ -162,8 +168,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -176,19 +182,20 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google-guest-agent-manager.service new/guest-agent-20250327.01/google-guest-agent-manager.service --- old/guest-agent-20250116.00/google-guest-agent-manager.service 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google-guest-agent-manager.service 2025-03-27 17:31:22.000000000 +0100 @@ -1,7 +1,7 @@ [Unit] Description=Google Compute Engine Guest Agent Plugin Manager -After=google-guest-agent.service -Wants=google-guest-agent.service +After=network-online.target syslog.service +After=network.service networking.service NetworkManager.service systemd-networkd.service [Service] Type=notify diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google-guest-compat-manager.service new/guest-agent-20250327.01/google-guest-compat-manager.service --- old/guest-agent-20250116.00/google-guest-compat-manager.service 1970-01-01 01:00:00.000000000 +0100 +++ new/guest-agent-20250327.01/google-guest-compat-manager.service 2025-03-27 17:31:22.000000000 +0100 @@ -0,0 +1,12 @@ +[Unit] +Description=Google Compute Engine Guest Compat Manager +After=network-online.target syslog.service +After=network.service networking.service NetworkManager.service systemd-networkd.service + +[Service] +Type=notify +ExecStart=/usr/bin/google_guest_compat_manager +Restart=always + +[Install] +WantedBy=multi-user.target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google-shutdown-scripts.service new/guest-agent-20250327.01/google-shutdown-scripts.service --- old/guest-agent-20250116.00/google-shutdown-scripts.service 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google-shutdown-scripts.service 2025-03-27 17:31:22.000000000 +0100 @@ -8,7 +8,7 @@ ExecStart=/bin/true RemainAfterExit=true # This service does nothing on start, and runs shutdown scripts on stop. -ExecStop=/usr/bin/google_metadata_script_runner shutdown +ExecStop=/bin/sh -c 'if [ -e /usr/bin/gce_compat_metadata_script_runner ]; then /usr/bin/gce_compat_metadata_script_runner shutdown; else /usr/bin/google_metadata_script_runner shutdown; fi' TimeoutStopSec=0 KillMode=process diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google-startup-scripts.service new/guest-agent-20250327.01/google-startup-scripts.service --- old/guest-agent-20250116.00/google-startup-scripts.service 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google-startup-scripts.service 2025-03-27 17:31:22.000000000 +0100 @@ -6,7 +6,7 @@ [Service] Type=oneshot -ExecStart=/usr/bin/google_metadata_script_runner startup +ExecStart=/bin/sh -c 'if [ -e /usr/bin/gce_compat_metadata_script_runner ]; then /usr/bin/gce_compat_metadata_script_runner startup; else /usr/bin/google_metadata_script_runner startup; fi' #TimeoutStartSec is ignored for Type=oneshot service units. KillMode=process StandardOutput=journal+console diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_authorized_keys/main.go new/guest-agent-20250327.01/google_authorized_keys/main.go --- old/guest-agent-20250116.00/google_authorized_keys/main.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_authorized_keys/main.go 2025-03-27 17:31:22.000000000 +0100 @@ -143,9 +143,11 @@ ctx := context.Background() username := os.Args[1] + createdBy, _ := client.GetKey(ctx, "/instance/attributes/created-by", nil) opts := logger.LogOpts{ LoggerName: programName, FormatFunction: logFormat, + MIG: createdBy, } if runtime.GOOS == "windows" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/cfg/cfg.go new/guest-agent-20250327.01/google_guest_agent/cfg/cfg.go --- old/guest-agent-20250116.00/google_guest_agent/cfg/cfg.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/cfg/cfg.go 2025-03-27 17:31:22.000000000 +0100 @@ -92,6 +92,7 @@ setup = true manage_primary_nic = restore_debian12_netplan_config = true +vlan_setup_enabled = false [OSLogin] cert_authentication = true @@ -111,7 +112,6 @@ command_pipe_mode = 0770 command_pipe_group = command_request_timeout = 10s -vlan_setup_enabled = false systemd_config_dir = /usr/lib/systemd/network ` ) @@ -288,6 +288,7 @@ Setup bool `ini:"setup,omitempty"` ManagePrimaryNIC bool `ini:"manage_primary_nic,omitempty"` RestoreDebian12NetplanConfig bool `ini:"restore_debian12_netplan_config,omitempty"` + VlanSetupEnabled bool `ini:"vlan_setup_enabled,omitempty"` } // Snapshots contains the configurations of Snapshots section. @@ -307,7 +308,6 @@ CommandRequestTimeout string `ini:"command_request_timeout,omitempty"` CommandPipeMode string `ini:"command_pipe_mode,omitempty"` CommandPipeGroup string `ini:"command_pipe_group,omitempty"` - VlanSetupEnabled bool `ini:"vlan_setup_enabled,omitempty"` SystemdConfigDir string `ini:"systemd_config_dir,omitempty"` } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/main.go new/guest-agent-20250327.01/google_guest_agent/main.go --- old/guest-agent-20250116.00/google_guest_agent/main.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/main.go 2025-03-27 17:31:22.000000000 +0100 @@ -207,6 +207,7 @@ // TODO: move all this metadata dependent code to its own metadata event handler. if newMetadata != nil { opts.ProjectName = newMetadata.Project.ProjectID + opts.MIG = newMetadata.Instance.Attributes.CreatedBy if err := logger.Init(ctx, opts); err != nil { logger.Errorf("Error initializing logger: %v", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/common.go new/guest-agent-20250327.01/google_guest_agent/network/manager/common.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/common.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/common.go 2025-03-27 17:31:22.000000000 +0100 @@ -23,13 +23,11 @@ "net" "os" "os/exec" - "regexp" - "strconv" + "strings" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/osinfo" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run" "github.com/GoogleCloudPlatform/guest-agent/metadata" - "github.com/GoogleCloudPlatform/guest-agent/utils" "github.com/GoogleCloudPlatform/guest-logging-go/logger" "github.com/go-ini/ini" @@ -85,39 +83,44 @@ var ifaces []string for _, ni := range nics { iface, err := GetInterfaceByMAC(ni.Mac) + ifaceName := iface.Name if err != nil { - return nil, err + if _, found := badMAC[ni.Mac]; !found { + logger.Errorf("Error getting interface %s: %v", ni.Mac, err) + badMAC[ni.Mac] = iface + } + // Mark the iface as invalid, and include its Mac. This is important + // to avoid shifting indices if a MAC is invalid, which will cause + // problems with network and VLAN setup. + ifaceName = fmt.Sprintf("invalid-%s", ni.Mac) } - ifaces = append(ifaces, iface.Name) + ifaces = append(ifaces, ifaceName) } return ifaces, nil } -// vlanInterfaceParentMap gets a map of VLAN IDs and its parent NIC. -func vlanInterfaceParentMap(nics map[int]metadata.VlanInterface, allEthernetInterfaces []string) (map[int]string, error) { - vlans := make(map[int]string) - - for _, ni := range nics { - parentInterface, err := vlanParentInterface(allEthernetInterfaces, ni) - if err != nil { - return nil, fmt.Errorf("failed to determine vlan's parent interface: %+v", err) - } - vlans[ni.Vlan] = parentInterface +// isInvalid checks if the provided interface is invalid. This is used to skip +// writing configurations for interfaces that have been disabled or otherwise +// made invalid. The `invalid` tag is added to ifaces whose MACs are invalid. +// This logic is handled in the `interfaceListsIpv4Ipv6` function below. +// +// Marking an interface as invalid allows us to keep consistency with the lists +// of interfaces returned by `interfaceNames` and `interfaceListsIpv4Ipv6`. In +// cases where a NIC is disabled, skipping them would result in shifting of +// indices, which will cause problems with both network setup (especially in cases +// where the primary NIC is disabled for some reason) and VLAN setup, which depends +// on properly pairing with respective NIC indices. +// +// For example, if the primary NIC was disabled, then the current network +// setup implementation will start treating the first secondary NIC as the +// primary NIC. In VLAN's case, a VLAN NIC may be improperly paired with the +// wrong parent NIC. +func isInvalid(iface string) bool { + invalid := strings.Contains(iface, "invalid") + if invalid { + logger.Debugf("Invalid interface %s, skipping", iface) } - - return vlans, nil -} - -// vlanInterfaceListsIpv6 gets a list of VLAN IDs that support IPv6. -func vlanInterfaceListsIpv6(nics map[int]VlanInterface) []int { - var googleIpv6Interfaces []int - - for _, ni := range nics { - if ni.DHCPv6Refresh != "" { - googleIpv6Interfaces = append(googleIpv6Interfaces, ni.Vlan) - } - } - return googleIpv6Interfaces + return invalid } // interfaceListsIpv4Ipv6 gets a list of interface names. The first list is a list of all @@ -128,17 +131,21 @@ for _, ni := range nics { iface, err := GetInterfaceByMAC(ni.Mac) + ifaceName := iface.Name if err != nil { if _, found := badMAC[ni.Mac]; !found { logger.Errorf("error getting interface: %s", err) badMAC[ni.Mac] = iface } - continue + // Mark the iface as invalid, and include its Mac. This is important + // to avoid shifting indices if a MAC is invalid, which will cause + // problems with network and VLAN setup. + ifaceName = fmt.Sprintf("invalid-%s", ni.Mac) } if ni.DHCPv6Refresh != "" { - googleIpv6Interfaces = append(googleIpv6Interfaces, iface.Name) + googleIpv6Interfaces = append(googleIpv6Interfaces, ifaceName) } - googleInterfaces = append(googleInterfaces, iface.Name) + googleInterfaces = append(googleInterfaces, ifaceName) } return googleInterfaces, googleIpv6Interfaces } @@ -183,30 +190,6 @@ return net.Interface{}, fmt.Errorf("no interface found with MAC %s", mac) } -// vlanParentInterface returns the interface name of the parent interface of a vlan interface. -func vlanParentInterface(ethernetInterfaces []string, vlan metadata.VlanInterface) (string, error) { - regexStr := "(?P<prefix>.*network-interfaces)/(?P<interface>[0-9]+)/" - parentRegex := regexp.MustCompile(regexStr) - - groups := utils.RegexGroupsMap(parentRegex, vlan.ParentInterface) - - ifaceIndex, found := groups["interface"] - if !found { - return "", fmt.Errorf("invalid vlan's ParentInterface reference, no interface index found") - } - - index, err := strconv.Atoi(ifaceIndex) - if err != nil { - return "", fmt.Errorf("failed to parse parent index(%s): %+v", ifaceIndex, err) - } - - if index >= len(ethernetInterfaces) { - return "", fmt.Errorf("invalid parent index(%d), known interfaces count: %d", index, len(ethernetInterfaces)) - } - - return ethernetInterfaces[index], nil -} - // readIniFile reads and parses the content of filePath and loads it into ptr. func readIniFile(filePath string, ptr any) error { opts := ini.LoadOptions{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/common_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/common_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/common_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/common_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -13,126 +13,3 @@ // limitations under the License. package manager - -import ( - "fmt" - "sort" - "testing" - - "github.com/GoogleCloudPlatform/guest-agent/metadata" - "github.com/google/go-cmp/cmp" -) - -func TestVlanParentInterfaceSuccess(t *testing.T) { - tests := []struct { - parentInterface string - expectedResult string - }{ - {"/computeMetadata/v1/instance/network-interfaces/0/", "eth0"}, - {"/computeMetadata/v1/instance/network-interfaces/1/", "eth1"}, - {"/computeMetadata/v1/instance/network-interfaces/2/", "eth2"}, - } - - availableNics := []string{ - "eth0", - "eth1", - "eth2", - } - - for i, curr := range tests { - t.Run(fmt.Sprintf("test-vlan-parent-success-%d", i), func(t *testing.T) { - vlan := metadata.VlanInterface{ParentInterface: curr.parentInterface} - - parent, err := vlanParentInterface(availableNics, vlan) - if err != nil { - t.Fatalf("expected err: nil, got: %+v", err) - } - - if parent != curr.expectedResult { - t.Fatalf("got wront parent value, expected: %s, got: %s", curr.expectedResult, parent) - } - }) - } -} - -func TestVlanParentInterfaceFailure(t *testing.T) { - tests := []string{ - "/computeMetadata/v1/instance/network-interfaces/x/", - "/computeMetadata/v1/instance/network-interfaces/0/", // Valid format but interfaces slices will have zero elements. - "/computeMetadata/v1/instance/network-interfaces/18446744073709551616/", // Out of int64 range - strconv.Atoi() should fail. - "/computeMetadata/v1/instance/0/", - "/computeMetadata/v1/instance/network-interfaces0/", - "/computeMetadata/v1/instance/network-interfaces/", - "/computeMetadata/", - "", - } - - for i, curr := range tests { - t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) { - vlan := metadata.VlanInterface{ParentInterface: curr} - _, err := vlanParentInterface([]string{}, vlan) - if err == nil { - t.Fatalf("vlanParentInterface(%s) = nil, want: non-nil", curr) - } - }) - } -} - -func TestVlanInterfaceListsIpv6(t *testing.T) { - nics := map[int]VlanInterface{ - 0: {VlanInterface: metadata.VlanInterface{Vlan: 4, DHCPv6Refresh: "123456"}}, - 1: {VlanInterface: metadata.VlanInterface{Vlan: 5}}, - 2: {VlanInterface: metadata.VlanInterface{Vlan: 6, MTU: 1234}}, - 3: {VlanInterface: metadata.VlanInterface{Vlan: 7, Mac: "acd", ParentInterface: "/parent/0", DHCPv6Refresh: "7890"}}, - } - want := []int{4, 7} - got := vlanInterfaceListsIpv6(nics) - sort.Ints(got) - - if diff := cmp.Diff(want, got); diff != "" { - t.Errorf("vlanInterfaceListsIpv6(%+v) returned unexpected diff (-want,+got)\n%s", nics, diff) - } -} - -func TestVlanInterfaceParentMap(t *testing.T) { - tests := []struct { - name string - nics map[int]metadata.VlanInterface - allEthernetInterfaces []string - wantErr bool - wantMap map[int]string - }{ - { - name: "all_valid_nics", - allEthernetInterfaces: []string{"ens3", "ens4"}, - nics: map[int]metadata.VlanInterface{ - 4: {Vlan: 4, ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/"}, - 5: {Vlan: 5, ParentInterface: "/computeMetadata/v1/instance/network-interfaces/1/"}, - }, - wantMap: map[int]string{ - 4: "ens3", - 5: "ens4", - }, - }, - { - name: "invalid_parent", - allEthernetInterfaces: []string{"ens3"}, - nics: map[int]metadata.VlanInterface{ - 5: {Vlan: 5, ParentInterface: "/computeMetadata/v1/instance/network-interfaces/1/"}, - }, - wantErr: true, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - got, err := vlanInterfaceParentMap(test.nics, test.allEthernetInterfaces) - if (err != nil) != test.wantErr { - t.Fatalf("vlanInterfaceParentMap(%+v, %v) = error [%v], want error: %t", test.nics, test.allEthernetInterfaces, err, test.wantErr) - } - if diff := cmp.Diff(test.wantMap, got); diff != "" { - t.Errorf("vlanInterfaceParentMap(%+v, %v) returned unexpected diff (-want,+got)\n%s", test.nics, test.allEthernetInterfaces, diff) - } - }) - } -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux.go new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux.go 2025-03-27 17:31:22.000000000 +0100 @@ -415,6 +415,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping dhclient launch for %s", iface) continue } + if isInvalid(iface) { + continue + } // On 18.04 we fallback to dhclient as networkctl is very old and has not reload support for example. // Default netplan config will take care of it, do not launch dhclient for primary NIC on 18.04. if (i == 0) && isUbuntu1804() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/dhclient_linux_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/dhclient_linux_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -49,7 +49,7 @@ for _, arg := range args { msg += fmt.Sprintf(" %v", arg) } - return fmt.Errorf(msg) + return fmt.Errorf("%s", msg) } return nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/manager.go new/guest-agent-20250327.01/google_guest_agent/network/manager/manager.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/manager.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/manager.go 2025-03-27 17:31:22.000000000 +0100 @@ -83,7 +83,7 @@ EthernetInterfaces []metadata.NetworkInterfaces // VlanInterfaces are the vLAN interfaces descriptors offered by metadata. - VlanInterfaces map[int]VlanInterface + VlanInterfaces map[string]VlanInterface } // guestAgentSection is the section added to guest-agent-written ini files to indicate @@ -163,7 +163,8 @@ } for vlanID, vlan := range vlans { - nics.VlanInterfaces[vlanID] = VlanInterface{VlanInterface: vlan, ParentInterfaceID: ethernetInterfaces[parentID]} + mapID := fmt.Sprintf("%d-%d", parentID, vlanID) + nics.VlanInterfaces[mapID] = VlanInterface{VlanInterface: vlan, ParentInterfaceID: ethernetInterfaces[parentID]} } } return nil @@ -191,7 +192,7 @@ nics := &Interfaces{ EthernetInterfaces: mds.Instance.NetworkInterfaces, - VlanInterfaces: map[int]VlanInterface{}, + VlanInterfaces: map[string]VlanInterface{}, } interfaces, err := interfaceNames(nics.EthernetInterfaces) @@ -231,7 +232,7 @@ return fmt.Errorf("manager(%s): error setting up ethernet interfaces: %v", activeService.manager.Name(), err) } - if config.Unstable.VlanSetupEnabled { + if config.NetworkInterfaces.VlanSetupEnabled { logger.Infof("VLAN setup is enabled via config file, setting up interfaces") if err := reformatVlanNics(mds, nics, interfaces); err != nil { return fmt.Errorf("unable to read vlans, invalid format: %w", err) @@ -335,7 +336,7 @@ func buildInterfacesFromAllPhysicalNICs() (*Interfaces, error) { nics := &Interfaces{ EthernetInterfaces: nil, - VlanInterfaces: map[int]VlanInterface{}, + VlanInterfaces: map[string]VlanInterface{}, } interfaces, err := net.Interfaces() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/manager_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/manager_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/manager_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/manager_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -335,11 +335,11 @@ }, }, }} - nics := &Interfaces{VlanInterfaces: map[int]VlanInterface{}} - want := &Interfaces{VlanInterfaces: map[int]VlanInterface{ - 5: {VlanInterface: metadata.VlanInterface{Mac: "a", ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/", Vlan: 5}, ParentInterfaceID: "eth0"}, - 6: {VlanInterface: metadata.VlanInterface{Mac: "b", Vlan: 6, IP: "1.2.3.4"}, ParentInterfaceID: "eth0"}, - 7: {VlanInterface: metadata.VlanInterface{Mac: "c", Vlan: 7, DHCPv6Refresh: "123456"}, ParentInterfaceID: "eth1"}, + nics := &Interfaces{VlanInterfaces: map[string]VlanInterface{}} + want := &Interfaces{VlanInterfaces: map[string]VlanInterface{ + "0-5": {VlanInterface: metadata.VlanInterface{Mac: "a", ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/", Vlan: 5}, ParentInterfaceID: "eth0"}, + "0-6": {VlanInterface: metadata.VlanInterface{Mac: "b", Vlan: 6, IP: "1.2.3.4"}, ParentInterfaceID: "eth0"}, + "1-7": {VlanInterface: metadata.VlanInterface{Mac: "c", Vlan: 7, DHCPv6Refresh: "123456"}, ParentInterfaceID: "eth1"}, }} ethernetInterfaces := []string{"eth0", "eth1"} @@ -365,7 +365,7 @@ }, }, }} - nics := &Interfaces{VlanInterfaces: map[int]VlanInterface{}} + nics := &Interfaces{VlanInterfaces: map[string]VlanInterface{}} tests := []struct { name string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux.go new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux.go 2025-03-27 17:31:22.000000000 +0100 @@ -26,6 +26,7 @@ "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/cfg" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/osinfo" "github.com/GoogleCloudPlatform/guest-agent/google_guest_agent/run" + "github.com/GoogleCloudPlatform/guest-agent/metadata" "github.com/GoogleCloudPlatform/guest-agent/utils" "github.com/GoogleCloudPlatform/guest-logging-go/logger" ) @@ -258,6 +259,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping writeNetworkdDropin for %s", iface) continue } + if isInvalid(iface) { + continue + } logger.Debugf("writing systemd-networkd drop-in config for %s", iface) var dhcp = "ipv4" @@ -368,6 +372,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping writeNetplanEthernetDropin for %s", iface) continue } + if isInvalid(iface) { + continue + } logger.Debugf("Adding %s(%d) to drop-in configuration.", iface, i) trueVal := true @@ -468,28 +475,33 @@ // SetupVlanInterface writes the apppropriate vLAN interfaces netplan configuration. func (n *netplan) SetupVlanInterface(ctx context.Context, config *cfg.Sections, nics *Interfaces) error { + var reload1, reload2, reload3 bool + var err error + toRemove, err := n.findVlanDiff(nics) if err != nil { return fmt.Errorf("unable to detect vlan nics to delete: %w", err) } - reload1, err := n.rollbackVlanNics(ctx, toRemove) - if err != nil { - return fmt.Errorf("unable to remove vlan interfaces (%+v): %w", toRemove, err) + if toRemove != nil { + reload1, err = n.rollbackVlanNics(ctx, toRemove) + if err != nil { + return fmt.Errorf("unable to remove vlan interfaces (%+v): %w", toRemove, err) + } } - reload2, err := n.writeNetplanVLANDropin(nics) + reload2, err = n.writeNetplanVLANDropin(nics) if err != nil { return fmt.Errorf("unable to write netplan VLAN dropin: %w", err) } - reload3, err := n.writeNetworkdVLANDropin(nics) + reload3, err = n.writeNetworkdVLANDropin(nics) if err != nil { return fmt.Errorf("unable to write netplan networkd VLAN dropin: %w", err) } if reload1 || reload2 || reload3 { - if err := n.reloadConfigs(ctx); err != nil { + if err = n.reloadConfigs(ctx); err != nil { return fmt.Errorf("error applying vlan interface configs: %w", err) } } @@ -512,23 +524,23 @@ // and returns only the vlan interfaces to delete. func (n *netplan) findVlanDiff(expectedNics *Interfaces) (*Interfaces, error) { keepInterfaces := make(map[string]string) - toRemove := &Interfaces{VlanInterfaces: make(map[int]VlanInterface)} + toRemove := Interfaces{VlanInterfaces: make(map[string]VlanInterface)} existingVlanCfgs := netplanDropin{} netplanVlanDropinFile := n.dropinFile(netplanVlanSuffix) // There's no config file per interface, single netplan config file lists all the interfaces. if !utils.FileExists(netplanVlanDropinFile, utils.TypeFile) { logger.Infof("File %q does not exist, nothing to rollback", netplanVlanDropinFile) - return toRemove, nil + return nil, nil } if err := readYamlFile(netplanVlanDropinFile, &existingVlanCfgs); err != nil { - return toRemove, fmt.Errorf("unable to read %q trying rollback configs: %w", netplanVlanDropinFile, err) + return nil, fmt.Errorf("unable to read %q trying rollback configs: %w", netplanVlanDropinFile, err) } if len(existingVlanCfgs.Network.Vlans) == 0 { logger.Debugf("No existing VLAN configs found at %q, skipping rollback", netplanVlanDropinFile) - return toRemove, nil + return nil, nil } for _, iface := range expectedNics.VlanInterfaces { @@ -541,11 +553,18 @@ for vlanKey, vlan := range existingVlanCfgs.Network.Vlans { _, ok := keepInterfaces[vlanKey] if !ok { - toRemove.VlanInterfaces[vlan.ID] = VlanInterface{ParentInterfaceID: n.interfaceFromLink(vlan.Link)} + parentID := n.interfaceFromLink(vlan.Link) + vlanID := fmt.Sprintf("%s-%d", parentID, vlan.ID) + toRemove.VlanInterfaces[vlanID] = VlanInterface{ + ParentInterfaceID: parentID, + VlanInterface: metadata.VlanInterface{ + Vlan: vlan.ID, + }, + } } } - return toRemove, nil + return &toRemove, nil } // rollbackVlanNics removes the [nics] and its config (netplan and networkd dropin both) on disk. @@ -567,8 +586,8 @@ } } - for id, iface := range nics.VlanInterfaces { - ifaceName := n.vlanInterfaceName(iface.ParentInterfaceID, id) + for _, iface := range nics.VlanInterfaces { + ifaceName := n.vlanInterfaceName(iface.ParentInterfaceID, iface.VlanInterface.Vlan) key := n.ID(ifaceName) deleteNics = append(deleteNics, key) @@ -663,8 +682,6 @@ func (n *netplan) writeNetworkdVLANDropin(nics *Interfaces) (bool, error) { var reload bool - googleIpv6Interfaces := vlanInterfaceListsIpv6(nics.VlanInterfaces) - stat, err := os.Stat(n.networkdDropinDir) if err != nil { return false, fmt.Errorf("failed to stat systemd-networkd's drop-in root dir: %w", err) @@ -678,7 +695,7 @@ logger.Debugf("writing systemd-networkd drop-in config for VLAN ID: %d", iface.Vlan) var dhcp = "ipv4" - if slices.Contains(googleIpv6Interfaces, iface.Vlan) { + if iface.DHCPv6Refresh != "" { dhcp = "yes" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/netplan_linux_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/netplan_linux_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -193,8 +193,8 @@ Mac: ifaces[1].HardwareAddr.String(), }, }, - VlanInterfaces: map[int]VlanInterface{ - 5: { + VlanInterfaces: map[string]VlanInterface{ + "0-5": { VlanInterface: metadata.VlanInterface{ Mac: "mac-address", Vlan: 5, @@ -202,7 +202,7 @@ }, ParentInterfaceID: ifaces[1].Name, }, - 6: { + "0-6": { VlanInterface: metadata.VlanInterface{ Mac: "mac-address2", Vlan: 6, @@ -426,8 +426,8 @@ } nics := &Interfaces{ - VlanInterfaces: map[int]VlanInterface{ - 5: { + VlanInterfaces: map[string]VlanInterface{ + "ens4-5": { VlanInterface: metadata.VlanInterface{ Mac: "mac-address", Vlan: 5, @@ -439,8 +439,11 @@ } wantNics := &Interfaces{ - VlanInterfaces: map[int]VlanInterface{ - 6: { + VlanInterfaces: map[string]VlanInterface{ + "ens4-6": { + VlanInterface: metadata.VlanInterface{ + Vlan: 6, + }, ParentInterfaceID: "ens4", }, }, @@ -451,6 +454,10 @@ t.Fatalf("netplan.findVlanDiff(%+v) failed unexpectedly with error: %v", nics, err) } + if got == nil { + t.Fatalf("netplan.findVlanDiff(%+v) return nil, expected non nil", nics) + } + if diff := cmp.Diff(wantNics, got); diff != "" { t.Errorf("netplan.findVlanDiff(%+v) returned diff on vlans to remove (-want,+got)\n%s", nics, diff) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux.go new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux.go 2025-03-27 17:31:22.000000000 +0100 @@ -289,7 +289,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping writeNetworkManagerConfigs for %s", iface) continue } - + if isInvalid(iface) { + continue + } logger.Debugf("writing nmconnection file for %s", iface) configFilePath := n.networkManagerConfigFilePath(iface) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/network_manager_linux_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/network_manager_linux_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -446,8 +446,8 @@ EthernetInterfaces: []metadata.NetworkInterfaces{{ Mac: ifaces[1].HardwareAddr.String(), }}, - VlanInterfaces: map[int]VlanInterface{ - 22: { + VlanInterfaces: map[string]VlanInterface{ + "0-22": { VlanInterface: metadata.VlanInterface{ Mac: "foobar", ParentInterface: "/computeMetadata/v1/instance/network-interfaces/0/", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux.go new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux.go 2025-03-27 17:31:22.000000000 +0100 @@ -403,7 +403,7 @@ ptr, foundPtr := ptrMap[extension] if !foundPtr { - return requiresRestart, fmt.Errorf("regex matching failed, invalid etension: %s", extension) + return requiresRestart, fmt.Errorf("regex matching failed, invalid extension: %s", extension) } filePath := filepath.Join(n.configDir, file.Name()) @@ -511,7 +511,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping systemdNetworkd writeEthernetConfig for %s", iface) continue } - + if isInvalid(iface) { + continue + } logger.Debugf("write systemd-networkd network config for %s", iface) var dhcp = "ipv4" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux_test.go new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux_test.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/systemd_networkd_linux_test.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/systemd_networkd_linux_test.go 2025-03-27 17:31:22.000000000 +0100 @@ -647,10 +647,11 @@ dhclientTestTearDown(t) }) + mapIdx := fmt.Sprintf("%s-%d", curr.parentID, curr.vlanInterface.Vlan) nics := &Interfaces{ EthernetInterfaces: []metadata.NetworkInterfaces{curr.ethernetInterface}, - VlanInterfaces: map[int]VlanInterface{ - curr.vlanInterface.Vlan: {VlanInterface: curr.vlanInterface, ParentInterfaceID: curr.parentID}, + VlanInterfaces: map[string]VlanInterface{ + mapIdx: {VlanInterface: curr.vlanInterface, ParentInterfaceID: curr.parentID}, }, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_guest_agent/network/manager/wicked_linux.go new/guest-agent-20250327.01/google_guest_agent/network/manager/wicked_linux.go --- old/guest-agent-20250116.00/google_guest_agent/network/manager/wicked_linux.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_guest_agent/network/manager/wicked_linux.go 2025-03-27 17:31:22.000000000 +0100 @@ -218,7 +218,9 @@ logger.Debugf("ManagePrimaryNIC is disabled, skipping wicked writeEthernetConfig for %s", iface) continue } - + if isInvalid(iface) { + continue + } logger.Debugf("write enabling ifcfg-%s config", iface) ifcfg := n.ifcfgFilePath(iface) @@ -333,7 +335,7 @@ // for non-primary configuration files. for _, iface := range ifaces[1:] { if err := n.removeInterface(ctx, iface); err != nil { - return fmt.Errorf("failed to rollback wicked ethernet interface: %+v", err) + logger.Errorf("failed to rollback wicked ethernet interface: %+v", err) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/google_metadata_script_runner/main.go new/guest-agent-20250327.01/google_metadata_script_runner/main.go --- old/guest-agent-20250116.00/google_metadata_script_runner/main.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/google_metadata_script_runner/main.go 2025-03-27 17:31:22.000000000 +0100 @@ -452,6 +452,10 @@ if err == nil { opts.ProjectName = projectID } + createdBy, err := getMetadataKey(ctx, "/instance/attributes/created-by") + if err == nil { + opts.MIG = createdBy + } 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/guest-agent-20250116.00/instance_configs.cfg new/guest-agent-20250327.01/instance_configs.cfg --- old/guest-agent-20250116.00/instance_configs.cfg 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/instance_configs.cfg 2025-03-27 17:31:22.000000000 +0100 @@ -36,6 +36,7 @@ dhcp_command = ip_forwarding = true setup = true +vlan_setup_enabled = false [OSLogin] cert_authentication = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/metadata/metadata.go new/guest-agent-20250327.01/metadata/metadata.go --- old/guest-agent-20250116.00/metadata/metadata.go 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/metadata/metadata.go 2025-03-27 17:31:22.000000000 +0100 @@ -205,6 +205,7 @@ // Attributes describes the project's attributes keys. type Attributes struct { + CreatedBy string BlockProjectKeys bool HTTPSMDSEnableNativeStore *bool DisableHTTPSMdsSetup *bool @@ -234,6 +235,7 @@ } // Unmarshal to literal JSON types before doing anything else. type inner struct { + CreatedBy string `json:"created-by"` BlockProjectKeys string `json:"block-project-ssh-keys"` Diagnostics string `json:"diagnostics"` DisableAccountManager string `json:"disable-account-manager"` @@ -262,6 +264,7 @@ a.WSFCAddresses = temp.WSFCAddresses a.WSFCAgentPort = temp.WSFCAgentPort a.WindowsKeys = temp.WindowsKeys + a.CreatedBy = temp.CreatedBy value, err := strconv.ParseBool(temp.DisableHTTPSMdsSetup) if err == nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/postinst new/guest-agent-20250327.01/packaging/debian/postinst --- old/guest-agent-20250116.00/packaging/debian/postinst 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/debian/postinst 2025-03-27 17:31:22.000000000 +0100 @@ -1,9 +1,18 @@ #!/bin/sh -e if [ "$1" = "configure" ] ; then - if [ ! -f /etc/default/instance_configs.cfg ]; then - cp -a "/usr/share/${DPKG_MAINTSCRIPT_PACKAGE}/instance_configs.cfg" /etc/default/ - fi + if [ ! -f /etc/default/instance_configs.cfg ]; then + cp -a "/usr/share/${DPKG_MAINTSCRIPT_PACKAGE}/instance_configs.cfg" /etc/default/ + fi + + if [ ! -f "/usr/bin/google_guest_compat_manager" ]; then + if [ -f "/etc/google-guest-agent/core-plugin-enabled" ] && [ ! -z $(grep "true" "/etc/google-guest-agent/core-plugin-enabled") ]; then + # If the guest agent is disabled because core plugin is enabled, then + # re-enable the guest agent. Otherwise it stays disabled post-upgrade. + systemctl enable 'google-guest-agent.service' > /dev/null || true + systemctl enable 'gce-workload-cert-refresh.timer' > /dev/null || true + fi + fi fi #DEBHELPER# diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/prerm new/guest-agent-20250327.01/packaging/debian/prerm --- old/guest-agent-20250116.00/packaging/debian/prerm 1970-01-01 01:00:00.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/debian/prerm 2025-03-27 17:31:22.000000000 +0100 @@ -0,0 +1,8 @@ +#!/bin/sh -e + +if [ "$1" = "purge" -o "$1" = "remove" ] ; then + systemctl stop google-guest-agent-manager >/dev/null 2>&1 || : + ggactl_plugin_cleanup all >/dev/null 2>&1 || : +fi + +#DEBHELPER# diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/debian/rules new/guest-agent-20250327.01/packaging/debian/rules --- old/guest-agent-20250116.00/packaging/debian/rules 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/debian/rules 2025-03-27 17:31:22.000000000 +0100 @@ -19,11 +19,18 @@ # Binary-only package. dh_auto_install -- --no-source install -d debian/google-guest-agent/usr/share/google-guest-agent + sed -i "s/vlan_setup_enabled = false/vlan_setup_enabled = true/g" instance_configs.cfg install -p -m 0644 instance_configs.cfg debian/google-guest-agent/usr/share/google-guest-agent install -d debian/google-guest-agent/lib/systemd/system install -p -m 0644 gce-workload-cert-refresh.timer debian/google-guest-agent/lib/systemd/system/ - if [[ -d google-guest-agent ]]; then\ - install -p -m 0644 google-guest-agent/cmd/google_guest_agent/google_guest_agent debian/google-guest-agent/usr/bin/google_guest_agent_manager;\ + if [ -d google-guest-agent ]; then\ + install -d debian/google-guest-agent/usr/lib/google/guest_agent;\ + 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_cleanup debian/google-guest-agent/usr/bin/ggactl_plugin_cleanup;\ + 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/metadata_script_runner_compat/gce_compat_metadata_script_runner debian/google-guest-agent/usr/bin/gce_compat_metadata_script_runner;\ fi override_dh_golang: @@ -31,8 +38,13 @@ override_dh_auto_build: dh_auto_build -O--buildsystem=golang -- -ldflags="-s -w -X main.version=$(VERSION)" -mod=readonly - if [[ -d google-guest-agent ]]; then\ + if [ -d google-guest-agent ]; then\ + VERSION=$(VERSION) make -C google-guest-agent cmd/google_guest_compat_manager/google_guest_compat_manager;\ VERSION=$(VERSION) make -C google-guest-agent cmd/google_guest_agent/google_guest_agent;\ + VERSION=$(VERSION) make -C google-guest-agent cmd/ggactl/ggactl_plugin_cleanup;\ + 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;\ fi override_dh_installinit: @@ -42,13 +54,15 @@ install -d debian/google-guest-agent/lib/systemd/system install -p -m 0644 *.service debian/google-guest-agent/lib/systemd/system/ # Don't include guest agent manager if not building with it. - if [[ ! -d google-guest-agent ]]; then\ - rm -f debian/google-guest-agent/lib/systemd/systemd/google-guest-agent-manager.service;\ + if [ ! -d google-guest-agent ]; then\ + rm -f debian/google-guest-agent/lib/systemd/system/google-guest-compat-manager.service;\ + rm -f debian/google-guest-agent/lib/systemd/system/google-guest-agent-manager.service;\ fi install -d debian/google-guest-agent/lib/systemd/system-preset install -p -m 0644 *.preset debian/google-guest-agent/lib/systemd/system-preset/ dh_systemd_enable google-guest-agent.service google-startup-scripts.service google-shutdown-scripts.service gce-workload-cert-refresh.timer - if [[ -d google-guest-agent ]]; then\ + if [ -d google-guest-agent ]; then\ + dh_systemd_enable google-guest-compat-manager.service;\ dh_systemd_enable google-guest-agent-manager.service;\ fi @@ -56,6 +70,7 @@ # Only perform start/stop actions for the guest agent and cert refresh timer. dh_systemd_start google-guest-agent.service dh_systemd_start gce-workload-cert-refresh.timer - if [[ -d google-guest-agent ]]; then\ + if [ -d google-guest-agent ]; then\ + dh_systemd_start google-guest-compat-manager.service;\ dh_systemd_start google-guest-agent-manager.service;\ fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/agent_install.ps1 new/guest-agent-20250327.01/packaging/googet/agent_install.ps1 --- old/guest-agent-20250116.00/packaging/googet/agent_install.ps1 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/agent_install.ps1 2025-03-27 17:31:22.000000000 +0100 @@ -22,6 +22,11 @@ $manager_display_name = 'Google Compute Engine Agent Manager' $manager_description = 'Google Compute Engine Agent Manager' +$compat_manager = 'GCEWindowsCompatManager' +$compat_path = '"C:\Program Files\Google\Compute Engine\agent\GCEWindowsCompatManager.exe"' +$compat_display_name = 'Google Compute Engine Compat Manager' +$compat_description = 'Google Compute Engine Compat Manager' + $initial_config = @' # GCE Instance Configuration @@ -72,11 +77,19 @@ Set-New-Service $name $display_name $description $path Set-ServiceConfig $name $path - # Guest Agent Manager service + # Guest Agent Manager and Compat Manager service if ($install_manager) { + Set-New-Service $compat_manager $compat_display_name $compat_description $compat_path + Set-ServiceConfig $compat_manager $compat_path + Set-New-Service $manager_name $manager_display_name $manager_description $manager_path Set-ServiceConfig $manager_name $manager_path } else { + if (Get-Service $compat_manager -ErrorAction SilentlyContinue) { + Stop-Service $compat_manager + & sc.exe delete $compat_manager + } + if (Get-Service $manager_name -ErrorAction SilentlyContinue) { Stop-Service $manager_name & sc.exe delete $manager_name @@ -91,6 +104,7 @@ Restart-Service $name -Verbose if ($install_manager) { + Restart-Service $compat_manager -Verbose Restart-Service $manager_name -Verbose } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/agent_uninstall.ps1 new/guest-agent-20250327.01/packaging/googet/agent_uninstall.ps1 --- old/guest-agent-20250116.00/packaging/googet/agent_uninstall.ps1 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/agent_uninstall.ps1 2025-03-27 17:31:22.000000000 +0100 @@ -15,9 +15,20 @@ Stop-Service GCEAgent -Verbose & sc.exe delete GCEAgent +$compat_manager = 'GCEWindowsCompatManager' $name = 'GCEAgentManager' +$cleanup_exe = "C:\Program Files\Google\Compute Engine\agent\ggactl_plugin_cleanup.exe" + +# Stop and Delete compat manager. +if (Get-Service $compat_manager -ErrorAction SilentlyContinue) { + Stop-Service $compat_manager -Verbose + & sc.exe delete $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 all & sc.exe delete $name } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/google-compute-engine-windows.goospec new/guest-agent-20250327.01/packaging/googet/google-compute-engine-windows.goospec --- old/guest-agent-20250116.00/packaging/googet/google-compute-engine-windows.goospec 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/google-compute-engine-windows.goospec 2025-03-27 17:31:22.000000000 +0100 @@ -7,9 +7,14 @@ "description": "Google Compute Engine Windows agent", "source": "https://github.com/GoogleCloudPlatform/guest-agent/", "files": { + "CorePlugin.exe": "<ProgramFiles>/Google/Compute Engine/agent/CorePlugin.exe", + "GCEMetadataScriptRunner.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEMetadataScriptRunner.exe", "GCEWindowsAgentManager.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEWindowsAgentManager.exe", + "GCEWindowsCompatManager.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEWindowsCompatManager.exe", + "GCECompatMetadataScripts.exe": "<ProgramFiles>/Google/Compute Engine/metadata_scripts/GCECompatMetadataScripts.exe", "GCEWindowsAgent.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEWindowsAgent.exe", "GCEAuthorizedKeysCommand.exe": "<ProgramFiles>/Google/Compute Engine/agent/GCEAuthorizedKeysCommand.exe", + "ggactl_plugin_cleanup.exe": "<ProgramFiles>/Google/Compute Engine/agent/ggactl_plugin_cleanup.exe", "THIRD_PARTY_LICENSES": "<ProgramFiles>/Google/Compute Engine/THIRD_PARTY_LICENSES/", "LICENSE": "<ProgramFiles>/Google/Compute Engine/agent/LICENSE.txt" }, @@ -36,7 +41,12 @@ ], "sources": [{ "include": [ + "CorePlugin.exe", + "ggactl_plugin_cleanup.exe", "GCEWindowsAgent.exe", + "GCECompatMetadataScripts.exe", + "GCEWindowsCompatManager.exe", + "GCEMetadataScriptRunner.exe", "GCEWindowsAgentManager.exe", "GCEAuthorizedKeysCommand.exe", "packaging/googet/agent_install.ps1", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/run_shutdown_scripts.cmd new/guest-agent-20250327.01/packaging/googet/run_shutdown_scripts.cmd --- old/guest-agent-20250116.00/packaging/googet/run_shutdown_scripts.cmd 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/run_shutdown_scripts.cmd 2025-03-27 17:31:22.000000000 +0100 @@ -16,4 +16,8 @@ REM Run shutdown scripts that should happen as soon as the instance REM begins to power down -"C:\Program Files\Google\Compute Engine\metadata_scripts\GCEMetadataScripts.exe" "shutdown" +IF EXIST "C:\Program Files\Google\Compute Engine\metadata_scripts\GCECompatMetadataScripts.exe" ( + "C:\Program Files\Google\Compute Engine\metadata_scripts\GCECompatMetadataScripts.exe" "shutdown" +) ELSE ( + "C:\Program Files\Google\Compute Engine\metadata_scripts\GCEMetadataScripts.exe" "shutdown" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/run_startup_scripts.cmd new/guest-agent-20250327.01/packaging/googet/run_startup_scripts.cmd --- old/guest-agent-20250116.00/packaging/googet/run_startup_scripts.cmd 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/run_startup_scripts.cmd 2025-03-27 17:31:22.000000000 +0100 @@ -19,4 +19,8 @@ REM We execute the startup script asynchronously so it may run without REM this three day maximum runtime limitation. -start "" "C:\Program Files\Google\Compute Engine\metadata_scripts\GCEMetadataScripts.exe" "startup" +IF EXIST "C:\Program Files\Google\Compute Engine\metadata_scripts\GCECompatMetadataScripts.exe" ( + start "" "C:\Program Files\Google\Compute Engine\metadata_scripts\GCECompatMetadataScripts.exe" "startup" +) ELSE ( + start "" "C:\Program Files\Google\Compute Engine\metadata_scripts\GCEMetadataScripts.exe" "startup" +) \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/googet/windows_agent_build.sh new/guest-agent-20250327.01/packaging/googet/windows_agent_build.sh --- old/guest-agent-20250116.00/packaging/googet/windows_agent_build.sh 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/googet/windows_agent_build.sh 2025-03-27 17:31:22.000000000 +0100 @@ -33,11 +33,27 @@ # This is a placeholder file for guest-agent package, google-compute-engine-windows.goospec # looks for this file during goopack packaging and will fail if not found. 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." > GCEWindowsAgentManager.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." > ggactl_plugin_cleanup.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." > GCEWindowsCompatManager.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." > CorePlugin.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." > GCEMetadataScriptRunner.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." > GCECompatMetadataScripts.exe exit 0 fi BUILD_DIR=$(pwd) pushd $GUEST_AGENT_REPO GOOS=windows VERSION=$version make cmd/google_guest_agent/google_guest_agent -cp cmd/google_guest_agent/google_guest_agent.exe $BUILD_DIR/GCEWindowsAgentManager.exe +GOOS=windows VERSION=$version make cmd/ggactl/ggactl_plugin_cleanup +GOOS=windows VERSION=$version make cmd/google_guest_compat_manager/google_guest_compat_manager +GOOS=windows VERSION=$version make cmd/core_plugin/core_plugin +GOOS=windows VERSION=$version make cmd/gce_metadata_script_runner/gce_metadata_script_runner +GOOS=windows VERSION=$version make cmd/metadata_script_runner_compat/gce_compat_metadata_script_runner + +cp cmd/google_guest_agent/google_guest_agent $BUILD_DIR/GCEWindowsAgentManager.exe +cp cmd/ggactl/ggactl_plugin_cleanup $BUILD_DIR/ggactl_plugin_cleanup.exe +cp cmd/google_guest_compat_manager/google_guest_compat_manager $BUILD_DIR/GCEWindowsCompatManager.exe +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 popd \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20250116.00/packaging/google-guest-agent.spec new/guest-agent-20250327.01/packaging/google-guest-agent.spec --- old/guest-agent-20250116.00/packaging/google-guest-agent.spec 2025-01-16 19:12:23.000000000 +0100 +++ new/guest-agent-20250327.01/packaging/google-guest-agent.spec 2025-03-27 17:31:22.000000000 +0100 @@ -63,6 +63,11 @@ %if 0%{?build_plugin_manager} pushd %{name}-extra-%{version}/ VERSION=%{version} make cmd/google_guest_agent/google_guest_agent + VERSION=%{version} make cmd/ggactl/ggactl_plugin_cleanup + VERSION=%{version} make cmd/google_guest_compat_manager/google_guest_compat_manager + 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 popd %endif @@ -79,7 +84,13 @@ # 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 -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_cleanup %{buildroot}%{_bindir}/ggactl_plugin_cleanup +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/metadata_script_runner_compat/gce_compat_metadata_script_runner %{buildroot}%{_bindir}/gce_compat_metadata_script_runner %endif %if 0%{?el6} @@ -94,6 +105,7 @@ %if 0%{?build_plugin_manager} install -p -m 0644 google-guest-agent-manager.service %{buildroot}%{_unitdir} +install -p -m 0644 google-guest-compat-manager.service %{buildroot}%{_unitdir} %endif install -p -m 0644 google-startup-scripts.service %{buildroot}%{_unitdir} @@ -110,7 +122,12 @@ %{_bindir}/google_guest_agent %if 0%{?build_plugin_manager} +%{_bindir}/gce_metadata_script_runner +%{_bindir}/google_guest_compat_manager +%{_bindir}/gce_compat_metadata_script_runner %{_bindir}/google_guest_agent_manager +%{_bindir}/ggactl_plugin_cleanup +%{_exec_prefix}/lib/google/guest_agent/core_plugin %endif %{_bindir}/google_metadata_script_runner @@ -124,6 +141,7 @@ %if 0%{?build_plugin_manager} %{_unitdir}/google-guest-agent-manager.service +%{_unitdir}/google-guest-compat-manager.service %endif %{_unitdir}/google-startup-scripts.service @@ -151,6 +169,7 @@ systemctl enable gce-workload-cert-refresh.timer >/dev/null 2>&1 || : %if 0%{?build_plugin_manager} + systemctl enable google-guest-compat-manager.service >/dev/null 2>&1 || : systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || : %endif @@ -159,6 +178,7 @@ systemctl start google-guest-agent.service >/dev/null 2>&1 || : systemctl start gce-workload-cert-refresh.timer >/dev/null 2>&1 || : %if 0%{?build_plugin_manager} + systemctl start google-guest-compat-manager.service >/dev/null 2>&1 || : systemctl start google-guest-agent-manager.service >/dev/null 2>&1 || : %endif fi @@ -166,20 +186,35 @@ else # Package upgrade + %if 0%{?build_plugin_manager} + systemctl enable google-guest-compat-manager.service >/dev/null 2>&1 || : + systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || : + %endif + if [ -d /run/systemd/system ]; then systemctl daemon-reload >/dev/null 2>&1 || : systemctl try-restart google-guest-agent.service >/dev/null 2>&1 || : %if 0%{?build_plugin_manager} - systemctl enable google-guest-agent-manager.service >/dev/null 2>&1 || : + systemctl restart google-guest-compat-manager.service >/dev/null 2>&1 || : systemctl restart google-guest-agent-manager.service >/dev/null 2>&1 || : %endif fi + + # Re-enable the guest agent service if core plugin was enabled, since the + # service would have been disabled, and stay disabled post-upgrade. + if [ ! -f "/usr/bin/google_guest_compat_manager" ]; then + if [ -f "/etc/google-guest-agent/core-plugin-enabled" ] && [ ! -z $(grep "true" "/etc/google-guest-agent/core-plugin-enabled") ]; then + systemctl enable google-guest-agent.service > /dev/null 2>&1 || : + systemctl enable gce-workload-cert-refresh.timer > /dev/null 2>&1 || : + fi + fi fi %preun if [ $1 -eq 0 ]; then # Package removal, not upgrade %if 0%{?build_plugin_manager} + systemctl --no-reload disable google-guest-compat-manager.service >/dev/null 2>&1 || : systemctl --no-reload disable google-guest-agent-manager.service >/dev/null 2>&1 || : %endif systemctl --no-reload disable google-guest-agent.service >/dev/null 2>&1 || : @@ -189,7 +224,9 @@ if [ -d /run/systemd/system ]; then systemctl stop google-guest-agent.service >/dev/null 2>&1 || : %if 0%{?build_plugin_manager} + systemctl stop google-guest-compat-manager.service >/dev/null 2>&1 || : systemctl stop google-guest-agent-manager.service >/dev/null 2>&1 || : + ggactl_plugin_cleanup all >/dev/null 2>&1 || : %endif fi fi ++++++ vendor.tar.gz ++++++ ++++ 24360 lines of diff (skipped)