From dd2eb2f97aa4badb7cfed718de00b6ba65aa38e7 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 17 Feb 2014 16:25:22 +0100 Subject: [PATCH] session_manager/event interface with field filter, preparing for multiple sessions --- sessionmanager/event.go | 16 +++++------ sessionmanager/fsevent.go | 44 +++++++++++++++--------------- sessionmanager/fssessionmanager.go | 38 +++++++++++++------------- sessionmanager/session.go | 16 +++++------ 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/sessionmanager/event.go b/sessionmanager/event.go index e31236ca1..336c3d144 100644 --- a/sessionmanager/event.go +++ b/sessionmanager/event.go @@ -25,15 +25,15 @@ import ( type Event interface { New(string) Event GetName() string - GetDirection() string - GetSubject() string - GetAccount() string - GetDestination() string - GetCallDestNr() string - GetTOR() string GetUUID() string - GetTenant() string - GetReqType() string + GetDirection(string) string + GetSubject(string) string + GetAccount(string) string + GetDestination(string) string + GetCallDestNr(string) string + GetTOR(string) string + GetTenant(string) string + GetReqType(string) string GetStartTime(string) (time.Time, error) GetEndTime() (time.Time, error) MissingParameter() bool diff --git a/sessionmanager/fsevent.go b/sessionmanager/fsevent.go index d0ba91a54..a7e635a7c 100644 --- a/sessionmanager/fsevent.go +++ b/sessionmanager/fsevent.go @@ -77,48 +77,48 @@ func (fsev FSEvent) New(body string) Event { func (fsev FSEvent) GetName() string { return fsev[NAME] } -func (fsev FSEvent) GetDirection() string { +func (fsev FSEvent) GetDirection(fieldName string) string { //TODO: implement direction return "*out" //return fsev[DIRECTION] } -func (fsev FSEvent) GetSubject() string { - return utils.FirstNonEmpty(fsev[SUBJECT], fsev[USERNAME]) +func (fsev FSEvent) GetSubject(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[SUBJECT], fsev[USERNAME]) } -func (fsev FSEvent) GetAccount() string { - return utils.FirstNonEmpty(fsev[ACCOUNT], fsev[USERNAME]) +func (fsev FSEvent) GetAccount(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[ACCOUNT], fsev[USERNAME]) } // Charging destination number -func (fsev FSEvent) GetDestination() string { - return utils.FirstNonEmpty(fsev[DESTINATION], fsev[CALL_DEST_NR]) +func (fsev FSEvent) GetDestination(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[DESTINATION], fsev[CALL_DEST_NR]) } // Original dialed destination number, useful in case of unpark -func (fsev FSEvent) GetCallDestNr() string { - return fsev[CALL_DEST_NR] +func (fsev FSEvent) GetCallDestNr(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[CALL_DEST_NR]) } -func (fsev FSEvent) GetTOR() string { - return utils.FirstNonEmpty(fsev[TOR], cfg.DefaultTOR) +func (fsev FSEvent) GetTOR(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[TOR], cfg.DefaultTOR) } func (fsev FSEvent) GetUUID() string { return fsev[UUID] } -func (fsev FSEvent) GetTenant() string { - return utils.FirstNonEmpty(fsev[CSTMID], cfg.DefaultTenant) +func (fsev FSEvent) GetTenant(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[CSTMID], cfg.DefaultTenant) } -func (fsev FSEvent) GetReqType() string { - return utils.FirstNonEmpty(fsev[REQTYPE], cfg.DefaultReqType) +func (fsev FSEvent) GetReqType(fieldName string) string { + return utils.FirstNonEmpty(fsev[fieldName], fsev[REQTYPE], cfg.DefaultReqType) } func (fsev FSEvent) MissingParameter() bool { - return strings.TrimSpace(fsev.GetDirection()) == "" || - strings.TrimSpace(fsev.GetSubject()) == "" || - strings.TrimSpace(fsev.GetAccount()) == "" || - strings.TrimSpace(fsev.GetDestination()) == "" || - strings.TrimSpace(fsev.GetTOR()) == "" || + return strings.TrimSpace(fsev.GetDirection("")) == "" || + strings.TrimSpace(fsev.GetSubject("")) == "" || + strings.TrimSpace(fsev.GetAccount("")) == "" || + strings.TrimSpace(fsev.GetDestination("")) == "" || + strings.TrimSpace(fsev.GetTOR("")) == "" || strings.TrimSpace(fsev.GetUUID()) == "" || - strings.TrimSpace(fsev.GetTenant()) == "" || - strings.TrimSpace(fsev.GetCallDestNr()) == "" + strings.TrimSpace(fsev.GetTenant("")) == "" || + strings.TrimSpace(fsev.GetCallDestNr("")) == "" } func (fsev FSEvent) GetStartTime(field string) (t time.Time, err error) { st, err := strconv.ParseInt(fsev[field], 0, 64) diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index f70651dc3..8db75a152 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -157,21 +157,21 @@ func (sm *FSSessionManager) OnChannelPark(ev Event) { startTime = time.Now() } // if there is no account configured leave the call alone - if !utils.IsSliceMember([]string{utils.PREPAID, utils.PSEUDOPREPAID}, strings.TrimSpace(ev.GetReqType())) { + if !utils.IsSliceMember([]string{utils.PREPAID, utils.PSEUDOPREPAID}, strings.TrimSpace(ev.GetReqType(""))) { return // we unpark only prepaid and pseudoprepaid calls } if ev.MissingParameter() { - sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), MISSING_PARAMETER) + sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(""), MISSING_PARAMETER) engine.Logger.Err(fmt.Sprintf("Missing parameter for %s", ev.GetUUID())) return } cd := engine.CallDescriptor{ - Direction: ev.GetDirection(), - Tenant: ev.GetTenant(), - TOR: ev.GetTOR(), - Subject: ev.GetSubject(), - Account: ev.GetAccount(), - Destination: ev.GetDestination(), + Direction: ev.GetDirection(""), + Tenant: ev.GetTenant(""), + TOR: ev.GetTOR(""), + Subject: ev.GetSubject(""), + Account: ev.GetAccount(""), + Destination: ev.GetDestination(""), TimeStart: startTime, TimeEnd: startTime.Add(cfg.SMMaxCallDuration), } @@ -179,24 +179,24 @@ func (sm *FSSessionManager) OnChannelPark(ev Event) { err = sm.connector.GetMaxSessionTime(cd, &remainingDurationFloat) if err != nil { engine.Logger.Err(fmt.Sprintf("Could not get max session time for %s: %v", ev.GetUUID(), err)) - sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), SYSTEM_ERROR) + sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(""), SYSTEM_ERROR) return } remainingDuration := time.Duration(remainingDurationFloat) //engine.Logger.Info(fmt.Sprintf("Remaining duration: %v", remainingDuration)) if remainingDuration == 0 { //engine.Logger.Info(fmt.Sprintf("Not enough credit for trasferring the call %s for %s.", ev.GetUUID(), cd.GetKey(cd.Subject))) - sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), INSUFFICIENT_FUNDS) + sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(""), INSUFFICIENT_FUNDS) return } sm.setMaxCallDuration(ev.GetUUID(), remainingDuration) - sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(), AUTH_OK) + sm.unparkCall(ev.GetUUID(), ev.GetCallDestNr(""), AUTH_OK) } func (sm *FSSessionManager) OnChannelAnswer(ev Event) { //engine.Logger.Info(" FreeSWITCH answer.") // Make sure cgr_type is enforced even if not set by FreeSWITCH - if _, err := fsock.FS.SendApiCmd(fmt.Sprintf("uuid_setvar %s cgr_reqtype %s\n\n", ev.GetUUID(), ev.GetReqType())); err != nil { + if _, err := fsock.FS.SendApiCmd(fmt.Sprintf("uuid_setvar %s cgr_reqtype %s\n\n", ev.GetUUID(), ev.GetReqType(""))); err != nil { engine.Logger.Err(fmt.Sprintf("Error on attempting to overwrite cgr_type in chan variables: %v", err)) } s := NewSession(ev, sm) @@ -212,7 +212,7 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { return } defer s.Close(ev) // Stop loop and save the costs deducted so far to database - if ev.GetReqType() == utils.POSTPAID { + if ev.GetReqType("") == utils.POSTPAID { startTime, err := ev.GetStartTime(START_TIME) if err != nil { engine.Logger.Crit("Error parsing postpaid call start time from event") @@ -224,14 +224,14 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { return } cd := engine.CallDescriptor{ - Direction: ev.GetDirection(), - Tenant: ev.GetTenant(), - TOR: ev.GetTOR(), - Subject: ev.GetSubject(), - Account: ev.GetAccount(), + Direction: ev.GetDirection(""), + Tenant: ev.GetTenant(""), + TOR: ev.GetTOR(""), + Subject: ev.GetSubject(""), + Account: ev.GetAccount(""), LoopIndex: 0, CallDuration: endTime.Sub(startTime), - Destination: ev.GetDestination(), + Destination: ev.GetDestination(""), TimeStart: startTime, TimeEnd: endTime, } diff --git a/sessionmanager/session.go b/sessionmanager/session.go index 47951e132..b34689569 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -39,7 +39,7 @@ type Session struct { // Creates a new session and starts the debit loop func NewSession(ev Event, sm SessionManager) (s *Session) { // SesionManager only handles prepaid and postpaid calls - if ev.GetReqType() != utils.PREPAID && ev.GetReqType() != utils.POSTPAID { + if ev.GetReqType("") != utils.PREPAID && ev.GetReqType("") != utils.POSTPAID { return } startTime, err := ev.GetStartTime(START_TIME) @@ -49,12 +49,12 @@ func NewSession(ev Event, sm SessionManager) (s *Session) { } cd := &engine.CallDescriptor{ - Direction: ev.GetDirection(), - Tenant: ev.GetTenant(), - TOR: ev.GetTOR(), - Subject: ev.GetSubject(), - Account: ev.GetAccount(), - Destination: ev.GetDestination(), + Direction: ev.GetDirection(""), + Tenant: ev.GetTenant(""), + TOR: ev.GetTOR(""), + Subject: ev.GetSubject(""), + Account: ev.GetAccount(""), + Destination: ev.GetDestination(""), TimeStart: startTime} s = &Session{uuid: ev.GetUUID(), callDescriptor: cd, @@ -63,7 +63,7 @@ func NewSession(ev Event, sm SessionManager) (s *Session) { if ev.MissingParameter() { sm.DisconnectSession(s, MISSING_PARAMETER) } else { - switch ev.GetReqType() { + switch ev.GetReqType("") { case utils.PREPAID: go s.startDebitLoop() case utils.POSTPAID: