func()

in google_guest_agent/windows_accounts.go [339:410]


func (a *winAccountsMgr) Set(ctx context.Context) error {
	oldSSHEnable := getWinSSHEnabled(oldMetadata)
	sshEnable := getWinSSHEnabled(newMetadata)

	if sshEnable {
		if sshEnable != oldSSHEnable {
			err := verifyWinSSHVersion(ctx)
			if err != nil {
				logger.Warningf(err.Error())
			}

			if !checkWindowsServiceRunning(ctx, "sshd") {
				logger.Warningf("The 'enable-windows-ssh' metadata key is set to 'true' " +
					"but sshd does not appear to be running.")
			}
		}

		if sshKeys == nil {
			logger.Debugf("initialize sshKeys map")
			sshKeys = make(map[string][]string)
		}
		mdkeys := newMetadata.Instance.Attributes.SSHKeys
		if !newMetadata.Instance.Attributes.BlockProjectKeys {
			mdkeys = append(mdkeys, newMetadata.Project.Attributes.SSHKeys...)
		}

		mdKeyMap := getUserKeys(mdkeys)

		for user := range mdKeyMap {
			if err := createSSHUser(ctx, user); err != nil {
				logger.Errorf("Error creating user: %s", err)
			}
		}
	}

	newKeys := newMetadata.Instance.Attributes.WindowsKeys
	regKeys, err := readRegMultiString(regKeyBase, accountRegKey)
	if err != nil && err != errRegNotExist {
		return err
	}

	toAdd := compareAccounts(newKeys, regKeys)

	for _, key := range toAdd {
		creds, err := createOrResetPwd(ctx, key)
		if err == nil {
			printCreds(creds)
			continue
		}
		logger.Errorf("error setting password: %s", err)
		creds = &credsJSON{
			PasswordFound: false,
			Exponent:      key.Exponent,
			Modulus:       key.Modulus,
			UserName:      key.UserName,
			ErrorMessage:  err.Error(),
		}
		printCreds(creds)
	}

	var jsonKeys []string
	for _, key := range newKeys {
		jsn, err := json.Marshal(key)
		if err != nil {
			// This *should* never happen as each key was just Unmarshalled above.
			logger.Errorf("Failed to marshal windows key to JSON: %s", err)
			continue
		}
		jsonKeys = append(jsonKeys, string(jsn))
	}
	return writeRegMultiString(regKeyBase, accountRegKey, jsonKeys)
}