ab7317b0c0
7 funciones Go del dominio infra para gestion programatica de ~/.ssh/config: ssh_config_parse (parser de bloques Host/Match), ssh_config_read (lectura del archivo), ssh_config_find (busqueda por host), ssh_config_add_entry y ssh_config_remove_entry (CRUD), ssh_config_render (serializacion a texto), ssh_config_write (escritura atomica). Incluye tipo SshConfigEntry (product type) y tests unitarios del parser.
43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
package infra
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// SSHConfigRender convierte una lista de SSHConfigEntry al formato texto
|
|
// de ~/.ssh/config. Cada bloque se separa con una linea en blanco.
|
|
func SSHConfigRender(entries []SSHConfigEntry) string {
|
|
var sb strings.Builder
|
|
for i, e := range entries {
|
|
if i > 0 {
|
|
sb.WriteString("\n")
|
|
}
|
|
sb.WriteString(fmt.Sprintf("Host %s\n", e.Alias))
|
|
if e.HostName != "" {
|
|
sb.WriteString(fmt.Sprintf(" HostName %s\n", e.HostName))
|
|
}
|
|
if e.User != "" {
|
|
sb.WriteString(fmt.Sprintf(" User %s\n", e.User))
|
|
}
|
|
if e.Port != 0 {
|
|
sb.WriteString(fmt.Sprintf(" Port %d\n", e.Port))
|
|
}
|
|
if e.IdentityFile != "" {
|
|
sb.WriteString(fmt.Sprintf(" IdentityFile %s\n", e.IdentityFile))
|
|
}
|
|
if len(e.Options) > 0 {
|
|
keys := make([]string, 0, len(e.Options))
|
|
for k := range e.Options {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
for _, k := range keys {
|
|
sb.WriteString(fmt.Sprintf(" %s %s\n", k, e.Options[k]))
|
|
}
|
|
}
|
|
}
|
|
return sb.String()
|
|
}
|