From 2e883b248915a61ce798b057ab3e34acc1d9dc20 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Thu, 8 May 2025 21:41:09 +0300 Subject: [PATCH] update installation docs + cleanup --- docs/admins.rst | 5 + docs/advanced.rst | 10 - docs/apicalls.rst | 7 - docs/apiers.rst | 5 - docs/cdre.rst | 251 ------------ docs/cgr-engine.rst | 22 +- docs/conf.py | 6 +- docs/dispatchers.rst | 207 ---------- docs/freeswitch.rst | 56 --- docs/images/CGRateSFSTypicalUsage.png | Bin 91834 -> 0 bytes docs/images/Complicated.png | Bin 16457 -> 0 bytes docs/images/Complicated_ha.png | Bin 16507 -> 0 bytes docs/images/Normal.png | Bin 12476 -> 0 bytes docs/images/Normal_ha.png | Bin 11565 -> 0 bytes docs/images/Simple.png | Bin 6149 -> 0 bytes docs/index.rst | 25 +- docs/installation.rst | 117 ++---- docs/miscellaneous.rst | 7 - docs/rals.rst | 525 -------------------------- docs/rates.rst | 5 + docs/ratinglogic.rst | 128 ------- docs/schedulers.rst | 7 - docs/tut_asterisk.rst | 17 - docs/tut_asterisk_ari.rst | 62 --- docs/tut_asterisk_installs.rst | 33 -- docs/tut_cgrates_usage.rst | 107 ------ docs/tut_freeswitch.rst | 16 - docs/tut_freeswitch_installs.rst | 38 -- docs/tut_freeswitch_json.rst | 66 ---- docs/tut_jitsi_installs.rst | 6 - docs/tut_kamailio.rst | 17 - docs/tut_kamailio_evapi.rst | 59 --- docs/tut_kamailio_installs.rst | 26 -- docs/tut_opensips.rst | 17 - docs/tut_opensips_event.rst | 60 --- docs/tut_opensips_installs.rst | 25 -- docs/tutorial.rst | 8 +- docs/tutorials.rst | 10 - 38 files changed, 80 insertions(+), 1870 deletions(-) create mode 100644 docs/admins.rst delete mode 100644 docs/advanced.rst delete mode 100644 docs/apicalls.rst delete mode 100644 docs/apiers.rst delete mode 100644 docs/cdre.rst delete mode 100644 docs/dispatchers.rst delete mode 100644 docs/freeswitch.rst delete mode 100644 docs/images/CGRateSFSTypicalUsage.png delete mode 100644 docs/images/Complicated.png delete mode 100644 docs/images/Complicated_ha.png delete mode 100644 docs/images/Normal.png delete mode 100644 docs/images/Normal_ha.png delete mode 100644 docs/images/Simple.png delete mode 100644 docs/miscellaneous.rst delete mode 100644 docs/rals.rst create mode 100644 docs/rates.rst delete mode 100644 docs/ratinglogic.rst delete mode 100644 docs/schedulers.rst delete mode 100644 docs/tut_asterisk.rst delete mode 100644 docs/tut_asterisk_ari.rst delete mode 100644 docs/tut_asterisk_installs.rst delete mode 100644 docs/tut_cgrates_usage.rst delete mode 100644 docs/tut_freeswitch.rst delete mode 100644 docs/tut_freeswitch_installs.rst delete mode 100644 docs/tut_freeswitch_json.rst delete mode 100644 docs/tut_jitsi_installs.rst delete mode 100644 docs/tut_kamailio.rst delete mode 100644 docs/tut_kamailio_evapi.rst delete mode 100644 docs/tut_kamailio_installs.rst delete mode 100644 docs/tut_opensips.rst delete mode 100644 docs/tut_opensips_event.rst delete mode 100644 docs/tut_opensips_installs.rst delete mode 100644 docs/tutorials.rst diff --git a/docs/admins.rst b/docs/admins.rst new file mode 100644 index 000000000..8f5b80f6a --- /dev/null +++ b/docs/admins.rst @@ -0,0 +1,5 @@ +AdminS +====== + + +TBD diff --git a/docs/advanced.rst b/docs/advanced.rst deleted file mode 100644 index f196de45d..000000000 --- a/docs/advanced.rst +++ /dev/null @@ -1,10 +0,0 @@ -Advanced Topics -=============== - -.. toctree:: - :maxdepth: 2 - - apicalls - ratinglogic - - diff --git a/docs/apicalls.rst b/docs/apicalls.rst deleted file mode 100644 index c49369443..000000000 --- a/docs/apicalls.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Calls -========= - -API calls are documented in the following GoDoc_ - -.. _GoDoc : https://pkg.go.dev/github.com/cgrates/cgrates/apier@master - diff --git a/docs/apiers.rst b/docs/apiers.rst deleted file mode 100644 index 16896d347..000000000 --- a/docs/apiers.rst +++ /dev/null @@ -1,5 +0,0 @@ -APIerS -====== - - -TBD \ No newline at end of file diff --git a/docs/cdre.rst b/docs/cdre.rst deleted file mode 100644 index 616993617..000000000 --- a/docs/cdre.rst +++ /dev/null @@ -1,251 +0,0 @@ -.. _AMQP: https://www.amqp.org/ -.. _SQS: https://aws.amazon.com/de/sqs/ -.. _S3: https://aws.amazon.com/de/s3/ -.. _Kafka: https://kafka.apache.org/ - - -.. _CDRe: - -CDRe -==== - - -**CDRe** is an extension of :ref:`CDRs`, responsible for exporting the *CDR* events processed by :ref:`CDRs`. It is accessed via `CGRateS RPC APIs `_ and configured within *cdre* section inside :ref:`JSON configuration `. - - -Export types ------------- - -There are two types of exports with common configuration but different data sources: - - -Online exports -^^^^^^^^^^^^^^ - -Are real-time exports, triggered by the CDR event processed by :ref:`CDRs`, and take these events as data source. - -The *online exports* are enabled via *online_cdr_exports* :ref:`JSON configuration ` option within *cdrs*. - -You can control the templates which are to be executed via the filters which are applied for each export template individually. - - -Offline exports -^^^^^^^^^^^^^^^ - -Are exports which are triggered via `CGRateS RPC APIs `_ and they have as data source the CDRs stored within *StorDB*. - - - -Parameters ----------- - -CDRe -^^^^ - -**CDRe** it is configured within **cdre** section from :ref:`JSON configuration `. - -One **export profile** includes the following parameters: - -export_format - Specify the type of export which will run. Possible values are: - - **\*fileCSV** - Exports into a comma separated file format. - - **\*fileFWV** - Exports into a fixed width file format. - - **\*httpPost** - Will post the CDR to a HTTP server. The export content will be a HTTP form encoded representation of the `internal CDR object `_. - - **\*http_json_cdr** - Will post the CDR to a HTTP server. The export content will be a JSON serialized representation of the `internal CDR object `_. - - **\*httpJSONMap** - Will post the CDR to a HTTP server. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. - - **\*amqp_json_cdr** - Will post the CDR to an AMQP_ queue. The export content will be a JSON serialized representation of the `internal CDR object `_. Uses AMQP_ protocol version 0.9.1. - - **\*amqpJSONMap** - Will post the CDR to an AMQP_ queue. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. Uses AMQP_ protocol version 1.0. - - **\*amqpv1JSONMap** - Will post the CDR to an AMQP_ queue. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. Uses AMQP_ protocol version 1.0. - - **\*sqsJSONMap** - Will post the CDR to an `Amazon SQS queue `_. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. - - **\*s3JSONMap** - Will post the CDR to `Amazon S3 storage `_. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. - - **\*kafkaJSONMap** - Will post the CDR to an `Apache Kafka `_. The export content will be a JSON serialized hmap with fields defined within the *fields* section of the template. - -export_path - Specify the export path. It has special format depending of the export type. - - **\*fileCSV**, **\*fileFWV** - Standard unix-like filesystem path. - - **\*httpPost**, **\*http_json_cdr**, **\*httpJSONMap** - Full HTTP URL - - **\*amqpJSONMap**, **\*amqpv1JSONMap** - AMQP URL with extra parameters. - - Sample: *amqp://guest:guest@localhost:5672/?queue_id=cgrates_cdrs&exchange=exchangename&exchange_type=fanout&routing_key=cgr_cdrs* - - **\*sqsJSONMap** - SQS URL with extra parameters. - - Sample: *http://sqs.eu-west-2.amazonaws.com/?aws_region=eu-west-2&aws_key=testkey&aws_secret=testsecret&queue_id=cgrates-cdrs* - - **\*s3JSONMap** - S3 URL with extra parameters. - - Sample: *http://s3.us-east-2.amazonaws.com/?aws_region=eu-west-2&aws_key=testkey&aws_secret=testsecret&queue_id=cgrates-cdrs* - - **\*kafkaJSONMap** - Kafka URL with extra parameters. - - Sample: *localhost:9092?topic=cgrates_cdrs* - - -filters - List of filters to pass for the export profile to execute. For the dynamic content (prefixed with *~*) following special variables are available: - - **\*req** - The *CDR* event itself. - - **\*ec** - The *EventCost* object with subpaths for all of it's nested objects. - -tenant - Tenant owning the template. It will be used mostly to match inside :ref:`FilterS`. - -synchronous - Block further exports until this one finishes. In case of *false* the control will be given to the next export template as soon as this one was started. - -attempts - Number of attempts before giving up on the export and writing the failed request to file. The failed request will be written to *failed_posts_dir* defined in *general* section. - -field_separator - Field separator to be used in some export types (ie. *\*fileCSV*). - -attributes_context - The context used when sending the CDR event to :ref:`AttributeS` for modifications. If empty, there will be no event sent to :ref:`AttributeS`. - -fields - List of fields for the exported event. Not affecting templates like *\*http_json_cdr* or *\*amqp_json_cdr* with fixed content. - - -One **field template** will contain the following parameters: - -path - Path for the exported content. Possible prefixes here are: - - *\*exp* - Reference to the exported record. - - *\*hdr* - Reference to the header content. Available in case of **\*fileCSV** and **\*fileFWV** export types. - - *\*trl* - Reference to the trailer content. Available in case of **\*fileCSV** and **\*fileFWV** export types. - -type - The field type will give out the logic for generating the value. Values used depend on the type of prefix used in path. - - For *\*exp*, following field types are implemented: - - **\*variable** - Writes out the variable value, overwriting previous one set. - - **\*composed** - Writes out the variable value, postpending to previous value set - - **\*filler** - Fills the values with a fixed lentgh string. - - **\*constant** - Writes out a constant - - **\*datetime** - Parses the value as datetime and reformats based on the *layout* attribute. - - **\*combimed** - Writes out a combined mediation considering events with the same *CGRID*. - - **\*masked_destination** - Masks the destination using *\** as suffix. Matches the destination field against the list defined via *mask_destinationd_id* field. - - **\*httpPost** - Uses a HTTP server as datasource for the value exported. - - For *\*hdr* and *\*trl*, following field types are possible: - - **\*filler** - Fills the values with a string. - - **\*constant** - Writes out a constant - - **\*handler** - Will obtain the content via a handler. This works in tandem with the attribute *handler_id*. - -value - The exported value. Works in tandem with *type* attribute. Possible prefixes for dynamic values: - - **\*req** - Data is taken from the current request coming from the *CDRs* component. - -mandatory - Makes sure that the field cannot have empty value (errors otherwise). - -tag - Used for debug purposes in logs. - -width - Used to control the formatting, enforcing the final value to a specific number of characters. - -strip - Used when the value is higher than *width* allows it, specifying the strip strategy. Possible values are: - - **\*right** - Strip the suffix. - - **\*xright** - Strip the suffix, postpending one *x* character to mark the stripping. - - **\*left** - Strip the prefix. - - **\*xleft** - Strip the prefix, prepending one *x* character to mark the stripping. - -padding - Used to control the formatting. Applied when the data is smaller than the *width*. Possible values are: - - **\*right** - Suffix with spaces. - - **\*left** - Prefix with spaces. - - **\*zeroleft** - Prefix with *0* chars. - -mask_destinationd_id - The destinations profile where we match the *masked_destinations*. - -hander_id - The identifier of the handler to be executed in case of *\*handler* *type*. - - - - - - - - diff --git a/docs/cgr-engine.rst b/docs/cgr-engine.rst index a010f4351..f863771f9 100644 --- a/docs/cgr-engine.rst +++ b/docs/cgr-engine.rst @@ -12,8 +12,10 @@ Able to read the configuration from either a local directory of *.json* files w :: - $ cgr-engine -help - Usage of cgr-engine: +$ cgr-engine -help +Usage of cgr-engine: + -check_config + Verify the config without starting the engine -config_path string Configuration directory path (default "/etc/cgrates/") -cpuprof_dir string @@ -21,7 +23,7 @@ Able to read the configuration from either a local directory of *.json* files w -log_level int Log level (0=emergency to 7=debug) (default -1) -logger string - Logger type <*syslog|*stdout> + Logger type <*syslog|*stdout|*kafkaLog> -memprof_dir string Directory for memory profiles -memprof_interval duration @@ -34,15 +36,13 @@ Able to read the configuration from either a local directory of *.json* files w Node ID of the engine -pid string Path to write the PID file - -preload string + -preload value Loader IDs used to load data before engine starts - -print_config - Print configuration object in JSON format -scheduled_shutdown duration Shutdown the engine after the specified duration -set_versions - Overwrite database versions (equivalent to cgr-migrator -exec=*set_versions) - -singlecpu + Overwrite database versions + -single_cpu Run on a single CPU core -version Print application version and exit @@ -66,7 +66,7 @@ The components from the diagram can be found documented in the links bellow: agents sessions - rals + rates cdrs ees attributes @@ -77,9 +77,7 @@ The components from the diagram can be found documented in the links bellow: trends thresholds filters - dispatchers - schedulers - apiers + admins loaders caches guardian diff --git a/docs/conf.py b/docs/conf.py index 0023a12b1..02950175d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -46,16 +46,16 @@ master_doc = 'index' # General information about the project. project = u'CGRateS' -copyright = u'2012-2023, ITsysCOM GmbH' +copyright = u'2012-2025, ITsysCOM GmbH' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '0.11' +version = '1.0' # The full version, including alpha/beta/rc tags. -release = '0.11.0~dev' +release = '1.0~dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/dispatchers.rst b/docs/dispatchers.rst deleted file mode 100644 index 9c234f356..000000000 --- a/docs/dispatchers.rst +++ /dev/null @@ -1,207 +0,0 @@ -.. _dispatchers: - -DispatcherS -=========== - -**DispatcherS** is the **CGRateS** component that handles request routing and load balancing. When enabled, it manages all requests to other CGRateS subsystems by wrapping their methods with additional features like :ref:`authorization `, request routing, load balancing, broadcasting, and loop prevention. - -Processing Logic ----------------- - -.. _dispatcher-authorization: - -Authorization -~~~~~~~~~~~~~ - -Optional step when :ref:`AttributeS ` connections are configured: - -- Looks for ``*apiKey`` in APIOpts (returns mandatory missing error if not present) -- Sends key to AttributeS, which adds it as "APIKey" to the Event -- AttributeS processes the event and adds allowed methods to APIMethods (e.g., "method1&method2&method3") -- Checks if the requested method is in the allowed list -- Continues only after successful authorization - -Dispatch -~~~~~~~~ - -The dispatcher processes requests through these steps: - -* Check for bypass conditions: - * Presence of ``*dispatchers: false`` in APIOpts - * Request source is another dispatcher and ``prevent_loops`` is enabled - -* Check cached routes: - * Search for ``*routeID`` in APIOpts - * If found, use cached dispatch data (tenant, profile ID, host ID) - * Fall back to full dispatch on network errors or timeouts - -* Run full dispatch sequence: - * Get matching dispatcher profiles - * Try each profile until dispatch succeeds - -.. _dispatcher-types: - -Dispatcher Types and Strategies -------------------------------- - -Load Dispatchers -~~~~~~~~~~~~~~~~ - -Used for ratio-based request distribution. Hosts are sorted in three steps: - -1. Initial sorting by weight -2. Secondary sorting by load ratio (current active requests/configured ratio), where lower ratios have priority -3. Final sorting based on the specified strategy: - - * ``*random``: Randomizes host selection - * ``*round_robin``: Sequential host selection with weight consideration - * ``*weight``: Skips final sorting, maintains weight and load-based ordering - -Configuration through: - -- ``*defaultRatio`` in StrategyParams -- Direct ratio specification in Host configuration - - -Simple Dispatchers -~~~~~~~~~~~~~~~~~~ - -Standard request distribution where hosts are sorted first by weight, followed by the chosen strategy (*random, *round_robin, *weight). - -Broadcast Dispatchers -~~~~~~~~~~~~~~~~~~~~~ - -Handles scenarios requiring multi-host distribution. Supports three broadcast strategies: - -* ``*broadcast``: Sends to all hosts, uses first response -* ``*broadcast_sync``: Sends to all hosts, waits for all responses -* ``*broadcast_async``: Sends to all hosts without waiting (fire-and-forget) - -Parameters ----------- - -Configure the dispatcher in the **dispatchers** section of the :ref:`JSON configuration `: - -enabled - Enables/disables the DispatcherS component. Values: - -indexed_selects - Enables profile matching exclusively on indexes for improved performance - -string_indexed_fields - Fields used for string-based index querying - -prefix_indexed_fields - Fields used for prefix-based index querying - -suffix_indexed_fields - Fields used for suffix-based index querying - -nested_fields - Controls indexed filter matching depth. Values: - - true: checks all levels - - false: checks only first level - -attributes_conns - Connections to :ref:`AttributeS ` for API authorization - - Empty: disables authorization - - "*internal": uses internal connection - - Custom connection ID - -any_subsystem - Enables matching of *any subsystem. Values: - -prevent_loops - Prevents request loops between dispatcher nodes. Values: - -DispatcherHost -~~~~~~~~~~~~~~ - -Defines individual dispatch destinations with the following parameters: - -Tenant - The tenant on the platform - -ID - Unique identifier for the host - -Address - Host address (use *internal for internal connections) - -Transport - Protocol used for communication (*gob, *json) - -ConnectAttempts - Number of connection attempts - -Reconnects - Maximum number of reconnection attempts - -MaxReconnectInterval - Maximum interval between reconnection attempts - -ConnectTimeout - Connection timeout (e.g., "1m") - -ReplyTimeout - Response timeout (e.g., "2m") - -TLS - TLS connection settings: - - ClientKey: Path to client key file - - ClientCertificate: Path to client certificate - - CaCertificate: Path to CA certificate - -DispatcherProfile -~~~~~~~~~~~~~~~~~ - -Defines routing rules and strategies. See :ref:`dispatcher-types` for available strategies. - -Tenant - The tenant on the platform - -ID - Profile identifier - -Subsystems - Target subsystems (*any for all) - -FilterIDs - List of filters for request matching - -ActivationInterval - Time interval when profile is active - -Strategy - Dispatch strategy (*weight, *random, *round_robin, *broadcast, *broadcast_sync) - -StrategyParameters - Additional strategy configuration (e.g., *default_ratio) - -ConnID - Target host identifier - -ConnFilterIDs - Filters for connection selection - -ConnWeight - Priority weight for connection selection within the profile - -ConnBlocker - Blocks connection if true - -ConnParameters - Additional connection parameters (e.g., *ratio) - -Weight - Priority weight used when selecting between multiple matching profiles - -Use Cases ---------- - -- Load balancing between multiple CGRateS nodes -- High availability setups with automatic failover -- Request authorization and access control -- Broadcasting requests for data collection -- Traffic distribution based on weight or custom metrics -- System scaling and performance optimization diff --git a/docs/freeswitch.rst b/docs/freeswitch.rst deleted file mode 100644 index add0c351f..000000000 --- a/docs/freeswitch.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. _FreeSWITCH: https://freeswitch.com/ - - -FreeSWITCH integration -====================== - -Being the original platform supported by CGRateS, FreeSWITCH_ has the advantage of support for complete set of CGRateS features. -When used as Telecom Switch it fully supports all rating modes: **prepaid**/**postpaid**/**pseudoprepaid**/**rated**. -A typical use case would be like the one in the diagram below: - -.. image:: images/CGRateSFSTypicalUsage.png - -The process of rating is decoupled into two different components: - -SessionManager --------------- - -**TODO** - update and add CDRs and CDRc. - -- Attached to FreeSWITCH_ via the socket library, enhancing CGRateS with real-time call monitoring and call control functions. -- In Prepaid mode implements the following behaviour: - - On *CHANNEL_PARK* event received from FreeSWITCH_: - - Authorize the call by calling *GetMaxSessionTime* on the Rater. - - Sets the channel variable *cgr_notify* via *uuid_setvar* to one of the following values: - - MISSING_PARAMETER: if one of the required channel variables is missing and CGRateS cannot make rating. - - SYSTEM_ERROR: if rating could not be performed due to a system error. - - INSUFFICIENT_FUNDS: if MaximSessionTime is 0. - - AUTH_OK: Call is authorized to proceed. - - Un-Park the call via *uuid_transfer* to original dialed number. The FreeSWITCH_ administrator is expected to make use of *cgr_notify* variable value to either allow the call going further or reject it (eg: towards an IVR or returning authorization fail message to call originator). - - - On *CHANNEL_ANSWER* event received: - - Index the call into CGRateS's cache. - - Starts debit loop by calling at configured interval *MaxDebit* on the Rater. - - If any of the debits fail: - - Set *cgr_notify* channel variable to either SYSTEM_ERROR in case of errors or INSUFFICIENT_FUNDS of there would be not enough balance for the next debit to proceed. - - Send *hangup* command with cause *MANAGER_REQUEST*. - - - On *CHANNEL_HANGUP_COMPLETE* event received: - - Refund the reserved balance back to the user's account (works for both monetary and minutes debited). - - Save call costs into CGRateS LogDB. - -- In Postpaid mode: - - - On *CHANNEL_ANSWER* event received: - - Index the call into CGRateS's cache. - - - On *CHANNEL_HANGUP_COMPLETE* event received: - - Call *Debit* RPC method on the Rater. - - Save call costs into CGRateS LogDB. - -- On CGRateS Shutdown execute, for security reasons, hangup commands on calls which can be CGR related: - - *hupall MANAGER_REQUEST cgr_reqtype prepaid* - - *hupall MANAGER_REQUEST cgr_reqtype postpaid* - - - diff --git a/docs/images/CGRateSFSTypicalUsage.png b/docs/images/CGRateSFSTypicalUsage.png deleted file mode 100644 index 23e11e9dc1324e332a1e061162497463a4b694b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91834 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 diff --git a/docs/images/Complicated.png b/docs/images/Complicated.png deleted file mode 100644 index 43f55f5352c0da135b2fa71abb1fc8892fad75da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16457 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 diff --git a/docs/images/Complicated_ha.png b/docs/images/Complicated_ha.png deleted file mode 100644 index 9d5bb8fc8ad8864cb8ce8e1c86c527d6b56df933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16507 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 diff --git a/docs/images/Normal.png b/docs/images/Normal.png deleted file mode 100644 index b89843f6ebb20231acd890a9acc6d4678bb77e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12476 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


+b-1=IK3lcB{(qu+dGy#C<^X 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 Oh>DWtqcVjTZ~hMwRU`)h diff --git a/docs/images/Simple.png b/docs/images/Simple.png deleted file mode 100644 index 0703b3440cfe6795eac805293c04a79541dad7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6149 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 S_&Pw|#{$c$%9Kf)e)vDqtr05# diff --git a/docs/index.rst b/docs/index.rst index a6eaeb9c9..efd29dee2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,9 +3,22 @@ CGRateS Documentation ===================== +.. warning:: + + **Documentation Migration in Progress** + + This documentation is currently being migrated from v0.11. + + **Currently reliable sections:** + + - **Installation:** Only Debian packages and source installation on Debian systems + - **Architecture:** General component information (some links may be broken) + + All other sections are being updated for version 1.0. + Welcome to `CGRateS`_'s documentation! -`CGRateS`_ is a *very fast* (**50k+ CPS**) and *easily scalable* (**load-balancer** + **replication** included) **Real-time Enterprise Billing Suite** targeted especially for ISPs and Telecom Operators (but not only). +`CGRateS`_ is a *very fast* (**50k+ CPS**) and *easily scalable* (**replication** included) **Real-time Enterprise Billing Suite** targeted especially for ISPs and Telecom Operators (but not only). .. toctree:: @@ -16,15 +29,5 @@ Welcome to `CGRateS`_'s documentation! installation configuration administration - advanced tutorial troubleshooting - miscellaneous - - - - - - - - diff --git a/docs/installation.rst b/docs/installation.rst index 0a445815b..297be21d8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -9,6 +9,17 @@ Installation ============ +.. warning:: + + **Installation Note** + + For version 1.0, only these installation methods currently work: + + - Debian package installation + - Source installation on Debian systems + + Other methods (RedHat packages, Docker) are under development and will be available in future updates. + .. contents:: :local: :depth: 2 @@ -22,8 +33,8 @@ Package Installation Package installation method varies according to the Linux distribution: -Debian or Debian-based Distributions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Debian or Debian-based Distributions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can add the CGRateS repository to your system's sources list, depending of the Debian version you are running, as follows: @@ -41,7 +52,7 @@ You can add the CGRateS repository to your system's sources list, depending of t sudo mv apt.cgrates.org.asc /etc/apt/trusted.gpg.d/ # Add the repository to the apt sources list - echo "deb http://apt.cgrates.org/debian/ master-bookworm main" | sudo tee /etc/apt/sources.list.d/cgrates.list + echo "deb http://apt.cgrates.org/debian/ 1.0-bookworm main" | sudo tee /etc/apt/sources.list.d/cgrates.list # Update the system repository and install CGRateS sudo apt-get update -y @@ -51,7 +62,7 @@ You can add the CGRateS repository to your system's sources list, depending of t .. code-block:: bash - wget http://pkg.cgrates.org/deb/master/bookworm/cgrates_current_amd64.deb + wget http://pkg.cgrates.org/deb/1.0/bookworm/cgrates_current_amd64.deb sudo dpkg -i ./cgrates_current_amd64.deb .. group-tab:: Bullseye @@ -66,7 +77,7 @@ You can add the CGRateS repository to your system's sources list, depending of t sudo mv apt.cgrates.org.asc /etc/apt/trusted.gpg.d/ # Add the repository to the apt sources list - echo "deb http://apt.cgrates.org/debian/ master-bullseye main" | sudo tee /etc/apt/sources.list.d/cgrates.list + echo "deb http://apt.cgrates.org/debian/ 1.0-bullseye main" | sudo tee /etc/apt/sources.list.d/cgrates.list # Update the system repository and install CGRateS sudo apt-get update -y @@ -76,7 +87,7 @@ You can add the CGRateS repository to your system's sources list, depending of t .. code-block:: bash - wget http://pkg.cgrates.org/deb/master/bullseye/cgrates_current_amd64.deb + wget http://pkg.cgrates.org/deb/1.0/bullseye/cgrates_current_amd64.deb sudo dpkg -i ./cgrates_current_amd64.deb @@ -94,16 +105,16 @@ For .rpm distros, we are using copr to manage the CGRateS packages: .. code-block:: bash # sudo yum install -y dnf-plugins-core on RHEL 8 or CentOS Stream - sudo dnf install -y dnf-plugins-core - sudo dnf copr -y enable cgrates/master + sudo dnf install -y dnf-plugins-core + sudo dnf copr -y enable cgrates/1.0 sudo dnf install -y cgrates -- For older distributions: +- For older distributions: .. code-block:: bash sudo yum install -y yum-plugin-copr - sudo yum copr -y enable cgrates/master + sudo yum copr -y enable cgrates/1.0 sudo yum install -y cgrates To install a specific version of the package, run: @@ -121,7 +132,7 @@ Alternatively, you can manually install a specific .rpm package as follows: .. note:: - The entire archive of CGRateS rpm packages is available at https://copr.fedorainfracloud.org/coprs/cgrates/master/packages/ or http://pkg.cgrates.org/rpm/nightly/. + The entire archive of CGRateS rpm packages is available at https://copr.fedorainfracloud.org/coprs/cgrates/1.0/packages/ or http://pkg.cgrates.org/rpm/nightly/. Installing from Source ---------------------- @@ -156,7 +167,7 @@ Installation: .. code-block:: bash mkdir -p $HOME/go/src/github.com/cgrates/cgrates - git clone https://github.com/cgrates/cgrates.git $HOME/go/src/github.com/cgrates/cgrates + git clone --branch=1.0 https://github.com/cgrates/cgrates.git $HOME/go/src/github.com/cgrates/cgrates cd $HOME/go/src/github.com/cgrates/cgrates # Compile the binaries and move them to $GOPATH/bin @@ -191,21 +202,21 @@ The following commands will pull the CGRateS components: :: - sudo docker pull dkr.cgrates.org/master/cgr-engine - sudo docker pull dkr.cgrates.org/master/cgr-loader - sudo docker pull dkr.cgrates.org/master/cgr-migrator - sudo docker pull dkr.cgrates.org/master/cgr-console - sudo docker pull dkr.cgrates.org/master/cgr-tester + sudo docker pull dkr.cgrates.org/1.0/cgr-engine + sudo docker pull dkr.cgrates.org/1.0/cgr-loader + sudo docker pull dkr.cgrates.org/1.0/cgr-migrator + sudo docker pull dkr.cgrates.org/1.0/cgr-console + sudo docker pull dkr.cgrates.org/1.0/cgr-tester Verify the images were pulled successfully: :: - sudo docker images dkr.cgrates.org/master/cgr-* + sudo docker images dkr.cgrates.org/1.0/cgr-* REPOSITORY TAG IMAGE ID CREATED SIZE - dkr.cgrates.org/master/cgr-loader latest 5b667e92a475 6 weeks ago 46.5MB - dkr.cgrates.org/master/cgr-console latest 464bd1992ab2 6 weeks ago 103MB - dkr.cgrates.org/master/cgr-engine latest e20f43491aa8 6 weeks ago 111MB + dkr.cgrates.org/1.0/cgr-loader latest 5b667e92a475 6 weeks ago 46.5MB + dkr.cgrates.org/1.0/cgr-console latest 464bd1992ab2 6 weeks ago 103MB + dkr.cgrates.org/1.0/cgr-engine latest e20f43491aa8 6 weeks ago 111MB ... .. note:: @@ -214,7 +225,7 @@ Verify the images were pulled successfully: :: - curl -X GET https://dkr.cgrates.org/v2/master/cgr-engine/tags/list + curl -X GET https://dkr.cgrates.org/v2/1.0/cgr-engine/tags/list cgr-engine Container @@ -234,7 +245,7 @@ The current cgr-engine container entrypoint is: :: - sudo docker inspect --format='{{json .Config.Entrypoint}}' dkr.cgrates.org/master/cgr-engine:latest + sudo docker inspect --format='{{json .Config.Entrypoint}}' dkr.cgrates.org/1.0/cgr-engine:latest Running cgr-engine ^^^^^^^^^^^^^^^^^^ @@ -250,7 +261,7 @@ Here's a basic example of running cgr-engine with common Docker parameters: -e REDIS_HOST=192.168.122.91 \ --network bridge \ --name cgr-engine \ - dkr.cgrates.org/master/cgr-engine:latest \ + dkr.cgrates.org/1.0/cgr-engine:latest \ -config_path=/etc/cgrates \ -logger=*stdout @@ -261,7 +272,7 @@ Verify cgr-engine is responding: sudo docker run --rm \ --name cgr-console \ --network host \ - dkr.cgrates.org/master/cgr-console:latest \ + dkr.cgrates.org/1.0/cgr-console:latest \ status Key parameters: @@ -276,62 +287,6 @@ Key parameters: .. note:: The ``-config_path`` and ``-logger`` flags above are cgr-engine specific flags and optional, as those values are already the defaults. -Creating Your Own Packages --------------------------- - -After compiling the source code, you may choose to create your own packages. - -For Debian-based distros: -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: bash - - # Install dependencies - sudo apt-get install build-essential fakeroot dh-systemd -y - - cd $HOME/go/src/github.com/cgrates/cgrates/packages - - # Delete old ones, if any - rm -rf $HOME/go/src/github.com/cgrates/*.deb - - make deb - -.. note:: - You might see some console warnings, which can be safely ignored. - -To install the generated package, run: - -.. code-block:: bash - - cd $HOME/go/src/github.com/cgrates - sudo dpkg -i cgrates_*.deb - -For Redhat-based distros: -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: bash - - sudo dnf install -y rpm-build wget curl tar - - # Create build directories - mkdir -p $HOME/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} - - # Fetch source code - cd $HOME/go/src/github.com/cgrates/cgrates - export gitLastCommit=$(git rev-parse HEAD) - export rpmTag=$(git log -1 --format=%ci | date +%Y%m%d%H%M%S)+$(git rev-parse --short HEAD) - - #Create the tarball from the source code - cd .. - tar -czvf $HOME/rpmbuild/SOURCES/$gitLastCommit.tar.gz cgrates - - # Copy RPM spec file - cp $HOME/go/src/github.com/cgrates/cgrates/packages/redhat_fedora/cgrates.spec $HOME/rpmbuild/SPECS - - # Build RPM package - cd $HOME/rpmbuild - rpmbuild -bb SPECS/cgrates.spec - .. _post_install: Post-install Configuration diff --git a/docs/miscellaneous.rst b/docs/miscellaneous.rst deleted file mode 100644 index 4c895ae16..000000000 --- a/docs/miscellaneous.rst +++ /dev/null @@ -1,7 +0,0 @@ -Miscellaneous -============= - -.. toctree:: - :maxdepth: 2 - - freeswitch diff --git a/docs/rals.rst b/docs/rals.rst deleted file mode 100644 index dba4aef61..000000000 --- a/docs/rals.rst +++ /dev/null @@ -1,525 +0,0 @@ -.. _rals: - -RALs -==== - - -**RALs** is a standalone subsystem within **CGRateS** designed to handle two major tasks: :ref:`Rating` and :ref:`Accounting`. It is accessed via `CGRateS RPC APIs `_. - - - -.. _Rating: - -Rating ------- - -Rating is the process responsible to attach costs to events. - -The costs are calculated based on the input data defined within :ref:`TariffPlan` in the following sections: - - -.. _RatingProfile: - -RatingProfile -^^^^^^^^^^^^^ - -Binds the event via a fixed number of fields to a predefined :ref:`RatingPlan`. Configured via the following parameters: - -Tenant - The tenant on the platform (one can see the tenant as partition ID). Matched from event or inherited from :ref:`JSON configuration `. - -Category - Freeform field used to "categorize" the event. Matched from event or inherited from :ref:`JSON configuration `. - -Subject - Rating subject matched from the event. In most of the cases this equals with the *Account* using the service. - -ActivationTime - Date and time when the profile becomes active. There is no match before this date. - -RatingPlanID - Identifier of the :ref:`RatingPlan` assigned to the event. - -FallbackSubjects - List of rating subjects which will be searched in order in case of missing rates in case of defined :ref:`RatingPlan`. This list is only considered at first level of iteration (not considering *FallbackSubjects* within interations). - -.. Note:: One *RatingProfile* entry is composed out of a unique combination of *Tenant* + *Category* + *Subject*. - - -.. _RatingPlan: - -RatingPlan -^^^^^^^^^^ - -Groups together rates per destination and relates them to event timing. Configured via the following parameters: - -ID - The tag uniquely idenfying each RatingPlan. There can be multiple entries grouped by the same ID. - -DestinationRatesID - The identifier of the :ref:`DestinationRate` set. - -TimingID - The itentifier of the :ref:`Timing` profile. - -Weight - Priority of matching rule (*DestinationRatesID*+*TimingID*). Higher value equals higher priority. - - -.. _DestinationRate: - -DestinationRate -^^^^^^^^^^^^^^^ - -Groups together destination with rate profiles and assigns them some properties used in the rating process. Configured via the following parameters: - -ID - The tag uniquely idenfying each DestinationRate profile. There can be multiple entries grouped by the same ID. - -DestinationsID - The identifier of the :ref:`Destination` profile. - -RatesID - The identifier of the :ref:`Rate` profile. - -RoundingMethod - Method used to round during float operations. Possible values: - - **\*up** - Upsize towards next integer value (ie: 0.11 -> 0.2) - - **\*middle** - Round at middle towards next integer value (ie: 0.11 -> 0.1, 0.16 -> 0.2) - - **\*down** - Downsize towards next integer (ie: 0.19 -> 0.1). - -RoundingDecimals - Number of decimals after the comma to use when rounding floats. - -MaxCost - Maximum cost threshold for an event or session. - -MaxCostStrategy - The strategy used once the maximum cost is reached. Can be one of following options: - - **\*free** - Anything above *MaxCost* is not charged - - **\*disconnect** - The session is disconnected forcefully. - - -.. _Destination: - -Destination -^^^^^^^^^^^ - -Groups list of prefixes under one *Destination* profile. Configured via the following parameters: - -ID - The tag uniquely idenfying each Destination profile. There can be multiple entries grouped by the same ID. - -Prefix - One prefix entry (can be also full destination string). - - -.. _Rate: - -Rate -^^^^ - -A *Rate* profile will contain all the individual rates applied for a matching event/session on a time interval. Configured via the following parameters: - -ID - The tag uniquely idenfying each *Rate* profile. There can be multiple entries grouped by the same ID. - -ConnectFee - One time charge applying when the session is opened. - -Rate - The rate applied for one rating increment. - -RateUnit - The unit raported to the usage received. - -RateIncrement - Splits the usage received into smaller increments. - -GroupIntervalStart - Activates the rate at specific usage within the event. - - -.. _Timing: - -Timing -^^^^^^ - -A *Timing* profile is giving time awarness to an event. Configured via the following parameters: - -ID - The tag uniquely idenfying each *Timing* profile. - -Years - List of years to match within the event. Defaults to the catch-all meta: *\*any*. - -Months - List of months to match within the event. Defaults to the catch-all meta: *\*any*. - -MonthDays - List of month days to match within the event. Defaults to the catch-all meta: *\*any*. - -WeekDays - List of week days to match within the event as integer values. Special case for *Sunday* which matches for both 0 and 7. - -Time - The exact time to match (mostly as time start). Defined in the format: *hh:mm:ss* - - - -.. Note:: Due to optimization, CGRateS encapsulates and stores the rating information into just three objects: *Destinations*, *RatingProfiles* and *RatingPlan* (composed out of *RatingPlan*, *DestinationRate*, *Rate* and *Timing* objects). - - - -.. _Accounting: - -Accounting ----------- - -Accounting is the process of charging an *Account* on it's *Balances*. The amount of charges is decided by either internal configuration of each *Balance* or calculated by :ref:`Rating`. - - -.. _Account: - -Account -^^^^^^^ - -Is the central unit of the :ref:`Accounting`. It contains the following fields: - - -Tenant - The tenant to whom the account belogs. - -ID - The Account identifier which should be unique within a tenant. This should match with the event's *Account* field. - -BalanceMap - The pool of :ref:`Balances ` indexed by type. - -UnitCounters - Usage counters which are set out of thresholds defined in :ref:`ActionTriggers ` - -AllowNegative - Allows authorization independent on credit available. - -UpdateTime - Set on each update in DataDB. - -Disabled - Marks the account as disabled, making it invisible to charging. - - - -.. _Balance: - -Balance -^^^^^^^ - - -Is the unit container (wallet/bundle) of the :ref:`Account`. There can be unlimited number of *Balances* within one :ref:`Account`, groupped by their type. - -The following *BalanceTypes* are supported: - -\*voice - Coupled with voice calls, represents nanosecond units. - -\*data - Coupled with data sessions, represents units of data (virtual units). - -\*sms - Coupled with SMS events, represents number of SMS units. - -\*mms - Coupled with MMS events, represents number of MMS units. - -\*generic - Matching all types of events after specific ones, representing generic units (i.e., for each x \*voice minutes, y \*sms units, and z \*data units will have their respective usage) - -\*monetary - Matching all types of events after specific ones, representing monetary units (can be interpreted as virtual currency). - - - -A *Balance* is made of the following fields: - -Uuid - Unique identifier within the system (unique hash generated for each *Balance*). - -ID - Idendificator configurable by the administrator. It is unique within an :ref:`Account`. - -Value - The *Balance's* value. - -ExpirationDate - The expiration time of this *Balance* - -Weight - Used to prioritize matching balances for an event. The higher the *Weight*, the more priority for the *Balance*. - -DestinationIDs - List of :ref:`Destination` profiles this *Balance* will match for, considering event's *Destination* field. - -RatingSubject - The rating subject this balance will use when calculating the cost. - - This will match within :ref:`RatingProfile`. If the rating profile starts with character *\**, special cost will apply, without interogating :ref:`Rating` for it. The following *metas* are available: - - **\*zero$xdur** - A *\*zero* followed by a duration will be the equivalent of 0 cost, charged in increments of *x* duration (ie: *\*zero1m*. - - **\*any** - Points out to default (same as undefined). Defaults are set to *\*zero1s* for voice and *\*zero1ns* for everything else. - -Categories - List of event *Category* fields this *Balance* will match for. - -SharedGroup - Pointing towards a shared balance ID. - -TimingIDs - List of :ref:`Timing` profiles this *Balance* will match for, considering event's *AnswerTime* field. - -Disabled - Makes the *Balance* invisible to charging. - -Factors - Used in case of of *\*generic* *BalanceType* to specify the conversion factors for different type of events. - -Blocker - A *blocking Balance* will prevent processing further matching balances when empty. - - - -.. _ActionTrigger: - -ActionTrigger -------------- - -Is a mechanism to monitor Balance values during live operation and react on changes based on configured thresholds and actions. - -An *ActionTrigger* is made of the following attributes: - -ID - Identifier given by the administrator - -UniqueID - Per threshold identifier - -ThresholdType - Type of threshold configured. The following types are available: - - **\*min_balance** - Matches when the :ref:`Balance` value is smaller. - - **\*max_balance** - Matches when the :ref:`Balance` value is higher. - - **\*balance_expired** - Matches if :ref:`Balance` is expired. - - **\*min_event_counter** - Consider smaller aggregated values within event based on filters. - - **\*max_event_counter** - Consider higher aggregated values within event based on filters. - - **\*min_balance_counter** - Consider smaller :ref:`Balance` aggregated value based on filters. - - **\*max_balance_counter** - Consider higher :ref:`Balance` aggregated value based on filters. - -ThresholdValue - The value of the threshold to match. - -Recurrent - Execute *ActionTrigger* multiple times. - -MinSleep - Sleep in between executes. - -ExpirationDate - Time when the *ActionTrigger* will expire. - -ActivationDate - Only consider the *ActionTrigger* starting with this time. - -Balance - Filters selecting the balance/-s to monitor. - -Weight - Priority in the chain. Higher values have more priority. - -ActionsID - :ref:`Action` profile to call on match. - -MinQueuedItems - Avoid false positives if the number of items hit is smaller than this. - -Executed - Marks the *ActionTrigger* as executed. - -LastExecutionTime - Time when the *ActionTrigger* was executed last. - - -.. _Action: - -Action ------- - -Actions are routines executed on demand (ie. by one of the three subsystems: :ref:`SchedulerS`, :ref:`ThresholdS` or :ref:`ActionTriggers `) or called by API by external scripts. - -An \*Action has the following parameters: - -ID - *ActionSet* identifier. - -ActionType - The type of action to execute. Can be one of the following: - - **\*log** - Creates an entry in the log (either syslog or stdout). - - **\*reset_triggers** - Reset the matching :ref:`ActionTriggers ` - - **\*cdrlog** - Creates a CDR entry (used for example when automatically charging DIDs). The content of the generated CDR entry can be customized within a special template which can be passed in *ExtraParameters* of the *Action*. - - **\*set_recurrent** - Set the recurrent flag on the matching :ref:`ActionTriggers `. - - **\*unset_recurrent** - Unset the recurrent flag on the matching :ref:`ActionTriggers `. - - **\*allow_negative** - Set the *AllowNegative* flag on the :ref:`Balance`. - - **\*deny_negative** - Unset the *AllowNegative* flag on the :ref:`Balance`. - - **\*reset_account** - Re-init the :ref:`Account` by setting all of it's :ref:`Balance's Value ` to 0 and re-initialize counters and :ref:`ActionTriggers `. - - **\*topup_reset** - Reset the :ref:`Balance` matching the filters to 0 and add the top-up value to it. - - **\*topup** - Add the value to the :ref:`Balance` matching the filters. - - **\*debit_reset** - Reset the :ref:`Balance` matching the filters to 0 and debit the value from it. - - **\*debit** - Debit the value from the :ref:`Balance` matching the filters. - - **\*reset_counters** - Reset the :ref:`Balance` counters (used by :ref:`ActionTriggers `). - - **\*enable_account** - Unset the :ref:`Account` *Disabled* flag. - - **\*disable_account** - Set the :ref:`Account` *Disabled* flag. - - **\*http_post** - Post data over HTTP protocol to configured HTTP URL. - - **\*http_post_async** - Post data over HTTP protocol to configured HTTP URL without waiting for the feedback of the remote server. - - **\*mail_async** - Send data to configured email address in extra parameters. - - **\*set_ddestinations** - Update list of prefixes for destination ID starting with: *\*ddc* out of StatS. Used in scenarios like autodiscovery of homezone prefixes. - - **\*remove_account** - Removes the matching account from the system. - - **\*remove_balance** - Removes the matching :ref:`Balances ` out of the :ref:`Account`. - - **\*set_balance** - Set the matching balances. - - **\*transfer_monetary_default** - Transfer the value of the matching balances into the *\*default* one. - - **\*cgr_rpc** - Call a CGRateS API over RPC connection. The API call will be defined as template within the *ExtraParameters*. - - **\*topup_zero_negative** - Set the the matching balances to topup value if they are negative. - - **\*set_expiry** - Set the *ExpirationDate* for the matching balances. - - **\*publish_account** - Publish the :ref:`Account` and each individual :ref:`Balance` to the :ref:`ThresholdS`. - - **\*publish_balance** - Publish the matching :ref:`Balances ` to the :ref:`ThresholdS`. - - **\*remove_session_costs** - Removes entries from the :ref:`StorDB.session_costs ` table. Additional filters can be specified within the *ExtraParameters*. - - **\*remove_expired** - Removes expired balances of type matching the filter. - - **\*reset_account_cdr** - Creates the account out of last *CDR* saved in :ref:`StorDB` matching the account details in the filter. The *CDR* should contain *AccountSummary* within it's *CostDetails*. - - -Configuration -------------- - -The *RALs* is configured within **rals** section from :ref:`JSON configuration ` via the following parameters: - -enabled - Will enable starting of the service. Possible values: . - -thresholds_conns - Connections towards :ref:`ThresholdS` component, used for :ref:`Account` notifications. - -stats_conns - Connections towards :ref:`StatS` component, used for :ref:`Account` ralated metrics. - -caches_conns - Connections towards :ref:`CacheS` used for data reloads. - -rp_subject_prefix_matching - Enabling prefix matching for rating *Subject* field. - -remove_expired - Enable automatic removal of expired :ref:`Balances `. - -max_computed_usage - Prevent usage rating calculations per type of records to avoid memory overload. - -max_increments - The maximum number of increments generated as part of rating calculations. - -balance_rating_subject - Default rating subject for balances, per balance type. - - -Use cases ---------- - -* Classic rater calculating costs for events using :ref:`Rating`. -* Account bundles for fixed and mobile networks (xG) using :ref:`Accounting`. -* Volume discounts in real-time using :ref:`Accounting`. -* Fraud detection with automatic mitigation using :ref:`ActionTriggers `. \ No newline at end of file diff --git a/docs/rates.rst b/docs/rates.rst new file mode 100644 index 000000000..e78b6a955 --- /dev/null +++ b/docs/rates.rst @@ -0,0 +1,5 @@ +RateS +===== + + +TBD diff --git a/docs/ratinglogic.rst b/docs/ratinglogic.rst deleted file mode 100644 index d07d7678d..000000000 --- a/docs/ratinglogic.rst +++ /dev/null @@ -1,128 +0,0 @@ -Rating logic -============ - -Let's start with the most important function: finding the cost of a certain call. - -The call information comes to CGRateS having the following vital information like subject, destination, start time and end time. The engine will look up the database for the rates applicable to the received subject and destination. - -:: - - type CallDescriptor struct { - Direction - ToR - Tenant, Subject, Account, Destination - TimeStart, TimeEnd - LoopIndex // indicates the position of this segment in a cost request loop - CallDuration // the call duration so far (partial or final) - FallbackSubject // the subject to check for destination if not found on primary subject - RatingPlans - } - -When the session manager receives a call start event it will first check if the call is prepaid or postpaid. If the call is postpaid than the cost will be determined only once at the end of the call but if the call is prepaid there will be a debit operation every X seconds (X is configurable). - -In prepaid case the rating engine will have to set rates for multiple parts of the call so the *LoopIndex* in the above structure will help the engine add the connect fee only to the first part. The *CallDuration* attribute is used to set the right rate in case the rates database has different costs for the different parts of a call e.g. first minute is more expensive (we can also define the minimum rate unit). - -The **FallbackSubject** is used in case the initial call subject is not found in the rating profiles list (more on this later in this chapter). - - -What are the activation periods? - - At one given time there is a set of prices that applay to different time intervals when a call can be made. In CGRateS one can define multiple such sets that will become active in various point of time called activation time. The activation period is a structure describing different prices for a call on different intervals of time. This structure has an activation time, which specifies the active prices for a period of time by one ore more (usually more than one) rate intervals. - -:: - - type RateInterval struct { - Years - Months - MonthDays - WeekDays - StartTime, EndTime - Weight, ConnectFee - Prices - RoundingMethod - RoundingDecimals - } - - type Price struct { - GroupIntervalStart - Value - RateIncrement - RateUnit - } - - -An **RateInterval** specifies the Month, the MonthDay, the WeekDays, the StartTime and the EndTime when the RateInterval's price profile is in effect. - -:Example: The RateInterval {"Month": [1], "WeekDays":[1,2,3,4,5], "StartTime":"18:00:00"} specifies the *Price* for the first month of each year from Monday to Friday starting 18:00. Most structure elements are optional and they can be combined in any way it makes sense. If an element is omitted it means it is zero or any. - -The *ConnectFee* specifies the connection price for the call if this interval is the first one of the call. - -The *Weight* will establish which interval will set the price for a call segment if more then one applies to it. - -:Example: Let's assume there is an interval defining price for the weekdays and another interval that defines a special holiday rates. As that holiday is also one of the regular weekdays than both intervals are applicable to a call made on that day so the interval with the smaller Weight will give the price for the call in question. If both intervals have the same Weight than the interval with the smaller price wins. It is, however, a good practice to set the Weight for the defined intervals. - -The *RoundingMethod* and the *RoundingDecimals* will adjust the price using the specified function and number of decimals (more on this in the rates definition chapter). - -The **Price** structure defines the start (*GroupIntervalStart*) of a section of a call with a specified rate *Value* per *RateUnit* diving and rounding the section in *RateIncrement* subsections. - -So when there is a need to define new sets of prices just define new RatingPlans with the activation time set to the moment when it becomes active. - -Let's get back to the engine. When a GetCost or Debit call comes to the engine it will try to match the best rating profile for the given *Direction*, *Tenant*, *ToR* and *Subject* using the longest *Subject* prefix method or using the *FallbackSubject* if not found. The rating profile contains the activation periods that might apply to the call in question. - -At this point in rating process the engine will start splitting the call into various time spans using the following criterias: - -1. Minute Balances: first it will handle the call information to the originator user acount to be split by available minute balances. If the user has free or special price minutes for the call destination they will be consumed by the call. - -2. Activation periods: if there were not enough special price minutes available than the engine will check if the call spans over multiple activation periods (the call starts in initial rates period and continues in another). - -3. RateIntervals: for each activation period that apply to the call the engine will select the best rate intervals that apply. - -:: - - type TimeSpan struct { - TimeStart, TimeEnd - Cost - RatingPlan - RateInterval - MinuteInfo - CallDuration // the call duration so far till TimeEnd - } - - -The result of this splitting will be a list of *TimeSpan* structures each having attached the MinuteInfo or the RateInterval that gave the price for it. The *CallDuration* attribute will select the right *Price* from the *RateInterval* *Prices* list. The final cost for the call will be the sum of the prices of these times spans plus the *ConnectionFee* from the first time span of the call. - -User balances -------------- - -The user account contains a map of various balances like money, sms, internet traffic, internet time, etc. Each of these lists contains one or more Balance structure that have a wheight and a possible expiration date. - -:: - - type UserBalance struct { - Type // prepaid-postpaid - BalanceMap - UnitCounters - ActionTriggers - } - - type Balance struct { - Value - ExpirationDate - Weight - } - -CGRateS treats special priced or free minutes different from the rest of balances. They will be called free minutes further on but they can have a special price. - -The free minutes must be handled a little differently because usually they are grouped by specific destinations (e.g. national minutes, ore minutes in the same network). So they are grouped in balances and when a call is made the engine checks all applicable balances to consume minutes according to that call. - -When a call cost needs to be debited these minute balances will be queried for call destination first. If the user has special minutes for the specific destination those minutes will be consumed according to call duration. - -A standard debit operation consist of selecting a certaing balance type and taking all balances from that list in the weight order to be debited till the total amount is consumed. - -CGRateS provide api for adding/substracting user's money credit. The prepaid and postpaid are uniformly treated except that the prepaid is checked to be always greater than zero and the postpaid can go bellow zero. - -Both prepaid and postpaid can have a limited number of free SMS and Internet traffic per month and this budget is replenished at regular intervals based on the user tariff plan or as the user buys more free SMSs (for example). - -Another special feature allows user to get a better price as the call volume increases each month. This can be added on one ore more thresholds so the more he/she talks the cheaper the calls. - -Finally bonuses can be rewarded to users who received a certain volume of calls. diff --git a/docs/schedulers.rst b/docs/schedulers.rst deleted file mode 100644 index 4962387b5..000000000 --- a/docs/schedulers.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. _schedulers: - -SchedulerS -========== - - -TBD \ No newline at end of file diff --git a/docs/tut_asterisk.rst b/docs/tut_asterisk.rst deleted file mode 100644 index f8743f007..000000000 --- a/docs/tut_asterisk.rst +++ /dev/null @@ -1,17 +0,0 @@ -Asterisk_ Integration Tutorials -=============================== - -In these tutorials we exemplify a few cases of integration between Asterisk_ and CGRateS_. We start with common steps, installation and postinstall processes, then we dive into particular configurations, depending on the case we run. - - -.. toctree:: - :maxdepth: 2 - - tut_asterisk_installs - tut_jitsi_installs - tut_asterisk_ari - tut_cgrates_usage - -.. _Asterisk: http://www.asterisk.org/ -.. _CGRateS: http://www.cgrates.org/ - diff --git a/docs/tut_asterisk_ari.rst b/docs/tut_asterisk_ari.rst deleted file mode 100644 index ef05230bd..000000000 --- a/docs/tut_asterisk_ari.rst +++ /dev/null @@ -1,62 +0,0 @@ -Asterisk_ interaction via *ARI* -=========================================== - -Scenario --------- - -- Asterisk out of *basic-pbx* configuration samples. - - - Considering the following users: 1001-prepaid, 1002-postpaid, 1003-pseudoprepaid, 1004-rated, 1007-rated. - -- **CGRateS** with following components: - - - CGR-SM started as translator between Asterisk_ and **CGR-RALs** for both authorization events (prepaid/pseudoprepaid) as well as postpaid ones. - - CGR-CDRS component processing raw CDRs from CGR-SM component and storing them inside CGR StorDB. - - CGR-CDRE exporting rated CDRs from CGR StorDB (export path: */tmp*). - - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*). - - -Starting Asterisk_ with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/asterisk_ari/asterisk/etc/init.d/asterisk start - - -To verify that Asterisk_ is running we run the console command: - -:: - - asterisk -r -s /tmp/cgr_asterisk_ari/asterisk/run/asterisk.ctl - - ari show status - - -Starting **CGRateS** with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/asterisk_ari/cgrates/etc/init.d/cgrates start - -Make sure that cgrates is running - -:: - - cgr-console status - - -CDR processing --------------- - -At the end of each call Asterisk_ will generate an CDR event and due to automatic handler registration built in **CGRateS-SM** component, this will be directed towards the port configured inside *cgrates.json*. This event will reach inside **CGRateS** through the *SM* component (close to real-time). Once in-there it will be instantly rated and be ready for export. - - -**CGRateS** Usage ------------------ - -Since it is common to most of the tutorials, the example for **CGRateS** usage is provided in a separate page `here `_ - - -.. _Asterisk: http://www.asterisk.org/ diff --git a/docs/tut_asterisk_installs.rst b/docs/tut_asterisk_installs.rst deleted file mode 100644 index 29654ed0b..000000000 --- a/docs/tut_asterisk_installs.rst +++ /dev/null @@ -1,33 +0,0 @@ -Software installation -===================== - -We have chosen Debian Jessie as operating system. - -CGRateS --------- - -**CGRateS** can be installed using the instructions found :ref:`here`. - - -Asterisk_ ---------- - -We got Asterisk14_ installed via following commands: -:: - - apt-get install autoconf build-essential openssl libssl-dev libsrtp-dev libxml2-dev libncurses5-dev uuid-dev sqlite3 libsqlite3-dev pkg-config libedit-dev - cd /tmp - wget --no-check-certificate https://raw.githubusercontent.com/asterisk/third-party/master/pjproject/2.7.2/pjproject-2.7.2.tar.bz2 - wget --no-check-certificate https://raw.githubusercontent.com/asterisk/third-party/master/jansson/2.11/jansson-2.11.tar.bz2 - wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz - tar xzvf asterisk-16-current.tar.gz - cd asterisk-16.1.0/ - ./configure --with-jansson-bundled - make - make install - adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "Asterisk" asterisk || true - - -Once installed we proceed with loading the configuration out of specific tutorial cases bellow. - -.. _Asterisk14: http://www.asterisk.org/ diff --git a/docs/tut_cgrates_usage.rst b/docs/tut_cgrates_usage.rst deleted file mode 100644 index 9f51536f6..000000000 --- a/docs/tut_cgrates_usage.rst +++ /dev/null @@ -1,107 +0,0 @@ -**CGRateS** Usage -================= - -Loading **CGRateS** Tariff Plans --------------------------------- - -Before proceeding to this step, you should have **CGRateS** installed and -started with custom configuration, depending on the tutorial you have followed. - -For our tutorial we load again prepared data out of shared folder, containing -following rules: - -- Configure 3 destinations (1002, 1003 and 10 used as catch all rule). -- As rating we configure the following: - - - Rate id: *RT_10CNT* with connect fee of 20cents, 10cents per minute for the first 60s in 60s increments followed by 5cents per minute in 1s increments. - - Rate id: *RT_20CNT* with connect fee of 40cents, 20cents per minute for the first 60s in 60s increments, followed by 10 cents per minute charged in 1s increments. - - Rate id: *RT_40CNT* with connect fee of 80cents, 40cents per minute for the first 60s in 60s increments, follwed by 20cents per minute charged in 10s increments. - - Rate id: *RT_1CNT* having no connect fee and a rate of 1 cent per minute, chargeable in 1 minute increments. - - Rate id: *RT_1CNT_PER_SEC* having no connect fee and a rate of 1 cent per second, chargeable in 1 second increments. - -- Accounting part will have following configured: - - Create 3 accounts: 1001, 1002, 1003. - - 1001, 1002 will receive 10units of *\*monetary* balance. - -:: - - cgr-loader -verbose -path=/usr/share/cgrates/tariffplans/tutorial - -To verify that all actions successfully performed, we use following *cgr-console* commands: - -- Make sure all our balances were topped-up: - - :: - - cgr-console 'accounts Tenant="cgrates.org" AccountIds=["1001"]' - cgr-console 'accounts Tenant="cgrates.org" AccountIds=["1002"]' - -- Query call costs so we can see our calls will have expected costs (final cost will result as sum of *ConnectFee* and *Cost* fields): - - :: - - cgr-console 'cost Category="call" Tenant="cgrates.org" Subject="1001" Destination="1002" AnswerTime="2014-08-04T13:00:00Z" Usage="20s"' - cgr-console 'cost Category="call" Tenant="cgrates.org" Subject="1001" Destination="1002" AnswerTime="2014-08-04T13:00:00Z" Usage="1m25s"' - cgr-console 'cost Category="call" Tenant="cgrates.org" Subject="1001" Destination="1003" AnswerTime="2014-08-04T13:00:00Z" Usage="20s"' - - -Test calls ----------- - - -1001 -> 1002 -~~~~~~~~~~~~ - -Since the user 1001 is marked as *prepaid* inside the telecom switch, calling between 1001 and 1002 should generate pre-auth and prepaid debits which can be checked with *get_account* command integrated within *cgr-console* tool. Charging will be done based on time of day as described in the tariff plan definition above. - -*Note*: An important particularity to note here is the ability of **CGRateS** SessionManager to refund units booked in advance (eg: if debit occurs every 10s and rate increments are set to 1s, the SessionManager will be smart enough to refund pre-booked credits for calls stopped in the middle of debit interval). - -Check that 1001 balance is properly deducted, during the call, and moreover considering that general balance has priority over the shared one debits for this call should take place at first out of general balance. - -:: - - cgr-console 'accounts Tenant="cgrates.org" AccountIds=["1001"]' - - -1002 -> 1001 -~~~~~~~~~~~~ - -The user 1002 is marked as *postpaid* inside the telecom switch hence his calls will be debited at the end of the call instead of during a call and his balance will be able to go on negative without influencing his new calls (no pre-auth). - -To check that we had debits we use again console command, this time not during the call but at the end of it: - -:: - - cgr-console 'accounts Tenant="cgrates.org" AccountIds=["1002"]' - - -1001 -> 1003 -~~~~~~~~~~~~ -The user 1001 call user 1003 and after 12 seconds the call will be disconnected. - -CDR Exporting -------------- - -Once the CDRs are mediated, they are available to be exported. One can use available RPC APIs for that or directly call exports from console: - -:: - - cgr-console 'cdrs_export CdrFormat="csv" ExportPath="/tmp"' - - -Fraud detection ---------------- - -Since we have configured some action triggers (more than 20 units of balance topped-up or less than 2 and more than 5 units spent on *FS_USERS* we should be notified over syslog when things like unexpected events happen (eg: fraud with more than 20 units topped-up). Most important is the monitor for 100 units topped-up which will also trigger an account disable together with killing it's calls if prepaid debits are used. - -To verify this mechanism simply add some random units into one account's balance: - -:: - - cgr-console 'balance_set Tenant="cgrates.org" Account="1003" Direction="*out" Value=23' - tail -f /var/log/syslog -n 20 - - cgr-console 'balance_set Tenant="cgrates.org" Account="1001" Direction="*out" Value=101' - tail -f /var/log/syslog -n 20 - -On the CDRs side we will be able to integrate CdrStats monitors as part of our Fraud Detection system (eg: the increase of average cost for 1001 and 1002 accounts will signal us abnormalities, hence we will be notified via syslog). diff --git a/docs/tut_freeswitch.rst b/docs/tut_freeswitch.rst deleted file mode 100644 index 8b0fcfaf3..000000000 --- a/docs/tut_freeswitch.rst +++ /dev/null @@ -1,16 +0,0 @@ -FreeSWITCH Integration Tutorials -================================ - -In these tutorials we exemplify a few cases of integration between FreeSWITCH_ and **CGRateS**. We start with common steps, installation and postinstall processes, then we dive into particular configurations. - - -.. toctree:: - :maxdepth: 2 - - tut_freeswitch_installs - tut_jitsi_installs - tut_freeswitch_json - tut_cgrates_usage - -.. _FreeSWITCH: https://freeswitch.com// - diff --git a/docs/tut_freeswitch_installs.rst b/docs/tut_freeswitch_installs.rst deleted file mode 100644 index 849442842..000000000 --- a/docs/tut_freeswitch_installs.rst +++ /dev/null @@ -1,38 +0,0 @@ -Software installation -===================== - -As operating system we have chosen Debian Jessie, since all the software components we use provide packaging for it. - -CGRateS --------- - -**CGRateS** can be installed using the instructions found :ref:`here`. - - - - -FreeSWITCH_ ------------ - -More information regarding the installation of FreeSWITCH_ on Debian can be found on it's official `installation wiki `_. - -Firstly, in order to install FreeSWITCH_, the authentication is required by creating a SignalWire Personal Access Token. Before instalation, it's needed to generate the personal token and this cand be found on :ref:`SignalWire official wiki in creating a personal token`. - -To get FreeSWITCH_ installed and configured, we have choosen the simplest method, out of *vanilla* packages, plus one individual module we need: *mod-json-cdr*. - -We will install FreeSWITCH_ via following commands: - -:: - TOKEN=YOURSIGNALWIRETOKEN # here insert your SignalWire Personal Acces Token - wget --http-user=signalwire --http-password=$TOKEN -O /usr/share/keyrings/signalwire-freeswitch-repo.gpg https://freeswitch.signalwire.com/repo/deb/debian-release/signalwire-freeswitch-repo.gpg - echo "machine freeswitch.signalwire.com login signalwire password $TOKEN" > /etc/apt/auth.conf - chmod 600 /etc/apt/auth.conf - echo "deb [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list - echo "deb-src [signed-by=/usr/share/keyrings/signalwire-freeswitch-repo.gpg] https://freeswitch.signalwire.com/repo/deb/debian-release/ `lsb_release -sc` main" >> /etc/apt/sources.list.d/freeswitch.list - - # if /etc/freeswitch does not exist, the standard vanilla configuration is deployed - apt-get update && apt-get install -y freeswitch-meta-allapt-get update && apt-get install -y freeswitch-meta-all - -Once installed, we will proceed with loading the configuration out of specific tutorial cases bellow. - -.. _FreeSWITCH: https://freeswitch.com// diff --git a/docs/tut_freeswitch_json.rst b/docs/tut_freeswitch_json.rst deleted file mode 100644 index 4ead41fe1..000000000 --- a/docs/tut_freeswitch_json.rst +++ /dev/null @@ -1,66 +0,0 @@ -FreeSWITCH_ generating *http-json* CDRs -======================================= - -Scenario --------- - -- FreeSWITCH with *vanilla* configuration adding *mod_json_cdr* for CDR generation. - - - Modified following users (with configs in *etc/freeswitch/directory/default*): 1001-prepaid, 1002-postpaid, 1003-pseudoprepaid, 1004-rated, 1006-prepaid, 1007-rated. - - Have added inside default dialplan CGR own extensions just before routing towards users (*etc/freeswitch/dialplan/default.xml*). - - FreeSWITCH configured to generate default *http-json* CDRs. - -- **CGRateS** with following components: - - - CGR-SM started as prepaid controller, with debits taking place at 5s intervals. - - CGR-CDRS component receiving raw CDRs from FreeSWITCH, storing them and attaching costs inside CGR StorDB. - - CGR-CDRE exporting processed CDRs from CGR StorDB (export path: */tmp*). - - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*). - - -Starting FreeSWITCH_ with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/fs_evsock/freeswitch/etc/init.d/freeswitch start - -To verify that FreeSWITCH_ is running we run the console command: - -:: - - fs_cli -x status - - -Starting **CGRateS** with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/fs_evsock/cgrates/etc/init.d/cgrates start - -Check that cgrates is running - -:: - - cgr-console status - - -CDR processing --------------- - -At the end of each call FreeSWITCH_ will issue a http post with the CDR. This will reach inside **CGRateS** through the *CDRS* component (close to real-time). Once in-there it will be instantly rated and it is ready to be exported: - -:: - - cgr-console 'cdrs_export CdrFormat="csv" ExportPath="/tmp"' - - -**CGRateS** Usage ------------------ - -Since it is common to most of the tutorials, the example for **CGRateS** usage is provided in a separate page `here `_ - - -.. _FreeSWITCH: https://freeswitch.com// -.. _Jitsi: https://jitsi.org/ diff --git a/docs/tut_jitsi_installs.rst b/docs/tut_jitsi_installs.rst deleted file mode 100644 index 87a484d5c..000000000 --- a/docs/tut_jitsi_installs.rst +++ /dev/null @@ -1,6 +0,0 @@ -SIP UA - Jitsi_ ---------------- - -On our ubuntu desktop host, we have installed Jitsi_ to be used as SIP UA, out of stable provided packages on `Jitsi download `_ and had Jitsi_ configured with 4 accounts: 1001/CGRateS.org, 1002/CGRateS.org, 1003/CGRateS.org and 1004/CGRateS.org. - -.. _Jitsi: https://jitsi.org/ \ No newline at end of file diff --git a/docs/tut_kamailio.rst b/docs/tut_kamailio.rst deleted file mode 100644 index 18efca663..000000000 --- a/docs/tut_kamailio.rst +++ /dev/null @@ -1,17 +0,0 @@ -Kamailio_ Integration Tutorials -=============================== - -In these tutorials we exemplify a few cases of integration between Kamailio_ and CGRateS_. We start with common steps, installation and postinstall processes, then we dive into particular configurations, depending on the case we run. - - -.. toctree:: - :maxdepth: 2 - - tut_kamailio_installs - tut_jitsi_installs - tut_kamailio_evapi - tut_cgrates_usage - -.. _Kamailio: https://www.kamailio.org/w/ -.. _CGRateS: http://www.cgrates.org/ - diff --git a/docs/tut_kamailio_evapi.rst b/docs/tut_kamailio_evapi.rst deleted file mode 100644 index 4f4738e52..000000000 --- a/docs/tut_kamailio_evapi.rst +++ /dev/null @@ -1,59 +0,0 @@ -Kamailio_ interaction via *evapi* module -========================================= - -Scenario --------- - - - Kamailio default configuration modified for **CGRateS** interaction. For script maintainability and simplicity we have separated CGRateS specific routes in *kamailio-cgrates.cfg* file which is included in main *kamailio.cfg* via include directive. - - - Considering the following users (with configs hardcoded in the *kamailio.cfg* configuration script and loaded in htable): 1001-prepaid, 1002-postpaid, 1003-pseudoprepaid, 1004-rated, 1005-rated, 1006-prepaid, 1007-prepaid. - -- **CGRateS** with following components: - - - CGR-SM started as translator between Kamailio_ and CGR-Rater for both authorization events as well as accounting ones. - - CGR-CDRS component processing raw CDRs from CGR-SM component and storing them inside CGR StorDB. - - CGR-CDRE exporting rated CDRs from CGR StorDB (export path: */tmp*). - - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*). - - -Starting Kamailio_ with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/kamevapi/kamailio/etc/init.d/kamailio start - -To verify that Kamailio_ is running we run the console command: - -:: - - kamctl moni - - -Starting **CGRateS** with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/kamevapi/cgrates/etc/init.d/cgrates start - -Make sure that cgrates is running - -:: - - cgr-console status - - -CDR processing --------------- - -At the end of each call Kamailio_ will generate an CDR event via *evapi* and this will be directed towards the port configured inside *cgrates.json*. This event will reach inside **CGRateS** through the *SM* component (close to real-time). Once in-there it will be instantly rated and be ready for export. - - -**CGRateS** Usage ------------------ - -Since it is common to most of the tutorials, the example for **CGRateS** usage is provided in a separate page `here `_ - - -.. _Kamailio: https://www.kamailio.org/w/ diff --git a/docs/tut_kamailio_installs.rst b/docs/tut_kamailio_installs.rst deleted file mode 100644 index 3c6bb40b9..000000000 --- a/docs/tut_kamailio_installs.rst +++ /dev/null @@ -1,26 +0,0 @@ -Software installation -===================== - -We have chosen Debian Jessie as operating system, since all the software components we use provide packaging for it. - -CGRateS --------- - -**CGRateS** can be installed using the instructions found :ref:`here`. - - - -Kamailio_ ---------- - -We got Kamailio_ installed via following commands: -:: - - wget -O- http://deb.kamailio.org/kamailiodebkey.gpg | sudo apt-key add - - echo "deb http://deb.kamailio.org/kamailio56 stretch main" > /etc/apt/sources.list.d/kamailio.list - apt-get update - apt-get install kamailio kamailio-extra-modules kamailio-json-modules - -Once installed we proceed with loading the configuration out of specific tutorial cases bellow. - -.. _Kamailio: https://www.kamailio.org/w/ diff --git a/docs/tut_opensips.rst b/docs/tut_opensips.rst deleted file mode 100644 index 97a1a3b10..000000000 --- a/docs/tut_opensips.rst +++ /dev/null @@ -1,17 +0,0 @@ -OpenSIPS_ Integration Tutorials -=============================== - -In these tutorials we exemplify a few cases of integration between OpenSIPS_ and CGRateS_. We start with common steps, installation and postinstall processes, then we dive into particular configurations, depending on the case we run. - - -.. toctree:: - :maxdepth: 2 - - tut_opensips_installs - tut_jitsi_installs - tut_opensips_event - tut_cgrates_usage - -.. _OpenSIPS: https://www.opensips.org/ -.. _CGRateS: http://www.cgrates.org/ - diff --git a/docs/tut_opensips_event.rst b/docs/tut_opensips_event.rst deleted file mode 100644 index 04fae43ce..000000000 --- a/docs/tut_opensips_event.rst +++ /dev/null @@ -1,60 +0,0 @@ -OpenSIPS_ interaction via *event_datagram* -=========================================== - -Scenario --------- - -- OpenSIPS out of *residential* configuration generated. - - - Considering the following users (with configs hardcoded in the *opensips.cfg* configuration script): 1002-postpaid, 1003-pseudoprepaid, 1004-rated, 1007-rated. - - For simplicity we configure no authentication (WARNING: Not for production usage). - -- **CGRateS** with following components: - - - CGR-SM started as translator between OpenSIPS_ and **cgr-rater** for both authorization events (pseudoprepaid) as well as CDR ones. - - CGR-CDRS component processing raw CDRs from CGR-SM component and storing them inside CGR StorDB. - - CGR-CDRE exporting rated CDRs from CGR StorDB (export path: */tmp*). - - CGR-History component keeping the archive of the rates modifications (path browsable with git client at */tmp/cgr_history*). - - -Starting OpenSIPS_ with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/osips_native/opensips/etc/init.d/opensips start - -To verify that OpenSIPS_ is running we run the console command: - -:: - - opensipsctl moni - - -Starting **CGRateS** with custom configuration ----------------------------------------------- - -:: - - /usr/share/cgrates/tutorials/osips_native/cgrates/etc/init.d/cgrates start - -Make sure that cgrates is running - -:: - - cgr-console status - - -CDR processing --------------- - -At the end of each call OpenSIPS_ will generate an CDR event and due to automatic handler registration built in **CGRateS-SM** component, this will be directed towards the port configured inside *cgrates.json*. This event will reach inside **CGRateS** through the *SM* component (close to real-time). Once in-there it will be instantly rated and be ready for export. - - -**CGRateS** Usage ------------------ - -Since it is common to most of the tutorials, the example for **CGRateS** usage is provided in a separate page `here `_ - - -.. _OpenSIPS: https://www.opensips.org/ diff --git a/docs/tut_opensips_installs.rst b/docs/tut_opensips_installs.rst deleted file mode 100644 index c0e5d88e7..000000000 --- a/docs/tut_opensips_installs.rst +++ /dev/null @@ -1,25 +0,0 @@ -Software installation -===================== - -We have chosen Debian Jessie as operating system, since all the software components we use provide packaging for it. - -CGRateS --------- - -**CGRateS** can be installed using the instructions found :ref:`here`. - - -OpenSIPS_ ---------- - -We got OpenSIPS_ installed via following commands: -:: - - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 049AD65B - echo "deb http://apt.opensips.org jessie 2.4-nightly" >/etc/apt/sources.list.d/opensips.list - apt-get update - apt-get install opensips opensips-cgrates-module - -Once installed we proceed with loading the configuration out of specific tutorial cases bellow. - -.. _OpenSIPS: https://www.opensips.org/ diff --git a/docs/tutorial.rst b/docs/tutorial.rst index 2fe838906..86f113481 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -1,6 +1,12 @@ Tutorial ======== +.. warning:: + + **Tutorial Not Available for Version 1.0** + + This tutorial was created for a previous version of CGRateS and is not compatible with version 1.0. + .. contents:: :local: :depth: 3 @@ -512,4 +518,4 @@ On the CDRs side we will be able to integrate CdrStats monitors as part of our F .. _FreeSWITCH: https://freeswitch.com/ .. _Kamailio: https://www.kamailio.org/w/ .. _OpenSIPS: https://opensips.org/ -.. _CGRateS: http://www.cgrates.org/ \ No newline at end of file +.. _CGRateS: http://www.cgrates.org/ diff --git a/docs/tutorials.rst b/docs/tutorials.rst deleted file mode 100644 index 19417bd43..000000000 --- a/docs/tutorials.rst +++ /dev/null @@ -1,10 +0,0 @@ -Tutorials -========= - -.. toctree:: - :maxdepth: 2 - - tut_asterisk - tut_freeswitch - tut_kamailio - tut_opensips