339 lines
11 KiB
Go
339 lines
11 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"bufio"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
"strconv"
|
|
"bytes"
|
|
"sort"
|
|
"io/ioutil"
|
|
"flag"
|
|
)
|
|
|
|
|
|
func check(e error) {
|
|
if e != nil {
|
|
panic(e)
|
|
} // if e != nil
|
|
} // func check
|
|
|
|
func readLines ( path string ) ( []string, error ) {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
} // if err != nil
|
|
defer file.Close()
|
|
|
|
var lines []string
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
lines = append(lines, scanner.Text())
|
|
} // for scanner.Scan()
|
|
return lines, scanner.Err()
|
|
} // func readlines
|
|
|
|
type Record struct {
|
|
date string
|
|
pregreet int
|
|
noqueue int
|
|
quarantine int
|
|
ham int
|
|
} // type Record struct
|
|
type DataMap map[string]*Record
|
|
|
|
func load (dataset DataMap, date string, str string, num int) ( DataMap ) {
|
|
if rec, ok := dataset[date]; ok {
|
|
if str == "PREGREET" {
|
|
if rec.pregreet < num {
|
|
rec.pregreet = num
|
|
} // if pregreet < num
|
|
} else if str == "NOQUEUE" {
|
|
if rec.noqueue < num {
|
|
rec.noqueue = num
|
|
} // if noqueue < num
|
|
} else if str == "QUARANTINED" {
|
|
if rec.quarantine < num {
|
|
rec.quarantine = num
|
|
} // if quarantine < num
|
|
} else if str == "HAM" {
|
|
if rec.ham < num {
|
|
rec.ham = num
|
|
} // if ham < num
|
|
} // if str == ...
|
|
dataset[date] = rec
|
|
} else {
|
|
rec := new(Record)
|
|
if str == "PREGREET" {
|
|
rec.pregreet = num
|
|
} else if str == "NOQUEUE" {
|
|
rec.noqueue = num
|
|
} else if str == "QUARANTINE" {
|
|
rec.quarantine = num
|
|
} else if str == "HAM" {
|
|
rec.ham = num
|
|
} // if str == ...
|
|
dataset[date] = rec
|
|
} // if dataset[date]
|
|
return dataset
|
|
} // func load
|
|
|
|
|
|
// Start main thread
|
|
func main() {
|
|
|
|
// Begin Arguments
|
|
sourceFile := flag.String("source", "/var/log/spam.log",
|
|
"The path to the spam log")
|
|
outfile := flag.String("out", "data.js",
|
|
"The path to the file you want to output.")
|
|
hamColor := flag.String("hamcolor","rgba(80,220,80,1)",
|
|
"The color of the ham graph.")
|
|
hamFill := flag.String("hamfill","rgba(80,220,80,0.2)",
|
|
"The fill color of the ham graph.")
|
|
quarantineColor := flag.String("quarantinecolor","rgba(220,80,80,1)",
|
|
"The line color of the quarantine graph.")
|
|
quarantineFill := flag.String("quarantinefill","rgba(220,80,80,0.2)",
|
|
"The fill color of the quarantine graph.")
|
|
noqueueColor := flag.String("noqueuecolor","rgba(220,150,80,1)",
|
|
"The line color of the noqueue graph.")
|
|
noqueueFill := flag.String("noqueuefill","rgba(220,150,80,0.2)",
|
|
"The fill color of the noqueue graph.")
|
|
pregreetColor := flag.String("pregreetcolor","rgba(220,200,80,1)",
|
|
"The line color of the pregreet graph.")
|
|
pregreetFill := flag.String("pregreetfill","rgba(220,200,80,0.2)",
|
|
"The fill color of the pregreet graph.")
|
|
flag.Parse()
|
|
// End Arguments
|
|
|
|
spamInfo, err := readLines(*sourceFile)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
} // if err != nil
|
|
|
|
// Start semi-constants
|
|
aWeekAgo := time.Now().AddDate(0,0,-8)
|
|
aMonthAgo := time.Now().AddDate(0,0,-31)
|
|
dateFormat := "2006-01-02"
|
|
// End semi-constants
|
|
|
|
// Start temporary maps
|
|
weekly := make(map[string]*Record)
|
|
monthly := make(map[string]*Record)
|
|
// End temporary maps
|
|
|
|
for _, line := range spamInfo {
|
|
val := strings.Split(line, " ")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
} // if err != nil
|
|
|
|
date, _ := time.Parse(dateFormat, val[0])
|
|
|
|
if date.After(aWeekAgo) {
|
|
count, err := strconv.Atoi(val[2])
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
} // if err != nil
|
|
weekly = load(weekly, val[0], val[1], count)
|
|
} // if date.After(aWeekAgo)
|
|
|
|
if date.After(aMonthAgo) {
|
|
count, err := strconv.Atoi(val[2])
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
} // if err != nil
|
|
monthly = load(monthly, val[0], val[1], count)
|
|
} // if date.After(aMonthAgo)
|
|
|
|
} //for line in spamInfo
|
|
|
|
var monthlyPregreet int
|
|
var monthlyNoqueue int
|
|
var monthlyQuarantine int
|
|
var monthlyHam int
|
|
|
|
for _, k := range monthly {
|
|
monthlyPregreet += k.pregreet
|
|
monthlyNoqueue += k.noqueue
|
|
monthlyQuarantine += k.quarantine
|
|
monthlyHam += k.ham
|
|
} // for k in monthly
|
|
|
|
monthlySpam := monthlyPregreet + monthlyNoqueue + monthlyQuarantine
|
|
|
|
sinceDate := time.Now().AddDate(10,0,0)
|
|
for k := range monthly {
|
|
date, _ := time.Parse(dateFormat, k)
|
|
if date.Before(sinceDate) {
|
|
sinceDate = date
|
|
} // if date.Before(since)
|
|
} // for k in monthly
|
|
var since string
|
|
since = sinceDate.Format(dateFormat)
|
|
|
|
var labels []string
|
|
for k := range weekly {
|
|
labels = append(labels, k)
|
|
} // for k in weekly
|
|
|
|
sort.Strings(labels)
|
|
|
|
// Make data.js string
|
|
var buffer bytes.Buffer
|
|
|
|
buffer.WriteString("var data = {\n")
|
|
|
|
// Generate graph labels
|
|
buffer.WriteString("\tlabels: [")
|
|
for c, val := range labels {
|
|
buffer.WriteString("\"")
|
|
buffer.WriteString(val)
|
|
if c < (len(labels)-1) {
|
|
buffer.WriteString("\", ")
|
|
} else {
|
|
buffer.WriteString("\"")
|
|
}
|
|
} // for val in labels
|
|
buffer.WriteString("],\n")
|
|
buffer.WriteString("\tdatasets: [\n")
|
|
|
|
// Generate HAM dataset
|
|
buffer.WriteString("\t\t{\n\t\t\tlabel: \"Ham\",\n")
|
|
buffer.WriteString("\t\t\tfillColor: \"")
|
|
buffer.WriteString(*hamFill)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tstrokeColor: \"")
|
|
buffer.WriteString(*hamColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointColor: \"")
|
|
buffer.WriteString(*hamColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointStrokeColor: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightFill: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightSroke: \"")
|
|
buffer.WriteString(*hamColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tdata: [")
|
|
for c, val := range labels {
|
|
buffer.WriteString(strconv.Itoa(weekly[val].ham))
|
|
if c < (len(labels)-1) {
|
|
buffer.WriteString(", ")
|
|
} // if c < len(labels)
|
|
} // for val in labels
|
|
buffer.WriteString("]\n\t\t},\n")
|
|
|
|
// Generate quarantine dataset
|
|
buffer.WriteString("\t\t{\n\t\t\tlabel: \"Quarantine\",\n")
|
|
buffer.WriteString("\t\t\tfillColor: \"")
|
|
buffer.WriteString(*quarantineFill)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tstrokeColor: \"")
|
|
buffer.WriteString(*quarantineColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointColor: \"")
|
|
buffer.WriteString(*quarantineColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointStrokeColor: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightFill: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightSroke: \"")
|
|
buffer.WriteString(*quarantineColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tdata: [")
|
|
for c, val := range labels {
|
|
buffer.WriteString(strconv.Itoa(weekly[val].quarantine))
|
|
if c < (len(labels)-1) {
|
|
buffer.WriteString(", ")
|
|
} // if c < len(labels)
|
|
} // for val in labels
|
|
buffer.WriteString("]\n\t\t},\n")
|
|
|
|
// Generate noqueue dataset
|
|
buffer.WriteString("\t\t{\n\t\t\tlabel: \"No Queue\",\n")
|
|
buffer.WriteString("\t\t\tfillColor: \"")
|
|
buffer.WriteString(*noqueueFill)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tstrokeColor: \"")
|
|
buffer.WriteString(*noqueueColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointColor: \"")
|
|
buffer.WriteString(*noqueueColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointStrokeColor: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightFill: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightSroke: \"")
|
|
buffer.WriteString(*noqueueColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tdata: [")
|
|
for c, val := range labels {
|
|
buffer.WriteString(strconv.Itoa(weekly[val].noqueue))
|
|
if c < (len(labels)-1) {
|
|
buffer.WriteString(", ")
|
|
} // if c < len(labels)
|
|
} // for val in labels
|
|
buffer.WriteString("]\n\t\t},\n")
|
|
|
|
// Generate pregreet dataset
|
|
buffer.WriteString("\t\t{\n\t\t\tlabel: \"Pregreet\",\n")
|
|
buffer.WriteString("\t\t\tfillColor: \"")
|
|
buffer.WriteString(*pregreetFill)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tstrokeColor: \"")
|
|
buffer.WriteString(*pregreetColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointColor: \"")
|
|
buffer.WriteString(*pregreetColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tpointStrokeColor: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightFill: \"#fff\",\n")
|
|
buffer.WriteString("\t\t\tpointHighlightSroke: \"")
|
|
buffer.WriteString(*pregreetColor)
|
|
buffer.WriteString("\",\n")
|
|
buffer.WriteString("\t\t\tdata: [")
|
|
for c, val := range labels {
|
|
buffer.WriteString(strconv.Itoa(weekly[val].pregreet))
|
|
if c < (len(labels)-1) {
|
|
buffer.WriteString(", ")
|
|
} // if c < len(labels)
|
|
} // for val in labels
|
|
buffer.WriteString("]\n\t\t}\n")
|
|
|
|
buffer.WriteString("\t],\n")
|
|
|
|
buffer.WriteString("\tmonthlyPregreet: \"")
|
|
buffer.WriteString(strconv.Itoa(monthlyPregreet))
|
|
buffer.WriteString("\",\n")
|
|
|
|
buffer.WriteString("\tmonthlyNoqueue: \"")
|
|
buffer.WriteString(strconv.Itoa(monthlyNoqueue))
|
|
buffer.WriteString("\",\n")
|
|
|
|
buffer.WriteString("\tmonthlyQuarantine: \"")
|
|
buffer.WriteString(strconv.Itoa(monthlyQuarantine))
|
|
buffer.WriteString("\",\n")
|
|
|
|
buffer.WriteString("\tmonthlySpam: \"")
|
|
buffer.WriteString(strconv.Itoa(monthlySpam))
|
|
buffer.WriteString("\",\n")
|
|
|
|
buffer.WriteString("\tmonthlyHam: \"")
|
|
buffer.WriteString(strconv.Itoa(monthlyHam))
|
|
buffer.WriteString("\",\n")
|
|
|
|
buffer.WriteString("\tsince: \"")
|
|
buffer.WriteString(since)
|
|
buffer.WriteString("\"\n")
|
|
|
|
buffer.WriteString("};\n\n")
|
|
// End make data.js string
|
|
|
|
// Create data file
|
|
ioutil.WriteFile(*outfile, []byte(buffer.String()), 0644)
|
|
// End create data file
|
|
} // End main thread
|