| | |
| | |
| | |
| | package util |
| |
|
| | import ( |
| | "fmt" |
| | "io/fs" |
| | "os" |
| | "path/filepath" |
| | "regexp" |
| | "strings" |
| |
|
| | "github.com/router-for-me/CLIProxyAPI/v6/internal/config" |
| | log "github.com/sirupsen/logrus" |
| | ) |
| |
|
| | var functionNameSanitizer = regexp.MustCompile(`[^a-zA-Z0-9_.:-]`) |
| |
|
| | |
| | |
| | |
| | |
| | func SanitizeFunctionName(name string) string { |
| | if name == "" { |
| | return "" |
| | } |
| |
|
| | |
| | sanitized := functionNameSanitizer.ReplaceAllString(name, "_") |
| |
|
| | |
| | |
| | if len(sanitized) > 0 { |
| | first := sanitized[0] |
| | if !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first == '_') { |
| | |
| | |
| |
|
| | |
| | if len(sanitized) >= 64 { |
| | sanitized = sanitized[:63] |
| | } |
| | sanitized = "_" + sanitized |
| | } |
| | } else { |
| | sanitized = "_" |
| | } |
| |
|
| | |
| | if len(sanitized) > 64 { |
| | sanitized = sanitized[:64] |
| | } |
| | return sanitized |
| | } |
| |
|
| | |
| | |
| | func SetLogLevel(cfg *config.Config) { |
| | currentLevel := log.GetLevel() |
| | var newLevel log.Level |
| | if cfg.Debug { |
| | newLevel = log.DebugLevel |
| | } else { |
| | newLevel = log.InfoLevel |
| | } |
| |
|
| | if currentLevel != newLevel { |
| | log.SetLevel(newLevel) |
| | log.Infof("log level changed from %s to %s (debug=%t)", currentLevel, newLevel, cfg.Debug) |
| | } |
| | } |
| |
|
| | |
| | |
| | func ResolveAuthDir(authDir string) (string, error) { |
| | if authDir == "" { |
| | return "", nil |
| | } |
| | if strings.HasPrefix(authDir, "~") { |
| | home, err := os.UserHomeDir() |
| | if err != nil { |
| | return "", fmt.Errorf("resolve auth dir: %w", err) |
| | } |
| | remainder := strings.TrimPrefix(authDir, "~") |
| | remainder = strings.TrimLeft(remainder, "/\\") |
| | if remainder == "" { |
| | return filepath.Clean(home), nil |
| | } |
| | normalized := strings.ReplaceAll(remainder, "\\", "/") |
| | return filepath.Clean(filepath.Join(home, filepath.FromSlash(normalized))), nil |
| | } |
| | return filepath.Clean(authDir), nil |
| | } |
| |
|
| | |
| | |
| | |
| | func CountAuthFiles(authDir string) int { |
| | dir, err := ResolveAuthDir(authDir) |
| | if err != nil { |
| | log.Debugf("countAuthFiles: failed to resolve auth directory: %v", err) |
| | return 0 |
| | } |
| | if dir == "" { |
| | return 0 |
| | } |
| | count := 0 |
| | walkErr := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { |
| | if err != nil { |
| | log.Debugf("countAuthFiles: error accessing %s: %v", path, err) |
| | return nil |
| | } |
| | if d.IsDir() { |
| | return nil |
| | } |
| | if strings.HasSuffix(strings.ToLower(d.Name()), ".json") { |
| | count++ |
| | } |
| | return nil |
| | }) |
| | if walkErr != nil { |
| | log.Debugf("countAuthFiles: walk error: %v", walkErr) |
| | } |
| | return count |
| | } |
| |
|
| | |
| | |
| | func WritablePath() string { |
| | for _, key := range []string{"WRITABLE_PATH", "writable_path"} { |
| | if value, ok := os.LookupEnv(key); ok { |
| | trimmed := strings.TrimSpace(value) |
| | if trimmed != "" { |
| | return filepath.Clean(trimmed) |
| | } |
| | } |
| | } |
| | return "" |
| | } |
| |
|