refactor: rename ScadaLink → ZB.MOM.WW.ScadaBridge (code + projects + namespaces)
Solution + 23 src projects + 26 test projects renamed; folders, csproj, namespaces, and ScadaLinkDbContext/ScadaBridgeDbContext class updated. ActorSystem "scadalink" → "scadabridge", Akka seed-node URLs migrated. SQL roles/logins, LDAP domains, CLI command name, and CLI config dir (~/.scadalink → ~/.scadabridge) also renamed. Build green; 5 Host.Tests fail awaiting SQL login rename in next commit. Pre-existing StaleTagMonitor timing flakes unchanged. Rename script committed at tools/rename-to-scadabridge.sh.
This commit is contained in:
+111
-111
@@ -2,13 +2,13 @@
|
||||
|
||||
## Purpose
|
||||
|
||||
The CLI is a standalone command-line tool for scripting and automating administrative operations against the ScadaLink central cluster. It connects to the Central Host's HTTP Management API (`POST /management`), which dispatches commands to the ManagementActor. Authentication and role resolution are handled server-side — the CLI sends credentials via HTTP Basic Auth. The CLI provides the same administrative capabilities as the Central UI, enabling automation, batch operations, and integration with CI/CD pipelines.
|
||||
The CLI is a standalone command-line tool for scripting and automating administrative operations against the ScadaBridge central cluster. It connects to the Central Host's HTTP Management API (`POST /management`), which dispatches commands to the ManagementActor. Authentication and role resolution are handled server-side — the CLI sends credentials via HTTP Basic Auth. The CLI provides the same administrative capabilities as the Central UI, enabling automation, batch operations, and integration with CI/CD pipelines.
|
||||
|
||||
## Location
|
||||
|
||||
Standalone executable, not part of the Host binary. Deployed on any machine with HTTP access to a central node.
|
||||
|
||||
`src/ScadaLink.CLI/`
|
||||
`src/ZB.MOM.WW.ScadaBridge.CLI/`
|
||||
|
||||
## Responsibilities
|
||||
|
||||
@@ -45,52 +45,52 @@ The CLI connects to the Central Host via HTTP:
|
||||
The CLI uses a hierarchical subcommand structure mirroring the Management Service message groups:
|
||||
|
||||
```
|
||||
scadalink <group> <action> [options]
|
||||
scadabridge <group> <action> [options]
|
||||
```
|
||||
|
||||
All entities are identified by their integer **ID** (via `--id`, `--template-id`,
|
||||
`--site-id`, etc.), not by name. Create/update commands take individual flags — there
|
||||
is no `--file` option. The authoritative, always-current reference is the in-repo
|
||||
`src/ScadaLink.CLI/README.md`; the command lists below mirror the implemented command
|
||||
`src/ZB.MOM.WW.ScadaBridge.CLI/README.md`; the command lists below mirror the implemented command
|
||||
tree at the time of writing.
|
||||
|
||||
### Template Commands
|
||||
```
|
||||
scadalink template list
|
||||
scadalink template get --id <id>
|
||||
scadalink template create --name <name> [--description <desc>] [--parent-id <id>]
|
||||
scadalink template update --id <id> [--name <name>] [--description <desc>] [--parent-id <id>]
|
||||
scadalink template validate --id <id>
|
||||
scadalink template delete --id <id>
|
||||
scadalink template attribute add --template-id <id> --name <name> --data-type <type> [--value <value>] [--description <desc>] [--data-source <ref>] [--locked <bool>]
|
||||
scadalink template attribute update --id <id> [--name <name>] [--data-type <type>] [--value <value>] [--description <desc>] [--data-source <ref>] [--locked <bool>]
|
||||
scadalink template attribute delete --id <id>
|
||||
scadalink template alarm add --template-id <id> --name <name> --trigger-type <type> --priority <n> [--description <desc>] [--trigger-config <json>] [--locked <bool>]
|
||||
scadalink template alarm update --id <id> [--name <name>] [--trigger-type <type>] [--priority <n>] [--description <desc>] [--trigger-config <json>] [--locked <bool>]
|
||||
scadalink template alarm delete --id <id>
|
||||
scadalink template script add --template-id <id> --name <name> --code <code> --trigger-type <type> [--trigger-config <json>] [--locked <bool>] [--parameters <json>] [--return-def <json>]
|
||||
scadalink template script update --id <id> [--name <name>] [--code <code>] [--trigger-type <type>] [--trigger-config <json>] [--locked <bool>] [--parameters <json>] [--return-def <json>]
|
||||
scadalink template script delete --id <id>
|
||||
scadalink template composition add --template-id <id> --instance-name <name> --composed-template-id <id>
|
||||
scadalink template composition delete --template-id <id> --instance-name <name>
|
||||
scadabridge template list
|
||||
scadabridge template get --id <id>
|
||||
scadabridge template create --name <name> [--description <desc>] [--parent-id <id>]
|
||||
scadabridge template update --id <id> [--name <name>] [--description <desc>] [--parent-id <id>]
|
||||
scadabridge template validate --id <id>
|
||||
scadabridge template delete --id <id>
|
||||
scadabridge template attribute add --template-id <id> --name <name> --data-type <type> [--value <value>] [--description <desc>] [--data-source <ref>] [--locked <bool>]
|
||||
scadabridge template attribute update --id <id> [--name <name>] [--data-type <type>] [--value <value>] [--description <desc>] [--data-source <ref>] [--locked <bool>]
|
||||
scadabridge template attribute delete --id <id>
|
||||
scadabridge template alarm add --template-id <id> --name <name> --trigger-type <type> --priority <n> [--description <desc>] [--trigger-config <json>] [--locked <bool>]
|
||||
scadabridge template alarm update --id <id> [--name <name>] [--trigger-type <type>] [--priority <n>] [--description <desc>] [--trigger-config <json>] [--locked <bool>]
|
||||
scadabridge template alarm delete --id <id>
|
||||
scadabridge template script add --template-id <id> --name <name> --code <code> --trigger-type <type> [--trigger-config <json>] [--locked <bool>] [--parameters <json>] [--return-def <json>]
|
||||
scadabridge template script update --id <id> [--name <name>] [--code <code>] [--trigger-type <type>] [--trigger-config <json>] [--locked <bool>] [--parameters <json>] [--return-def <json>]
|
||||
scadabridge template script delete --id <id>
|
||||
scadabridge template composition add --template-id <id> --instance-name <name> --composed-template-id <id>
|
||||
scadabridge template composition delete --template-id <id> --instance-name <name>
|
||||
```
|
||||
|
||||
### Instance Commands
|
||||
```
|
||||
scadalink instance list [--site-id <id>] [--template-id <id>] [--search <term>]
|
||||
scadalink instance get --id <id>
|
||||
scadalink instance create --name <name> --template-id <id> --site-id <id> [--area-id <id>]
|
||||
scadalink instance set-bindings --id <id> --bindings <json>
|
||||
scadalink instance set-overrides --id <id> --overrides <json>
|
||||
scadalink instance alarm-override set --instance-id <id> --alarm <name> [--trigger-config <json>] [--priority <n>]
|
||||
scadalink instance alarm-override delete --instance-id <id> --alarm <name>
|
||||
scadalink instance alarm-override list --instance-id <id>
|
||||
scadalink instance set-area --id <id> [--area-id <id>]
|
||||
scadalink instance diff --id <id>
|
||||
scadalink instance deploy --id <id>
|
||||
scadalink instance enable --id <id>
|
||||
scadalink instance disable --id <id>
|
||||
scadalink instance delete --id <id>
|
||||
scadabridge instance list [--site-id <id>] [--template-id <id>] [--search <term>]
|
||||
scadabridge instance get --id <id>
|
||||
scadabridge instance create --name <name> --template-id <id> --site-id <id> [--area-id <id>]
|
||||
scadabridge instance set-bindings --id <id> --bindings <json>
|
||||
scadabridge instance set-overrides --id <id> --overrides <json>
|
||||
scadabridge instance alarm-override set --instance-id <id> --alarm <name> [--trigger-config <json>] [--priority <n>]
|
||||
scadabridge instance alarm-override delete --instance-id <id> --alarm <name>
|
||||
scadabridge instance alarm-override list --instance-id <id>
|
||||
scadabridge instance set-area --id <id> [--area-id <id>]
|
||||
scadabridge instance diff --id <id>
|
||||
scadabridge instance deploy --id <id>
|
||||
scadabridge instance enable --id <id>
|
||||
scadabridge instance disable --id <id>
|
||||
scadabridge instance delete --id <id>
|
||||
```
|
||||
|
||||
`--bindings` is a JSON array of `[attributeName, dataConnectionId]` pairs, e.g.
|
||||
@@ -99,86 +99,86 @@ value, e.g. `{"Speed": "100", "Mode": null}`.
|
||||
|
||||
### Site Commands
|
||||
```
|
||||
scadalink site list
|
||||
scadalink site get --id <id>
|
||||
scadalink site create --identifier <id> --name <name> [--description <desc>] [--node-a-address <addr>] [--node-b-address <addr>] [--grpc-node-a-address <addr>] [--grpc-node-b-address <addr>]
|
||||
scadalink site update --id <id> [--name <name>] [--description <desc>] [--node-a-address <addr>] [--node-b-address <addr>] [--grpc-node-a-address <addr>] [--grpc-node-b-address <addr>]
|
||||
scadalink site delete --id <id>
|
||||
scadalink site area list --site-id <id>
|
||||
scadalink site area create --site-id <id> --name <name> [--parent-id <id>]
|
||||
scadalink site area update --id <id> --name <name>
|
||||
scadalink site area delete --id <id>
|
||||
scadalink site deploy-artifacts [--site-id <id>]
|
||||
scadabridge site list
|
||||
scadabridge site get --id <id>
|
||||
scadabridge site create --identifier <id> --name <name> [--description <desc>] [--node-a-address <addr>] [--node-b-address <addr>] [--grpc-node-a-address <addr>] [--grpc-node-b-address <addr>]
|
||||
scadabridge site update --id <id> [--name <name>] [--description <desc>] [--node-a-address <addr>] [--node-b-address <addr>] [--grpc-node-a-address <addr>] [--grpc-node-b-address <addr>]
|
||||
scadabridge site delete --id <id>
|
||||
scadabridge site area list --site-id <id>
|
||||
scadabridge site area create --site-id <id> --name <name> [--parent-id <id>]
|
||||
scadabridge site area update --id <id> --name <name>
|
||||
scadabridge site area delete --id <id>
|
||||
scadabridge site deploy-artifacts [--site-id <id>]
|
||||
```
|
||||
|
||||
### Deployment Commands
|
||||
```
|
||||
scadalink deploy instance --id <id>
|
||||
scadalink deploy artifacts [--site-id <id>]
|
||||
scadalink deploy status [--instance-id <id>] [--status <status>] [--page <n>] [--page-size <n>]
|
||||
scadabridge deploy instance --id <id>
|
||||
scadabridge deploy artifacts [--site-id <id>]
|
||||
scadabridge deploy status [--instance-id <id>] [--status <status>] [--page <n>] [--page-size <n>]
|
||||
```
|
||||
|
||||
### Data Connection Commands
|
||||
```
|
||||
scadalink data-connection list [--site-id <id>]
|
||||
scadalink data-connection get --id <id>
|
||||
scadalink data-connection create --site-id <id> --name <name> --protocol <protocol> [--backup-config <json>] [--failover-retry-count <n>]
|
||||
scadalink data-connection update --id <id> [--name <name>] [--protocol <protocol>] [--backup-config <json>] [--failover-retry-count <n>]
|
||||
scadalink data-connection delete --id <id>
|
||||
scadabridge data-connection list [--site-id <id>]
|
||||
scadabridge data-connection get --id <id>
|
||||
scadabridge data-connection create --site-id <id> --name <name> --protocol <protocol> [--backup-config <json>] [--failover-retry-count <n>]
|
||||
scadabridge data-connection update --id <id> [--name <name>] [--protocol <protocol>] [--backup-config <json>] [--failover-retry-count <n>]
|
||||
scadabridge data-connection delete --id <id>
|
||||
```
|
||||
|
||||
### External System Commands
|
||||
```
|
||||
scadalink external-system list
|
||||
scadalink external-system get --id <id>
|
||||
scadalink external-system create --name <name> --endpoint-url <url> --auth-type <type> [--auth-config <json>]
|
||||
scadalink external-system update --id <id> [--name <name>] [--endpoint-url <url>] [--auth-type <type>] [--auth-config <json>]
|
||||
scadalink external-system delete --id <id>
|
||||
scadalink external-system method list --external-system-id <id>
|
||||
scadalink external-system method get --id <id>
|
||||
scadalink external-system method create --external-system-id <id> --name <name> --http-method <verb> --path <path> [--params <json>] [--return <json>]
|
||||
scadalink external-system method update --id <id> [--name <name>] [--http-method <verb>] [--path <path>] [--params <json>] [--return <json>]
|
||||
scadalink external-system method delete --id <id>
|
||||
scadabridge external-system list
|
||||
scadabridge external-system get --id <id>
|
||||
scadabridge external-system create --name <name> --endpoint-url <url> --auth-type <type> [--auth-config <json>]
|
||||
scadabridge external-system update --id <id> [--name <name>] [--endpoint-url <url>] [--auth-type <type>] [--auth-config <json>]
|
||||
scadabridge external-system delete --id <id>
|
||||
scadabridge external-system method list --external-system-id <id>
|
||||
scadabridge external-system method get --id <id>
|
||||
scadabridge external-system method create --external-system-id <id> --name <name> --http-method <verb> --path <path> [--params <json>] [--return <json>]
|
||||
scadabridge external-system method update --id <id> [--name <name>] [--http-method <verb>] [--path <path>] [--params <json>] [--return <json>]
|
||||
scadabridge external-system method delete --id <id>
|
||||
```
|
||||
|
||||
### Notification Commands
|
||||
```
|
||||
scadalink notification list
|
||||
scadalink notification get --id <id>
|
||||
scadalink notification create --name <name> --emails <comma-separated>
|
||||
scadalink notification update --id <id> [--name <name>] [--emails <comma-separated>]
|
||||
scadalink notification delete --id <id>
|
||||
scadalink notification smtp list
|
||||
scadalink notification smtp update --id <id> --server <host> --port <n> --auth-mode <mode> --from-address <email>
|
||||
scadabridge notification list
|
||||
scadabridge notification get --id <id>
|
||||
scadabridge notification create --name <name> --emails <comma-separated>
|
||||
scadabridge notification update --id <id> [--name <name>] [--emails <comma-separated>]
|
||||
scadabridge notification delete --id <id>
|
||||
scadabridge notification smtp list
|
||||
scadabridge notification smtp update --id <id> --server <host> --port <n> --auth-mode <mode> --from-address <email>
|
||||
```
|
||||
|
||||
### Security Commands
|
||||
```
|
||||
scadalink security api-key list
|
||||
scadalink security api-key create --name <name>
|
||||
scadalink security api-key update --id <id> --enabled <bool>
|
||||
scadalink security api-key delete --id <id>
|
||||
scadalink security role-mapping list
|
||||
scadalink security role-mapping create --ldap-group <group> --role <role>
|
||||
scadalink security role-mapping update --id <id> [--ldap-group <group>] [--role <role>]
|
||||
scadalink security role-mapping delete --id <id>
|
||||
scadalink security scope-rule list [--mapping-id <id>]
|
||||
scadalink security scope-rule add --mapping-id <id> --site-id <id>
|
||||
scadalink security scope-rule delete --id <id>
|
||||
scadabridge security api-key list
|
||||
scadabridge security api-key create --name <name>
|
||||
scadabridge security api-key update --id <id> --enabled <bool>
|
||||
scadabridge security api-key delete --id <id>
|
||||
scadabridge security role-mapping list
|
||||
scadabridge security role-mapping create --ldap-group <group> --role <role>
|
||||
scadabridge security role-mapping update --id <id> [--ldap-group <group>] [--role <role>]
|
||||
scadabridge security role-mapping delete --id <id>
|
||||
scadabridge security scope-rule list [--mapping-id <id>]
|
||||
scadabridge security scope-rule add --mapping-id <id> --site-id <id>
|
||||
scadabridge security scope-rule delete --id <id>
|
||||
```
|
||||
|
||||
### Audit Log Commands
|
||||
```
|
||||
scadalink audit-log query [--user <username>] [--entity-type <type>] [--action <action>] [--from <date>] [--to <date>] [--page <n>] [--page-size <n>]
|
||||
scadabridge audit-log query [--user <username>] [--entity-type <type>] [--action <action>] [--from <date>] [--to <date>] [--page <n>] [--page-size <n>]
|
||||
```
|
||||
|
||||
The legacy `audit-log query` above targets the original configuration-change audit
|
||||
(IAuditService) surface. The new centralized Audit Log component (#23) is exposed via
|
||||
the `scadalink audit` group below.
|
||||
the `scadabridge audit` group below.
|
||||
|
||||
### Centralized Audit Commands
|
||||
|
||||
The `scadalink audit` group targets the centralized Audit Log component (#23) and
|
||||
The `scadabridge audit` group targets the centralized Audit Log component (#23) and
|
||||
exposes the UI-equivalent operational audit surface. Permissions follow the same
|
||||
read-vs-export split the Central UI uses (see Component-AuditLog.md, Security &
|
||||
Tamper-Evidence, and Security & Auth #10): `audit query` and `audit verify-chain`
|
||||
@@ -187,9 +187,9 @@ require the `OperationalAudit` permission; `audit export` additionally requires
|
||||
exit code 2) on denial.
|
||||
|
||||
```
|
||||
scadalink audit query --since <t> [--until <t>] [--channel <c>] [--kind <k>] [--status <s>] [--site <s>] [--instance <i>] [--target <t>] [--actor <a>] [--correlation-id <id>] [--errors-only] [--page <n>] [--page-size <n>]
|
||||
scadalink audit export --since <t> --until <t> --format csv|jsonl|parquet --output <path> [--channel <c>] [--kind <k>] [--status <s>] [--site <s>] [--target <t>] [--actor <a>]
|
||||
scadalink audit verify-chain --month <YYYY-MM>
|
||||
scadabridge audit query --since <t> [--until <t>] [--channel <c>] [--kind <k>] [--status <s>] [--site <s>] [--instance <i>] [--target <t>] [--actor <a>] [--correlation-id <id>] [--errors-only] [--page <n>] [--page-size <n>]
|
||||
scadabridge audit export --since <t> --until <t> --format csv|jsonl|parquet --output <path> [--channel <c>] [--kind <k>] [--status <s>] [--site <s>] [--target <t>] [--actor <a>]
|
||||
scadabridge audit verify-chain --month <YYYY-MM>
|
||||
```
|
||||
|
||||
- `audit query` — filtered query against the central `AuditLog` table, matching the
|
||||
@@ -208,16 +208,16 @@ scadalink audit verify-chain --month <YYYY-MM>
|
||||
|
||||
### Health Commands
|
||||
```
|
||||
scadalink health summary
|
||||
scadalink health site --identifier <site-identifier>
|
||||
scadalink health event-log --site <site-identifier> [--event-type <type>] [--severity <level>] [--keyword <term>] [--from <date>] [--to <date>] [--page <n>] [--page-size <n>] [--instance-name <name>]
|
||||
scadalink health parked-messages --site <site-identifier> [--page <n>] [--page-size <n>]
|
||||
scadabridge health summary
|
||||
scadabridge health site --identifier <site-identifier>
|
||||
scadabridge health event-log --site <site-identifier> [--event-type <type>] [--severity <level>] [--keyword <term>] [--from <date>] [--to <date>] [--page <n>] [--page-size <n>] [--instance-name <name>]
|
||||
scadabridge health parked-messages --site <site-identifier> [--page <n>] [--page-size <n>]
|
||||
```
|
||||
|
||||
### Debug Commands
|
||||
```
|
||||
scadalink debug snapshot --id <id>
|
||||
scadalink debug stream --id <id>
|
||||
scadabridge debug snapshot --id <id>
|
||||
scadabridge debug stream --id <id>
|
||||
```
|
||||
|
||||
The `debug snapshot` command retrieves a point-in-time snapshot via the HTTP Management API.
|
||||
@@ -234,29 +234,29 @@ Unlike `debug snapshot` (which uses the HTTP Management API), `debug stream` use
|
||||
|
||||
### Shared Script Commands
|
||||
```
|
||||
scadalink shared-script list
|
||||
scadalink shared-script get --id <id>
|
||||
scadalink shared-script create --name <name> --code <code> [--parameters <json>] [--return-def <json>]
|
||||
scadalink shared-script update --id <id> [--name <name>] [--code <code>] [--parameters <json>] [--return-def <json>]
|
||||
scadalink shared-script delete --id <id>
|
||||
scadabridge shared-script list
|
||||
scadabridge shared-script get --id <id>
|
||||
scadabridge shared-script create --name <name> --code <code> [--parameters <json>] [--return-def <json>]
|
||||
scadabridge shared-script update --id <id> [--name <name>] [--code <code>] [--parameters <json>] [--return-def <json>]
|
||||
scadabridge shared-script delete --id <id>
|
||||
```
|
||||
|
||||
### Database Connection Commands
|
||||
```
|
||||
scadalink db-connection list
|
||||
scadalink db-connection get --id <id>
|
||||
scadalink db-connection create --name <name> --connection-string <string>
|
||||
scadalink db-connection update --id <id> [--name <name>] [--connection-string <string>]
|
||||
scadalink db-connection delete --id <id>
|
||||
scadabridge db-connection list
|
||||
scadabridge db-connection get --id <id>
|
||||
scadabridge db-connection create --name <name> --connection-string <string>
|
||||
scadabridge db-connection update --id <id> [--name <name>] [--connection-string <string>]
|
||||
scadabridge db-connection delete --id <id>
|
||||
```
|
||||
|
||||
### Inbound API Method Commands
|
||||
```
|
||||
scadalink api-method list
|
||||
scadalink api-method get --id <id>
|
||||
scadalink api-method create --name <name> --script <code> [--timeout <seconds>] [--parameters <json>] [--return-def <json>]
|
||||
scadalink api-method update --id <id> [--script <code>] [--timeout <seconds>] [--parameters <json>] [--return-def <json>]
|
||||
scadalink api-method delete --id <id>
|
||||
scadabridge api-method list
|
||||
scadabridge api-method get --id <id>
|
||||
scadabridge api-method create --name <name> --script <code> [--timeout <seconds>] [--parameters <json>] [--return-def <json>]
|
||||
scadabridge api-method update --id <id> [--script <code>] [--timeout <seconds>] [--parameters <json>] [--return-def <json>]
|
||||
scadabridge api-method delete --id <id>
|
||||
```
|
||||
|
||||
The `--format json|table` option is recursive and accepted on every command above.
|
||||
@@ -272,7 +272,7 @@ Configuration is resolved in the following priority order (highest wins):
|
||||
- `SCADALINK_USERNAME` / `SCADALINK_PASSWORD` — LDAP credentials. Preferred over
|
||||
`--password` on the command line, which is visible in process listings and shell
|
||||
history. Credentials are never read from the config file.
|
||||
3. **Configuration file**: `~/.scadalink/config.json` — Persistent defaults for management URL and output format only (never credentials).
|
||||
3. **Configuration file**: `~/.scadabridge/config.json` — Persistent defaults for management URL and output format only (never credentials).
|
||||
|
||||
### Configuration File Format
|
||||
|
||||
@@ -307,8 +307,8 @@ Configuration is resolved in the following priority order (highest wins):
|
||||
- **Commons**: Message contracts (`Messages/Management/`) for command type definitions and registry.
|
||||
- **System.CommandLine**: Command-line argument parsing.
|
||||
- **Microsoft.AspNetCore.SignalR.Client**: SignalR client for the `debug stream` command's WebSocket connection.
|
||||
- **Management Service (#18)**: The CLI hits the central cluster via the existing HTTP Management API (`POST /management`), which dispatches to the ManagementActor. The `scadalink audit` command group rides a parallel REST surface on the same Host (`GET /api/audit/query` and `GET /api/audit/export`), sharing HTTP Basic Auth with `/management` but bypassing the actor for read-only, keyset-paged / streaming workloads.
|
||||
- **Audit Log (#23)**: The `scadalink audit query` and `audit export` subcommands target the centralized Audit Log component's REST endpoints (`GET /api/audit/query`, `GET /api/audit/export`) on the Host's Management API surface; `audit verify-chain` rides `POST /management` until hash-chain verification ships. Permission checks (`OperationalAudit`, `AuditExport`) are enforced server-side by `AuditEndpoints`.
|
||||
- **Management Service (#18)**: The CLI hits the central cluster via the existing HTTP Management API (`POST /management`), which dispatches to the ManagementActor. The `scadabridge audit` command group rides a parallel REST surface on the same Host (`GET /api/audit/query` and `GET /api/audit/export`), sharing HTTP Basic Auth with `/management` but bypassing the actor for read-only, keyset-paged / streaming workloads.
|
||||
- **Audit Log (#23)**: The `scadabridge audit query` and `audit export` subcommands target the centralized Audit Log component's REST endpoints (`GET /api/audit/query`, `GET /api/audit/export`) on the Host's Management API surface; `audit verify-chain` rides `POST /management` until hash-chain verification ships. Permission checks (`OperationalAudit`, `AuditExport`) are enforced server-side by `AuditEndpoints`.
|
||||
|
||||
## Interactions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user