RDK Resources
[*RDK Preferred*]
Code Management Facility
RDK Forums
[RDK Conferences]
RDK Support
Archives
Papers & Presentations Archive
...
https://drive.google.com/file/d/11QXXM9WBg8Sw76Eikg5FyodrpIfoBnkL/view
...
TODO: Point to code where in resident UI of VA LISA is used (on RDK6.1 VA image)
...
LISA is an alternative to the Packager Thunder Plugin used to retrieve ipkg packages, see https://github.com/rdkcentral/rdkservices/blob/master/Packager/doc/PackagerPlugin.md
...
Existing Packager API (RDK services github) | Proposed Packager API (DAC RDK wiki) | LISA API |
---|---|---|
install (package, version, architecture) | install (id, type, URL, token, listener) → (id, task, success) | install (type, id, version, URL, appName, category), → (status, handle) |
remove (id, listener) → (id, task, success) | uninstall (type, id, version, uninstallType), → (status, handle) | |
operationStatus→ (handle, status, details) | ||
cancel (task, listener) → (success) | cancel (handle) → (status) | |
isInstalled (id) → (success) | - | |
getInstallProgress (task) → ( percent) | getProgress (handle) → (status, percent) | |
getInstalled() → (applications) | getList (filter) → (array of {type, id, version, metadata}) | |
getPackageInfo(id) → (metadata) | getMetadata(type, id, version) → (metadata) | |
- | setMetadata(type, id, version, tag, metadata) | |
getAvaialbleSpace() → (space) | getStorageDetails() → (path, quota, size, persistentStoragePath, persistentStorageQuota, persistentStorageSize) | |
synchronize() | - |
...
Before implementation, at the design stage, the following API in json schema has been defined defined LISA API .
In later design phase additional lock/unlock api allowing external application manager to signal LISA that a specific app from LISA database is in active use by End user and hence should not be deleted/upgraded at this moment, see description in LISA API Extension (Locking mechanism)#APISchema
Actual Thunder interface definition/api is in defined in dual COM RPC / JSON- RPC interface in in https://github.com/rdkcentral/ThunderInterfaces/blob/R2/interfaces/ILISA.h with annotations to automatically autogenerate* the JSON RPC api at build time
Below is description of expected api behaviour in expected use cases.
In section below we provide more explanation with the API methods.
API is API to be exposed in JSON-RPC over WebSocket
Generic format (see with https://www.jsonrpc.org/specification and https://github.com/rdkcentral/rdkservices/blob/master/SystemServices/README.md):
WebSocket like other JSON-RPC thunder services
For mat is of style :
Code Block | ||||
---|---|---|---|---|
| ||||
{"jsonrpc":"2.0" | ||||
Code Block | ||||
| ||||
{"jsonrpc":"2.0","id":{id},"method":"com.lgi.dac.lisa.1.methodName", "params":{payload}} |
{id} - An identifier established by the Client that MUST contain a String, Number, or NULL value if included. If it is not included it is assumed to be a notification.
{payload} - A Structured value that holds the parameter values to be used during the invocation of the method. This member MAY be omitted.
Download the application bundle tarball from the given URL, unpack files to dedicated directory, create the db entries and persistent storage on success. Asynchronous operation, handle should be used for tracking the request. The id of an app is unique within the database. That means only one kind of (mime)type can be combined and saved with a specific app id.
...
parameter and errors | values |
---|---|
errors |
|
handle | handle to refer with the following requests |
Uninstall the application: remove application files and - optionally - persistent storage and db entry. Non-blocking operation, handle should be used for tracking the request.
...
parameters and errors | values |
---|---|
resKey |
|
errors |
|
handle | handle to refer with the following requests |
Deletes the content of the database and/or persistent storage and/or all resources for the application. Synchronous operation, returns response on success or failure. Optional parameters type, id, version are used to filter the applications on which the reset will be performed. If they are not given, the reset operation affects all the data. Synchronous operation, returns a response on success or failure.
...
parameters and errors | values |
---|---|
type |
|
id |
|
version |
|
errors |
|
storagePayload | {"apps":{"path":"<string>", "quotaKB":"<string>", "usedKB":"<string>"}, "persistent":{"path":"<string>", "quotaKB":"<string>", "usedKB":"<string>"}} |
Returns a list of installed applications filtered using optional filtering criteria: type, id, version, appName, category. Synchronous operation, returns a response on success or failure.
...
parameters and errors | values |
---|---|
handle |
|
errors |
|
Get estimated progress of an asynchronous operation.
...
parameters and errors | values |
---|---|
handle |
|
status |
|
progress |
|
Notification sent on the completion of asynchronous operation.
...
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
(is not IMPLEMENTED, was not required for MVP since bundles are encrypted and signed)
API to be implemented by the library:
...
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
Code Block | ||||
---|---|---|---|---|
| ||||
-- enable support for foreign keys, available since sqlite version 3.6.19 (2009-10-14) PRAGMA foreign_keys = ON; -- table for application ids and persistent storage CREATE TABLE IF NOT EXISTS apps( idx INTEGER PRIMARY KEY, -- unique index for the application type/id type TEXT NOT NULL, -- MIME type app_id TEXT UNIQUE NOT NULL, -- unique id of app within given MIME type data_path TEXT, -- path to app peristent storage, relative to [APPS_STORAGE]/{epoch} created TEXT NOT NULL -- unix epoch timestamp of when the application entry was created ); -- table for installed applications in specific versions CREATE TABLE IF NOT EXISTS installed_apps ( idx INTEGER PRIMARY KEY, -- unique index for the application type/id/version app_idx INTEGER NOT NULL, -- reference to apps table, index of the application type/id version TEXT NOT NULL, -- version of the application name TEXT NOT NULL, -- name of the application category TEXT, -- category url TEXT, -- URL from which the application was downloaded app_path TEXT, -- path to app files, realtive to [APPS]/{epoch} created TEXT NOT NULL, -- unix epoch timestamp of when the application was installed resources TEXT, -- json object with downloaded resources metadata metadata TEXT, -- json object with auxiliary resources metadata FOREIGN KEY(app_idx) REFERENCES apps(idx), UNIQUE(app_idx, version) ); |
1. print tables
SELECT sql FROM sqlite_master WHERE name = 'apps';
SELECT sql FROM sqlite_master WHERE name = 'installed_apps';
...
6. set meatdata for given app/version
SELECT DISTINCT installed_apps.idx,installed_apps.metadata FROM installed_apps,apps WHERE apps.type='application/vnd.rdk-app.dac.native' AND apps.app_id='com.lgi.app3' AND installed_apps.version="1.0.0";
UPDATE installed_apps SET metadata = '{[{"description","New nice application."},{"parental":"5"}]}' WHERE idx=<idx>;
The logical storages: [APPS] and [APPS_STORAGE] should be defined per platform, to use concrete physical storages.
Epoch indicator {epoch} is used for easy invalidation of not supported or revoked format of apps on fundamental changes. May also be used for the antirollback (db authentication - TBD?)
files of App in App oci bundle Apps files are stored in [APPS] storage.
...
...
Important, LISA's database can be located there eg : [APPS]/dac/db/{epoch}/apps.db
Apps persistent storage is located in [APPS_STORAGE].
...
Apps' persistent storage: [APPS_STORAGE]/dac/{epoch}/{id}/
...
Epoch indicator {epoch} is used for easy invalidation of not supported or revoked format of apps on fundamental changes. May also be used for the antirollback (db authentication - TBD?)
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
draw.io Diagram | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
LISA should be implemented as a Thunder plugin.
An implementation may be based on the Packager code.
Code Block | ||||
---|---|---|---|---|
| ||||
{
"$schema": "plugin.schema.json",
"jsonrpc":"2.0",
"info": {
"title": "Local Inventory & Storage Manager of DAC Apps (LISA) Plugin",
"class": "Lisa",
"callsign": "org.rdk.dac.lisa",
"locator": "libWPEFrameworkLisa.so",
"status": "alpha",
"autostart": true,
"description": "The Local Inventory & Storage Manager of DAC Apps (LISA) plugin allows authenticated downloading and management of DAC bundles from a remote server. It also manages the persistent storage of the DAC applications.",
"version": "1.0"
},
"interface": {
"$ref": "{interfacedir}/lisa.json#"
},
"configuration": {
"type": "object",
"properties": {
"configuration": {
"type": "object",
"properties": {
"network": {
"type": "object",
"required": [
"timeout",
"default_retryIn"
],
"properties": {
"timeout": {
"type": "number",
"description": "Single resource downloading timeout in seconds"
},
"default_retryIn": {
"type": "number",
"description": "Default value of GET retry delay in seconds on HTTP/202, when no "Retry-After" header field is returned in the response."
}
}
},
"storages": {
"type": "object",
"required": [
"apps",
"apps_storage",
"apps_tmp"
],
"properties": {
"apps": {
"type": "string",
"description": "Path to the persistent storage for downloaded applications top dir"
},
"apps_storage": {
"type": "string",
"description": "Path to the persistent storage for downloaded applications persistent storage top dir"
},
"apps_tmp": {
"type": "string",
"description": "Path to the temporary storage for applications being downloaded"
}
}
}
},
"required": [
"timeout",
"storages"
]
}
}
}
}
|
Code Block | ||||
---|---|---|---|---|
| ||||
{ "$schema": "plugin.schema.json", "jsonrpc":"2.0", "info": { "title": "Local Inventory & Storage Manager of DAC Apps (LISA) Plugin", "class": "Lisa", "callsign": "org.rdk.dac.lisa", "locator": "libWPEFrameworkLisa.so", "status": "alpha", "autostart": true, "description": [ "The Local Inventory & Storage Manager of DAC Apps (LISA) plugin allows authenticated downloading and management of DAC bundles from a remote server. It also manages the persistent storage of the DAC applications." ], "version": "1.0" }, "interface": { "$ref": "{interfacedir}/lisa.json" }, "configuration": { "storages": { "apps": "/mnt/apps", "apps_storage": "/mnt/apps_storage", "apps_tmp": "/mnt/apps_tmp" }, "network": { "timeout": 1800, "default_retryIn": 300 } } } |
...