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.
34 lines
953 B
Go
34 lines
953 B
Go
package infra
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
// SSHConfigWrite escribe la lista de entries al archivo ~/.ssh/config.
|
|
// Crea un backup (.config.bak) antes de sobrescribir si el archivo ya existe.
|
|
// Crea el directorio ~/.ssh si no existe.
|
|
func SSHConfigWrite(entries []SSHConfigEntry) error {
|
|
sshDir := filepath.Join(os.Getenv("HOME"), ".ssh")
|
|
configPath := filepath.Join(sshDir, "config")
|
|
backupPath := filepath.Join(sshDir, "config.bak")
|
|
|
|
if err := os.MkdirAll(sshDir, 0700); err != nil {
|
|
return fmt.Errorf("ssh config write: create dir: %w", err)
|
|
}
|
|
|
|
// Backup si existe
|
|
if data, err := os.ReadFile(configPath); err == nil {
|
|
if err := os.WriteFile(backupPath, data, 0600); err != nil {
|
|
return fmt.Errorf("ssh config write: backup: %w", err)
|
|
}
|
|
}
|
|
|
|
content := SSHConfigRender(entries)
|
|
if err := os.WriteFile(configPath, []byte(content), 0600); err != nil {
|
|
return fmt.Errorf("ssh config write: %w", err)
|
|
}
|
|
return nil
|
|
}
|