X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=doc%2Fafm-user-daemon.html;h=5bf56f7a7a28646ff07c4c7548376ef64aa14b78;hb=62a07cae0e40181daafdb0204c275af66d0f6d64;hp=29001bbd88fb9d0a59f91d520d68567c813e7d5d;hpb=f2bde701a9873c69897e599a7da08a0d113a86ab;p=src%2Fapp-framework-main.git diff --git a/doc/afm-user-daemon.html b/doc/afm-user-daemon.html index 29001bb..5bf56f7 100644 --- a/doc/afm-user-daemon.html +++ b/doc/afm-user-daemon.html @@ -1,52 +1,64 @@ + - - + + + + + + The afm-user-daemon + + + - -

The afm-user-daemon

- -
version: 1
-Date:    15 March 2016
-Author:  José Bollo
-
- - -

Foreword

- -

This document describes what we intend to do. It may happen that our -current implementation and the content of this document differ.

- -

In case of differences, it is assumed that this document is right -and the implementation is wrong.

- - -

Introduction

- -

The daemon afm-user-daemon is in charge of handling -applications for one user. Its main tasks are:

- +
+

The afm-user-daemon

+

José Bollo

+

Fulup Ar Foll

+

24 juin 2016

+
+ +

The afm-user-daemon

+

Foreword

+

This document describes application framework user daemon fundamentals. FCF (Fully Conform to Specification) implementation is still under development. It may happen that current implementation somehow diverges with specifications.

+

Introduction

+

The daemon afm-user-daemon is in charge of handling applications on behalf of a user. Its main tasks are:

+ +

The afm-user-daemon takes its orders from the session instance of D-Bus.

+

The figure below summarizes the situation of afm-user-daemon in the system.

+------------------------------------------------------------+
 |                          User                              |
 |                                 +---------------------+    |
@@ -73,79 +85,28 @@ instance of D-Bus.

| +--------------------+ +-----------------------+ | | | | System | -+------------------------------------------------------------+ -
- - -

Tasks of afm-user-daemon

- - -

Maintaining list of applications

- -

At start afm-user-daemon scans the directories containing -the applications and load in memory the list applications -availables to the current user.

- -

When afm-system-daemon installs or removes an application, -it sends the signal org.AGL.afm.system.changed on success. -If it receives that signal, afm-user-daemon rebuild its -list of applications.

- -

afm-user-daemon provides the data that it collected about -application to its clients that either want to get that list -or to get information about one application.

- - -

Launching applications

- -

afm-user-daemon launchs the applications. This means -that its builds a secure environment for the application -and then start it inside that secured environment.

- -

Applications of different kind can be launched.

- -

This is set using a configuration file that describes -how to launch an application of a given kind for a given -mode.

- ++------------------------------------------------------------+ +

Tasks of afm-user-daemon

+

Maintaining list of applications

+

At start afm-user-daemon scans the directories containing applications and load in memory a list of avaliable applications accessible by current user.

+

When afm-system-daemon installs or removes an application. On success it sends the signal org.AGL.afm.system.changed. When receiving such a signal, afm-user-daemon rebuilds its applications list.

+

afm-user-daemon provides the data it collects about applications to its clients. Clients may either request the full list of avaliable applications or a more specific information about a given application.

+

Launching application

+

afm-user-daemon launches application. Its builds a secure environment for the application before starting it within a secured environment.

+

Different kind of applications can be launched.

+

This is set using a configuration file that describes how to launch an application of a given kind within a given mode.

There is two launching modes: local or remote.

- -

Launching an application locally means that -the application and its binder are launcher together.

- -

Launching application remotely means that only the -binder is launched for the application.

- -

Once launched, running instances of application receive -a runid that identify them.

- - -

Managing instances of running applications

- -

afm-user-daemon manages the list of applications -that it launched.

- -

With the good permissions, a client can get the list -of the running instances and details about a specific -running instance. It can also terminate, stop or -continue a given application.

- - -

Installing and uninstalling applications

- -

If the client has the good permission, -afm-user-daemon delegates that task -to afm-system-daemon.

- - -

Starting afm-user-daemon

- -

afm-user-daemon is launched as a systemd service -attached to user sessions. Normally, the service file is -located at /usr/lib/systemd/user/afm-user-daemon.service.

- +

Launching an application locally means that the application and its binder are launched together.

+

Launching application remotely translates in only launching the application binder. The UI by itself has to be activated remotely by the requested (ie: HTML5 homescreen in a browser)

+

Once launched, running instances of application receive a runid that identify them.

+

Managing instances of running applications

+

afm-user-daemon manages the list of applications that it launched.

+

When owning the right permissions, a client can get the list of running instances and details about a specific running instance. It can also terminates, stops or continues a given application.

+

Installing and uninstalling applications

+

If the client own the right permissions, afm-user-daemon delegates that task to afm-system-daemon.

+

Starting afm-user-daemon

+

afm-user-daemon is launched as a systemd service attached to user sessions. Normally, the service file is located at /usr/lib/systemd/user/afm-user-daemon.service.

The options for launching afm-user-daemon are:

-
-a
 --application directory
 
@@ -155,22 +116,21 @@ located at /usr/lib/systemd/user/afm-user-daemon.service.

Can be repeated. -r ---root directory - - Includes the root application directory to - the database base of applications. - - Note that the default root directory for - applications is always added. It is defined - to be /usr/share/afm/applications (may change). +--root directory - Can be repeated. + Includes root application directory or directories when + passing multiple rootdir to + applications database. + Note that default root directory for + applications is always added. In current version + /usr/share/afm/applications is used as default. + -m --mode (local|remote) Set the default launch mode. - The default value is 'local' + The default value is 'local' -d --daemon @@ -190,47 +150,24 @@ located at /usr/lib/systemd/user/afm-user-daemon.service.

-h --help - Prints a short help. -
- - -

Configuration of the launcher

- -

It contains rules for launching applications. -When afm-user-daemon need to launch an application, -it looks to the mode of launch, local or remote, and the -type of the application as given by the file config.xml -of the widget.

- -

This couple mode and type allows to select the rule.

- -

The configuration file is /etc/afm/afm-launch.conf.

- -

It contains sections and rules. It can also contain comments -and empty lines to improve the readability.

- -

The separators are space and tabulation, any other character -is meaning something.

- -

The format is line oriented. -The new line character separate the lines.

- -

Lines having only separators are blank lines and are skipped. -Line having the character # (sharp) as first not separator character -are comment lines and are ignored.

- -

Lines starting with a not separator character are differents -of lines starting with a separator character.

- + Prints a short help. +

Launcher Configuration

+

It contains rules for launching applications. When afm-user-daemon has to launch an application, it looks for launch mode (local or remote), as well as for the type of application describe in config.xml widget configuration file.

+

This tuple mode+type allows to select the adequate rule.

+

Configuration file is /etc/afm/afm-launch.conf.

+

It contains sections and rules. It can also contain comments and empty lines to improve readability.

+

The separators are space and tabulation, any other character should have a meaning.

+

The format is line oriented. The new line character separate the lines.

+

Lines having only separators are blank lines and ignored. Line having character #(sharp) at first position are comment lines and ignored.

+

Lines not starting with a separator are different from lines starting with a separator character.

The grammar of the configuration file is defined below:

-
CONF: *COMMENT *SECTION
 
 SECTION: MODE *RULE
 
 RULE: +TYPE VECTOR ?VECTOR
 
-MODE: 'mode' +SEP ('local' | 'remote') *SEP EOL
+MODE: 'mode' +SEP ('local' | 'remote') *SEP EOL
 
 TYPE: DATA *SEP EOL
 
@@ -242,17 +179,12 @@ NDATA: +NCHAR
 EOL: NL *COMMENT
 COMMENT: *SEP CMT *(SEP | NCHAR) NL
 
-NL: '\x0a'
-SEP: '\x20' | '\x09'
-CMT: '#'
-CHAR: '\x00'..'\x08' | '\x0b'..'\x1f' | '\x21' | '\x22' | '\x24'..'\xff'
-NCHAR: CMT | CHAR
-
- -

Here is a sample of configuration file for defining how -to launch an application declared of types application/x-executable, -text/x-shellscript and text/html in mode local:

- +NL: '\x0a' +SEP: '\x20' | '\x09' +CMT: '#' +CHAR: '\x00'..'\x08' | '\x0b'..'\x1f' | '\x21' | '\x22' | '\x24'..'\xff' +NCHAR: CMT | CHAR +

Here is a sample of configuration file for defining how to launch an application of types application/x-executable, text/x-shellscript and text/html in local mode:

mode local
 
 application/x-executable
@@ -261,11 +193,8 @@ text/x-shellscript
 
 text/html
     /usr/bin/afb-daemon --mode=local --readyfd=%R --alias=/icons:%I --port=%P --rootdir=%r --token=%S --sessiondir=%D/.afb-daemon
-    /usr/bin/web-runtime http://localhost:%P/%c?token=%S
-
- + /usr/bin/web-runtime http://localhost:%P/%c?token=%S

This shows that:

- - - - -

mode local

- -

Within this mode, the launchers have either one or two vectors -describing them. All of these vectors are treated as programs -and are executed with the system call ‘execve’.

- -

The first vector is the leader vector and it defines the process -group. The second vector (if any) is attached to the group -defined by this first vector.

- - -

mode remote

- -

Within this mode, the launchers have either one or two vectors -describing them.

- -

The first vector is treated as a program and is executed with -the system call ‘execve’.

- -

The second vector (if any) defines a text that is returned -to the caller. This mechanism can be used to return the uri -to connect to for executing the application remotely.

- -

The daemon afm-user-daemon allocates a port for the -running the application remotely. -The current implmentation of the port allocation is just -incremental. -A more reliable (cacheable and same-originable) allocation -is to be defined.

- - -

%substitutions

- -

Vectors can include sequences of 2 characters that have a special -meaning. These sequences are named %substitution because their -first character is the percent sign (%) and because each occurrence -of the sequence is replaced, at launch time, by the value associated -to sequences.

- +

mode local

+

Within this mode, the launchers have either one or two description vectors. All of those vectors are treated as programs and are executed with 'execve' system call.

+

The first vector is the leader vector and it defines the process group. The second vector (if any) is attached to the group defined by this first vector.

+

mode remote

+

Within this mode, the launchers have either one or two vectors describing them.

+

The first vector is process as a program and is executed with system call 'execve'.

+

The second vector (if any) defines a text that is returned to the caller. This mechanism can be used to return a uri for remote UI to connect on the newly launched application.

+

The daemon afm-user-daemon allocates a port for each new remote application. The current implementation port allocation is incremental. A smarter (cacheable and discoverable) allocation should be defined.

+

%substitutions

+

Vectors can include sequences of 2 characters that have a special meaning. These sequences are named %substitution because their first character is the percent sign (%) and because each occurrence of the sequence is replaced, at launch time, by the value associated to sequences.

Here is the list of %substitutions:

- +

This simply emits the percent sign %

+ +

Holds application Id of launched application.

+

Defined by the attribute id of the element of config.xml.

+ +

In the future should represent the list of bindings and bindings directory separated by ','. Warning: not supported in current version.

+

The file within the widget directory that is the entry point.

- -

For a HTML application, it is the relative path to the main -page (aka index.html).

- -

Defined by the attribute src of the element -of config.xml.

-
  • %D: datadir

    - -

    Path of the directory where the application runs (cwd) -and stores its data.

    - -

    It is equal to %h/%a.

  • -
  • %H: height

    - +

    For HTML applications, it represents the relative path to main page (aka index.html).

    +

    Defined by attribute src of the element within config.xml.

    + +

    Path of the directory where the application runs (cwd) and stores its data.

    +

    It is equal to %h/%a.

    +

    Requested height for the widget.

    - -

    Defined by the attribute height of the element -of config.xml.

  • -
  • %h: homedir

    - +

    Defined by the attribute height of the element of config.xml.

    +

    Path of the home directory for all applications.

    - -

    It is generally equal to $HOME/app-data

  • -
  • %I: icondir

    - -

    Path of the directory were the icons of the applications can be found.

  • -
  • %m: mime-type

    - +

    It is generally equal to $HOME/app-data

    + +

    Path of the directory were the icons of the applications can be found.

    +

    Mime type of the launched application.

    - -

    Defined by the attribute type of the element -of config.xml.

  • -
  • %n: name

    - -

    Name of the application as defined by the content of the -element of config.xml.

  • -
  • %p: plugins

    - -

    Unhandled until now.

    - -

    Will be the colon separated list of plugins and plugins directory.

  • -
  • %P: port

    - -

    A port to use. It is currently a kind of random port. The precise -model is to be defined later.

  • -
  • %R: readyfd

    - -

    Number of the file descriptor to use for signalling -readyness of the launched process.

  • -
  • %r: rootdir

    - -

    Path of the directory containing the widget and its data.

  • -
  • %S: secret

    - -

    An hexadecimal number that can be used to pair the client -with its server binder.

  • -
  • %W: width

    - -

    Requested width for the widget.

    - -

    Defined by the attribute width of the element -of config.xml.

  • +

    Defined by the attribute type of the element of config.xml.

    + - - - -

    The D-Bus interface

    - - -

    Overview of the dbus interface

    - -

    afm-user-daemon takes its orders from the session instance -of D-Bus. The use of D-Bus is great because it allows to implement -discovery and signaling.

    - -

    The dbus of the session is by default adressed by the environment -variable DBUS_SESSION_BUS_ADDRESS. Using systemd -the variable DBUS_SESSION_BUS_ADDRESS is automatically set for -user sessions.

    - -

    The afm-user-daemon is listening with the destination name -org.AGL.afm.user at the object of path /org/AGL/afm/user -on the interface org.AGL.afm.user for the below detailed -members runnables, detail, start, terminate, -stop, continue, runners, state, -install and uninstall.

    - -

    D-Bus is mainly used for signaling and discovery. Its optimized -typed protocol is not used except for transmitting only one string -in both directions.

    - -

    The client and the service are using JSON serialisation to -exchange data.

    - +

    Name of the application as defined by the content of the element of config.xml.

    + +

    A port to use. It is currently a kind of random port. The precise model is to be defined later.

    + +

    Number of file descriptor to use for signaling readiness of launched process.

    + +

    Path of directory containing the widget and its data.

    + +

    An hexadecimal number that can be used to initialize pairing of client and application binder.

    + +

    Requested width for the widget.

    +

    Defined by the attribute width of the element of config.xml.

    +

    The D-Bus interface

    +

    Overview of the dbus interface

    +

    afm-user-daemon takes its orders from the session instance of D-Bus. D-Bus is nice to use in this context because it allows discovery and signaling.

    +

    The dbus session is by default addressed by environment variable DBUS_SESSION_BUS_ADDRESS. Using systemd variable DBUS_SESSION_BUS_ADDRESS is automatically set for user sessions.

    +

    The afm-user-daemon is listening on destination name org.AGL.afm.user at object path /org/AGL/afm/user on interface org.AGL.afm.user for following members: runnables, detail, start, terminate, stop, continue, runners, state, install and uninstall.

    +

    D-Bus is mainly used for signaling and discovery. Its optimized typed protocol is not used except for transmission of standalone strings.

    +

    Clients and Services are using JSON serialisation to exchange data.

    The D-Bus interface is defined by:

    - - - -

    The signature of any member of the interface is string -> string -for JSON -> JSON.

    - -

    This is the normal case. In case of error, the current implmentation -returns a dbus error that is a string.

    - -

    Here is an example that use dbus-send to query data on -installed applications.

    - +

    The signature of any member of the interface is string -> string for JSON -> JSON.

    +

    This is the normal case. In case of error, the current implementation returns a dbus error as a string.

    +

    Here an example using dbus-send to query data on installed applications.

    dbus-send --session --print-reply \
         --dest=org.AGL.afm.user \
         /org/AGL/afm/user \
    -    org.AGL.afm.user.runnables string:true
    -
    - - -

    Using afm-util

    - -

    The command line tool afm-util uses dbus-send to send -orders to afm-user-daemon. This small scripts allows to -send command to afm-user-daemon either interactively -at shell prompt or scriptically.

    - -

    The syntax is simple: it accept a command and if the command -requires it, the argument to the command.

    - + org.AGL.afm.user.runnables string:true +

    Using afm-util

    +

    The command line tool afm-util uses dbus-send to send orders to afm-user-daemon. This small scripts allows to send command to afm-user-daemon either interactively at shell prompt or scriptically.

    +

    The syntax is simple: it accept a command and when requires attached arguments.

    Here is the summary of afm-util:

    - - - +

    list the runnable widgets installed

    + +

    install the wgt file

    + +

    remove the installed widget of id

    + +

    print detail about the installed widget of id

    + +

    list the running instance

    + +

    start an instance of the widget of id

    + +

    terminate the running instance rid

    + +

    stop the running instance rid

    + +

    continue the previously rid

    + +

    get status of the running instance rid

    Here is how to list applications using afm-util:

    - -
    afm-util runnables
    -
    - +
    afm-util runnables

    - - -

    The protocol over D-Bus

    - +

    The protocol over D-Bus

    Recall:

    - - -
    - - -

    Method org.AGL.afm.user.detail

    - +

    Method org.AGL.afm.user.detail

    Description: Get details about an application from its id.

    -

    Input: the id of the application as below.

    -

    Either just a string:

    - -
    "appli@x.y"
    -
    - -

    Or an object having the field “id” of type string:

    - -
    {"id":"appli@x.y"}
    -
    - -

    Output: A JSON object describing the application containing -the fields described below.

    - +
    "appli@x.y"
    +

    Or an object having the field "id" of type string:

    +
    {"id":"appli@x.y"}
    +

    Output: A JSON object describing the application containing the fields described below.

    {
    -  "id":          string, the application id (id@version)
    -  "version":     string, the version of the application
    -  "width":       integer, requested width of the application
    -  "height":      integer, resqueted height of the application
    -  "name":        string, the name of the application
    -  "description": string, the description of the application
    -  "shortname":   string, the short name of the application
    -  "author":      string, the author of the application
    -}
    -
    - + "id": string, the application id (id@version) + "version": string, the version of the application + "width": integer, requested width of the application + "height": integer, resqueted height of the application + "name": string, the name of the application + "description": string, the description of the application + "shortname": string, the short name of the application + "author": string, the author of the application +}
    - - -

    Method org.AGL.afm.user.runnables

    - +

    Method org.AGL.afm.user.runnables

    Description: Get the list of applications that can be run.

    -

    Input: any valid json entry, can be anything except null.

    - -

    output: An array of description of the runnable applications. -Each item of the array contains an object containing the detail of -an application as described above for the method -org.AGL.afm.user.detail.

    - +

    output: An array of description of the runnable applications. Each item of the array contains an object containing the detail of an application as described above for the method org.AGL.afm.user.detail.


    - - -

    Method org.AGL.afm.user.install

    - +

    Method org.AGL.afm.user.install

    Description: Install an application from its widget file.

    - -

    If an application of the same id and version exists, it is not -reinstalled except if force=true.

    - -

    Applications are installed in the subdirectories of the common directory -of applications. -If root is specified, the application is installed under the -sub-directories of the root defined.

    - -

    Note that this methods is a simple accessor to the method -org.AGL.afm.system.install of afm-system-daemon.

    - -

    After the installation and before returning to the sender, -afm-user-daemon sends the signal org.AGL.afm.user.changed.

    - -

    Input: The path of the widget file to install and, optionaly, -a flag to force reinstallation, and, optionaly, a root directory.

    - -

    Either just a string being the absolute path of the widget file:

    - -
    "/a/path/driving/to/the/widget"
    -
    - +

    If an application of the same id and version exists, it is not reinstalled except when force=true.

    +

    Applications are installed in the subdirectories of the common directory reserved for applications. If root is specified, the application is installed under sub-directories of defined root.

    +

    Note that this methods is a simple accessor to the method org.AGL.afm.system.install of afm-system-daemon.

    +

    After the installation and before returning to the sender, afm-user-daemon sends the signal org.AGL.afm.user.changed.

    +

    Input: The path of widget file to be installed. Optionally, a flag to force reinstallation and/or a root directory.

    +

    Simple form a simple string containing the absolute widget path:

    +
    "/a/path/driving/to/the/widget"

    Or an object:

    -
    {
    -  "wgt": "/a/path/to/the/widget",
    -  "force": false,
    -  "root": "/a/path/to/the/root"
    -}
    -
    - -

    “wgt” and “root” must be absolute paths.

    - -

    output: An object with the field “added” being the string for -the id of the added application.

    - -
    {"added":"appli@x.y"}
    -
    - + "wgt": "/a/path/to/the/widget", + "force": false, + "root": "/a/path/to/the/root" +} +

    "wgt" and "root" MUST be absolute paths.

    +

    output: An object containing field "added" to use as application ID.

    +
    {"added":"appli@x.y"}

    - - -

    Method org.AGL.afm.user.uninstall

    - +

    Method org.AGL.afm.user.uninstall

    Description: Uninstall an application from its id.

    - -

    Note that this methods is a simple accessor to the method -org.AGL.afm.system.uninstall of afm-system-daemon.

    - -

    After the uninstallation and before returning to the sender, -afm-user-daemon sends the signal org.AGL.afm.user.changed.

    - -

    Input: the id of the application and, otpionaly, the path to -root of the application.

    - +

    Note that this methods is a simple accessor to org.AGL.afm.system.uninstall method from afm-system-daemon.

    +

    After the uninstallation and before returning to the sender, afm-user-daemon sends the signal org.AGL.afm.user.changed.

    +

    Input: the id of the application and, optionally, the path to application root.

    Either a string:

    - -
    "appli@x.y"
    -
    - +
    "appli@x.y"

    Or an object:

    -
    {
    -  "id": "appli@x.y",
    -  "root": "/a/path/to/the/root"
    -}
    -
    - -

    output: the value ‘true’.

    - + "id": "appli@x.y", + "root": "/a/path/to/the/root" +} +

    output: the value 'true'.


    - - -

    Method org.AGL.afm.user.start

    - +

    Method org.AGL.afm.user.start

    Description:

    - -

    Input: the id of the application and, optionaly, the -start mode as below.

    - +

    Input: the id of the application and, optionally, the start mode as below.

    Either just a string:

    - -
    "appli@x.y"
    -
    - -

    Or an object having the field “id” of type string and -optionaly a field mode:

    - -
    {"id":"appli@x.y","mode":"local"}
    -
    - -

    The field “mode” as a string value being either “local” or “remote”.

    - -

    output: The runid of the application launched. -The runid is an integer.

    - +
    "appli@x.y"
    +

    Or an object containing field "id" of type string and optionally a field mode:

    +
    {"id":"appli@x.y","mode":"local"}
    +

    The field "mode" is a string equal to either "local" or "remote".

    +

    output: The runid of the application launched. runid is an integer.


    - - -

    Method org.AGL.afm.user.terminate

    - -

    Description: Terminates the application of runid.

    - -

    Input: The runid (an integer) of the running instance to terminate.

    - -

    output: the value ‘true’.

    - +

    Method org.AGL.afm.user.terminate

    +

    Description: Terminates the application attached to runid.

    +

    Input: The runid (an integer) of running instance to terminate.

    +

    output: the value 'true'.


    - - -

    Method org.AGL.afm.user.stop

    - -

    Description: Stops the application of runid until terminate or continue.

    - -

    Input: The runid (an integer) of the running instance to stop.

    - -

    output: the value ‘true’.

    - +

    Method org.AGL.afm.user.stop

    +

    Description: Stops the application attached to runid until terminate or continue.

    +

    Input: The runid (integer) of the running instance to stop.

    +

    output: the value 'true'.


    - - -

    Method org.AGL.afm.user.continue

    - -

    Description: Continues the application of runid previously stopped.

    - -

    Input: The runid (an integer) of the running instance to continue.

    - -

    output: the value ‘true’.

    - +

    Method org.AGL.afm.user.continue

    +

    Description: Continues the application attached to runid previously stopped.

    +

    Input: The runid (integer) of the running instance to continue.

    +

    output: the value 'true'.


    - - -

    Method org.AGL.afm.user.state

    - +

    Method org.AGL.afm.user.state

    Description: Get informations about a running instance of runid.

    - -

    Input: The runid (an integer) of the running instance inspected.

    - -

    output: An object describing the state of the instance. It contains: -the runid (an integer), the id of the running application (a string), -the state of the application (a string being either “starting”, “running” -or “stopped”).

    - +

    Input: The runid (integer) of the running instance inspected.

    +

    output: An object describing instance state. It contains: the runid (integer), the id of the running application (string), the state of the application (string either: "starting", "running", "stopped").

    Example of returned state:

    -
    {
    -  "runid": 2,
    -  "state": "running",
    -  "id": "appli@x.y"
    -}
    -
    - + "runid": 2, + "state": "running", + "id": "appli@x.y" +}
    - - -

    Method org.AGL.afm.user.runners

    - -

    Description: Get the list of the currently running instances.

    - +

    Method org.AGL.afm.user.runners

    +

    Description: Get the list of currently running instances.

    Input: anything.

    - -

    output: An array of states, one per running instance, as returned by -the methodd org.AGL.afm.user.state.

    +

    output: An array of states, one per running instance, as returned by the methodd org.AGL.afm.user.state.