iopsys-feed/self-diagnostics
Markus Gothe f67d771ea4 ebtables: Use --concurrent to avoid race conditions.
On GenXOS we've for some time used this to avoid running
into issues with reloading scripts at the same time.

Adding the same functionality to feeds/iopsys.
2024-04-25 05:48:52 +00:00
..
files ebtables: Use --concurrent to avoid race conditions. 2024-04-25 05:48:52 +00:00
Makefile self-diagnostics: Added datamodel schema get 2023-12-13 16:32:10 +05:30
README.md self-diagnostics: substitute possible slashes in report names 2023-11-14 09:10:49 +00:00

Self Test Diagnostics and Reports

Self test diagnostics package provides a set of tools and recipes to run diagnostics/commands and collect logs.

It provides a cli utility called self-diagnostics, which executes recipes defined in json files and collect logs.

# self-diagnostics -h
Generate self diagnostics report

Syntax: /usr/sbin/self-diagnostics [-m|h|l|j]

Options:
  l     List available module(s)
  m     Generate system report of specific module(s)
  j     Enable JSON output
  h     Print this help

It also has an uci file to configure the various parameters:

# cat /etc/config/self-diagnostics
config globals 'globals'
        option extended_spec_dir '/etc/self-diagnostics/spec'
        option exec_timeout '5'
        option report_name 'self-diagnostics-report-$MODEL-$SERIAL'
        option verbose '0'
        option compression_level '9'

Here:

Options Description
extended_spec_dir Directory path to store 3rd-party/user diagnostics recipes
exec_timeout Timeout used for each command
report_name Name of the generated report file, here $MODEL and $SERIAL replaced with ProductModel and SerialNumber
verbose Logs everythings to logread as well
commpression_level Gzip compression_level 0-9, if not set, then report will not gziped

It also provide, a rpcd script to expose self-diagnostics over ubus

# ubus -v list self-diagnostics
'self-diagnostics' @2c0b768d
        "list":{}
        "generate":{"modules":"String"}

Recipe(s)

It has core modules and extended modules.

Core module recipes are present in /usr/share/self-diagnostics/spec/ path, where as extended module recipes are defined in uci option 'self-diagnostics.globals.extended_spec_dir'

Both the spec directories has recipes to run diagnostics and collect logs, these recipes are defined in json files.

# ls /usr/share/self-diagnostics/spec/
config.json   network.json  trx69.json    wifi.json
multiap.json  system.json   voice.json

Each json file need to follow below structure:

{
  "description": "<Description of module>",
  "dependency": [
    {
      "type": "file",
      "file": "<filepath>"
    }
  ],
  "exec": [
    {
      "description": "<Description of command>",
      "cmd": "<command To Execute>",
      "dependency": [
        {
          "type": "file",
          "file": "<filepath>"
        }
      ]
    },
    {
      "description": "<Next command description>",
      "cmd": "<command to execute>"
    }
  ]
}

How to use

This can be run from command line, ubus , USP-Controller and ACS.

List available core/extension modules

# self-diagnostics -l

Core Module(s):
 - config
 - multiap
 - network
 - system
 - trx69
 - voice
 - wifi

Extension Module(s):

Run and collect logs

# self-diagnostics
/tmp/self-diagnostics-report-EX600-Y.0721140081.tar.gz

List available core/extension modules over ubus

# ubus call self-diagnostics list
{
        "CoreModules": [
                "config",
                "multiap",
                "network",
                "system",
                "trx69",
                "voice",
                "wifi"
        ],
        "ExtensionModules": [

        ]
}

Run specific module from ubus

# ubus call self-diagnostics generate '{"modules":"config"}'
{
        "result": "/tmp/self-diagnostics-report-EX600-Y.0721140081.tar.gz"
}

TR-181 Integration

TR-181 (USP) provides an Operate command Device.SelfTestDiagnostics() to execute it from USP-controllers. TR-181 (CWMP) provides a diagnostics object Device.SelfTestDiagnostics. for the same, so its can be triggered from ACS as well.

# ubus call bbfdm operate '{"command":"Device.SelfTestDiagnostics()"}'
{
        "results": [
                {
                        "path": "Device.SelfTestDiagnostics()",
                        "data": "",
                        "output": [
                                {
                                        "Results": "Device.DeviceInfo.VendorLogFile.2",
                                        "Status": "Complete"
                                }
                        ]
                }
        ]
}

Once the opreate command is done, it generate a new entry in VendorLogFile, like below:

# bbfdmd -c get Device.DeviceInfo.VendorLogFile.2.
Device.DeviceInfo.VendorLogFile.2.Alias => cpe-2
Device.DeviceInfo.VendorLogFile.2.Name => /tmp/self-diagnostics-report-EX600-Y.0721140081.tar.gz
Device.DeviceInfo.VendorLogFile.2.MaximumSize => 0
Device.DeviceInfo.VendorLogFile.2.Persistent => 0

Which is then can be uploaded to a server using Device.DeviceInfo.VendorLogFile.{i}.Upload() operate command.