$darkmode
Elektra 0.9.12
elektra-web

an API and web user interface to remotely manage Elektra instances

The configuration view of elektra-web is similar to the tree view of the qt-gui, but with dynamic fields rendered via key metadata.

Elektra-web requires:

To build Elektra with the elektra-web tool:

If you do not want to configure multiple instances, you can set the INSTANCE environment variable to the server you want to configure. You can also set user:/sw/elektra/web/#0/current/instance to the host. Make sure to enter a full HTTP URL, e.g. http://localhost:33333.

If this configuration option is set, elektra-web will load the configuration page for that instance instead of the main overview page.

If you want to host elektra-web with the client and elektrad on the same instance, you must first start elektrad via kdb run-elektrad. Afterwards, you can run the client with:

INSTANCE="http://localhost:33333" kdb run-webd

It is also possible to set visibility by prefixing the host with VISIBILITY@.

For example (advanced visibility, user is default):

INSTANCE="advanced@http://localhost:33333" kdb run-webd

Now, when you open http://localhost:33334 in your browser, the configuration page for the instance will be opened immediately.

Elektra web consists of multiple components:

https://cdn.rawgit.com/ElektraInitiative/libelektra/master/doc/images/network_structure.png
https://cdn.rawgit.com/ElektraInitiative/libelektra/master/doc/images/daemon_structure.png

API blueprints are available for both APIs:

In order to test the API on localhost, you have to start an elektrad instance. This is possible in two ways:

cd libelektra/src/tools/web
cd elektrad
go build
./elektrad

Now the server is running on http://localhost:33333. After that you can test the API with help of Postman or similar tools that allow sending REST API requests.

Additional note: It is recommended to install the elektrad tool rather than starting the server manually. When Elektra is installed, the kdb command together with its tools is installed globally. For instance, whenever you would like to write a shell script which has to start a REST API server, you can just add kdb run-elektrad and execute it locally.

Examples:

First create a new key-value pair user:/test and set its value to 5. This can be done

The output of the commandline tool will be Set string to "5" if the key did not exist before. If the specified key didn't exist before, then the output will be Create a new key user:/test with string "5". Elektrad will respond with code 200.

The command

curl http://localhost:33333/kdb/user/test
#> {"exists":true,"name":"test","path":"user/test","ls":["user/test"],"value":"5","meta":""}

will now return the value of the specified key user:/test, which is stored in the database.

{
"exists": true,
"name": "test",
"path": "user:/test",
"ls": [
"user:/test"
],
"value": "5",
"meta": ""
}

Currently, webd does not support authentication. The best way to work around this is to use a reverse proxy (e.g. nginx reverse proxy).

Once you set up a reverse proxy on your web server, you can use it to authenticate users, e.g. by username/password auth

elektrad/ - contains the daemon to interact with a single elektra instance webd/ - contains a daemon to serve the client and interact with multiple elektra instances

webui/ - contains the elektra-web client (Web UI)

Lockfiles (package-lock.json) can be updated by simply deleting the current lock file and running npm install, which creates a new lock file.

Check for outdated dependencies via npm outdated. Dependencies can then be updated by running npm update.

Run the following command in the scripts/docker/web/ directory, replacing 1.5.0 with the latest version:

docker build -t elektra/web:1.5.0 -t elektra/web:latest .

Test the image:

docker run -d -it -p 33333:33333 -p 33334:33334 elektra/web:1.5.0

Publish it to the docker registry:

docker push elektra/web:1.5.0
+ <NewSubDialog
+ onChange={this.handleEdit('check/something')}
+ value={this.getMeta('check/something', '')}
+ saved={this.getSaved('check/something')}
+ />
<AdditionalMetakeysSubDialog
handleEdit={this.handleEdit.bind(this)}
getMeta={this.getMeta.bind(this)}
getSaved={this.getSaved.bind(this)}
meta={this.props.meta}
deleteMeta={this.props.deleteMeta}
/>
</FocusTrapDialog>
export const HANDLED_METADATA = [
...,
'visibility',
'binary',
+ 'check/something',
]