diff --git a/cmd/cgr-console/cgr-console.go b/cmd/cgr-console/cgr-console.go index a7c907b93..bf6cf60a6 100644 --- a/cmd/cgr-console/cgr-console.go +++ b/cmd/cgr-console/cgr-console.go @@ -77,7 +77,7 @@ func executeCommand(command string) { } if cmd.RpcMethod() != "" { res := cmd.RpcResult() - param := cmd.RpcParams(true) + param := cmd.RpcParams(true, false) //log.Print(reflect.TypeOf(param)) switch param.(type) { case *console.StringWrapper: diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 89130f251..88d700249 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -459,12 +459,12 @@ func main() { server.RpcRegister(&v1.CDRStatsV1{CdrStats: cdrStats}) // Public APIs } - if cfg.PubSubEnabled { + if cfg.PubSubServerEnabled { pubSubServer = engine.NewPubSub(accountDb, cfg.HttpSkipTlsVerify) server.RpcRegisterName("PubSubV1", pubSubServer) } - if cfg.HistoryEnabled { + if cfg.HistoryServerEnabled { scribeServer, err = history.NewFileScribe(cfg.HistoryDir, cfg.HistorySaveInterval) if err != nil { engine.Logger.Crit(fmt.Sprintf(" Could not start, error: %s", err.Error())) @@ -474,7 +474,11 @@ func main() { } if cfg.UserServerEnabled { - userServer = engine.NewUserMap(ratingDb) + userServer, err = engine.NewUserMap(ratingDb) + if err != nil { + engine.Logger.Crit(fmt.Sprintf(" Could not start, error: %s", err.Error())) + exitChan <- true + } server.RpcRegisterName("UsersV1", userServer) if len(cfg.UserServerIndexes) != 0 { var s string diff --git a/config/config.go b/config/config.go index 1d7dac91c..186709342 100644 --- a/config/config.go +++ b/config/config.go @@ -208,8 +208,7 @@ type CGRConfig struct { CDRSCdrReplication []*CdrReplicationCfg // Replicate raw CDRs to a number of servers CDRStatsEnabled bool // Enable CDR Stats service CDRStatsSaveInterval time.Duration // Save interval duration - PubSubEnabled bool - HistoryEnabled bool + //CDRStatConfig *CdrStatsConfig // Active cdr stats configuration instances, platform level CdreProfiles map[string]*CdreConfig CdrcProfiles map[string]map[string]*CdrcConfig // Number of CDRC instances running imports, format map[dirPath]map[instanceName]{Configs} SmFsConfig *SmFsConfig // SM-FreeSWITCH configuration diff --git a/console/account_add.go b/console/account_add.go index 5f209f978..660be2ff6 100644 --- a/console/account_add.go +++ b/console/account_add.go @@ -45,8 +45,8 @@ func (self *CmdAddAccount) RpcMethod() string { return self.rpcMethod } -func (self *CmdAddAccount) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdAddAccount) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrSetAccount{Direction: utils.OUT} } if ptr { diff --git a/console/accountactions_set.go b/console/accountactions_set.go index 263408370..75b757c39 100644 --- a/console/accountactions_set.go +++ b/console/accountactions_set.go @@ -45,8 +45,8 @@ func (self *CmdSetAccountActions) RpcMethod() string { return self.rpcMethod } -func (self *CmdSetAccountActions) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdSetAccountActions) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.TPAccountActions{} } if ptr { diff --git a/console/accounts.go b/console/accounts.go index f4c4b8ffc..a4e2f32eb 100644 --- a/console/accounts.go +++ b/console/accounts.go @@ -49,8 +49,8 @@ func (self *CmdGetAccounts) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetAccounts) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetAccounts) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrGetAccounts{Direction: "*out"} } if ptr { diff --git a/console/action_execute.go b/console/action_execute.go index 78e1d3c2e..f2f22da9c 100644 --- a/console/action_execute.go +++ b/console/action_execute.go @@ -48,8 +48,8 @@ func (self *CmdExecuteAction) RpcMethod() string { return self.rpcMethod } -func (self *CmdExecuteAction) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdExecuteAction) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrExecuteAction{Direction: utils.OUT} } if ptr { diff --git a/console/active_sessions.go b/console/active_sessions.go index 53f663670..87d4a941a 100644 --- a/console/active_sessions.go +++ b/console/active_sessions.go @@ -48,8 +48,8 @@ func (self *CmdActiveSessions) RpcMethod() string { return self.rpcMethod } -func (self *CmdActiveSessions) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdActiveSessions) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrGetSMASessions{} } if ptr { diff --git a/console/balance_debit.go b/console/balance_debit.go index 94b783c56..1b1b5d79c 100644 --- a/console/balance_debit.go +++ b/console/balance_debit.go @@ -48,8 +48,8 @@ func (self *CmdDebitBalance) RpcMethod() string { return self.rpcMethod } -func (self *CmdDebitBalance) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdDebitBalance) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.CallDescriptor{Direction: "*out"} } if ptr { diff --git a/console/balance_set.go b/console/balance_set.go index 7925915c1..d012fb05a 100644 --- a/console/balance_set.go +++ b/console/balance_set.go @@ -48,8 +48,8 @@ func (self *CmdAddBalance) RpcMethod() string { return self.rpcMethod } -func (self *CmdAddBalance) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdAddBalance) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &v1.AttrAddBalance{BalanceType: utils.MONETARY, Overwrite: false} } if ptr { diff --git a/console/cache_age.go b/console/cache_age.go index 20943adbb..3e0177e37 100644 --- a/console/cache_age.go +++ b/console/cache_age.go @@ -45,8 +45,8 @@ func (self *CmdGetCacheAge) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetCacheAge) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetCacheAge) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/cache_reload.go b/console/cache_reload.go index e4e35af80..555ffc86a 100644 --- a/console/cache_reload.go +++ b/console/cache_reload.go @@ -46,8 +46,8 @@ func (self *CmdReloadCache) RpcMethod() string { return self.rpcMethod } -func (self *CmdReloadCache) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdReloadCache) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.ApiReloadCache{} } if ptr { diff --git a/console/cache_stats.go b/console/cache_stats.go index 9ed351846..f68d52a59 100644 --- a/console/cache_stats.go +++ b/console/cache_stats.go @@ -45,8 +45,8 @@ func (self *CmdGetCacheStats) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetCacheStats) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetCacheStats) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrCacheStats{} } if ptr { diff --git a/console/callcost.go b/console/callcost.go index 4c2236385..6093dc19a 100644 --- a/console/callcost.go +++ b/console/callcost.go @@ -49,8 +49,8 @@ func (self *CmdGetCostDetails) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetCostDetails) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetCostDetails) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrGetCallCost{RunId: utils.DEFAULT_RUNID} } if ptr { diff --git a/console/cdrs_export.go b/console/cdrs_export.go index fd88b43c4..7defe1451 100644 --- a/console/cdrs_export.go +++ b/console/cdrs_export.go @@ -45,8 +45,8 @@ func (self *CmdExportCdrs) RpcMethod() string { return self.rpcMethod } -func (self *CmdExportCdrs) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdExportCdrs) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrExportCdrsToFile{} } if ptr { diff --git a/console/cdrs_rem.go b/console/cdrs_rem.go index 633158680..5b3c097c4 100644 --- a/console/cdrs_rem.go +++ b/console/cdrs_rem.go @@ -45,8 +45,8 @@ func (self *CmdRemCdrs) RpcMethod() string { return self.rpcMethod } -func (self *CmdRemCdrs) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdRemCdrs) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrRemCdrs{} } if ptr { diff --git a/console/cdrstats_metrics.go b/console/cdrstats_metrics.go index 3e3b6f11d..9ae874cd9 100644 --- a/console/cdrstats_metrics.go +++ b/console/cdrstats_metrics.go @@ -45,8 +45,8 @@ func (self *CmdCdrStatsMetrics) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrStatsMetrics) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrStatsMetrics) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &v1.AttrGetMetrics{} } if ptr { diff --git a/console/cdrstats_queue.go b/console/cdrstats_queue.go index 261315335..b58c4f7a9 100644 --- a/console/cdrstats_queue.go +++ b/console/cdrstats_queue.go @@ -44,8 +44,8 @@ func (self *CmdCdrStatsQueue) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrStatsQueue) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrStatsQueue) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/cdrstats_queue_triggers.go b/console/cdrstats_queue_triggers.go index e9f4cafd5..0218515a0 100644 --- a/console/cdrstats_queue_triggers.go +++ b/console/cdrstats_queue_triggers.go @@ -44,8 +44,8 @@ func (self *CmdCdrStatsQueueTriggers) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrStatsQueueTriggers) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrStatsQueueTriggers) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/cdrstats_queueids.go b/console/cdrstats_queueids.go index 3addb2d2e..288534c54 100644 --- a/console/cdrstats_queueids.go +++ b/console/cdrstats_queueids.go @@ -42,8 +42,8 @@ func (self *CmdCdrStatsQueueIds) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrStatsQueueIds) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrStatsQueueIds) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/cdrstats_reload.go b/console/cdrstats_reload.go index 6c76afdf5..29143a2ce 100644 --- a/console/cdrstats_reload.go +++ b/console/cdrstats_reload.go @@ -47,8 +47,8 @@ func (self *CmdCdrReloadQueues) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrReloadQueues) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrReloadQueues) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrCDRStatsReloadQueues{} } if ptr { diff --git a/console/cdrstats_reset.go b/console/cdrstats_reset.go index 21ab805d5..d2f942ae1 100644 --- a/console/cdrstats_reset.go +++ b/console/cdrstats_reset.go @@ -45,8 +45,8 @@ func (self *CmdCdrResetQueues) RpcMethod() string { return self.rpcMethod } -func (self *CmdCdrResetQueues) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdCdrResetQueues) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrCDRStatsReloadQueues{} } if ptr { diff --git a/console/command.go b/console/command.go index 152b6d75f..d7d192ba2 100644 --- a/console/command.go +++ b/console/command.go @@ -33,7 +33,7 @@ type Commander interface { FromArgs(args string, verbose bool) error // Load data from os arguments or flag.Args() Usage() string // usage message RpcMethod() string // Method which should be called remotely - RpcParams(bool) interface{} // Parameters to send out on rpc + RpcParams(bool, bool) interface{} // Parameters to send out on rpc PostprocessRpcParams() error // Corrects rpc parameters when needed RpcResult() interface{} // Only requirement is to have a String method to print on console ClientArgs() []string // for autocompletion @@ -84,3 +84,7 @@ func GetCommandValue(command string, verbose bool) (Commander, error) { type StringWrapper struct { Item string } + +type StringSliceWrapper struct { + Items []string +} diff --git a/console/command_executer.go b/console/command_executer.go index df9c22ce3..4d7e2595d 100644 --- a/console/command_executer.go +++ b/console/command_executer.go @@ -40,17 +40,18 @@ type CommandExecuter struct { } func (ce *CommandExecuter) Usage() string { - jsn, _ := json.Marshal(ce.command.RpcParams(true)) + jsn, _ := json.Marshal(ce.command.RpcParams(true, true)) return fmt.Sprintf("\n\tUsage: %s %s \n", ce.command.Name(), FromJSON(jsn, ce.command.ClientArgs())) } // Parses command line args and builds CmdBalance value func (ce *CommandExecuter) FromArgs(args string, verbose bool) error { - if err := json.Unmarshal(ToJSON(args), ce.command.RpcParams(true)); err != nil { + params := ce.command.RpcParams(true, true) + if err := json.Unmarshal(ToJSON(args), params); err != nil { return err } if verbose { - jsn, _ := json.Marshal(ce.command.RpcParams(true)) + jsn, _ := json.Marshal(params) fmt.Println(ce.command.Name(), FromJSON(jsn, ce.command.ClientArgs())) } return nil @@ -73,7 +74,7 @@ func (ce *CommandExecuter) clientArgs(iface interface{}) (args []string) { } func (ce *CommandExecuter) ClientArgs() (args []string) { - return ce.clientArgs(ce.command.RpcParams(false)) + return ce.clientArgs(ce.command.RpcParams(false, true)) } // To be overwritten by commands that do not need a rpc call diff --git a/console/cost.go b/console/cost.go index 5bac5ed04..ab60d04bc 100644 --- a/console/cost.go +++ b/console/cost.go @@ -47,8 +47,8 @@ func (self *CmdGetCost) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetCost) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetCost) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.CallDescriptor{Direction: "*out"} } if ptr { diff --git a/console/datacost.go b/console/datacost.go index 884ed5756..6df827e07 100644 --- a/console/datacost.go +++ b/console/datacost.go @@ -51,8 +51,8 @@ func (self *CmdGetDataCost) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetDataCost) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetDataCost) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &v1.AttrGetDataCost{Direction: utils.OUT} } if ptr { diff --git a/console/destination.go b/console/destination.go index 07c03fbc8..9762081ba 100644 --- a/console/destination.go +++ b/console/destination.go @@ -45,8 +45,8 @@ func (self *CmdGetDestination) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetDestination) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetDestination) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/destination_set.go b/console/destination_set.go index 42d8f0cf1..ed00b86b6 100644 --- a/console/destination_set.go +++ b/console/destination_set.go @@ -46,8 +46,8 @@ func (self *CmdSetDestination) RpcMethod() string { return self.rpcMethod } -func (self *CmdSetDestination) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdSetDestination) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrSetDestination{} } if ptr { diff --git a/console/lcr.go b/console/lcr.go index 51ff4fdc1..cbd2daeb4 100644 --- a/console/lcr.go +++ b/console/lcr.go @@ -48,8 +48,8 @@ func (self *CmdGetLcr) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetLcr) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetLcr) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.LcrRequest{} } if ptr { diff --git a/console/load_tp_from_folder.go b/console/load_tp_from_folder.go index 56e2893b9..329e45318 100644 --- a/console/load_tp_from_folder.go +++ b/console/load_tp_from_folder.go @@ -46,8 +46,8 @@ func (self *LoadTpFromFolder) RpcMethod() string { return self.rpcMethod } -func (self *LoadTpFromFolder) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *LoadTpFromFolder) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.AttrLoadTpFromFolder{} } if ptr { diff --git a/console/load_tp_from_stordb.go b/console/load_tp_from_stordb.go index ebb2d0403..0d2af8714 100644 --- a/console/load_tp_from_stordb.go +++ b/console/load_tp_from_stordb.go @@ -46,8 +46,8 @@ func (self *LoadTpFromStorDb) RpcMethod() string { return self.rpcMethod } -func (self *LoadTpFromStorDb) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *LoadTpFromStorDb) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &v1.AttrLoadTpFromStorDb{} } if ptr { diff --git a/console/maxduration.go b/console/maxduration.go index fc94642f1..2e04868de 100644 --- a/console/maxduration.go +++ b/console/maxduration.go @@ -47,8 +47,8 @@ func (self *CmdGetMaxDuration) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetMaxDuration) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetMaxDuration) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.CallDescriptor{Direction: "*out"} } if ptr { diff --git a/console/parse.go b/console/parse.go index dcf2b7cbf..558d024b4 100644 --- a/console/parse.go +++ b/console/parse.go @@ -49,8 +49,8 @@ func (self *CmdParse) RpcMethod() string { return "" } -func (self *CmdParse) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdParse) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &AttrParse{} } if ptr { diff --git a/console/publish.go b/console/publish.go index a407c8023..41797a178 100644 --- a/console/publish.go +++ b/console/publish.go @@ -44,8 +44,8 @@ func (self *CmdPublish) RpcMethod() string { return self.rpcMethod } -func (self *CmdPublish) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdPublish) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.PublishInfo{} } if ptr { diff --git a/console/ratingprofile_set.go b/console/ratingprofile_set.go index d877a0ca1..19c1597b8 100644 --- a/console/ratingprofile_set.go +++ b/console/ratingprofile_set.go @@ -46,8 +46,8 @@ func (self *CmdSetRatingProfile) RpcMethod() string { return self.rpcMethod } -func (self *CmdSetRatingProfile) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdSetRatingProfile) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &utils.TPRatingProfile{} } if ptr { diff --git a/console/scheduler_reload.go b/console/scheduler_reload.go index ef3aafcbe..b9fa8a11e 100644 --- a/console/scheduler_reload.go +++ b/console/scheduler_reload.go @@ -43,8 +43,8 @@ func (self *CmdReloadScheduler) RpcMethod() string { return self.rpcMethod } -func (self *CmdReloadScheduler) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdReloadScheduler) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/sharedgroup.go b/console/sharedgroup.go index 58aef7882..5ed688fc0 100644 --- a/console/sharedgroup.go +++ b/console/sharedgroup.go @@ -45,8 +45,8 @@ func (self *CmdGetSharedGroup) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetSharedGroup) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetSharedGroup) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/status.go b/console/status.go index 5e738c57a..efa15a8ce 100644 --- a/console/status.go +++ b/console/status.go @@ -42,8 +42,8 @@ func (self *CmdStatus) RpcMethod() string { return self.rpcMethod } -func (self *CmdStatus) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdStatus) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/subscribe.go b/console/subscribe.go index ee8c27bd7..25c8f3e42 100644 --- a/console/subscribe.go +++ b/console/subscribe.go @@ -44,8 +44,8 @@ func (self *CmdSubscribe) RpcMethod() string { return self.rpcMethod } -func (self *CmdSubscribe) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdSubscribe) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.SubscribeInfo{} } if ptr { diff --git a/console/show_subscribers.go b/console/subscribers.go similarity index 91% rename from console/show_subscribers.go rename to console/subscribers.go index 6a27adfa7..4a37d0496 100644 --- a/console/show_subscribers.go +++ b/console/subscribers.go @@ -22,7 +22,7 @@ import "github.com/cgrates/cgrates/engine" func init() { c := &CmdShowSubscribers{ - name: "show_subscribers", + name: "subscribers", rpcMethod: "PubSubV1.ShowSubscribers", } commands[c.Name()] = c @@ -44,8 +44,8 @@ func (self *CmdShowSubscribers) RpcMethod() string { return self.rpcMethod } -func (self *CmdShowSubscribers) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdShowSubscribers) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &StringWrapper{} } if ptr { diff --git a/console/triggeredaction_add.go b/console/triggeredaction_add.go index a740862ea..122c40901 100644 --- a/console/triggeredaction_add.go +++ b/console/triggeredaction_add.go @@ -45,8 +45,8 @@ func (self *CmdAddTriggeredAction) RpcMethod() string { return self.rpcMethod } -func (self *CmdAddTriggeredAction) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdAddTriggeredAction) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &v1.AttrAddActionTrigger{BalanceDirection: "*out"} } if ptr { diff --git a/console/unsubscribe.go b/console/unsubscribe.go index 66f02d741..806922388 100644 --- a/console/unsubscribe.go +++ b/console/unsubscribe.go @@ -44,8 +44,8 @@ func (self *CmdUnsubscribe) RpcMethod() string { return self.rpcMethod } -func (self *CmdUnsubscribe) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdUnsubscribe) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.SubscribeInfo{} } if ptr { diff --git a/console/user_addindex.go b/console/user_addindex.go index bc0b0b2b6..d0408340a 100644 --- a/console/user_addindex.go +++ b/console/user_addindex.go @@ -31,7 +31,7 @@ func init() { type CmdUserAddIndex struct { name string rpcMethod string - rpcParams *[]string + rpcParams *StringSliceWrapper *CommandExecuter } @@ -43,9 +43,9 @@ func (self *CmdUserAddIndex) RpcMethod() string { return self.rpcMethod } -func (self *CmdUserAddIndex) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { - self.rpcParams = &[]string{} +func (self *CmdUserAddIndex) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { + self.rpcParams = &StringSliceWrapper{} } if ptr { return self.rpcParams diff --git a/console/user_indexes.go b/console/user_indexes.go new file mode 100644 index 000000000..965196e25 --- /dev/null +++ b/console/user_indexes.go @@ -0,0 +1,63 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2012-2015 ITsysCOM + +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 console + +func init() { + c := &CmdUserShowIndexes{ + name: "user_indexes", + rpcMethod: "UsersV1.GetIndexes", + } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} +} + +// Commander implementation +type CmdUserShowIndexes struct { + name string + rpcMethod string + rpcParams *StringWrapper + *CommandExecuter +} + +func (self *CmdUserShowIndexes) Name() string { + return self.name +} + +func (self *CmdUserShowIndexes) RpcMethod() string { + return self.rpcMethod +} + +func (self *CmdUserShowIndexes) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { + self.rpcParams = &StringWrapper{} + } + if ptr { + return self.rpcParams + } + return *self.rpcParams +} + +func (self *CmdUserShowIndexes) PostprocessRpcParams() error { + return nil +} + +func (self *CmdUserShowIndexes) RpcResult() interface{} { + s := []string{} + return &s +} diff --git a/console/user_remove.go b/console/user_remove.go index ccdac6ad3..8e8658e81 100644 --- a/console/user_remove.go +++ b/console/user_remove.go @@ -45,8 +45,8 @@ func (self *CmdUserRemove) RpcMethod() string { return self.rpcMethod } -func (self *CmdUserRemove) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdUserRemove) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.UserProfile{} } if ptr { diff --git a/console/user_set.go b/console/user_set.go index 618b09a79..e531fe8e3 100644 --- a/console/user_set.go +++ b/console/user_set.go @@ -45,8 +45,8 @@ func (self *CmdSetUser) RpcMethod() string { return self.rpcMethod } -func (self *CmdSetUser) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdSetUser) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.UserProfile{} } if ptr { diff --git a/console/user_update.go b/console/user_update.go index e9867be1d..908b54376 100644 --- a/console/user_update.go +++ b/console/user_update.go @@ -45,8 +45,8 @@ func (self *CmdUpdateUser) RpcMethod() string { return self.rpcMethod } -func (self *CmdUpdateUser) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdUpdateUser) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.UserProfile{} } if ptr { diff --git a/console/users.go b/console/users.go index 2d3b648fb..89492d7f0 100644 --- a/console/users.go +++ b/console/users.go @@ -46,8 +46,8 @@ func (self *CmdGetUsers) RpcMethod() string { return self.rpcMethod } -func (self *CmdGetUsers) RpcParams(ptr bool) interface{} { - if self.rpcParams == nil { +func (self *CmdGetUsers) RpcParams(ptr, reset bool) interface{} { + if reset || self.rpcParams == nil { self.rpcParams = &engine.UserProfile{} } if ptr { diff --git a/data/conf/samples/cgradmin/cgradmin.json b/data/conf/samples/cgradmin/cgradmin.json index 158e85047..93016038d 100644 --- a/data/conf/samples/cgradmin/cgradmin.json +++ b/data/conf/samples/cgradmin/cgradmin.json @@ -12,19 +12,20 @@ "rater": { "enabled": true, // enable Rater service: + "pubsubs": "internal", + "users": "internal", }, "scheduler": { "enabled": true, // start Scheduler service: }, -"pubsub_server": { +"pubsubs": { "enabled": true, // starts pubsub service: . }, - -"pubsub_agent": { - "enabled": true, // starts pubsub as a client: . - "server": "internal", // address where to reach the master pubsub server: +"users": { + "enabled": true, // starts users service: . }, + } diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 1e43eca3b..e2e64cead 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -73,6 +73,7 @@ type RatingStorage interface { GetAccountAliases(string, string, bool) ([]string, error) SetUser(*UserProfile) error GetUser(string) (*UserProfile, error) + GetUsers() ([]*UserProfile, error) RemoveUser(string) error } diff --git a/engine/storage_map.go b/engine/storage_map.go index 339054110..83711694a 100644 --- a/engine/storage_map.go +++ b/engine/storage_map.go @@ -601,6 +601,19 @@ func (ms *MapStorage) GetUser(key string) (up *UserProfile, err error) { } return } + +func (ms *MapStorage) GetUsers() (result []*UserProfile, err error) { + for key, value := range ms.dict { + if strings.HasPrefix(key, utils.USERS_PREFIX) { + up := &UserProfile{} + if err = ms.ms.Unmarshal(value, up); err == nil { + result = append(result, up) + } + } + } + return +} + func (ms *MapStorage) RemoveUser(key string) error { delete(ms.dict, utils.USERS_PREFIX+key) return nil diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 8f9704d9d..3360e09f9 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -716,6 +716,23 @@ func (rs *RedisStorage) GetUser(key string) (up *UserProfile, err error) { return } +func (rs *RedisStorage) GetUsers() (result []*UserProfile, err error) { + keys, err := rs.db.Keys(utils.USERS_PREFIX + "*") + if err != nil { + return nil, err + } + for _, key := range keys { + if values, err := rs.db.Get(key); err == nil { + up := &UserProfile{} + err = rs.ms.Unmarshal(values, up) + result = append(result, up) + } else { + return nil, utils.ErrNotFound + } + } + return +} + func (rs *RedisStorage) SetSubscriber(key string, sub *SubscriberData) (err error) { result, err := rs.ms.Marshal(sub) rs.db.Set(utils.PUBSUB_SUBSCRIBERS_PREFIX+key, result) diff --git a/engine/users.go b/engine/users.go index e15b5965f..3ea20805a 100644 --- a/engine/users.go +++ b/engine/users.go @@ -33,6 +33,7 @@ type UserService interface { UpdateUser(UserProfile, *string) error GetUsers(UserProfile, *[]*UserProfile) error AddIndex([]string, *string) error + GetIndexes(string, *[]string) error } type UserMap struct { @@ -41,7 +42,20 @@ type UserMap struct { ratingDb RatingStorage } -func NewUserMap(ratingDb RatingStorage) *UserMap { +func NewUserMap(ratingDb RatingStorage) (*UserMap, error) { + um := newUserMap(ratingDb) + // load from rating db + if ups, err := um.ratingDb.GetUsers(); err == nil { + for _, up := range ups { + um.table[up.GetId()] = up.Profile + } + } else { + return nil, err + } + return um, nil +} + +func newUserMap(ratingDb RatingStorage) *UserMap { return &UserMap{ table: make(map[string]map[string]string), index: make(map[string][]string), @@ -186,6 +200,15 @@ func (um *UserMap) AddIndex(indexes []string, reply *string) error { return nil } +func (um *UserMap) GetIndexes(in string, reply *[]string) error { + var indexes []string + for key := range um.index { + indexes = append(indexes, key) + } + *reply = indexes + return nil +} + type UserProxy struct{} type ProxyUserService struct { @@ -219,3 +242,7 @@ func (ps *ProxyUserService) GetUsers(ud UserProfile, users *[]*UserProfile) erro func (ps *ProxyUserService) AddIndex(indexes []string, reply *string) error { return ps.Client.Call("UsersV1.AddIndex", indexes, reply) } + +func (ps *ProxyUserService) GetIndexes(in string, reply *[]string) error { + return ps.Client.Call("UsersV1.AddIndex", in, reply) +} diff --git a/engine/users_test.go b/engine/users_test.go index 27bc59f4a..1820c6636 100644 --- a/engine/users_test.go +++ b/engine/users_test.go @@ -17,7 +17,7 @@ var testMap = UserMap{ } func TestUsersAdd(t *testing.T) { - tm := NewUserMap(ratingStorage) + tm := newUserMap(ratingStorage) var r string up := UserProfile{ Tenant: "test", @@ -33,12 +33,12 @@ func TestUsersAdd(t *testing.T) { p["t"] != "v" || len(tm.table) != 1 || len(p) != 1 { - t.Error("Error setting user: ", tm) + t.Error("Error setting user: ", tm, len(tm.table)) } } func TestUsersUpdate(t *testing.T) { - tm := NewUserMap(ratingStorage) + tm := newUserMap(ratingStorage) var r string up := UserProfile{ Tenant: "test", @@ -69,7 +69,7 @@ func TestUsersUpdate(t *testing.T) { } func TestUsersUpdateNotFound(t *testing.T) { - tm := NewUserMap(ratingStorage) + tm := newUserMap(ratingStorage) var r string up := UserProfile{ Tenant: "test", @@ -80,14 +80,14 @@ func TestUsersUpdateNotFound(t *testing.T) { } tm.SetUser(up, &r) up.UserName = "test1" - err := tm.UpdateUser(up, &r) + err = tm.UpdateUser(up, &r) if err != utils.ErrNotFound { t.Error("Error detecting user not found on update: ", err) } } func TestUsersUpdateInit(t *testing.T) { - tm := NewUserMap(ratingStorage) + tm := newUserMap(ratingStorage) var r string up := UserProfile{ Tenant: "test", @@ -113,7 +113,7 @@ func TestUsersUpdateInit(t *testing.T) { } func TestUsersRemove(t *testing.T) { - tm := NewUserMap(ratingStorage) + tm := newUserMap(ratingStorage) var r string up := UserProfile{ Tenant: "test",