Files
1Panel/agent/utils/ctl_conf/ctl_conf.go

89 lines
2.0 KiB
Go

package ctl_conf
import (
"fmt"
"os"
"strings"
)
const defaultFile = "/usr/local/bin/1pctl"
func Load(key string) string {
info, err := LoadFromFile(defaultFile, key)
if err != nil {
panic(err)
}
if len(info) == 0 || info == `""` {
panic(fmt.Sprintf("error `%s` find in %s", key, defaultFile))
}
return info
}
func LoadWithoutPanic(key string) string {
info, err := LoadFromFile(defaultFile, key)
if err != nil {
return ""
}
return info
}
func LoadFromFile(filePath, key string) (string, error) {
data, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
prefix := key + "="
for _, line := range strings.Split(string(data), "\n") {
if strings.HasPrefix(line, prefix) {
return strings.TrimSpace(strings.TrimPrefix(line, prefix)), nil
}
}
return "", fmt.Errorf("error `%s` find in %s", key, filePath)
}
func UpdateInFile(filePath, key, value string) error {
return rewriteFile(filePath, func(line string) (string, bool) {
if strings.HasPrefix(line, key+"=") {
return key + "=" + value, true
}
return line, true
})
}
func RemoveValueFromFile(filePath, key, value string) error {
target := key + "=" + value
return rewriteFile(filePath, func(line string) (string, bool) {
return line, line != target
})
}
func rewriteFile(filePath string, rewrite func(string) (string, bool)) error {
info, err := os.Stat(filePath)
if err != nil {
return err
}
data, err := os.ReadFile(filePath)
if err != nil {
return err
}
content := rewriteLines(string(data), rewrite)
return os.WriteFile(filePath, []byte(content), info.Mode().Perm())
}
func rewriteLines(data string, rewrite func(string) (string, bool)) string {
hasTrailingNewline := strings.HasSuffix(data, "\n")
lines := strings.Split(strings.TrimSuffix(data, "\n"), "\n")
rewritten := make([]string, 0, len(lines))
for _, line := range lines {
newLine, keep := rewrite(line)
if keep {
rewritten = append(rewritten, newLine)
}
}
content := strings.Join(rewritten, "\n")
if hasTrailingNewline {
content += "\n"
}
return content
}