From 32efd573da2d46d1ba7ff04ca7dc35140146d69e Mon Sep 17 00:00:00 2001 From: DanB Date: Thu, 7 Mar 2019 20:41:17 +0100 Subject: [PATCH] Default configuration updated, smaller internal_ttl, no default tenant for cdrc, cdre and loaders, dispatchers sample config removed --- config/cdrscfg.go | 4 +- config/cdrscfg_test.go | 2 +- config/config_defaults.go | 212 ++++++++++++++-------------- config/config_json_test.go | 39 ++---- config/config_test.go | 21 +-- config/configcdrc_test.go | 4 - config/libconfig_json.go | 20 +-- data/conf/cgrates/cgrates.json | 245 ++++++++++++++++++--------------- 8 files changed, 265 insertions(+), 282 deletions(-) diff --git a/config/cdrscfg.go b/config/cdrscfg.go index 405addf91..2960cea35 100644 --- a/config/cdrscfg.go +++ b/config/cdrscfg.go @@ -51,8 +51,8 @@ func (cdrscfg *CdrsCfg) loadFromJsonCfg(jsnCdrsCfg *CdrsJsonCfg) (err error) { if jsnCdrsCfg.Store_cdrs != nil { cdrscfg.CDRSStoreCdrs = *jsnCdrsCfg.Store_cdrs } - if jsnCdrsCfg.Sessions_cost_retries != nil { - cdrscfg.CDRSSMCostRetries = *jsnCdrsCfg.Sessions_cost_retries + if jsnCdrsCfg.Session_cost_retries != nil { + cdrscfg.CDRSSMCostRetries = *jsnCdrsCfg.Session_cost_retries } if jsnCdrsCfg.Chargers_conns != nil { cdrscfg.CDRSChargerSConns = make([]*HaPoolConfig, len(*jsnCdrsCfg.Chargers_conns)) diff --git a/config/cdrscfg_test.go b/config/cdrscfg_test.go index fe2fd296d..44094a2e2 100644 --- a/config/cdrscfg_test.go +++ b/config/cdrscfg_test.go @@ -42,7 +42,7 @@ func TestCdrsCfgloadFromJsonCfg(t *testing.T) { "enabled": false, // start the CDR Server service: "extra_fields": [], // extra fields to store in CDRs for non-generic CDRs "store_cdrs": true, // store cdrs in storDb - "sessions_cost_retries": 5, // number of queries to sessions_costs before recalculating CDR + "session_cost_retries": 5, // number of queries to sessions_costs before recalculating CDR "chargers_conns": [], // address where to reach the charger service, empty to disable charger functionality: <""|*internal|x.y.z.y:1234> "rals_conns": [ {"address": "*internal"} // address where to reach the Rater for cost calculation, empty to disable functionality: <""|*internal|x.y.z.y:1234> diff --git a/config/config_defaults.go b/config/config_defaults.go index c39ed36eb..a1eac4f72 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -31,11 +31,11 @@ const CGRATES_CFG_JSON = ` "node_id": "", // identifier of this instance in the cluster, if empty it will be autogenerated "logger":"*syslog", // controls the destination of logs <*syslog|*stdout> "log_level": 6, // control the level of messages logged (0-emerg to 7-debug) - "http_skip_tls_verify": false, // if enabled Http Client will accept any TLS certificate + "http_skip_tls_verify": false, // if enabled HttpClient will accept any TLS certificate "rounding_decimals": 5, // system level precision for floats "dbdata_encoding": "*msgpack", // encoding used to store object data in strings: <*msgpack|*json> - "tpexport_dir": "/var/spool/cgrates/tpe", // path towards export folder for offline Tariff Plans - "poster_attempts": 3, // number of attempts before considering post request failed (eg: *call_url, CDR replication) + "tpexport_dir": "/var/spool/cgrates/tpe", // path towards export folder for offline TariffPlans + "poster_attempts": 3, // number of attempts before considering post request failed (eg: *call_url, CDR exports) "failed_posts_dir": "/var/spool/cgrates/failed_posts", // directory path where we store failed requests "default_request_type": "*rated", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated> "default_category": "call", // default category to consider when missing from requests @@ -45,32 +45,32 @@ const CGRATES_CFG_JSON = ` "reconnects": -1, // number of retries in case of connection lost "connect_timeout": "1s", // consider connection unsuccessful on timeout, 0 to disable the feature "reply_timeout": "2s", // consider connection down for replies taking longer than this value - "internal_ttl": "2m", // maximum duration to wait for internal connections before giving up + "internal_ttl": "5s", // maximum duration to wait for internal connections before giving up "locking_timeout": "0", // timeout internal locks to avoid deadlocks - "digest_separator": ",", - "digest_equal": ":", - "rsr_separator": ";", + "digest_separator": ",", // separator to use in replies containing data digests + "digest_equal": ":", // equal symbol used in case of digests + "rsr_separator": ";", // separator used within RSR fields }, -"data_db": { // database used to store runtime data (eg: accounts, cdr stats) - "db_type": "redis", // data_db type: <*redis|*mongo|*internal> +"data_db": { // database used to store runtime data (eg: accounts) + "db_type": "*redis", // data_db type: <*redis|*mongo> "db_host": "127.0.0.1", // data_db host address "db_port": 6379, // data_db port to reach the database "db_name": "10", // data_db database name to connect to "db_user": "cgrates", // username to use when connecting to data_db "db_password": "", // password to use when connecting to data_db - "redis_sentinel":"", // redis_sentinel is the name of sentinel + "redis_sentinel":"", // the name of sentinel when used }, "stor_db": { // database used to store offline tariff plans and CDRs - "db_type": "mysql", // stor database type to use: <*mongo|*mysql|*postgres|*internal> + "db_type": "*mysql", // stor database type to use: <*mongo|*mysql|*postgres|*internal> "db_host": "127.0.0.1", // the host to connect to - "db_port": 3306, // the port to reach the stordb + "db_port": 3306, // the port to reach the stor_db "db_name": "cgrates", // stor database name - "db_user": "cgrates", // username to use when connecting to stordb - "db_password": "", // password to use when connecting to stordb + "db_user": "cgrates", // username to use when connecting to stor_db + "db_password": "", // password to use when connecting to stor_db "max_open_conns": 100, // maximum database connections opened, not applying for mongo "max_idle_conns": 10, // maximum database connections idle, not applying for mongo "conn_max_lifetime": 0, // maximum amount of time in seconds a connection may be reused (0 for unlimited), not applying for mongo @@ -93,8 +93,8 @@ const CGRATES_CFG_JSON = ` "server_key":"", // path to server key "client_certificate" : "", // path to client certificate "client_key":"", // path to client key - "ca_certificate":"", // path to CA certificate (populate if used self-sign certificate otherwise let it empty) - "server_policy":4, // server_policy determine the TLS Client Authentication (0-NoClientCert, 1-RequestClientCert, 2-RequireAnyClientCert, 3-VerifyClientCertIfGiven, 4-RequireAndVerifyClientCert) + "ca_certificate":"", // path to CA certificate (populate for self-signed certificate otherwise let it empty) + "server_policy":4, // server_policy determines the TLS Client Authentication (0-NoClientCert, 1-RequestClientCert, 2-RequireAnyClientCert, 3-VerifyClientCertIfGiven, 4-RequireAndVerifyClientCert) "server_name":"", }, @@ -111,7 +111,7 @@ const CGRATES_CFG_JSON = ` "scheduler": { "enabled": false, // start Scheduler service: - "cdrs_conns": [], // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234> + "cdrs_conns": [], // connections to CDRs for *cdrlog actions <*internal|x.y.z.y:1234> }, @@ -152,18 +152,18 @@ const CGRATES_CFG_JSON = ` "filters": { // Filters configuration (*new) - "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> - "resources_conns": [], // address where to reach the resource service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "stats_conns": [], // connections to StatS for <*stats> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "resources_conns": [], // connections to ResourceS for <*resources> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> "indexed_selects":true, // enable profile matching exclusively on indexes }, "rals": { - "enabled": false, // enable Rater service: - "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> - "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "enabled": false, // enable Rating/Accounting service: + "thresholds_conns": [], // connections to ThresholdS for account/balance updates, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> + "stats_conns": [], // connections to StatS for account/balance updates, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> "rp_subject_prefix_matching": false, // enables prefix matching for the rating profile subject - "remove_expired":true, // enables remove of expired balances + "remove_expired":true, // enables automatic removal of expired balances "max_computed_usage": { // do not compute usage higher than this, prevents memory overload "*any": "189h", "*voice": "72h", @@ -173,32 +173,32 @@ const CGRATES_CFG_JSON = ` }, -"cdrs": { - "enabled": false, // start the CDR Server service: - "extra_fields": [], // extra fields to store in CDRs for non-generic CDRs - "store_cdrs": true, // store cdrs in storDb - "sessions_cost_retries": 5, // number of queries to sessions_costs before recalculating CDR - "chargers_conns": [ - {"address": "*internal"} // address where to reach the charger service, empty to disable charger functionality: <""|*internal|x.y.z.y:1234> +"cdrs": { // CDRs config + "enabled": false, // start the CDR Server: + "extra_fields": [], // extra fields to store in CDRs for non-generic CDRs (ie: FreeSWITCH JSON) + "store_cdrs": true, // store cdrs in StorDB + "session_cost_retries": 5, // number of queries to session_costs before recalculating CDR + "chargers_conns": [ // connection to ChargerS for CDR forking, empty to disable billing for CDRs: <""|*internal|x.y.z.y:1234> + {"address": "*internal"} ], - "rals_conns": [ - {"address": "*internal"} // address where to reach the Rater for cost calculation, empty to disable functionality: <""|*internal|x.y.z.y:1234> + "rals_conns": [ // connections to RALs for cost calculation: <""|*internal|x.y.z.y:1234> + {"address": "*internal"} ], - "attributes_conns": [], // address where to reach the attribute service, empty to disable attributes functionality: <""|*internal|x.y.z.y:1234> - "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> - "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "attributes_conns": [], // connection to AttributeS for altering *raw CDRs, empty to disable attributes functionality: <""|*internal|x.y.z.y:1234> + "thresholds_conns": [], // connection to ThresholdS for CDR reporting, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> + "stats_conns": [], // connections to StatS for CDR reporting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> "online_cdr_exports":[], // list of CDRE profiles to use for real-time CDR exports }, -"cdre": { +"cdre": { // CDRe config "*default": { - "export_format": "*file_csv", // exported CDRs format <*file_csv|*file_fwv|*http_post|*http_json_cdr|*http_json_map|*amqp_json_cdr|*amqp_json_map> + "export_format": "*file_csv", // exported CDRs format <*file_csv|*file_fwv|*http_post|*http_json_cdr|*http_json_map|*amqp_json_cdr|*amqp_json_map|*sqs_json_map> "export_path": "/var/spool/cgrates/cdre", // path where the exported CDRs will be placed - "filters" :[], // new filters for cdre - "tenant": "cgrates.org", // tenant used in filterS.Pass + "filters" :[], // filters for this export + "tenant": "", // tenant used in filterS.Pass "synchronous": false, // block processing until export has a result - "attempts": 1, // Number of attempts if not success + "attempts": 1, // export attempts "field_separator": ",", // used field separator in some export formats, eg: *file_csv "usage_multiply_factor": { "*any": 1 // multiply usage based on ToR field or *any for all @@ -226,13 +226,13 @@ const CGRATES_CFG_JSON = ` }, -"cdrc": [ +"cdrc": [ // CDRc config { "id": "*default", // identifier of the CDRC runner "enabled": false, // enable CDR client functionality "dry_run": false, // do not send the CDRs to CDRS, just parse them - "cdrs_conns": [ - {"address": "*internal"} // address where to reach CDR server. <*internal|x.y.z.y:1234> + "cdrs_conns": [ // connections to CDRs. <*internal|x.y.z.y:1234> + {"address": "*internal"} ], "cdr_format": "*csv", // CDR file format <*csv|*freeswitch_csv|*fwv|*opensips_flatstore|*partial_csv> "field_separator": ",", // separator used in case of csv files @@ -245,8 +245,8 @@ const CGRATES_CFG_JSON = ` "failed_calls_prefix": "missed_calls", // used in case of flatstore CDRs to avoid searching for BYE records "cdr_path": "", // path towards one CDR element in case of XML CDRs "cdr_source_id": "freeswitch_csv", // free form field, tag identifying the source of the CDRs within CDRS database - "filters" :[], // new filters used in FilterS subsystem - "tenant": "cgrates.org", // default tenant + "filters" :[], // limit parsing based on the filters + "tenant": "", // tenant used by import "continue_on_success": false, // continue to the next template if executed "partial_record_cache": "10s", // duration to cache partial records when not pairing "partial_cache_expiry_action": "*dump_to_file", // action taken when cache when records in cache are timed-out <*dump_to_file|*post_cdr> @@ -286,22 +286,22 @@ const CGRATES_CFG_JSON = ` "sessions": { - "enabled": false, // starts session manager service: + "enabled": false, // starts the session service: "listen_bijson": "127.0.0.1:2014", // address where to listen for bidirectional JSON-RPC requests - "chargers_conns": [ - {"address": "*internal"} // address where to reach the charger service <*internal|x.y.z.y:1234> + "chargers_conns": [ // connections to ChargerS for session forking <*internal|x.y.z.y:1234> + {"address": "*internal"} ], - "rals_conns": [ - {"address": "*internal"} // address where to reach the RALs <""|*internal|127.0.0.1:2013> + "rals_conns": [ // connections to RALs for rating/accounting <""|*internal|127.0.0.1:2013> + {"address": "*internal"} ], - "cdrs_conns": [ - {"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234> + "cdrs_conns": [ // connections to CDRs for CDR posting <*internal|x.y.z.y:1234> + {"address": "*internal"} ], - "resources_conns": [], // address where to reach the ResourceS <""|*internal|127.0.0.1:2013> - "thresholds_conns": [], // address where to reach the ThresholdS <""|*internal|127.0.0.1:2013> - "stats_conns": [], // address where to reach the StatS <""|*internal|127.0.0.1:2013> - "suppliers_conns": [], // address where to reach the SupplierS <""|*internal|127.0.0.1:2013> - "attributes_conns": [], // address where to reach the AttributeS <""|*internal|127.0.0.1:2013> + "resources_conns": [], // connections to ResourceS for resources monitoring <""|*internal|127.0.0.1:2013> + "thresholds_conns": [], // connections to ThresholdS for reporting session events <""|*internal|127.0.0.1:2013> + "stats_conns": [], // connections to StatS for reporting session events <""|*internal|127.0.0.1:2013> + "suppliers_conns": [], // connections to SupplierS for querying suppliers for event <""|*internal|127.0.0.1:2013> + "attributes_conns": [], // connections to AttributeS for altering event fields <""|*internal|127.0.0.1:2013> "session_replication_conns": [], // replicate sessions towards these session services "debit_interval": "0s", // interval to perform debits on. "min_call_duration": "0s", // only authorize calls with allowed duration higher than this @@ -312,14 +312,14 @@ const CGRATES_CFG_JSON = ` //"session_ttl_usage": "", // tweak Usage for sessions timing-out, not defined by default "session_indexes": [], // index sessions based on these fields for GetActiveSessions API "client_protocol": 1.0, // version of protocol to use when acting as JSON-PRC client <"0","1.0"> - "channel_sync_interval": "0", // sync channels regularly (0 to disable sync session) + "channel_sync_interval": "0", // sync channels to detect stale sessions (0 to disable) }, "asterisk_agent": { "enabled": false, // starts the Asterisk agent: - "sessions_conns": [ - {"address": "*internal"} // connection towards session service: <*internal> + "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> + {"address": "*internal"} ], "create_cdr": false, // create CDR out of events and sends it to CDRS component "asterisk_conns":[ // instantiate connections to multiple Asterisk servers @@ -330,11 +330,11 @@ const CGRATES_CFG_JSON = ` "freeswitch_agent": { "enabled": false, // starts the FreeSWITCH agent: - "sessions_conns": [ - {"address": "*internal"} // connection towards session service: <*internal> + "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> + {"address": "*internal"} ], "subscribe_park": true, // subscribe via fsock to receive park events - "create_cdr": false, // create CDR out of events and sends them to CDRS component + "create_cdr": false, // creates CDR out of events and sends them to CDRS component "extra_fields": [], // extra fields to store in auth/CDRs when creating them //"min_dur_low_balance": "5s", // threshold which will trigger low balance warnings for prepaid calls (needs to be lower than debit_interval) //"low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls @@ -348,9 +348,9 @@ const CGRATES_CFG_JSON = ` "kamailio_agent": { - "enabled": false, // starts SessionManager service: - "sessions_conns": [ - {"address": "*internal"} // connection towards session service: <*internal> + "enabled": false, // starts Kamailio agent: + "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> + {"address": "*internal"} ], "create_cdr": false, // create CDR out of events and sends them to CDRS component "timezone": "", // timezone of the Kamailio server @@ -365,8 +365,8 @@ const CGRATES_CFG_JSON = ` "listen": "127.0.0.1:3868", // address where to listen for diameter requests "listen_net": "tcp", // transport type for diameter "dictionaries_path": "/usr/share/cgrates/diameter/dict/", // path towards directory holding additional dictionaries to load - "sessions_conns": [ - {"address": "*internal"} // connection towards SessionService + "sessions_conns": [ // connections to SessionS for session management and CDR posting + {"address": "*internal"} ], "origin_host": "CGR-DA", // diameter Origin-Host AVP used in replies "origin_realm": "cgrates.org", // diameter Origin-Realm AVP used in replies @@ -374,7 +374,7 @@ const CGRATES_CFG_JSON = ` "product_name": "CGRateS", // diameter Product-Name AVP used in replies "max_active_requests": -1, // limit the number of active requests processed by the server <-1|0-n> "asr_template": "", // enable AbortSession message being sent to client on DisconnectSession - "templates":{ + "templates":{ // default message templates "*err": [ {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", "value": "~*req.Session-Id", "mandatory": true}, @@ -418,7 +418,8 @@ const CGRATES_CFG_JSON = ` "value": "1"}, ] }, - "request_processors": [], + "request_processors": [ // list of processors to be applied to diameter messages + ], }, @@ -433,10 +434,11 @@ const CGRATES_CFG_JSON = ` "client_dictionaries": { // per client path towards directory holding additional dictionaries to load (extra to RFC) "*default": "/usr/share/cgrates/radius/dict/", // key represents the client IP or catch-all <*default|$client_ip> }, - "sessions_conns": [ - {"address": "*internal"} // connection towards SessionService + "sessions_conns": [ // connections to SessionS for session management and CDR posting + {"address": "*internal"} + ], + "request_processors": [ // request processors to be applied to Radius messages ], - "request_processors": [], }, @@ -444,7 +446,7 @@ const CGRATES_CFG_JSON = ` ], -"attributes": { // Attribute service +"attributes": { // AttributeS config "enabled": false, // starts attribute service: . //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing @@ -452,33 +454,33 @@ const CGRATES_CFG_JSON = ` }, -"chargers": { // Charger service +"chargers": { // ChargerS config "enabled": false, // starts charger service: . - "attributes_conns": [], // address where to reach the AttributeS <""|127.0.0.1:2013> + "attributes_conns": [], // connections to AttributeS for event fields altering <""|127.0.0.1:2013> //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing }, -"resources": { // Resource service (*new) +"resources": { // ResourceS config "enabled": false, // starts ResourceLimiter service: . "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> - "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> + "thresholds_conns": [], // connections to ThresholdS for resource reporting, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing }, -"stats": { // Stat service (*new) +"stats": { // StatS config "enabled": false, // starts Stat service: . "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> - "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> + "thresholds_conns": [], // connections to ThresholdS for StatUpdates, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing }, -"thresholds": { // Threshold service (*new) +"thresholds": { // ThresholdS "enabled": false, // starts ThresholdS service: . "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> //"string_indexed_fields": [], // query indexes based on these fields for faster processing @@ -486,33 +488,33 @@ const CGRATES_CFG_JSON = ` }, -"suppliers": { // Supplier service (*new) +"suppliers": { // SupplierS config "enabled": false, // starts SupplierS service: . //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing - "attributes_conns": [], // address where to reach the AttributeS <""|127.0.0.1:2013> - "rals_conns": [ - {"address": "*internal"}, // address where to reach the RALs for cost/accounting <*internal> + "attributes_conns": [], // connections to AttributeS for altering events before supplier queries: <""|*internal|127.0.0.1:2013> + "rals_conns": [ // connections to RALs for cost/accounting <*internal> + {"address": "*internal"}, ], - "resources_conns": [], // address where to reach the Resource service, empty to disable functionality: <""|*internal|x.y.z.y:1234> - "stats_conns": [], // address where to reach the Stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> + "resources_conns": [], // connections to ResourceS for *res sorting, empty to disable functionality: <""|*internal|x.y.z.y:1234> + "stats_conns": [], // connections to StatS for *stats sorting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> }, -"loaders": [ +"loaders": [ // LoaderS config { "id": "*default", // identifier of the Loader "enabled": false, // starts as service: . - "tenant": "cgrates.org", // tenant used in filterS.Pass + "tenant": "", // tenant used in filterS.Pass "dry_run": false, // do not send the CDRs to CDRS, just parse them "run_delay": 0, // sleep interval in seconds between consecutive runs, 0 to use automation via inotify "lock_filename": ".cgr.lck", // Filename containing concurrency lock in case of delayed processing - "caches_conns": [ - {"address": "*internal"}, // address where to reach the CacheS for data reload, empty for no reloads <""|*internal|x.y.z.y:1234> + "caches_conns": [ // connections to CacheS for data reload, empty for no reloads <""|*internal|x.y.z.y:1234> + {"address": "*internal"}, ], "field_separator": ",", // separator used in case of csv files - "tp_in_dir": "/var/spool/cgrates/loader/in", // absolute path towards the directory where the CDRs are stored - "tp_out_dir": "/var/spool/cgrates/loader/out", // absolute path towards the directory where processed CDRs will be moved + "tp_in_dir": "/var/spool/cgrates/loader/in", // absolute path towards the directory where the TPs are stored + "tp_out_dir": "/var/spool/cgrates/loader/out", // absolute path towards the directory where processed TPs will be moved "data":[ // data profiles to load { "type": "*attributes", // data source type @@ -695,10 +697,10 @@ const CGRATES_CFG_JSON = ` "data_path": "./", // path towards tariff plan files "disable_reverse": false, // disable reverse computing "field_separator": ",", // separator used in case of csv files - "caches_conns":[ // addresses towards cacheS components for reloads + "caches_conns":[ // connections to CacheS for reloads {"address": "127.0.0.1:2012", "transport": "*json"} ], - "scheduler_conns": [ + "scheduler_conns": [ // connections to SchedulerS for reloads {"address": "127.0.0.1:2012"} ], }, @@ -722,29 +724,17 @@ const CGRATES_CFG_JSON = ` }, -"dispatchers":{ +"dispatchers":{ // DispatcherS config "enabled": false, // starts DispatcherS service: . //"string_indexed_fields": [], // query indexes based on these fields for faster processing "prefix_indexed_fields": [], // query indexes based on these fields for faster processing - "attributes_conns": [], // address where to reach the attribute service, empty to disable auth functionality: <""|*internal|x.y.z.y:1234> - "conns": { - "sessions_eu": [ - {"address": "127.0.0.1:2012", "transport": "*json"}, - {"address": "127.0.0.2:2012", "transport": "*json"}, - ], - "sessions_us": [ - {"address": "127.0.0.3:2012", "transport": "*json"}, - {"address": "127.0.0.4:2012", "transport": "*json"}, - ], - "sessions_others": [ - {"address": "127.0.0.5:2012", "transport": "*json"}, - {"address": "127.0.0.6:2012", "transport": "*json"}, - ], + "attributes_conns": [], // connections to AttributeS for API authorization, empty to disable auth functionality: <""|*internal|x.y.z.y:1234> + "conns": { // connection pools to use for dispatching requests }, }, -"analyzers":{ +"analyzers":{ // AnalyzerS config "enabled":false // starts AnalyzerS service: . }, diff --git a/config/config_json_test.go b/config/config_json_test.go index 4ae0286f1..1d7248430 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -55,7 +55,7 @@ func TestDfGeneralJsonCfg(t *testing.T) { Reconnects: utils.IntPointer(-1), Connect_timeout: utils.StringPointer("1s"), Reply_timeout: utils.StringPointer("2s"), - Internal_ttl: utils.StringPointer("2m"), + Internal_ttl: utils.StringPointer("5s"), Locking_timeout: utils.StringPointer("0"), Digest_separator: utils.StringPointer(","), Digest_equal: utils.StringPointer(":"), @@ -64,7 +64,7 @@ func TestDfGeneralJsonCfg(t *testing.T) { if gCfg, err := dfCgrJsonCfg.GeneralJsonCfg(); err != nil { t.Error(err) } else if !reflect.DeepEqual(eCfg, gCfg) { - t.Error("Received: ", utils.ToIJSON(gCfg)) + t.Errorf("expecting: %s, \nreceived: %s", utils.ToIJSON(eCfg), utils.ToIJSON(gCfg)) } } @@ -182,7 +182,7 @@ func TestDfListenJsonCfg(t *testing.T) { func TestDfDataDbJsonCfg(t *testing.T) { eCfg := &DbJsonCfg{ - Db_type: utils.StringPointer("redis"), + Db_type: utils.StringPointer("*redis"), Db_host: utils.StringPointer("127.0.0.1"), Db_port: utils.IntPointer(6379), Db_name: utils.StringPointer("10"), @@ -193,13 +193,13 @@ func TestDfDataDbJsonCfg(t *testing.T) { if cfg, err := dfCgrJsonCfg.DbJsonCfg(DATADB_JSN); err != nil { t.Error(err) } else if !reflect.DeepEqual(eCfg, cfg) { - t.Error("Received: ", utils.ToJSON(cfg)) + t.Errorf("expecting: %s, \nreceived: %s", utils.ToIJSON(eCfg), utils.ToIJSON(cfg)) } } func TestDfStorDBJsonCfg(t *testing.T) { eCfg := &DbJsonCfg{ - Db_type: utils.StringPointer("mysql"), + Db_type: utils.StringPointer("*mysql"), Db_host: utils.StringPointer("127.0.0.1"), Db_port: utils.IntPointer(3306), Db_name: utils.StringPointer("cgrates"), @@ -251,10 +251,10 @@ func TestDfSchedulerJsonCfg(t *testing.T) { func TestDfCdrsJsonCfg(t *testing.T) { eCfg := &CdrsJsonCfg{ - Enabled: utils.BoolPointer(false), - Extra_fields: &[]string{}, - Store_cdrs: utils.BoolPointer(true), - Sessions_cost_retries: utils.IntPointer(5), + Enabled: utils.BoolPointer(false), + Extra_fields: &[]string{}, + Store_cdrs: utils.BoolPointer(true), + Session_cost_retries: utils.IntPointer(5), Chargers_conns: &[]*HaPoolJsonCfg{ { Address: utils.StringPointer("*internal"), @@ -330,7 +330,7 @@ func TestDfCdreJsonCfgs(t *testing.T) { Export_path: utils.StringPointer("/var/spool/cgrates/cdre"), Synchronous: utils.BoolPointer(false), Attempts: utils.IntPointer(1), - Tenant: utils.StringPointer("cgrates.org"), + Tenant: utils.StringPointer(""), Field_separator: utils.StringPointer(","), Usage_multiply_factor: &map[string]float64{utils.ANY: 1.0}, Cost_multiply_factor: utils.Float64Pointer(1.0), @@ -441,7 +441,7 @@ func TestDfCdrcJsonCfg(t *testing.T) { Cdr_path: utils.StringPointer(""), Cdr_source_id: utils.StringPointer("freeswitch_csv"), Filters: &[]string{}, - Tenant: utils.StringPointer("cgrates.org"), + Tenant: utils.StringPointer(""), Continue_on_success: utils.BoolPointer(false), Partial_record_cache: utils.StringPointer("10s"), Partial_cache_expiry_action: utils.StringPointer(utils.MetaDumpToFile), @@ -835,7 +835,7 @@ func TestDfLoaderJsonCfg(t *testing.T) { { ID: utils.StringPointer(utils.META_DEFAULT), Enabled: utils.BoolPointer(false), - Tenant: utils.StringPointer("cgrates.org"), + Tenant: utils.StringPointer(""), Dry_run: utils.BoolPointer(false), Run_delay: utils.IntPointer(0), Lock_filename: utils.StringPointer(".cgr.lck"), @@ -1395,20 +1395,7 @@ func TestDfDispatcherSJsonCfg(t *testing.T) { String_indexed_fields: nil, Prefix_indexed_fields: &[]string{}, Attributes_conns: &[]*HaPoolJsonCfg{}, - Conns: &map[string]*[]*HaPoolJsonCfg{ - "sessions_eu": &[]*HaPoolJsonCfg{ - {Address: utils.StringPointer("127.0.0.1:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - {Address: utils.StringPointer("127.0.0.2:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - }, - "sessions_us": &[]*HaPoolJsonCfg{ - {Address: utils.StringPointer("127.0.0.3:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - {Address: utils.StringPointer("127.0.0.4:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - }, - "sessions_others": &[]*HaPoolJsonCfg{ - {Address: utils.StringPointer("127.0.0.5:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - {Address: utils.StringPointer("127.0.0.6:2012"), Transport: utils.StringPointer(utils.MetaJSONrpc)}, - }, - }, + Conns: &map[string]*[]*HaPoolJsonCfg{}, } if cfg, err := dfCgrJsonCfg.DispatcherSJsonCfg(); err != nil { t.Error(err) diff --git a/config/config_test.go b/config/config_test.go index de507f385..a788cac90 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -217,7 +217,6 @@ func TestCgrCfgCDRC(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "freeswitch_csv", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), ContinueOnSuccess: false, PartialRecordCache: time.Duration(10 * time.Second), PartialCacheExpiryAction: "*dump_to_file", @@ -361,7 +360,7 @@ func TestCgrCfgJSONDefaultsGeneral(t *testing.T) { if cgrCfg.GeneralCfg().ReplyTimeout != 2*time.Second { t.Errorf("Expected: 2s, received: %+v", cgrCfg.GeneralCfg().ReplyTimeout) } - if cgrCfg.GeneralCfg().InternalTtl != 2*time.Minute { + if cgrCfg.GeneralCfg().InternalTtl != 5*time.Second { t.Errorf("Expected: 2m, received: %+v", cgrCfg.GeneralCfg().InternalTtl) } if cgrCfg.GeneralCfg().LockingTimeout != 0 { @@ -592,7 +591,6 @@ func TestCgrCfgJSONDefaultsCdreProfiles(t *testing.T) { ExportFormat: utils.MetaFileCSV, ExportPath: "/var/spool/cgrates/cdre", Filters: []string{}, - Tenant: "cgrates.org", Synchronous: false, Attempts: 1, FieldSeparator: ',', @@ -1020,7 +1018,6 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { { Id: utils.META_DEFAULT, Enabled: false, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), DryRun: false, RunDelay: 0, LockFileName: ".cgr.lck", @@ -1463,20 +1460,7 @@ func TestCgrCfgJSONDefaultDispatcherSCfg(t *testing.T) { StringIndexedFields: nil, PrefixIndexedFields: &[]string{}, AttributeSConns: []*HaPoolConfig{}, - Conns: map[string][]*HaPoolConfig{ - "sessions_eu": []*HaPoolConfig{ - {Address: "127.0.0.1:2012", Transport: utils.MetaJSONrpc}, - {Address: "127.0.0.2:2012", Transport: utils.MetaJSONrpc}, - }, - "sessions_us": []*HaPoolConfig{ - {Address: "127.0.0.3:2012", Transport: utils.MetaJSONrpc}, - {Address: "127.0.0.4:2012", Transport: utils.MetaJSONrpc}, - }, - "sessions_others": []*HaPoolConfig{ - {Address: "127.0.0.5:2012", Transport: utils.MetaJSONrpc}, - {Address: "127.0.0.6:2012", Transport: utils.MetaJSONrpc}, - }, - }, + Conns: map[string][]*HaPoolConfig{}, } if !reflect.DeepEqual(cgrCfg.dispatcherSCfg, eDspSCfg) { t.Errorf("received: %+v, expecting: %+v", cgrCfg.dispatcherSCfg, eDspSCfg) @@ -1547,7 +1531,6 @@ func TestCDRCWithDefault(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "freeswitch_csv", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), ContinueOnSuccess: false, PartialRecordCache: time.Duration(10 * time.Second), PartialCacheExpiryAction: "*dump_to_file", diff --git a/config/configcdrc_test.go b/config/configcdrc_test.go index 482adbbcb..3a97c89b9 100644 --- a/config/configcdrc_test.go +++ b/config/configcdrc_test.go @@ -49,7 +49,6 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "freeswitch_csv", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), @@ -128,7 +127,6 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv1", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), @@ -207,7 +205,6 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv2", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), @@ -270,7 +267,6 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) { CDRPath: utils.HierarchyPath([]string{""}), CdrSourceId: "csv3", Filters: []string{}, - Tenant: NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP), PartialRecordCache: time.Duration(10) * time.Second, PartialCacheExpiryAction: utils.MetaDumpToFile, HeaderFields: make([]*FCTemplate, 0), diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 1f01cc2e6..08b1722fe 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -114,16 +114,16 @@ type SchedulerJsonCfg struct { // Cdrs config section type CdrsJsonCfg struct { - Enabled *bool - Extra_fields *[]string - Store_cdrs *bool - Sessions_cost_retries *int - Chargers_conns *[]*HaPoolJsonCfg - Rals_conns *[]*HaPoolJsonCfg - Attributes_conns *[]*HaPoolJsonCfg - Thresholds_conns *[]*HaPoolJsonCfg - Stats_conns *[]*HaPoolJsonCfg - Online_cdr_exports *[]string + Enabled *bool + Extra_fields *[]string + Store_cdrs *bool + Session_cost_retries *int + Chargers_conns *[]*HaPoolJsonCfg + Rals_conns *[]*HaPoolJsonCfg + Attributes_conns *[]*HaPoolJsonCfg + Thresholds_conns *[]*HaPoolJsonCfg + Stats_conns *[]*HaPoolJsonCfg + Online_cdr_exports *[]string } type CdrReplicationJsonCfg struct { diff --git a/data/conf/cgrates/cgrates.json b/data/conf/cgrates/cgrates.json index 15c4900d8..3bf7f3a0c 100644 --- a/data/conf/cgrates/cgrates.json +++ b/data/conf/cgrates/cgrates.json @@ -10,47 +10,46 @@ // "node_id": "", // identifier of this instance in the cluster, if empty it will be autogenerated // "logger":"*syslog", // controls the destination of logs <*syslog|*stdout> // "log_level": 6, // control the level of messages logged (0-emerg to 7-debug) -// "http_skip_tls_verify": false, // if enabled Http Client will accept any TLS certificate +// "http_skip_tls_verify": false, // if enabled HttpClient will accept any TLS certificate // "rounding_decimals": 5, // system level precision for floats // "dbdata_encoding": "*msgpack", // encoding used to store object data in strings: <*msgpack|*json> -// "tpexport_dir": "/var/spool/cgrates/tpe", // path towards export folder for offline Tariff Plans -// "poster_attempts": 3, // number of attempts before considering post request failed (eg: *call_url, CDR replication) +// "tpexport_dir": "/var/spool/cgrates/tpe", // path towards export folder for offline TariffPlans +// "poster_attempts": 3, // number of attempts before considering post request failed (eg: *call_url, CDR exports) // "failed_posts_dir": "/var/spool/cgrates/failed_posts", // directory path where we store failed requests // "default_request_type": "*rated", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated> // "default_category": "call", // default category to consider when missing from requests // "default_tenant": "cgrates.org", // default tenant to consider when missing from requests // "default_timezone": "Local", // default timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB> -// "connect_attempts": 3, // initial server connect attempts +// "connect_attempts": 5, // initial server connect attempts // "reconnects": -1, // number of retries in case of connection lost // "connect_timeout": "1s", // consider connection unsuccessful on timeout, 0 to disable the feature // "reply_timeout": "2s", // consider connection down for replies taking longer than this value -// "response_cache_ttl": "0s", // the life span of a cached response -// "internal_ttl": "2m", // maximum duration to wait for internal connections before giving up +// "internal_ttl": "5s", // maximum duration to wait for internal connections before giving up // "locking_timeout": "0", // timeout internal locks to avoid deadlocks -// "digest_separator": ",", -// "digest_equal": ":", -// "rsr_separator": ";", +// "digest_separator": ",", // separator to use in replies containing data digests +// "digest_equal": ":", // equal symbol used in case of digests +// "rsr_separator": ";", // separator used within RSR fields // }, -// "data_db": { // database used to store runtime data (eg: accounts, cdr stats) -// "db_type": "redis", // data_db type: <*redis|*mongo|*internal> +// "data_db": { // database used to store runtime data (eg: accounts) +// "db_type": "*redis", // data_db type: <*redis|*mongo> // "db_host": "127.0.0.1", // data_db host address // "db_port": 6379, // data_db port to reach the database // "db_name": "10", // data_db database name to connect to // "db_user": "cgrates", // username to use when connecting to data_db // "db_password": "", // password to use when connecting to data_db -// "redis_sentinel":"", // redis_sentinel is the name of sentinel +// "redis_sentinel":"", // the name of sentinel when used // }, // "stor_db": { // database used to store offline tariff plans and CDRs -// "db_type": "mysql", // stor database type to use: <*mongo|*mysql|*postgres|*internal> +// "db_type": "*mysql", // stor database type to use: <*mongo|*mysql|*postgres|*internal> // "db_host": "127.0.0.1", // the host to connect to -// "db_port": 3306, // the port to reach the stordb +// "db_port": 3306, // the port to reach the stor_db // "db_name": "cgrates", // stor database name -// "db_user": "cgrates", // username to use when connecting to stordb -// "db_password": "", // password to use when connecting to stordb +// "db_user": "cgrates", // username to use when connecting to stor_db +// "db_password": "", // password to use when connecting to stor_db // "max_open_conns": 100, // maximum database connections opened, not applying for mongo // "max_idle_conns": 10, // maximum database connections idle, not applying for mongo // "conn_max_lifetime": 0, // maximum amount of time in seconds a connection may be reused (0 for unlimited), not applying for mongo @@ -73,8 +72,8 @@ // "server_key":"", // path to server key // "client_certificate" : "", // path to client certificate // "client_key":"", // path to client key -// "ca_certificate":"", // path to CA certificate (populate if used self-sign certificate otherwise let it empty) -// "server_policy":4, // server_policy determine the TLS Client Authentication (0-NoClientCert, 1-RequestClientCert, 2-RequireAnyClientCert, 3-VerifyClientCertIfGiven, 4-RequireAndVerifyClientCert) +// "ca_certificate":"", // path to CA certificate (populate for self-signed certificate otherwise let it empty) +// "server_policy":4, // server_policy determines the TLS Client Authentication (0-NoClientCert, 1-RequestClientCert, 2-RequireAnyClientCert, 3-VerifyClientCertIfGiven, 4-RequireAndVerifyClientCert) // "server_name":"", // }, @@ -91,7 +90,7 @@ // "scheduler": { // "enabled": false, // start Scheduler service: -// "cdrs_conns": [], // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234> +// "cdrs_conns": [], // connections to CDRs for *cdrlog actions <*internal|x.y.z.y:1234> // }, @@ -109,8 +108,8 @@ // "resource_profiles": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control resource profiles caching // "resources": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control resources caching // "event_resources": {"limit": -1, "ttl": "", "static_ttl": false}, // matching resources to events -// "statqueue_profiles": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // statqueue profiles -// "statqueues": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // statqueues with metrics +// "statqueue_profiles": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // statqueue profiles +// "statqueues": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // statqueues with metrics // "threshold_profiles": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control threshold profiles caching // "thresholds": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control thresholds caching // "filters": {"limit": -1, "ttl": "", "static_ttl": false, "precache": false}, // control filters caching @@ -127,20 +126,23 @@ // "dispatcher_filter_indexes" : {"limit": -1, "ttl": "", "static_ttl": false}, // control dispatcher filter indexes caching // "dispatcher_routes": {"limit": -1, "ttl": "", "static_ttl": false}, // control dispatcher routes caching // "diameter_messages": {"limit": -1, "ttl": "3h", "static_ttl": false}, // diameter messages caching +// "rpc_responses": {"limit": 0, "ttl": "2s", "static_ttl": false}, // RPC responses caching // }, // "filters": { // Filters configuration (*new) -// "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "stats_conns": [], // connections to StatS for <*stats> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "resources_conns": [], // connections to ResourceS for <*resources> filters, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // "indexed_selects":true, // enable profile matching exclusively on indexes // }, // "rals": { -// "enabled": false, // enable Rater service: -// "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> -// "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "enabled": false, // enable Rating/Accounting service: +// "thresholds_conns": [], // connections to ThresholdS for account/balance updates, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> +// "stats_conns": [], // connections to StatS for account/balance updates, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // "rp_subject_prefix_matching": false, // enables prefix matching for the rating profile subject +// "remove_expired":true, // enables automatic removal of expired balances // "max_computed_usage": { // do not compute usage higher than this, prevents memory overload // "*any": "189h", // "*voice": "72h", @@ -150,30 +152,32 @@ // }, -// "cdrs": { -// "enabled": false, // start the CDR Server service: -// "extra_fields": [], // extra fields to store in CDRs for non-generic CDRs -// "store_cdrs": true, // store cdrs in storDb -// "sessions_cost_retries": 5, // number of queries to sessions_costs before recalculating CDR -// "chargers_conns": [], // address where to reach the charger service, empty to disable charger functionality: <""|*internal|x.y.z.y:1234> -// "rals_conns": [ -// {"address": "*internal"} // address where to reach the Rater for cost calculation, empty to disable functionality: <""|*internal|x.y.z.y:1234> +// "cdrs": { // CDRs config +// "enabled": false, // start the CDR Server: +// "extra_fields": [], // extra fields to store in CDRs for non-generic CDRs (ie: FreeSWITCH JSON) +// "store_cdrs": true, // store cdrs in StorDB +// "session_cost_retries": 5, // number of queries to session_costs before recalculating CDR +// "chargers_conns": [ // connection to ChargerS for CDR forking, empty to disable billing for CDRs: <""|*internal|x.y.z.y:1234> +// {"address": "*internal"} +// ], +// "rals_conns": [ // connections to RALs for cost calculation: <""|*internal|x.y.z.y:1234> +// {"address": "*internal"} // ], -// "attributes_conns": [], // address where to reach the attribute service, empty to disable attributes functionality: <""|*internal|x.y.z.y:1234> -// "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> -// "stats_conns": [], // address where to reach the stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "attributes_conns": [], // connection to AttributeS for altering *raw CDRs, empty to disable attributes functionality: <""|*internal|x.y.z.y:1234> +// "thresholds_conns": [], // connection to ThresholdS for CDR reporting, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> +// "stats_conns": [], // connections to StatS for CDR reporting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // "online_cdr_exports":[], // list of CDRE profiles to use for real-time CDR exports // }, -// "cdre": { +// "cdre": { // CDRe config // "*default": { -// "export_format": "*file_csv", // exported CDRs format <*file_csv|*file_fwv|*http_post|*http_json_cdr|*http_json_map|*amqp_json_cdr|*amqp_json_map> +// "export_format": "*file_csv", // exported CDRs format <*file_csv|*file_fwv|*http_post|*http_json_cdr|*http_json_map|*amqp_json_cdr|*amqp_json_map|*sqs_json_map> // "export_path": "/var/spool/cgrates/cdre", // path where the exported CDRs will be placed -// "filters" :[], // new filters for cdre -// "tenant": "cgrates.org", // tenant used in filterS.Pass +// "filters" :[], // filters for this export +// "tenant": "", // tenant used in filterS.Pass // "synchronous": false, // block processing until export has a result -// "attempts": 1, // Number of attempts if not success +// "attempts": 1, // export attempts // "field_separator": ",", // used field separator in some export formats, eg: *file_csv // "usage_multiply_factor": { // "*any": 1 // multiply usage based on ToR field or *any for all @@ -201,13 +205,13 @@ // }, -// "cdrc": [ +// "cdrc": [ // CDRc config // { // "id": "*default", // identifier of the CDRC runner // "enabled": false, // enable CDR client functionality // "dry_run": false, // do not send the CDRs to CDRS, just parse them -// "cdrs_conns": [ -// {"address": "*internal"} // address where to reach CDR server. <*internal|x.y.z.y:1234> +// "cdrs_conns": [ // connections to CDRs. <*internal|x.y.z.y:1234> +// {"address": "*internal"} // ], // "cdr_format": "*csv", // CDR file format <*csv|*freeswitch_csv|*fwv|*opensips_flatstore|*partial_csv> // "field_separator": ",", // separator used in case of csv files @@ -220,8 +224,8 @@ // "failed_calls_prefix": "missed_calls", // used in case of flatstore CDRs to avoid searching for BYE records // "cdr_path": "", // path towards one CDR element in case of XML CDRs // "cdr_source_id": "freeswitch_csv", // free form field, tag identifying the source of the CDRs within CDRS database -// "filters" :[], // new filters used in FilterS subsystem -// "tenant": "cgrates.org", // default tenant +// "filters" :[], // limit parsing based on the filters +// "tenant": "", // tenant used by import // "continue_on_success": false, // continue to the next template if executed // "partial_record_cache": "10s", // duration to cache partial records when not pairing // "partial_cache_expiry_action": "*dump_to_file", // action taken when cache when records in cache are timed-out <*dump_to_file|*post_cdr> @@ -261,20 +265,22 @@ // "sessions": { -// "enabled": false, // starts session manager service: +// "enabled": false, // starts the session service: // "listen_bijson": "127.0.0.1:2014", // address where to listen for bidirectional JSON-RPC requests -// "chargers_conns": [], // address where to reach the charger service, empty to disable charger functionality: <""|*internal|x.y.z.y:1234> -// "rals_conns": [ -// {"address": "*internal"} // address where to reach the RALs <""|*internal|127.0.0.1:2013> +// "chargers_conns": [ // connections to ChargerS for session forking <*internal|x.y.z.y:1234> +// {"address": "*internal"} +// ], +// "rals_conns": [ // connections to RALs for rating/accounting <""|*internal|127.0.0.1:2013> +// {"address": "*internal"} // ], -// "cdrs_conns": [ -// {"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234> +// "cdrs_conns": [ // connections to CDRs for CDR posting <*internal|x.y.z.y:1234> +// {"address": "*internal"} // ], -// "resources_conns": [], // address where to reach the ResourceS <""|*internal|127.0.0.1:2013> -// "thresholds_conns": [], // address where to reach the ThresholdS <""|*internal|127.0.0.1:2013> -// "stats_conns": [], // address where to reach the StatS <""|*internal|127.0.0.1:2013> -// "suppliers_conns": [], // address where to reach the SupplierS <""|*internal|127.0.0.1:2013> -// "attributes_conns": [], // address where to reach the AttributeS <""|*internal|127.0.0.1:2013> +// "resources_conns": [], // connections to ResourceS for resources monitoring <""|*internal|127.0.0.1:2013> +// "thresholds_conns": [], // connections to ThresholdS for reporting session events <""|*internal|127.0.0.1:2013> +// "stats_conns": [], // connections to StatS for reporting session events <""|*internal|127.0.0.1:2013> +// "suppliers_conns": [], // connections to SupplierS for querying suppliers for event <""|*internal|127.0.0.1:2013> +// "attributes_conns": [], // connections to AttributeS for altering event fields <""|*internal|127.0.0.1:2013> // "session_replication_conns": [], // replicate sessions towards these session services // "debit_interval": "0s", // interval to perform debits on. // "min_call_duration": "0s", // only authorize calls with allowed duration higher than this @@ -285,14 +291,14 @@ // //"session_ttl_usage": "", // tweak Usage for sessions timing-out, not defined by default // "session_indexes": [], // index sessions based on these fields for GetActiveSessions API // "client_protocol": 1.0, // version of protocol to use when acting as JSON-PRC client <"0","1.0"> -// "channel_sync_interval": "0", // sync channels regularly (0 to disable sync session) +// "channel_sync_interval": "0", // sync channels to detect stale sessions (0 to disable) // }, // "asterisk_agent": { // "enabled": false, // starts the Asterisk agent: -// "sessions_conns": [ -// {"address": "*internal"} // connection towards session service: <*internal> +// "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> +// {"address": "*internal"} // ], // "create_cdr": false, // create CDR out of events and sends it to CDRS component // "asterisk_conns":[ // instantiate connections to multiple Asterisk servers @@ -303,11 +309,11 @@ // "freeswitch_agent": { // "enabled": false, // starts the FreeSWITCH agent: -// "sessions_conns": [ -// {"address": "*internal"} // connection towards session service: <*internal> +// "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> +// {"address": "*internal"} // ], // "subscribe_park": true, // subscribe via fsock to receive park events -// "create_cdr": false, // create CDR out of events and sends them to CDRS component +// "create_cdr": false, // creates CDR out of events and sends them to CDRS component // "extra_fields": [], // extra fields to store in auth/CDRs when creating them // //"min_dur_low_balance": "5s", // threshold which will trigger low balance warnings for prepaid calls (needs to be lower than debit_interval) // //"low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls @@ -321,9 +327,9 @@ // "kamailio_agent": { -// "enabled": false, // starts SessionManager service: -// "sessions_conns": [ -// {"address": "*internal"} // connection towards session service: <*internal> +// "enabled": false, // starts Kamailio agent: +// "sessions_conns": [ // connections to SessionS for session management and CDR posting: <*internal> +// {"address": "*internal"} // ], // "create_cdr": false, // create CDR out of events and sends them to CDRS component // "timezone": "", // timezone of the Kamailio server @@ -338,8 +344,8 @@ // "listen": "127.0.0.1:3868", // address where to listen for diameter requests // "listen_net": "tcp", // transport type for diameter // "dictionaries_path": "/usr/share/cgrates/diameter/dict/", // path towards directory holding additional dictionaries to load -// "sessions_conns": [ -// {"address": "*internal"} // connection towards SessionService +// "sessions_conns": [ // connections to SessionS for session management and CDR posting +// {"address": "*internal"} // ], // "origin_host": "CGR-DA", // diameter Origin-Host AVP used in replies // "origin_realm": "cgrates.org", // diameter Origin-Realm AVP used in replies @@ -347,7 +353,7 @@ // "product_name": "CGRateS", // diameter Product-Name AVP used in replies // "max_active_requests": -1, // limit the number of active requests processed by the server <-1|0-n> // "asr_template": "", // enable AbortSession message being sent to client on DisconnectSession -// "templates":{ +// "templates":{ // default message templates // "*err": [ // {"tag": "SessionId", "field_id": "Session-Id", "type": "*composed", // "value": "~*req.Session-Id", "mandatory": true}, @@ -391,7 +397,8 @@ // "value": "1"}, // ] // }, -// "request_processors": [], +// "request_processors": [ // list of processors to be applied to diameter messages +// ], // }, @@ -406,10 +413,11 @@ // "client_dictionaries": { // per client path towards directory holding additional dictionaries to load (extra to RFC) // "*default": "/usr/share/cgrates/radius/dict/", // key represents the client IP or catch-all <*default|$client_ip> // }, -// "sessions_conns": [ -// {"address": "*internal"} // connection towards SessionService +// "sessions_conns": [ // connections to SessionS for session management and CDR posting +// {"address": "*internal"} +// ], +// "request_processors": [ // request processors to be applied to Radius messages // ], -// "request_processors": [], // }, @@ -417,7 +425,7 @@ // ], -// "attributes": { // Attribute service +// "attributes": { // AttributeS config // "enabled": false, // starts attribute service: . // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing @@ -425,33 +433,33 @@ // }, -// "chargers": { // Charger service +// "chargers": { // ChargerS config // "enabled": false, // starts charger service: . -// "attributes_conns": [], // address where to reach the AttributeS <""|127.0.0.1:2013> +// "attributes_conns": [], // connections to AttributeS for event fields altering <""|127.0.0.1:2013> // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing // }, -// "resources": { // Resource service (*new) +// "resources": { // ResourceS config // "enabled": false, // starts ResourceLimiter service: . // "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> -// "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> +// "thresholds_conns": [], // connections to ThresholdS for resource reporting, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing // }, -// "stats": { // Stat service (*new) +// "stats": { // StatS config // "enabled": false, // starts Stat service: . // "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> -// "thresholds_conns": [], // address where to reach the thresholds service, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> +// "thresholds_conns": [], // connections to ThresholdS for StatUpdates, empty to disable thresholds functionality: <""|*internal|x.y.z.y:1234> // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing // }, -// "thresholds": { // Threshold service (*new) +// "thresholds": { // ThresholdS // "enabled": false, // starts ThresholdS service: . // "store_interval": "", // dump cache regularly to dataDB, 0 - dump at start/shutdown: <""|$dur> // //"string_indexed_fields": [], // query indexes based on these fields for faster processing @@ -459,33 +467,33 @@ // }, -// "suppliers": { // Supplier service (*new) +// "suppliers": { // SupplierS config // "enabled": false, // starts SupplierS service: . // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing -// "attributes_conns": [], // address where to reach the AttributeS <""|127.0.0.1:2013> -// "rals_conns": [ -// {"address": "*internal"}, // address where to reach the RALs for cost/accounting <*internal> +// "attributes_conns": [], // connections to AttributeS for altering events before supplier queries: <""|*internal|127.0.0.1:2013> +// "rals_conns": [ // connections to RALs for cost/accounting <*internal> +// {"address": "*internal"}, // ], -// "resources_conns": [], // address where to reach the Resource service, empty to disable functionality: <""|*internal|x.y.z.y:1234> -// "stats_conns": [], // address where to reach the Stat service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> +// "resources_conns": [], // connections to ResourceS for *res sorting, empty to disable functionality: <""|*internal|x.y.z.y:1234> +// "stats_conns": [], // connections to StatS for *stats sorting, empty to disable stats functionality: <""|*internal|x.y.z.y:1234> // }, -// "loaders": [ +// "loaders": [ // LoaderS config // { // "id": "*default", // identifier of the Loader // "enabled": false, // starts as service: . -// "tenant": "cgrates.org", // tenant used in filterS.Pass +// "tenant": "", // tenant used in filterS.Pass // "dry_run": false, // do not send the CDRs to CDRS, just parse them // "run_delay": 0, // sleep interval in seconds between consecutive runs, 0 to use automation via inotify // "lock_filename": ".cgr.lck", // Filename containing concurrency lock in case of delayed processing -// "caches_conns": [ -// {"address": "*internal"}, // address where to reach the CacheS for data reload, empty for no reloads <""|*internal|x.y.z.y:1234> +// "caches_conns": [ // connections to CacheS for data reload, empty for no reloads <""|*internal|x.y.z.y:1234> +// {"address": "*internal"}, // ], // "field_separator": ",", // separator used in case of csv files -// "tp_in_dir": "/var/spool/cgrates/loader/in", // absolute path towards the directory where the CDRs are stored -// "tp_out_dir": "/var/spool/cgrates/loader/out", // absolute path towards the directory where processed CDRs will be moved +// "tp_in_dir": "/var/spool/cgrates/loader/in", // absolute path towards the directory where the TPs are stored +// "tp_out_dir": "/var/spool/cgrates/loader/out", // absolute path towards the directory where processed TPs will be moved // "data":[ // data profiles to load // { // "type": "*attributes", // data source type @@ -496,11 +504,10 @@ // {"tag": "Contexts", "field_id": "Contexts", "type": "*composed", "value": "~2"}, // {"tag": "FilterIDs", "field_id": "FilterIDs", "type": "*composed", "value": "~3"}, // {"tag": "ActivationInterval", "field_id": "ActivationInterval", "type": "*composed", "value": "~4"}, -// {"tag": "FieldName", "field_id": "FieldName", "type": "*composed", "value": "~5"}, -// {"tag": "Initial", "field_id": "Initial", "type": "*composed", "value": "~6"}, +// {"tag": "AttributeFilterIDs", "field_id": "AttributeFilterIDs", "type": "*composed", "value": "~5"}, +// {"tag": "FieldName", "field_id": "FieldName", "type": "*composed", "value": "~6"}, // {"tag": "Substitute", "field_id": "Substitute", "type": "*composed", "value": "~7"}, -// {"tag": "Append", "field_id": "Append", "type": "*composed", "value": "~8"}, -// {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~9"}, +// {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~8"}, // ], // }, // { @@ -543,12 +550,11 @@ // {"tag": "QueueLength", "field_id": "QueueLength", "type": "*composed", "value": "~4"}, // {"tag": "TTL", "field_id": "TTL", "type": "*composed", "value": "~5"}, // {"tag": "Metrics", "field_id": "Metrics", "type": "*composed", "value": "~6"}, -// {"tag": "MetricParams", "field_id": "Parameters", "type": "*composed", "value": "~7"}, -// {"tag": "Blocker", "field_id": "Blocker", "type": "*composed", "value": "~8"}, -// {"tag": "Stored", "field_id": "Stored", "type": "*composed", "value": "~9"}, -// {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~10"}, -// {"tag": "MinItems", "field_id": "MinItems", "type": "*composed", "value": "~11"}, -// {"tag": "ThresholdIDs", "field_id": "ThresholdIDs", "type": "*composed", "value": "~12"}, +// {"tag": "Blocker", "field_id": "Blocker", "type": "*composed", "value": "~7"}, +// {"tag": "Stored", "field_id": "Stored", "type": "*composed", "value": "~8"}, +// {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~9"}, +// {"tag": "MinItems", "field_id": "MinItems", "type": "*composed", "value": "~10"}, +// {"tag": "ThresholdIDs", "field_id": "ThresholdIDs", "type": "*composed", "value": "~11"}, // ], // }, // { @@ -603,6 +609,25 @@ // {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~6"}, // ], // }, +// { +// "type": "*dispatchers", // data source type +// "file_name": "Dispatchers.csv", // file name in the tp_in_dir +// "fields": [ +// {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "~0", "mandatory": true}, +// {"tag": "ID", "field_id": "ID", "type": "*composed", "value": "~1", "mandatory": true}, +// {"tag": "Contexts", "field_id": "Contexts", "type": "*composed", "value": "~2"}, +// {"tag": "FilterIDs", "field_id": "FilterIDs", "type": "*composed", "value": "~3"}, +// {"tag": "ActivationInterval", "field_id": "ActivationInterval", "type": "*composed", "value": "~4"}, +// {"tag": "Strategy", "field_id": "Strategy", "type": "*composed", "value": "~5"}, +// {"tag": "StrategyParameters", "field_id": "StrategyParameters", "type": "*composed", "value": "~6"}, +// {"tag": "ConnID", "field_id": "ConnID", "type": "*composed", "value": "~7"}, +// {"tag": "ConnFilterIDs", "field_id": "ConnFilterIDs", "type": "*composed", "value": "~8"}, +// {"tag": "ConnWeight", "field_id": "ConnWeight", "type": "*composed", "value": "~9"}, +// {"tag": "ConnBlocker", "field_id": "ConnBlocker", "type": "*composed", "value": "~10"}, +// {"tag": "ConnParameters", "field_id": "ConnParameters", "type": "*composed", "value": "~11"}, +// {"tag": "Weight", "field_id": "Weight", "type": "*composed", "value": "~12"}, +// ], +// }, // ], // }, // ], @@ -651,10 +676,10 @@ // "data_path": "./", // path towards tariff plan files // "disable_reverse": false, // disable reverse computing // "field_separator": ",", // separator used in case of csv files -// "caches_conns":[ // addresses towards cacheS components for reloads +// "caches_conns":[ // connections to CacheS for reloads // {"address": "127.0.0.1:2012", "transport": "*json"} // ], -// "scheduler_conns": [ +// "scheduler_conns": [ // connections to SchedulerS for reloads // {"address": "127.0.0.1:2012"} // ], // }, @@ -674,19 +699,21 @@ // "out_stordb_name": "cgrates", // "out_stordb_user": "cgrates", // "out_stordb_password": "", +// "users_filters":[], // }, -// "dispatchers":{ +// "dispatchers":{ // DispatcherS config // "enabled": false, // starts DispatcherS service: . // //"string_indexed_fields": [], // query indexes based on these fields for faster processing // "prefix_indexed_fields": [], // query indexes based on these fields for faster processing -// "attributes_conns": [], // address where to reach the attribute service, empty to disable auth functionality: <""|*internal|x.y.z.y:1234> -// "conns": {}, +// "attributes_conns": [], // connections to AttributeS for API authorization, empty to disable auth functionality: <""|*internal|x.y.z.y:1234> +// "conns": { // connection pools to use for dispatching requests +// }, // }, -// "analyzers":{ +// "analyzers":{ // AnalyzerS config // "enabled":false // starts AnalyzerS service: . // },