From 44ade83471949c31023043cfc8cf996c41182159 Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 11 Aug 2019 18:43:44 +0200 Subject: [PATCH] Skel configuration for EventReaderService --- config/config_defaults.go | 41 +++++++++++++++++++++++ config/config_json.go | 11 ++++++ config/erscfg.go | 70 +++++++++++++++++++++++++++++++++++++++ config/libconfig_json.go | 40 ++++++++++++++++++---- 4 files changed, 155 insertions(+), 7 deletions(-) create mode 100644 config/erscfg.go diff --git a/config/config_defaults.go b/config/config_defaults.go index d6719a505..6a9c0ebec 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -294,6 +294,47 @@ const CGRATES_CFG_JSON = ` ], +"ers": { // EventReaderService + "enabled": false, // starts the EventReader service: + "sessions_conns": [ // connections to SessionS: <*internal|127.0.0.1:2012> + {"address": "*internal"} + ], + "readers": [ + { + "id": "*default", // identifier of the EventReader profile + "type": "*file_csv", // reader type <*file_csv> + "field_separator": ",", // separator used in case of csv files + "run_delay": 0, // sleep interval in seconds between consecutive runs, 0 to use automation via inotify + "concurrent_requests": 1024, // maximum simultaneous requests/files to process, 0 for unlimited + "source_path": "/var/spool/cgrates/cdrc/in", // read data from this path + "processed_path": "/var/spool/cgrates/cdrc/out", // move processed data here + "Xml_root_path": "", // path towards one event in case of XML CDRs + "Source_id": "ers_csv", // free form field, tag identifying the source of the CDRs within CDRS database + "tenant": "", // tenant used by import + "timezone": "", // timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB> + "filters": [], // limit parsing based on the filters + "flags": [], // flags to influence the event processing + "header_fields": [], // template of the import header fields + "content_fields":[ // import content_fields template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value + {"tag": "TOR", "field_id": "ToR", "type": "*composed", "value": "~2", "mandatory": true}, + {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "~3", "mandatory": true}, + {"tag": "RequestType", "field_id": "RequestType", "type": "*composed", "value": "~4", "mandatory": true}, + {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "~6", "mandatory": true}, + {"tag": "Category", "field_id": "Category", "type": "*composed", "value": "~7", "mandatory": true}, + {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "~8", "mandatory": true}, + {"tag": "Subject", "field_id": "Subject", "type": "*composed", "value": "~9", "mandatory": true}, + {"tag": "Destination", "field_id": "Destination", "type": "*composed", "value": "~10", "mandatory": true}, + {"tag": "SetupTime", "field_id": "SetupTime", "type": "*composed", "value": "~11", "mandatory": true}, + {"tag": "AnswerTime", "field_id": "AnswerTime", "type": "*composed", "value": "~12", "mandatory": true}, + {"tag": "Usage", "field_id": "Usage", "type": "*composed", "value": "~13", "mandatory": true}, + ], + "trailer_fields": [], // template of the import trailer fields + "continue": false, // continue to the next template if executed + }, + ], +}, + + "sessions": { "enabled": false, // starts the session service: "listen_bijson": "127.0.0.1:2014", // address where to listen for bidirectional JSON-RPC requests diff --git a/config/config_json.go b/config/config_json.go index 280dd0dd4..fe0d4cdf2 100644 --- a/config/config_json.go +++ b/config/config_json.go @@ -67,6 +67,7 @@ const ( AnalyzerCfgJson = "analyzers" Apier = "apier" DNSAgentJson = "dns_agent" + ERsJson = "ers" ) // Loads the json config out of io.Reader, eg other sources than file, maybe over http @@ -237,6 +238,16 @@ func (self CgrJsonCfg) CdrcJsonCfg() ([]*CdrcJsonCfg, error) { return cfg, nil } +func (self CgrJsonCfg) ERsJsonCfg() (erSCfg *ERsJsonCfg, err error) { + rawCfg, hasKey := self[ERsJson] + if !hasKey { + return + } + erSCfg = new(ERsJsonCfg) + err = json.Unmarshal(*rawCfg, &erSCfg) + return +} + func (self CgrJsonCfg) SessionSJsonCfg() (*SessionSJsonCfg, error) { rawCfg, hasKey := self[SessionSJson] if !hasKey { diff --git a/config/erscfg.go b/config/erscfg.go new file mode 100644 index 000000000..0e8acf1ce --- /dev/null +++ b/config/erscfg.go @@ -0,0 +1,70 @@ +/* +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 config + +import ( + "time" + + "github.com/cgrates/cgrates/utils" +) + +type ERsCfg struct { + Enabled bool + SessionSConns []*RemoteHost + Readers []*EventReaderCfg +} + +func (erS *ERsJsonCfg) loadFromJsonCfg(jsnCfg *ERsJsonCfg, sep string) (err error) { + if jsnCfg == nil { + return + } + return +} + +// Clone itself into a new ERsCfg +func (erS *ERsCfg) Clone() (cln *ERsCfg) { + return +} + +type EventReaderCfg struct { + ID string + Type string + FieldSep string + RunDelay time.Duration + ConcurrentReqs int + SourcePath string + ProcessedPath string + XmlRootPath string + Tenant RSRParsers + Timezone string + SourceID string + Filters []string + Flags utils.FlagsWithParams + Header_fields []*FCTemplate + Content_fields []*FCTemplate + Trailer_fields []*FCTemplate + Continue bool +} + +func (er *EventReaderCfg) loadFromJsonCfg(jsnCfg *EventReaderJsonCfg, sep string) (err error) { + if jsnCfg == nil { + return + } + return +} diff --git a/config/libconfig_json.go b/config/libconfig_json.go index dadceb3b7..b8c10199d 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -170,6 +170,34 @@ type CdrcJsonCfg struct { Cache_dump_fields *[]*FcTemplateJsonCfg } +// EventReaderSJsonCfg contains the configuration of EventReaderService +type ERsJsonCfg struct { + Enabled *bool + Sessions_conns *[]*RemoteHostJson + Readers *[]*EventReaderJsonCfg +} + +// EventReaderSJsonCfg is the configuration of a single EventReader +type EventReaderJsonCfg struct { + Id *string + Type *string + Field_separator *string + Run_delay *int + Concurrent_requests *int + Source_path *string + Processed_path *string + Xml_root_path *string + Source_id *string + Tenant *string + Timezone *string + Filters *[]string + Flags *[]string + Header_fields *[]*FcTemplateJsonCfg + Content_fields *[]*FcTemplateJsonCfg + Trailer_fields *[]*FcTemplateJsonCfg + Continue *bool +} + // SM-Generic config section type SessionSJsonCfg struct { Enabled *bool @@ -199,13 +227,11 @@ type SessionSJsonCfg struct { // FreeSWITCHAgent config section type FreeswitchAgentJsonCfg struct { - Enabled *bool - Sessions_conns *[]*RemoteHostJson - Subscribe_park *bool - Create_cdr *bool - Extra_fields *[]string - //Min_dur_low_balance *string - //Low_balance_ann_file *string + Enabled *bool + Sessions_conns *[]*RemoteHostJson + Subscribe_park *bool + Create_cdr *bool + Extra_fields *[]string Empty_balance_context *string Empty_balance_ann_file *string Max_wait_connection *string