package web import ( "bufio" "bytes" "io" "mime/multipart" "regexp" "strings" ) type CommandStat struct { Command string Count int } func ProcessHistory(file multipart.File) (map[string]int, map[string]int, map[string]int, map[string]int) { commandCounts := make(map[string]int) categories := make(map[string]int) pipeRedirectionCounts := make(map[string]int) commonPatterns := make(map[string]int) re := regexp.MustCompile(`\S+\.(log|txt|conf|json)`) buf := bytes.NewBuffer(nil) if _, err := io.Copy(buf, file); err != nil { return nil, nil, nil, nil } // Reset the file pointer to the beginning (if needed) if seeker, ok := file.(multipart.File); ok { seeker.Seek(0, 0) } scanner := bufio.NewScanner(file) for scanner.Scan() { command := scanner.Text() if command == "" { continue } commandCounts[command]++ if strings.Contains(command, "git") { categories["Git"]++ } else if strings.Contains(command, "docker") { categories["Docker"]++ } else if strings.Contains(command, "ssh") { categories["SSH"]++ } if strings.Contains(command, "|") { pipeRedirectionCounts["pipe"]++ } if strings.Contains(command, ">") || strings.Contains(command, "<") || strings.Contains(command, ">>") { pipeRedirectionCounts["redirection"]++ } matches := re.FindAllString(command, -1) for _, match := range matches { commonPatterns[match]++ } } return commandCounts, categories, pipeRedirectionCounts, commonPatterns } func GenerateStats(commandCounts map[string]int, categories map[string]int, commonPatterns map[string]int) map[string]interface{} { stats := map[string]interface{}{ "topCommands": commandCounts, "categories": categories, "commonPatterns": commonPatterns, } return stats }