// llmongo.go package main import ( "flag" "fmt" "log" "os" "sync" "time" ) const ( _VERSION = "v2.7.2" ) var ( opts = Options{ RedisTTL: time.Hour * 11688, // 16 mesi LogFile: "log/llmongo.log", } loop []bool done []chan bool consume []chan produced remove []chan consumed wg sync.WaitGroup count *Counter ) func main() { flag.Usage = usage flag.Parse() if opts.Version { fmt.Println(os.Args[0], _VERSION) os.Exit(0) } if opts.Hostname == "" { var err error opts.Hostname, err = os.Hostname() if err != nil { fmt.Println("Hostname error: ", err.Error()) } } setTerm() fs, err := os.OpenFile(opts.LogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) if err != nil { fmt.Println("Log file error: ", err.Error()) os.Exit(-4) } defer fs.Close() log.SetOutput(fs) // DA VERIFICARE pid.Write(true) defer pid.Remove() start := time.Now() fmt.Printf("Start: %+v\n", opts) log.Printf("Start: %+v\n", opts) opts.Month = start.Format("0601") dbs.poolRedis() defer dbs.rdb.Close() dbs.connectMongo() defer dbs.mdb.Close() if opts.Timeout > 0 { time.AfterFunc(opts.Timeout, exit) } count = NewCounter() for i := 0; i < opts.Concurrent; i++ { consume = append(consume, make(chan produced)) remove = append(remove, make(chan consumed)) loop = append(loop, true) done = append(done, make(chan bool)) go producer(i) go consumer(i) go remover(i) } for i := 0; i < opts.Concurrent; i++ { <-done[i] fmt.Printf("Done %d\n", i) close(done[i]) } fmt.Println("Waiting WG") for i := 0; i < opts.Concurrent; i++ { fmt.Printf("ID (%d): %d\n", i, count.GetWG(i)) } wg.Wait() count.SetTime(time.Since(start)) fmt.Printf("Stop %v - user: %d - login: %d - errors: %d - rem: %d - duplicate: %d\n\r", count.GetTime(), count.GetUser(), count.GetLog(), count.GetErr(), count.GetRem(), count.GetDup()) log.Printf("Stop %v - user: %d - login: %d - errors: %d - rem: %d - duplicate: %d\n\r", count.GetTime(), count.GetUser(), count.GetLog(), count.GetErr(), count.GetRem(), count.GetDup()) if opts.Influxdb != "" { writeStats(start) } if opts.Xymon != "" { sendStatus() } }