From ae47ab39de3b00a79c6ad53699a9cd21d16c14cb Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Tue, 15 May 2012 17:31:26 +0300 Subject: [PATCH] created standalone session manager --- cmd/cgr-sessionmanager/cgr-sessionmanager.go | 40 ++++++++++++++++++++ sessionmanager/sessiondelegate.go | 15 +++++++- sessionmanager/sessionmanager.go | 4 +- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 cmd/cgr-sessionmanager/cgr-sessionmanager.go diff --git a/cmd/cgr-sessionmanager/cgr-sessionmanager.go b/cmd/cgr-sessionmanager/cgr-sessionmanager.go new file mode 100644 index 000000000..7c080192f --- /dev/null +++ b/cmd/cgr-sessionmanager/cgr-sessionmanager.go @@ -0,0 +1,40 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2012 Radu Ioan Fericean + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package main + +import ( + "flag" + "github.com/rif/cgrates/sessionmanager" + "log" +) + +var ( + balancer = flag.String("balancer", "127.0.0.1:2000", "balancer address host:port") + freeswitchsrv = flag.String("freeswitchsrv", "localhost:8021", "freeswitch address host:port") + freeswitchpass = flag.String("freeswitchpass", "ClueCon", "freeswitch address host:port") +) + +func main() { + flag.Parse() + sm := &sessionmanager.SessionManager{} + sm.Connect(new(sessionmanager.DirectSessionDelegate), *freeswitchsrv, *freeswitchpass) + waitChan := make(<-chan byte) + log.Print("Session manager!") + <-waitChan +} diff --git a/sessionmanager/sessiondelegate.go b/sessionmanager/sessiondelegate.go index 6428ca216..53780d3f7 100644 --- a/sessionmanager/sessiondelegate.go +++ b/sessionmanager/sessiondelegate.go @@ -55,7 +55,14 @@ func (dsd *DirectSessionDelegate) OnHeartBeat(ev *Event) { } func (dsd *DirectSessionDelegate) OnChannelAnswer(ev *Event, s *Session) { - log.Print("direct answer") + s.callDescriptor.Amount = DEBIT_PERIOD.Seconds() + remainingSeconds, err := s.callDescriptor.GetMaxSessionTime() + if remainingSeconds == 0 || err != nil { + log.Print("No credit left: Disconnect!") + } + if remainingSeconds < DEBIT_PERIOD.Seconds() || err != nil { + log.Print("Not enough money for a debit period!") + } } func (dsd *DirectSessionDelegate) OnChannelHangupComplete(ev *Event, s *Session) { @@ -69,7 +76,11 @@ func (dsd *DirectSessionDelegate) LoopAction(s *Session, cd *timespans.CallDescr } s.CallCosts = append(s.CallCosts, cc) cd.Amount = DEBIT_PERIOD.Seconds() - if remainingSeconds, err := cd.GetMaxSessionTime(); remainingSeconds < DEBIT_PERIOD.Seconds() || err != nil { + remainingSeconds, err := cd.GetMaxSessionTime() + if remainingSeconds == 0 || err != nil { + log.Print("No credit left: Disconnect!") + } + if remainingSeconds < DEBIT_PERIOD.Seconds() || err != nil { log.Print("Not enough money for another debit period!") } } diff --git a/sessionmanager/sessionmanager.go b/sessionmanager/sessionmanager.go index 371637ae7..49e2ddfaf 100644 --- a/sessionmanager/sessionmanager.go +++ b/sessionmanager/sessionmanager.go @@ -113,7 +113,9 @@ func (sm *SessionManager) OnChannelHangupComplete(ev *Event) { } else { log.Print("HangupComplete") } - s.Close() + if s != nil { + s.Close() + } } // Called on freeswitch's events not processed by the session manger,