func createSess(req *radius.Packet) model.Session { return model.Session{ BytesIn: radius.DecodeFour(req.Attr(radius.AcctInputOctets)), BytesOut: radius.DecodeFour(req.Attr(radius.AcctOutputOctets)), PacketsIn: radius.DecodeFour(req.Attr(radius.AcctInputPackets)), PacketsOut: radius.DecodeFour(req.Attr(radius.AcctOutputPackets)), SessionID: string(req.Attr(radius.AcctSessionId)), SessionTime: radius.DecodeFour(req.Attr(radius.AcctSessionTime)), User: string(req.Attr(radius.UserName)), NasIP: radius.DecodeIP(req.Attr(radius.NASIPAddress)).String(), } }
func acctStop(w io.Writer, req *radius.Packet) { if e := radius.ValidateAcctRequest(req); e != "" { config.Log.Printf("acct.stop e=" + e) return } user := string(req.Attr(radius.UserName)) sess := string(req.Attr(radius.AcctSessionId)) nasIp := radius.DecodeIP(req.Attr(radius.NASIPAddress)).String() sessTime := radius.DecodeFour(req.Attr(radius.AcctSessionTime)) octIn := radius.DecodeFour(req.Attr(radius.AcctInputOctets)) octOut := radius.DecodeFour(req.Attr(radius.AcctOutputOctets)) packIn := radius.DecodeFour(req.Attr(radius.AcctInputPackets)) packOut := radius.DecodeFour(req.Attr(radius.AcctOutputPackets)) if config.Verbose { config.Log.Printf( "acct.stop sess=%s for user=%s sessTime=%d octetsIn=%d octetsOut=%d", sess, user, sessTime, octIn, octOut, ) } txn, e := model.Begin() if e != nil { config.Log.Printf("acct.update e=" + e.Error()) return } sessModel := createSess(req) if e := model.SessionUpdate(txn, sessModel); e != nil { config.Log.Printf("acct.update e=" + e.Error()) return } if e := model.SessionLog(txn, sess, user, nasIp); e != nil { config.Log.Printf("acct.update e=" + e.Error()) return } if e := model.SessionRemove(txn, sess, user, nasIp); e != nil { config.Log.Printf("acct.update e=" + e.Error()) return } queue.Queue(user, octIn, octOut, packIn, packOut) if e := txn.Commit(); e != nil { config.Log.Printf("acct.update e=" + e.Error()) return } w.Write(radius.DefaultPacket(req, radius.AccountingResponse, "Finished accounting.")) }
func acctBegin(w io.Writer, req *radius.Packet) { if e := radius.ValidateAcctRequest(req); e != "" { config.Log.Printf("WARN: acct.begin err=" + e) return } if !req.HasAttr(radius.FramedIPAddress) { config.Log.Printf("WARN: acct.begin missing FramedIPAddress") return } user := string(req.Attr(radius.UserName)) sess := string(req.Attr(radius.AcctSessionId)) nasIp := radius.DecodeIP(req.Attr(radius.NASIPAddress)).String() clientIp := string(req.Attr(radius.CallingStationId)) assignedIp := radius.DecodeIP(req.Attr(radius.FramedIPAddress)).String() if config.Verbose { config.Log.Printf("acct.begin sess=%s for user=%s on nasIP=%s", sess, user, nasIp) } reply := []radius.AttrEncoder{} _, e := model.Limits(user) if e != nil { if e == model.ErrNoRows { config.Log.Printf("acct.begin received invalid user="******"acct.begin e=" + e.Error()) return } if e := model.SessionAdd(sess, user, nasIp, assignedIp, clientIp); e != nil { config.Log.Printf("acct.begin e=%s", e.Error()) return } w.Write(req.Response(radius.AccountingResponse, reply)) }