modificata la struttura dei files

This commit is contained in:
Michele Fadda 2015-07-30 15:55:32 +02:00
parent 7c48a60d3b
commit d80e25711d
3 changed files with 122 additions and 110 deletions

49
dbs.go Normal file
View file

@ -0,0 +1,49 @@
// dbs
package main
import (
"github.com/fzzy/radix/redis"
"gopkg.in/mgo.v2"
"log"
"os"
"time"
)
type Dbs struct {
MongoUri string
RedisUri string
rdb *redis.Client
mdb *mgo.Session
ll *mgo.Collection
}
type MongoLogin struct {
User string `json:"user"`
Protocol string `json:"protocol"`
Ip string `json:"ip"`
Date time.Time `json:"date"`
}
type Index struct {
User string `json:"user"`
Date time.Time `json:"date"`
}
func (db *Dbs) connectRedis() {
var err error
db.rdb, err = redis.Dial("tcp", db.RedisUri)
if err != nil {
log.Println("Redis connect Error: ", err.Error())
os.Exit(-1)
}
}
func (db *Dbs) connectMongo() {
var err error
db.mdb, err = mgo.Dial(db.MongoUri)
if err != nil {
log.Println("Mongodb connect Error: ", err.Error())
os.Exit(-3)
}
db.ll = db.mdb.DB("dovecot").C("lastlogin")
}

View file

@ -4,13 +4,8 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"github.com/fzzy/radix/redis"
"gopkg.in/mgo.v2"
"os"
// "gopkg.in/mgo.v2/bson"
"bytes"
"io/ioutil"
"log" "log"
"os"
"path" "path"
"path/filepath" "path/filepath"
"strconv" "strconv"
@ -23,32 +18,11 @@ type Options struct {
CurrentPath string CurrentPath string
Exe string Exe string
LogFile string LogFile string
PIDFile string
Version bool Version bool
} }
type Dbs struct {
MongoUri string
RedisUri string
rdb *redis.Client
mdb *mgo.Session
ll *mgo.Collection
}
type MongoLogin struct {
User string `json:"user"`
Protocol string `json:"protocol"`
Ip string `json:"ip"`
Date time.Time `json:"date"`
}
type Index struct {
User string `json:"user"`
Date time.Time `json:"date"`
}
const ( const (
_VERSION = "v1.1.1" _VERSION = "v1.1.2"
) )
var ( var (
@ -61,6 +35,8 @@ var (
MongoUri: "mongodb://127.0.0.1:27018", MongoUri: "mongodb://127.0.0.1:27018",
RedisUri: "127.0.0.1:6379", RedisUri: "127.0.0.1:6379",
} }
pid = PID{}
) )
func usage() { func usage() {
@ -76,7 +52,7 @@ func init() {
} }
opts.LogFile = path.Join(opts.CurrentPath, opts.LogFile) opts.LogFile = path.Join(opts.CurrentPath, opts.LogFile)
opts.PIDFile = path.Join(opts.CurrentPath, "run", path.Base(os.Args[0])+".pid") pid.PIDFile = path.Join(opts.CurrentPath, "run", path.Base(os.Args[0])+".pid")
opts.Exe = path.Base(os.Args[0]) opts.Exe = path.Base(os.Args[0])
flag.StringVar(&dbs.MongoUri, "m", dbs.MongoUri, "Mongodb") flag.StringVar(&dbs.MongoUri, "m", dbs.MongoUri, "Mongodb")
@ -86,54 +62,6 @@ func init() {
flag.BoolVar(&opts.Version, "v", false, "Version") flag.BoolVar(&opts.Version, "v", false, "Version")
} }
func (db *Dbs) connectRedis() {
var err error
db.rdb, err = redis.Dial("tcp", db.RedisUri)
if err != nil {
log.Println("Redis connect Error: ", err.Error())
os.Exit(-1)
}
}
func (db *Dbs) connectMongo() {
var err error
db.mdb, err = mgo.Dial(db.MongoUri)
if err != nil {
log.Println("Mongodb connect Error: ", err.Error())
os.Exit(-3)
}
db.ll = db.mdb.DB("dovecot").C("lastlogin")
}
func checkPID(bpid []byte) bool {
pid := strings.TrimRight(string(bpid), "\n")
fmt.Println("PID: ", pid)
bcmd, err := ioutil.ReadFile(path.Join("/proc", pid, "cmdline"))
if err != nil {
fmt.Println("cmdline error: ", err)
return false
}
cmd := bytes.Trim(bcmd, "\x00")
// fmt.Println(string(cmd), opts.Exe)
if strings.Contains(string(cmd), opts.Exe) {
return true
} else {
fmt.Printf("PID %s used by %s\n", pid, cmd)
return true
}
return true
}
func writePID(pfile string) {
fpid, err := os.OpenFile(pfile, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("PID file error: ", err.Error())
os.Exit(-5)
}
fpid.WriteString(strconv.Itoa(os.Getpid()))
fpid.Close()
}
func main() { func main() {
flag.Usage = usage flag.Usage = usage
flag.Parse() flag.Parse()
@ -143,15 +71,8 @@ func main() {
os.Exit(0) os.Exit(0)
} }
if bpid, err := ioutil.ReadFile(opts.PIDFile); err == nil && checkPID(bpid) { pid.Write()
fmt.Println("Running: ", string(bpid)) defer pid.Remove()
os.Exit(-6)
} else {
writePID(opts.PIDFile)
}
defer os.Remove(opts.PIDFile)
// fmt.Println(os.Stat(opts.PIDFile))
fs, err := os.OpenFile(opts.LogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) fs, err := os.OpenFile(opts.LogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
if err != nil { if err != nil {
@ -161,7 +82,6 @@ func main() {
defer fs.Close() defer fs.Close()
log.SetOutput(fs) log.SetOutput(fs)
// log.SetPrefix("[llmongo] ")
start := time.Now() start := time.Now()
fmt.Printf("Start: %+v\n", opts) fmt.Printf("Start: %+v\n", opts)
@ -173,16 +93,6 @@ func main() {
dbs.connectMongo() dbs.connectMongo()
defer dbs.mdb.Close() defer dbs.mdb.Close()
// // Estrae la lista degli utenti che hanno fatto login negli ultimi X min.
// llindex := opts.rdb.Cmd("smembers", "llindex")
// lista, err := llindex.List()
// if err != nil {
// log.Panicln("LLINDEX error: ", err.Error())
// }
// // for _, user := range lista {
// // cicla fino a che esistono righe di login
// var wg sync.WaitGroup
count := 0 count := 0
for { for {
// estrae un userid dalla lista degli utenti che hanno fatto login // estrae un userid dalla lista degli utenti che hanno fatto login
@ -194,8 +104,6 @@ func main() {
log.Printf("LLINDEX empty: %v\n", err) log.Printf("LLINDEX empty: %v\n", err)
break break
} }
count++
// user := spop.String()
var date int64 var date int64
var lastval, val string var lastval, val string
for { for {
@ -244,7 +152,7 @@ func main() {
Date: time.Unix(date, 0), Date: time.Unix(date, 0),
} }
// inserisce il login su Mongodb // inserisce il login su Mongodb
count++
_, err := dbs.ll.Upsert(ind, ml) _, err := dbs.ll.Upsert(ind, ml)
if err != nil { if err != nil {
log.Printf("Insert error: %+v\n", err) log.Printf("Insert error: %+v\n", err)
@ -253,21 +161,11 @@ func main() {
continue continue
} }
} }
// fmt.Println("Info: ", info)
// cancella da Redis la riga di login inserita // cancella da Redis la riga di login inserita
retval := dbs.rdb.Cmd("lrem", user, "-1", val) retval := dbs.rdb.Cmd("lrem", user, "-1", val)
log.Println("LREM retval: ", retval, user, val) log.Println("LREM retval: ", retval, user, val)
lastval = val lastval = val
} }
// controlla se ci sono ancora line di login per l'utente 'user'
/*
llen, _ := opts.rdb.Cmd("llen", user).Int64()
if llen <= 1 {
// elimina l'utente dalla lista di quelli che hanno fatto login se ci sono 1 o meno
retval := opts.rdb.Cmd("srem", "llindex", user)
log.Println("SREM retval: ", retval, user)
}
*/
} }
fmt.Printf("Stop %v - %d\n", time.Since(start), count) fmt.Printf("Stop %v - %d\n", time.Since(start), count)

65
pid.go Normal file
View file

@ -0,0 +1,65 @@
// pid
package main
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"path"
"strconv"
"strings"
)
type PID struct {
PID string
PIDFile string
}
func (p *PID) check() bool {
bpid, err := ioutil.ReadFile(p.PIDFile)
p.PID = strings.TrimRight(string(bpid), "\n")
if err == nil && p.readCmd() {
return true
}
return false
}
func (p *PID) readCmd() bool {
bcmd, err := ioutil.ReadFile(path.Join("/proc", p.PID, "cmdline"))
if err != nil {
fmt.Println("cmdline error: ", err)
return false
}
cmd := bytes.Trim(bcmd, "\x00")
if strings.Contains(string(cmd), opts.Exe) {
return true
} else {
fmt.Printf("PID %s used by %s\n", pid, cmd)
return true
}
return true
}
func (p *PID) Write() {
if p.check() {
fmt.Println("Running: ", p.PID)
os.Exit(-6)
}
fpid, err := os.OpenFile(p.PIDFile, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("PID file error: ", err.Error())
os.Exit(-5)
}
fpid.WriteString(strconv.Itoa(os.Getpid()))
fpid.Close()
}
func (p *PID) Remove() {
err := os.Remove(p.PIDFile)
if err != nil {
}
}