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 2022-02-09 20:39:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/google-guest-agent (Old) and /work/SRC/openSUSE:Factory/.google-guest-agent.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "google-guest-agent" Wed Feb 9 20:39:29 2022 rev:10 rq:952790 version:20220204.00 Changes: -------- --- /work/SRC/openSUSE:Factory/google-guest-agent/google-guest-agent.changes 2021-12-02 02:13:50.658920685 +0100 +++ /work/SRC/openSUSE:Factory/.google-guest-agent.new.1898/google-guest-agent.changes 2022-02-09 20:40:41.402589810 +0100 @@ -1,0 +2,13 @@ +Tue Feb 8 15:46:09 UTC 2022 - John Paul Adrian Glaubitz <[email protected]> + +- Update to version 20220204.00 (bsc#1195437, bsc#1195438) + * remove han from owners (#154) + * Remove extra slash from metadata URL. (#151) +- from version 20220104.00 + * List IPv6 routes (#150) +- from version 20211228.00 + * add add or remove route integration test, utils (#147) +- from version 20211214.00 + * add malformed ssh key unit test (#142) + +------------------------------------------------------------------- Old: ---- guest-agent-20211116.00.tar.gz New: ---- guest-agent-20220204.00.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ google-guest-agent.spec ++++++ --- /var/tmp/diff_new_pack.0GYj92/_old 2022-02-09 20:40:42.046591351 +0100 +++ /var/tmp/diff_new_pack.0GYj92/_new 2022-02-09 20:40:42.050591361 +0100 @@ -1,7 +1,7 @@ # # spec file for package google-guest-agent # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ %global import_path %{provider_prefix} Name: google-guest-agent -Version: 20211116.00 +Version: 20220204.00 Release: 0 Summary: Google Cloud Guest Agent License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.0GYj92/_old 2022-02-09 20:40:42.086591447 +0100 +++ /var/tmp/diff_new_pack.0GYj92/_new 2022-02-09 20:40:42.090591457 +0100 @@ -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">20211116.00</param> - <param name="revision">20211116.00</param> + <param name="versionformat">20220204.00</param> + <param name="revision">20220204.00</param> <param name="changesgenerate">enable</param> </service> <service name="recompress" mode="disabled"> @@ -15,7 +15,7 @@ <param name="basename">guest-agent</param> </service> <service name="go_modules" mode="disabled"> - <param name="archive">guest-agent-20211116.00.tar.gz</param> + <param name="archive">guest-agent-20220204.00.tar.gz</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.0GYj92/_old 2022-02-09 20:40:42.110591504 +0100 +++ /var/tmp/diff_new_pack.0GYj92/_new 2022-02-09 20:40:42.114591514 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/GoogleCloudPlatform/guest-agent/</param> - <param name="changesrevision">b0c8cbdfb9e74a4ef05e0ac09faf20e83eddbbcc</param></service></servicedata> + <param name="changesrevision">a592540d245747ad8a8a982b93e32056357076dc</param></service></servicedata> (No newline at EOF) ++++++ guest-agent-20211116.00.tar.gz -> guest-agent-20220204.00.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/OWNERS new/guest-agent-20220204.00/OWNERS --- old/guest-agent-20211116.00/OWNERS 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/OWNERS 2022-01-24 21:23:50.000000000 +0100 @@ -5,11 +5,9 @@ - adjackura - hopkiw - zmarano - - gaohannk - bkatyl reviewers: - adjackura - hopkiw - zmarano - - gaohannk - bkatyl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/addresses.go new/guest-agent-20220204.00/google_guest_agent/addresses.go --- old/guest-agent-20211116.00/google_guest_agent/addresses.go 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/addresses.go 2022-01-24 21:23:50.000000000 +0100 @@ -146,6 +146,21 @@ res = append(res, line) } } + + // and again for IPv6 routes, without 'scope host' which is IPv4 only + args = fmt.Sprintf("-6 route list table local type local dev %s proto %s", ifname, protoID) + out = runCmdOutput(exec.Command("ip", strings.Split(args, " ")...)) + if out.ExitCode() != 0 { + return nil, error(out) + } + for _, line := range strings.Split(out.Stdout(), "\n") { + line = strings.TrimPrefix(line, "local ") + line = strings.Split(line, " ")[0] + line = strings.TrimSpace(line) + if line != "" { + res = append(res, line) + } + } return res, nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/addresses_integ_test.go new/guest-agent-20220204.00/google_guest_agent/addresses_integ_test.go --- old/guest-agent-20211116.00/google_guest_agent/addresses_integ_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/addresses_integ_test.go 2022-01-24 21:23:50.000000000 +0100 @@ -0,0 +1,98 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build integration + +package main + +import ( + "context" + "fmt" + "strings" + "testing" +) + +const testIp = "192.168.0.0" + +func TestAddAndRemoveLocalRoute(t *testing.T) { + metdata, err := getMetadata(context.Context(), false) + if err != nil { + t.Fatalf("failed to get metadata, err %v", err) + } + iface, err := getInterfaceByMAC(metdata.Instance.NetworkInterfaces[0].Mac) + if err != nil { + t.Fatalf("failed to get interface from mac, err %v", err) + } + // test add local route + if err := removeLocalRoute(testIp, iface.Name); err != nil { + t.Fatalf("failed to remove local route, err %v", err) + } + if err := addLocalRoute(testIp, iface.Name); err != nil { + t.Fatalf("add test local route should not failed, err %v", err) + } + + res, err := getLocalRoutes(iface.Name) + if err != nil { + t.Fatalf("get local route should not failed, err %v", err) + } + exist := false + for _, route := range res { + if strings.Contains(route, fmt.Sprintf("local %s/24", testIp)) { + exist = true + } + } + if !exist { + t.Fatalf("route %s is not added", testIp) + } + + // test remove local route + if err := removeLocalRoute(testIp, iface.Name); err != nil { + t.Fatalf("add test local route should not failed") + } + res, err := getLocalRoutes(iface.Name) + if err != nil { + t.Fatalf("ip route list should not failed, err %s", res.err) + } + + for _, route := range res { + if strings.Contains(route, fmt.Sprintf("local %s/24", testIp)) { + t.Fatalf("route %s should be removed but exist", testIp) + } + } +} + +func TestGetLocalRoute(t *testing.T) { + metdata, err := getMetadata(context.Context(), false) + if err != nil { + t.Fatalf("failed to get metadata, err %v", err) + } + iface, err := getInterfaceByMAC(metdata.Instance.NetworkInterfaces[0].Mac) + if err != nil { + t.Fatalf("failed to get interface from mac, err %v", err) + } + + if err := addLocalRoute(testIp, iface.Name); err != nil { + t.Fatalf("add test local route should not failed, err %v", err) + } + routes, err := getLocalRoutes(iface.Name) + if err != nil { + t.Fatalf("get local routes should not failed, err %v", err) + } + if len(routes) != 1 { + t.Fatal("find unexpected local route %s.", routes[0]) + } + if routes[0] != testIp { + t.Fatal("find unexpected local route %s.", routes[0]) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/metadata.go new/guest-agent-20220204.00/google_guest_agent/metadata.go --- old/guest-agent-20211116.00/google_guest_agent/metadata.go 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/metadata.go 2022-01-24 21:23:50.000000000 +0100 @@ -31,7 +31,7 @@ const defaultEtag = "NONE" var ( - metadataURL = "http://169.254.169.254/computeMetadata/v1/" + metadataURL = "http://169.254.169.254/computeMetadata/v1" metadataRecursive = "/?recursive=true&alt=json" metadataHang = "&wait_for_change=true&timeout_sec=60" defaultTimeout = 70 * time.Second diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/non_windows_accounts.go new/guest-agent-20220204.00/google_guest_agent/non_windows_accounts.go --- old/guest-agent-20211116.00/google_guest_agent/non_windows_accounts.go 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/non_windows_accounts.go 2022-01-24 21:23:50.000000000 +0100 @@ -73,7 +73,7 @@ // If any on-disk keys have expired. for _, keys := range sshKeys { - if len(keys) != len(removeExpiredKeys(keys)) { + if len(keys) != len(getUserKeys(keys)) { return true } } @@ -118,22 +118,7 @@ mdkeys = append(mdkeys, newMetadata.Project.Attributes.SSHKeys...) } - mdKeyMap := make(map[string][]string) - for _, key := range removeExpiredKeys(mdkeys) { - idx := strings.Index(key, ":") - if idx == -1 { - logger.Debugf("invalid ssh key entry: %q", key) - continue - } - user := key[:idx] - if user == "" { - logger.Debugf("invalid ssh key entry: %q", key) - continue - } - userKeys := mdKeyMap[user] - userKeys = append(userKeys, key[idx+1:]) - mdKeyMap[user] = userKeys - } + mdKeyMap := getUserKeys(mdkeys) logger.Debugf("read google users file") gUsers, err := readGoogleUsersFile() @@ -197,6 +182,55 @@ return nil } +// getUserKeys returns the keys which are not expired and non-expiring key. +// valid formats are: +// user:ssh-rsa [KEY_VALUE] [USERNAME] +// user:ssh-rsa [KEY_VALUE] +// user:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"} +func getUserKeys(mdkeys []string) map[string][]string { + mdKeyMap := make(map[string][]string) + for i := 0; i < len(mdkeys); i++ { + key := strings.Trim(mdkeys[i], " ") + if key == "" { + logger.Debugf("invalid ssh key entry: %q", key) + continue + } + idx := strings.Index(key, ":") + if idx == -1 { + logger.Debugf("invalid ssh key entry: %q", key) + continue + } + user := key[:idx] + if user == "" { + logger.Debugf("invalid ssh key entry: %q", key) + continue + } + fields := strings.SplitN(key, " ", 4) + if len(fields) == 3 && fields[2] == "google-ssh" { + logger.Debugf("invalid ssh key entry: %q", key) + // expiring key without expiration format. + continue + } + if len(fields) > 3 { + lkey := linuxKey{} + if err := json.Unmarshal([]byte(fields[3]), &lkey); err != nil { + // invalid expiration format. + logger.Debugf("invalid ssh key entry: %q", key) + continue + } + if lkey.expired() { + logger.Debugf("expired ssh key entry: %q", key) + continue + } + } + // key which is not expired or non-expiring key, add it. + userKeys := mdKeyMap[user] + userKeys = append(userKeys, key[idx+1:]) + mdKeyMap[user] = userKeys + } + return mdKeyMap +} + // passwdEntry is a user.User with omitted passwd fields restored. type passwdEntry struct { Username string @@ -311,42 +345,6 @@ return t.Before(time.Now()) } -// removeExpiredKeys returns the provided list of keys with expired keys removed. -// valid formats are: -// ssh-rsa [KEY_VALUE] [USERNAME] -// ssh-rsa [KEY_VALUE] -// ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"} -// -// see: https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys#sshkeyformat -func removeExpiredKeys(keys []string) []string { - var res []string - for i := 0; i < len(keys); i++ { - key := strings.Trim(keys[i], " ") - if key == "" { - continue - } - fields := strings.SplitN(key, " ", 4) - if len(fields) < 3 || fields[2] != "google-ssh" { - // non-expiring key, add it. - res = append(res, key) - continue - } - if len(fields) < 4 { - // expiring key without expiration format. - continue - } - lkey := linuxKey{} - if err := json.Unmarshal([]byte(fields[3]), &lkey); err != nil { - // invalid expiration format. - continue - } - if !lkey.expired() { - res = append(res, key) - } - } - return res -} - // Replaces {user} or {group} in command string. Supports legacy python-era // user command overrides. func createUserGroupCmd(cmd, user, group string) *exec.Cmd { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/non_windows_accounts_integ_test.go new/guest-agent-20220204.00/google_guest_agent/non_windows_accounts_integ_test.go --- old/guest-agent-20211116.00/google_guest_agent/non_windows_accounts_integ_test.go 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/non_windows_accounts_integ_test.go 2022-01-24 21:23:50.000000000 +0100 @@ -1,3 +1,17 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // +build integration package main diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/guest-agent-20211116.00/google_guest_agent/windows_accounts_test.go new/guest-agent-20220204.00/google_guest_agent/windows_accounts_test.go --- old/guest-agent-20211116.00/google_guest_agent/windows_accounts_test.go 2021-11-11 20:48:43.000000000 +0100 +++ new/guest-agent-20220204.00/google_guest_agent/windows_accounts_test.go 2022-01-24 21:23:50.000000000 +0100 @@ -216,32 +216,50 @@ } } -func TestRemoveExpiredKeys(t *testing.T) { +func TestGetUserKeys(t *testing.T) { var tests = []struct { - key string - valid bool + key string + expectedValid int }{ - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0000"}`, true}, - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0700"}`, true}, - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0700", "futureField": "UNUSED_FIELDS_IGNORED"}`, true}, - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2018-11-08T19:30:46+0000"}`, false}, - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2018-11-08T19:30:46+0700"}`, false}, - {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"INVALID_TIMESTAMP"}`, false}, - {`user:ssh-rsa [KEY] google-ssh`, false}, - {`user:ssh-rsa [KEY] user`, true}, - {`user:ssh-rsa [KEY]`, true}, - {}, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0000"}`, + 1, + }, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0700"}`, + 1, + }, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2028-11-08T19:30:47+0700", "futureField": "UNUSED_FIELDS_IGNORED"}`, + 1, + }, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2018-11-08T19:30:46+0000"}`, + 0, + }, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"2018-11-08T19:30:46+0700"}`, + 0, + }, + {`user:ssh-rsa [KEY] google-ssh {"userName":"[email protected]", "expireOn":"INVALID_TIMESTAMP"}`, + 0, + }, + {`user:ssh-rsa [KEY] google-ssh`, + 0, + }, + {`user:ssh-rsa [KEY] user`, + 1, + }, + {`user:ssh-rsa [KEY]`, + 1, + }, + {`malformed-ssh-keys [KEY] google-ssh`, + 0, + }, + {`:malformed-ssh-keys [KEY] google-ssh`, + 0, + }, } for _, tt := range tests { - ret := removeExpiredKeys([]string{tt.key}) - if tt.valid { - if len(ret) == 0 || ret[0] != tt.key { - t.Errorf("valid key was removed: %q", tt.key) - } - } - if !tt.valid && len(ret) == 1 { - t.Errorf("invalid key was kept: %q", tt.key) + ret := getUserKeys([]string{tt.key}) + if userKeys, _ := ret["user"]; len(userKeys) != tt.expectedValid { + t.Errorf("expected %d valid keys from getUserKeys, but %d", tt.expectedValid, len(userKeys)) } } } ++++++ vendor.tar.gz ++++++
