1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<meta name="author" content="José Bollo">
<meta name="author" content="Fulup Ar Foll">
<title>The afm-system-daemon</title>
<style type="text/css">code{white-space: pre;}</style>
<link rel="stylesheet" href="doc.css">
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<header>
<h1 class="title">The afm-system-daemon</h1>
<h2 class="author">José Bollo</h2>
<h2 class="author">Fulup Ar Foll</h2>
<h3 class="date">24 juin 2016</h3>
</header>
<nav id="TOC">
<ul>
<li><a href="#the-afm-system-daemon">The afm-system-daemon</a><ul>
<li><a href="#foreword">Foreword</a></li>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#starting-afm-system-daemon">Starting <strong>afm-system-daemon</strong></a></li>
<li><a href="#the-d-bus-interface">The D-Bus interface</a><ul>
<li><a href="#overview-of-the-dbus-interface">Overview of the dbus interface</a></li>
<li><a href="#the-protocol-over-d-bus">The protocol over D-Bus</a></li>
</ul></li>
</ul></li>
</ul>
</nav>
<h1 id="the-afm-system-daemon">The afm-system-daemon</h1>
<h2 id="foreword">Foreword</h2>
<p>This document describes application framework system daemon fundamentals. FCF (Fully Conform to Specification) implementation is still under development. It may happen that current implementation somehow diverges with specifications.</p>
<h2 id="introduction">Introduction</h2>
<p>The daemon <strong>afm-system-daemon</strong> is in charge of installing applications on AGL system. Its main tasks are:</p>
<ul>
<li><p>installs applications and setup security framework for newly installed application.</p></li>
<li><p>uninstall applications</p></li>
</ul>
<p>The <strong>afm-system-daemon</strong> takes its orders from system instance of D-Bus.</p>
<p>The figure below summarizes the situation of <strong>afm-system-daemon</strong> in the system.</p>
<pre><code>+------------------------------------------------------------+
| User |
| |
| +-------------------------------------------------+ |
| | | |
| | afm-user-daemon | |
| | | |
| +----------+----------------------+----------+----+ |
| | | : |
| | | : |
:================|======================|==========:=========:
| | | : |
| +----------+----------+ +-----+-----+ : |
| | D-Bus system +-----+ CYNARA | : |
| +----------+----------+ +-----+-----+ : |
| | | : |
| +----------+---------+ +-------+----------+----+ |
| | afm-system-daemon +----+ SECURITY-MANAGER | |
| +--------------------+ +-----------------------+ |
| |
| System |
+------------------------------------------------------------+</code></pre>
<h2 id="starting-afm-system-daemon">Starting <strong>afm-system-daemon</strong></h2>
<p><strong>afm-system-daemon</strong> is launched as a <strong>systemd</strong> service attached to system. Normally, the service file is located at /lib/systemd/system/afm-system-daemon.service.</p>
<p>The options for launching <strong>afm-system-daemon</strong> are:</p>
<pre><code>-r
--root directory
Set the root application directory.
Note that the default root directory is defined
to be /usr/share/afm/applications (may change).
-d
--daemon
Daemonizes the process. It is not needed by sytemd.
-q
--quiet
Reduces the verbosity (can be repeated).
-v
--verbose
Increases the verbosity (can be repeated).
-h
--help
Prints a short help.</code></pre>
<h2 id="the-d-bus-interface">The D-Bus interface</h2>
<h3 id="overview-of-the-dbus-interface">Overview of the dbus interface</h3>
<p><strong><em>afm-system-daemon</em></strong> 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.</p>
<p>The <strong>afm-system-daemon</strong> is listening with the destination name <strong><em>org.AGL.afm.system</em></strong> at the object of path <strong><em>/org/AGL/afm/system</em></strong> on the interface <strong><em>org.AGL.afm.system</em></strong> for the below detailed members <strong><em>install</em></strong> and <strong><em>uninstall</em></strong>.</p>
<p>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.</p>
<p>The client and the service are using JSON serialization to exchange data.</p>
<p>The D-Bus interface is defined by:</p>
<ul>
<li><p>DESTINATION: <strong>org.AGL.afm.system</strong></p></li>
<li><p>PATH: <strong>/org/AGL/afm/system</strong></p></li>
<li><p>INTERFACE: <strong>org.AGL.afm.system</strong></p></li>
</ul>
<p>The signature of any member of the interface is <strong><em>string -> string</em></strong> for <strong><em>JSON -> JSON</em></strong>.</p>
<p>This is the normal case. In case of error, the current implementation returns a dbus error that is a string.</p>
<p>Here is an example using <em>dbus-send</em> to query data on installed applications.</p>
<pre><code>dbus-send --session --print-reply \
--dest=org.AGL.afm.system \
/org/AGL/afm/system \
org.AGL.afm.system.install 'string:"/tmp/appli.wgt"'</code></pre>
<h3 id="the-protocol-over-d-bus">The protocol over D-Bus</h3>
<hr />
<h4 id="method-org.agl.afm.system.install">Method org.AGL.afm.system.install</h4>
<p><strong>Description</strong>: Install an application from a widget file.</p>
<p>When an application with the same <em>id</em> and <em>version</em> already exists. Outside of using <em>force=true</em> the application is not reinstalled.</p>
<p>Applications are installed the subdirectories of applications common directory. If <em>root</em> is specified, the application is installed under the sub-directories of the <em>root</em> defined.</p>
<p>Note that this methods is a simple accessor method of <strong><em>org.AGL.afm.system.install</em></strong> from <strong><em>afm-system-daemon</em></strong>.</p>
<p>After the installation and before returning to the sender, <strong><em>afm-system-daemon</em></strong> sends a signal <strong><em>org.AGL.afm.system.changed</em></strong>.</p>
<p><strong>Input</strong>: The <em>path</em> of the widget file to install and, optionally, a flag to <em>force</em> reinstallation, and, optionally, a <em>root</em> directory.</p>
<p>Either just a string being the absolute path of the widget file:</p>
<pre><code>"/a/path/driving/to/the/widget"</code></pre>
<p>Or an object:</p>
<pre><code>{
"wgt": "/a/path/to/the/widget",
"force": false,
"root": "/a/path/to/the/root"
}</code></pre>
<p>"wgt" and "root" must be absolute paths.</p>
<p><strong>output</strong>: An object with the field "added" being the string for the id of the added application.</p>
<pre><code>{"added":"appli@x.y"}</code></pre>
<hr />
<h4 id="method-org.agl.afm.system.uninstall">Method org.AGL.afm.system.uninstall</h4>
<p><strong>Description</strong>: Uninstall an application from its id.</p>
<p>Note that this methods is a simple method accessor of <strong><em>org.AGL.afm.system.uninstall</em></strong> from <strong><em>afm-system-daemon</em></strong>.</p>
<p>After the uninstallation and before returning to the sender, <strong><em>afm-system-daemon</em></strong> sends a signal <strong><em>org.AGL.afm.system.changed</em></strong>.</p>
<p><strong>Input</strong>: the <em>id</em> of the application and optionally the application <em>root</em> path.</p>
<p>Either a string:</p>
<pre><code>"appli@x.y"</code></pre>
<p>Or an object:</p>
<pre><code>{
"id": "appli@x.y",
"root": "/a/path/to/the/root"
}</code></pre>
<p><strong>output</strong>: the value 'true'.</p>
</body>
</html>
|