feat: add inbox
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package inbox
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
sshConfigBegin = "# BEGIN agent-notify inbox"
|
||||
sshConfigEnd = "# END agent-notify inbox"
|
||||
)
|
||||
|
||||
func DefaultSSHConfigPath() string {
|
||||
return filepath.Join(os.Getenv("HOME"), ".ssh", "config")
|
||||
}
|
||||
|
||||
func SSHConfigBlock(remoteSocket, localSocket string) string {
|
||||
return strings.Join([]string{
|
||||
sshConfigBegin,
|
||||
"Host *",
|
||||
" RemoteForward " + remoteSocket + " " + localSocket,
|
||||
" ExitOnForwardFailure no",
|
||||
" ServerAliveInterval 30",
|
||||
sshConfigEnd,
|
||||
"",
|
||||
}, "\n")
|
||||
}
|
||||
|
||||
func InstallSSHConfig(path, remoteSocket, localSocket string) (string, error) {
|
||||
if path == "" {
|
||||
path = DefaultSSHConfigPath()
|
||||
}
|
||||
block := SSHConfigBlock(remoteSocket, localSocket)
|
||||
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var current string
|
||||
if data, err := os.ReadFile(path); err == nil {
|
||||
current = string(data)
|
||||
} else if !os.IsNotExist(err) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
next := replaceManagedBlock(current, block)
|
||||
if err := os.WriteFile(path, []byte(next), 0600); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return block, nil
|
||||
}
|
||||
|
||||
func replaceManagedBlock(current, block string) string {
|
||||
start := strings.Index(current, sshConfigBegin)
|
||||
end := strings.Index(current, sshConfigEnd)
|
||||
if start >= 0 && end >= start {
|
||||
end += len(sshConfigEnd)
|
||||
for end < len(current) && (current[end] == '\n' || current[end] == '\r') {
|
||||
end++
|
||||
}
|
||||
prefix := strings.TrimRight(current[:start], "\n")
|
||||
suffix := strings.TrimLeft(current[end:], "\n")
|
||||
var parts []string
|
||||
if prefix != "" {
|
||||
parts = append(parts, prefix)
|
||||
}
|
||||
parts = append(parts, strings.TrimRight(block, "\n"))
|
||||
if suffix != "" {
|
||||
parts = append(parts, suffix)
|
||||
}
|
||||
return strings.Join(parts, "\n\n") + "\n"
|
||||
}
|
||||
if strings.TrimSpace(current) == "" {
|
||||
return block
|
||||
}
|
||||
return strings.TrimRight(current, "\n") + "\n\n" + block
|
||||
}
|
||||
Reference in New Issue
Block a user