bbfdm/docs/guide/bbfdmd.md
2025-03-18 12:56:15 +01:00

176 lines
5.1 KiB
Markdown

# BBFDM Daemon (`bbfdmd`)
`bbfdmd` daemon creates a data model layer between system resources and exposes TR-181 data model objects over `ubus` for higher-layer application protocols such as [TR-069/CWMP](https://cwmp-data-models.broadband-forum.org/) or [TR-369/USP](https://usp.technology/).
> **Note:** The command outputs shown in this document are examples. The actual output may vary depending on the device and configuration.
---
## Concepts and Workflow
`bbfdmd` daemon collects data models from various microservices and exposes them over `ubus`. It does not handle the data model internally or validate its existence.
### Initialization
1. The `bbfdmd` daemon is started by the `/etc/init.d/bbfdmd` service.
2. During startup, it registers all available microservices listed under `/etc/bbfdm/service/` by parsing each JSON file to extract information such as:
- `service_name`
- Data model paths exposed by the service
- Protocol visibility (CWMP or USP)
3. After processing the JSON files, it registers the supported `bbfdm` ubus methods.
### Handling Ubus Calls
When a `bbfdm` ubus object is called, the daemon determines the handling type based on the ubus method:
- **Asynchronous methods** (`get`, `schema`, `instances`, `operate`)
These methods are executed asynchronously to collect data model output from multiple microservices simultaneously.
- **Synchronous methods** (`set`, `add`, `delete`)
These methods are executed synchronously because they only target a specific microservice.
### Microservice Identification
To identify which microservice to call, `bbfdm`:
- Extracts the requested path from the `"path"` input.
- Retrieves the protocol from `"optional.proto"` input.
- Matches the extracted path and protocol against the list of registered services.
---
## Example Configuration
```json
{
"daemon": {
"enable": "1",
"service_name": "dhcpmngr",
"unified_daemon": false,
"services": [
{
"parent_dm": "Device.",
"object": "DHCPv4"
},
{
"parent_dm": "Device.",
"object": "DHCPv6"
}
],
"config": {
"loglevel": "3"
}
}
}
```
### Explanation
- **service_name** → `dhcpmngr``ubus` service name is `bbfdm.dhcpmngr`
- **Data model paths** → `Device.DHCPv4.` and `Device.DHCPv6.`
- **Protocol** → Both CWMP and USP since no restriction is defined in the JSON file.
Any call to `bbfdm` with the path `Device.DHCPv4.XXXX` or `Device.DHCPv6.XXXX` will be directed to the `dhcpmngr` microservice.
> **Note:** `bbfdmd` does not automatically reload services after updating the configuration. Higher-layer applications (e.g., `icwmp`, `obuspa`) use `bbf.config` to apply updates and reload services.
---
## Input and Output Schema
### Configuration
- `bbfdmd` configuration can be updated using `uci`:
- [bbfdm uci guide](../api/uci/bbfdm.md)
- [bbfdm uci schema](../api/uci/bbfdm.json)
### Ubus Schema
- `bbfdmd` exposes a detailed schema for ubus methods:
- [bbfdm ubus guide](../api/ubus/bbfdm.md)
- [bbfdm ubus schema](../api/ubus/bbfdm.json)
---
## Ubus Methods
### Available Methods
```bash
# ubus -v list bbfdm
'bbfdm' @7971a201
"get":{"path":"String","value":"String","optional":"Table"}
"schema":{"path":"String","value":"String","optional":"Table"}
"instances":{"path":"String","value":"String","optional":"Table"}
"operate":{"path":"String","value":"String","optional":"Table"}
"set":{"path":"String","value":"String","optional":"Table"}
"add":{"path":"String","value":"String","optional":"Table"}
"del":{"path":"String","value":"String","optional":"Table"}
"services":{}
```
### `optional` Table Options
```json
"optional": {"proto": "String", "format": "String"}
```
- **proto** → Specifies the data model protocol (`cwmp`, `usp`). Defaults to the standard model if not provided.
- **format** → Specifies the output format (`raw`, `pretty`). Defaults to `pretty` if not provided.
> **Note:** See the ubus schema document for more details.
---
## Debugging Tools
### Command Line Interface (CLI)
`bbfdmd` provides a CLI to debug the data model using the `-c` option:
```bash
# bbfdmd -h
Usage: bbfdmd [options]
Options:
-c <command input> Run CLI command
-l <loglevel> Log verbosity value (0-7) as per syslog
-h Displays this help
```
If no options are provided, `bbfdmd` starts in daemon mode.
### CLI Commands
```bash
# bbfdmd -c help
Valid commands:
help
get [path-expr]
set [path-expr] [value]
add [object]
del [path-expr]
instances [path-expr]
schema [path-expr]
```
### Debugging Logs
To enable debugging logs, use the following macros:
```c
BBFDM_ERR(MESSAGE, ...)
BBFDM_WARNING(MESSAGE, ...)
BBFDM_INFO(MESSAGE, ...)
BBFDM_DEBUG(MESSAGE, ...)
```
Logs are written to `syslog` based on the `log_level` defined in the `bbfdm` configuration.
To configure the log level, use the `bbfdm.bbfdmd.loglevel` option.
---
## Notes
1. `bbfdmd` does not handle RPC method output.
2. The actual arguments expected by `bbfdmd` may differ from the ones shown in the ubus schema because `bbfdmd` only routes the calls to the correct microservice.
---