// writeSSHKeys writes out a new ~/.ssh/authorised_keys file, retaining any non Juju keys // and adding the specified set of Juju keys. func (kw *keyupdaterWorker) writeSSHKeys(jujuKeys []string) error { allKeys := kw.nonJujuKeys // Ensure any Juju keys have the required prefix in their comment. for i, key := range jujuKeys { jujuKeys[i] = ssh.EnsureJujuComment(key) } allKeys = append(allKeys, jujuKeys...) return ssh.ReplaceKeys(SSHUser, allKeys...) }
// splitAuthKeys splits the given authorized keys // into the form expected to be found in the // user data. func splitAuthKeys(keys string) []interface{} { slines := strings.FieldsFunc(keys, func(r rune) bool { return r == '\n' }) var lines []interface{} for _, line := range slines { lines = append(lines, ssh.EnsureJujuComment(strings.TrimSpace(line))) } return lines }
func annotateKeys(rawKeys string) []string { cfgKeys := []string{} keys := ssh.SplitAuthorisedKeys(rawKeys) for _, key := range keys { // ensure our keys have "Juju:" prepended to differentiate // Juju-managed keys and externally added ones jujuKey := ssh.EnsureJujuComment(key) cfgKeys = append(cfgKeys, jujuKey) } return cfgKeys }
func (s *AuthorisedKeysKeysSuite) TestEnsureJujuComment(c *gc.C) { sshKey := sshtesting.ValidKeyOne.Key for _, test := range []struct { key string expected string }{ {"invalid-key", "invalid-key"}, {sshKey, sshKey + " Juju:sshkey"}, {sshKey + " user@host", sshKey + " Juju:user@host"}, {sshKey + " Juju:user@host", sshKey + " Juju:user@host"}, {sshKey + " " + sshKey[3:5], sshKey + " Juju:" + sshKey[3:5]}, } { actual := ssh.EnsureJujuComment(test.key) c.Assert(actual, gc.Equals, test.expected) } }