func startSmOpenSIPS(internalRaterChan, internalCDRSChan chan rpcclient.RpcClientConnection, cdrDb engine.CdrStorage, exitChan chan bool) { utils.Logger.Info("Starting CGRateS SMOpenSIPS service.") var ralsConn, cdrsConn *rpcclient.RpcClientPool if len(cfg.SmOsipsConfig.RALsConns) != 0 { ralsConn, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SmOsipsConfig.RALsConns, internalRaterChan, cfg.InternalTtl) if err != nil { utils.Logger.Crit(fmt.Sprintf("<SMOpenSIPS> Could not connect to RALs: %s", err.Error())) exitChan <- true return } } if len(cfg.SmOsipsConfig.CDRsConns) != 0 { cdrsConn, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SmOsipsConfig.CDRsConns, internalCDRSChan, cfg.InternalTtl) if err != nil { utils.Logger.Crit(fmt.Sprintf("<SMOpenSIPS> Could not connect to CDRs: %s", err.Error())) exitChan <- true return } } sm, _ := sessionmanager.NewOSipsSessionManager(cfg.SmOsipsConfig, cfg.Reconnects, ralsConn, cdrsConn, cfg.DefaultTimezone) smRpc.SMs = append(smRpc.SMs, sm) if err := sm.Connect(); err != nil { utils.Logger.Err(fmt.Sprintf("<SM-OpenSIPS> error: %s!", err)) } exitChan <- true }
func startSmOpenSIPS(internalRaterChan chan *engine.Responder, cdrDb engine.CdrStorage, exitChan chan bool) { var raterConn, cdrsConn engine.ConnectorPool var client *rpcclient.RpcClient var err error delay := utils.Fib() for _, raterCfg := range cfg.SmOsipsConfig.HaRater { if raterCfg.Server == utils.INTERNAL { resp := <-internalRaterChan raterConn = append(raterConn, resp) internalRaterChan <- resp } for i := 0; i < cfg.Reconnects; i++ { client, err = rpcclient.NewRpcClient("tcp", raterCfg.Server, cfg.ConnectAttempts, cfg.Reconnects, utils.GOB) if err == nil { //Connected so no need to reiterate break } time.Sleep(delay()) } if err != nil { engine.Logger.Crit(fmt.Sprintf("<SessionManager> Could not connect to rater: %v", err)) exitChan <- true } raterConn = append(raterConn, &engine.RPCClientConnector{Client: client, Timeout: raterCfg.Timeout}) } if reflect.DeepEqual(cfg.SmOsipsConfig.HaCdrs, cfg.SmOsipsConfig.HaRater) { cdrsConn = raterConn } for _, cdrsCfg := range cfg.SmOsipsConfig.HaCdrs { if cdrsCfg.Server == utils.INTERNAL { resp := <-internalRaterChan raterConn = append(raterConn, resp) internalRaterChan <- resp } if len(cfg.SmOsipsConfig.HaCdrs) != 0 { delay := utils.Fib() for i := 0; i < cfg.Reconnects; i++ { client, err = rpcclient.NewRpcClient("tcp", cdrsCfg.Server, cfg.ConnectAttempts, cfg.Reconnects, utils.GOB) if err == nil { //Connected so no need to reiterate break } time.Sleep(delay()) } if err != nil { engine.Logger.Crit(fmt.Sprintf("<SM-OpenSIPS> Could not connect to CDRS via RPC: %v", err)) exitChan <- true return } cdrsConn = append(raterConn, &engine.RPCClientConnector{Client: client, Timeout: cdrsCfg.Timeout}) } } sm, _ := sessionmanager.NewOSipsSessionManager(cfg.SmOsipsConfig, cfg.Reconnects, raterConn, cdrsConn, cfg.DefaultTimezone) sms = append(sms, sm) smRpc.SMs = append(smRpc.SMs, sm) if err := sm.Connect(); err != nil { engine.Logger.Err(fmt.Sprintf("<SM-OpenSIPS> error: %s!", err)) } exitChan <- true }
func startSessionManager(responder *engine.Responder, loggerDb engine.LogStorage, cacheChan chan struct{}) { var raterConn, cdrsConn engine.Connector var client *rpcclient.RpcClient if cfg.SMRater == utils.INTERNAL { <-cacheChan // Wait for the cache to init before start doing queries raterConn = responder } else { var err error for i := 0; i < cfg.SMReconnects; i++ { client, err = rpcclient.NewRpcClient("tcp", cfg.SMRater, 0, cfg.SMReconnects, utils.GOB) if err == nil { //Connected so no need to reiterate break } time.Sleep(time.Duration(i+1) * time.Second) } if err != nil { engine.Logger.Crit(fmt.Sprintf("<SessionManager> Could not connect to engine: %v", err)) exitChan <- true } raterConn = &engine.RPCClientConnector{Client: client} } if cfg.SMCdrS == cfg.SMRater { cdrsConn = raterConn } else if cfg.SMCdrS == utils.INTERNAL { <-cacheChan // Wait for the cache to init before start doing queries cdrsConn = responder } else if len(cfg.SMCdrS) != 0 { for i := 0; i < cfg.SMReconnects; i++ { client, err = rpcclient.NewRpcClient("tcp", cfg.SMCdrS, 0, cfg.SMReconnects, utils.GOB) if err == nil { //Connected so no need to reiterate break } time.Sleep(time.Duration(i+1) * time.Second) } if err != nil { engine.Logger.Crit(fmt.Sprintf("<SM-OpenSIPS> Could not connect to CDRS via RPC: %v", err)) exitChan <- true } cdrsConn = &engine.RPCClientConnector{Client: client} } switch cfg.SMSwitchType { case FS: dp, _ := time.ParseDuration(fmt.Sprintf("%vs", cfg.SMDebitInterval)) sm = sessionmanager.NewFSSessionManager(cfg, loggerDb, raterConn, cdrsConn, dp) case OSIPS: sm, _ = sessionmanager.NewOSipsSessionManager(cfg, raterConn, cdrsConn) default: engine.Logger.Err(fmt.Sprintf("<SessionManager> Unsupported session manger type: %s!", cfg.SMSwitchType)) exitChan <- true } if err = sm.Connect(); err != nil { engine.Logger.Err(fmt.Sprintf("<SessionManager> error: %s!", err)) } exitChan <- true }
func startSmOpenSIPS(internalRaterChan chan *engine.Responder, cdrDb engine.CdrStorage, exitChan chan bool) { utils.Logger.Info("Starting CGRateS SM-OpenSIPS service.") var raterConn, cdrsConn engine.Connector var client *rpcclient.RpcClient var err error // Connect to rater for _, raterCfg := range cfg.SmOsipsConfig.HaRater { if raterCfg.Server == utils.INTERNAL { resp := <-internalRaterChan raterConn = resp // Will overwrite here for the sake of keeping internally the new configuration format for ha connections internalRaterChan <- resp } else { client, err = rpcclient.NewRpcClient("tcp", raterCfg.Server, cfg.ConnectAttempts, cfg.Reconnects, utils.GOB) if err != nil { //Connected so no need to reiterate utils.Logger.Crit(fmt.Sprintf("<SM-FreeSWITCH> Could not connect to rater via RPC: %v", err)) exitChan <- true return } raterConn = &engine.RPCClientConnector{Client: client} } } // Connect to CDRS if reflect.DeepEqual(cfg.SmOsipsConfig.HaCdrs, cfg.SmOsipsConfig.HaRater) { cdrsConn = raterConn } else if len(cfg.SmOsipsConfig.HaCdrs) != 0 { for _, cdrsCfg := range cfg.SmOsipsConfig.HaCdrs { if cdrsCfg.Server == utils.INTERNAL { resp := <-internalRaterChan cdrsConn = resp internalRaterChan <- resp } else { client, err = rpcclient.NewRpcClient("tcp", cdrsCfg.Server, cfg.ConnectAttempts, cfg.Reconnects, utils.GOB) if err != nil { utils.Logger.Crit(fmt.Sprintf("<SM-FreeSWITCH> Could not connect to CDRS via RPC: %v", err)) exitChan <- true return } cdrsConn = &engine.RPCClientConnector{Client: client} } } } sm, _ := sessionmanager.NewOSipsSessionManager(cfg.SmOsipsConfig, cfg.Reconnects, raterConn, cdrsConn, cfg.DefaultTimezone) sms = append(sms, sm) smRpc.SMs = append(smRpc.SMs, sm) if err := sm.Connect(); err != nil { utils.Logger.Err(fmt.Sprintf("<SM-OpenSIPS> error: %s!", err)) } exitChan <- true }