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)
}