2024-12-05 14:00:58 +01:00
|
|
|
package web
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
2024-12-05 15:58:55 +01:00
|
|
|
"bytes"
|
|
|
|
"io"
|
|
|
|
"mime/multipart"
|
2024-12-05 14:00:58 +01:00
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type CommandStat struct {
|
|
|
|
Command string
|
|
|
|
Count int
|
|
|
|
}
|
|
|
|
|
2024-12-05 15:58:55 +01:00
|
|
|
func ProcessHistory(file multipart.File) (map[string]int, map[string]int, map[string]int, map[string]int) {
|
2024-12-05 14:00:58 +01:00
|
|
|
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)`)
|
|
|
|
|
2024-12-05 15:58:55 +01:00
|
|
|
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)
|
2024-12-05 14:00:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|