Files
monaco/new-backend/utils/utils.go
2025-06-22 11:30:47 +05:30

107 lines
2.5 KiB
Go

package utils
import (
"log"
"os"
"os/exec"
"regexp"
"strings"
)
// DockerAvailable checks if Docker is available on the system
func DockerAvailable() bool {
cmd := exec.Command("docker", "--version")
if err := cmd.Run(); err != nil {
log.Printf("Docker not available: %v", err)
return false
}
return true
}
// PullDockerImage pulls a Docker image if it doesn't exist
func PullDockerImage(image string) error {
// Check if image exists
checkCmd := exec.Command("docker", "image", "inspect", image)
if err := checkCmd.Run(); err == nil {
// Image exists
return nil
}
// Pull the image
log.Printf("Pulling Docker image: %s", image)
pullCmd := exec.Command("docker", "pull", image)
pullCmd.Stdout = os.Stdout
pullCmd.Stderr = os.Stderr
return pullCmd.Run()
}
// ExtractJavaClassName extracts the class name from Java code
func ExtractJavaClassName(code string) string {
// Default class name as fallback
defaultClass := "Solution"
// Look for public class
re := regexp.MustCompile(`public\s+class\s+(\w+)`)
matches := re.FindStringSubmatch(code)
if len(matches) > 1 {
return matches[1]
}
// Look for any class if no public class
re = regexp.MustCompile(`class\s+(\w+)`)
matches = re.FindStringSubmatch(code)
if len(matches) > 1 {
return matches[1]
}
return defaultClass
}
// IsInputPrompt determines if a string is likely an input prompt
func IsInputPrompt(text string) bool {
// Early exit for empty or very long text
text = strings.TrimSpace(text)
if text == "" || len(text) > 100 {
return false
}
// Common prompt endings
if strings.HasSuffix(text, ":") || strings.HasSuffix(text, ">") ||
strings.HasSuffix(text, "?") || strings.HasSuffix(text, "...") {
return true
}
// Common prompt words
promptWords := []string{"input", "enter", "type", "provide"}
for _, word := range promptWords {
if strings.Contains(strings.ToLower(text), word) {
return true
}
}
return false
}
// SanitizeDockerArgs ensures safe Docker command arguments
func SanitizeDockerArgs(args []string) []string {
// This is a simplified version - in production, you'd want more robust checks
sanitized := make([]string, 0, len(args))
// Disallow certain dangerous flags
dangerousFlags := map[string]bool{
"--privileged": true,
"--net=host": true,
"--pid=host": true,
"--ipc=host": true,
"--userns=host": true,
}
for _, arg := range args {
if _, isDangerous := dangerousFlags[arg]; !isDangerous {
sanitized = append(sanitized, arg)
}
}
return sanitized
}