diff --git a/apier/v1/dispatcher.go b/apier/v1/dispatcher.go index 48a55d045..e229984c4 100644 --- a/apier/v1/dispatcher.go +++ b/apier/v1/dispatcher.go @@ -26,6 +26,7 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/dispatchers" "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/ers" "github.com/cgrates/cgrates/sessions" "github.com/cgrates/cgrates/utils" "github.com/cgrates/ltcache" @@ -970,7 +971,7 @@ func (dS *DispatcherCoreSv1) Panic(ctx *context.Context, args *utils.PanicMessag return dS.dS.CoreSv1Panic(ctx, args, reply) } -// DispatcherCoreSv1 exports RPC from CoreSv1 +// DispatcherEeSv1 exports RPC from EeSv1. type DispatcherEeSv1 struct { dS *dispatchers.DispatcherService } @@ -987,6 +988,23 @@ func (dS *DispatcherEeSv1) ProcessEvent(ctx *context.Context, args *engine.CGREv return dS.dS.EeSv1ProcessEvent(ctx, args, reply) } +// DispatcherErSv1 exports RPC from ErSv1. +type DispatcherErSv1 struct { + dS *dispatchers.DispatcherService +} + +func NewDispatcherErSv1(dps *dispatchers.DispatcherService) *DispatcherErSv1 { + return &DispatcherErSv1{dS: dps} +} + +func (dS *DispatcherErSv1) Ping(ctx *context.Context, cgrEv *utils.CGREvent, reply *string) error { + return dS.dS.ErSv1Ping(ctx, cgrEv, reply) +} + +func (dS *DispatcherErSv1) ProcessEvent(ctx *context.Context, params ers.V1RunReaderParams, reply *string) error { + return dS.dS.ErSv1RunReader(ctx, params, reply) +} + type DispatcherReplicatorSv1 struct { dS *dispatchers.DispatcherService } diff --git a/dispatchers/ers.go b/dispatchers/ers.go new file mode 100644 index 000000000..07dc602dd --- /dev/null +++ b/dispatchers/ers.go @@ -0,0 +1,79 @@ +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +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 dispatchers + +import ( + "time" + + "github.com/cgrates/birpc/context" + "github.com/cgrates/cgrates/ers" + "github.com/cgrates/cgrates/utils" +) + +func (dS *DispatcherService) ErSv1Ping(ctx *context.Context, cgrEv *utils.CGREvent, reply *string) error { + tnt := dS.cfg.GeneralCfg().DefaultTenant + if cgrEv != nil && len(cgrEv.Tenant) != 0 { + tnt = cgrEv.Tenant + } + ev := make(map[string]any) + if cgrEv != nil { + ev = cgrEv.Event + } + opts := make(map[string]any) + if cgrEv != nil { + opts = cgrEv.APIOpts + } + if len(dS.cfg.DispatcherSCfg().AttributeSConns) != 0 { + if err := dS.authorize(utils.ErSv1Ping, tnt, + utils.IfaceAsString(opts[utils.OptsAPIKey]), utils.TimePointer(time.Now())); err != nil { + return err + } + } + return dS.Dispatch( + &utils.CGREvent{ + Tenant: tnt, + Event: ev, + APIOpts: opts, + }, + utils.MetaERs, + utils.ErSv1Ping, cgrEv, reply, + ) +} + +func (dS *DispatcherService) ErSv1RunReader(ctx *context.Context, params ers.V1RunReaderParams, reply *string) error { + tnt := dS.cfg.GeneralCfg().DefaultTenant + if params.Tenant != "" { + tnt = params.Tenant + } + if len(dS.cfg.DispatcherSCfg().AttributeSConns) != 0 { + if err := dS.authorize(utils.ErSv1RunReader, tnt, + utils.IfaceAsString(params.APIOpts[utils.OptsAPIKey]), utils.TimePointer(time.Now())); err != nil { + return err + } + } + return dS.Dispatch( + &utils.CGREvent{ + Tenant: tnt, + ID: params.ID, + APIOpts: params.APIOpts, + }, + utils.MetaERs, + utils.ErSv1RunReader, params, reply, + ) +} diff --git a/services/dispatchers.go b/services/dispatchers.go index 01a2fcf46..6bb08556a 100644 --- a/services/dispatchers.go +++ b/services/dispatchers.go @@ -201,6 +201,13 @@ func newDispatcherServiceMap(val *dispatchers.DispatcherService) (engine.IntServ } srvMap[srv.Name] = srv + srv, err = birpc.NewService(v1.NewDispatcherErSv1(val), + utils.ErSv1, true) + if err != nil { + return nil, err + } + srvMap[srv.Name] = srv + srv, err = birpc.NewService(v1.NewDispatcherGuardianSv1(val), utils.GuardianSv1, true) if err != nil {