Merge ~sylvain-pineau/plainbox:xml-removal into plainbox:master

Proposed by Sylvain Pineau
Status: Merged
Approved by: Sylvain Pineau
Approved revision: ac80303917922d3edf9bcdc7fc08653a17dfe3b1
Merged at revision: 30d7cf665e34499b6426cc0cffadff6883df46ee
Proposed branch: ~sylvain-pineau/plainbox:xml-removal
Merge into: plainbox:master
Diff against target: 56194 lines (+26/-373)
16 files modified
MANIFEST.in (+1/-1)
dev/null (+0/-21)
docs/glossary.rst (+1/-1)
docs/manpages/plainbox-run.rst (+4/-35)
docs/usage.rst (+2/-18)
plainbox/abc.py (+1/-1)
plainbox/impl/commands/test_run.py (+0/-2)
plainbox/impl/exporter/jinja2.py (+1/-17)
plainbox/impl/launcher.py (+0/-6)
plainbox/impl/providers/exporters/data/checkbox.json (+1/-1)
plainbox/impl/providers/exporters/units/exporter.pxu (+0/-7)
plainbox/impl/result.py (+12/-42)
plainbox/impl/session/assistant.py (+1/-75)
plainbox/impl/session/manager.py (+1/-2)
plainbox/impl/test_launcher.py (+0/-1)
plainbox/impl/transport.py (+1/-143)
Reviewer Review Type Date Requested Status
Maciej Kisielewski Approve
Review via email: mp+326677@code.launchpad.net

Description of the change

Remove XML/HEXR support from plainbox

To post a comment you must log in.
Revision history for this message
Maciej Kisielewski (kissiel) wrote :

Epic work. Huge +1.

I admit, I didn't read every line of the diff :) The changes look appropriate. I also tested it with the corresponding branch for checkbox-ng. Works fine.

\o/

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/MANIFEST.in b/MANIFEST.in
index 7318b78..e51f963 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -48,4 +48,4 @@ recursive-exclude daily-package-testing *
48recursive-include contrib *.policy48recursive-include contrib *.policy
49recursive-include docs *.rst *.py *.html *.conf49recursive-include docs *.rst *.py *.html *.conf
50recursive-include plainbox/data *.rng50recursive-include plainbox/data *.rng
51recursive-include plainbox/test-data *.json *.xml *.html51recursive-include plainbox/test-data *.json *.html *.tar.xz
diff --git a/docs/glossary.rst b/docs/glossary.rst
index a4eea8b..6174025 100644
--- a/docs/glossary.rst
+++ b/docs/glossary.rst
@@ -96,7 +96,7 @@ Glossary
96 attachment96 attachment
97 97
98 Attachments are a special type of a Job that can creates an attachment98 Attachments are a special type of a Job that can creates an attachment
99 record in the submission.xml file. They are commonly used to include99 record in the submission reports. They are commonly used to include
100 basic system information files and output of certain commands which can100 basic system information files and output of certain commands which can
101 aid in system certification.101 aid in system certification.
102102
diff --git a/docs/manpages/plainbox-run.rst b/docs/manpages/plainbox-run.rst
index 83a5717..eaf5098 100644
--- a/docs/manpages/plainbox-run.rst
+++ b/docs/manpages/plainbox-run.rst
@@ -191,10 +191,10 @@ plainbox-run (1)
191191
192 Some formats are more useful than others in that they are capable of192 Some formats are more useful than others in that they are capable of
193 transferring more of the internal state. Depending on your application you193 transferring more of the internal state. Depending on your application you
194 may wish to choose the most generic format (json) and process it further194 may wish to choose the most generic format (tar.xz) and process it further
195 with additional tools, choose the most basic format (text) just to get a195 with additional tools, choose the most basic format (text) just to get a
196 simple summary of the results or lastly choose one of the two specialized196 simple summary of the results or lastly choose one of the two specialized
197 formats (xml and html) that are specific to the Checkbox workflow.197 formats (xlsx and html) that are specific to the Checkbox workflow.
198198
199 Out of the box the following exporters are supported:199 Out of the box the following exporters are supported:
200200
@@ -230,7 +230,7 @@ plainbox-run (1)
230 xlsx230 xlsx
231 ----231 ----
232232
233 This exporter creates a standalone .xlsx (XML format for Microsoft Excel)233 This exporter creates a standalone .xlsx (OOXML format for Microsoft Excel)
234 file that contains a human-readable test report. It is quit similar to the234 file that contains a human-readable test report. It is quit similar to the
235 HTML report but it is easier to edit. It is useful for communicating with235 HTML report but it is easier to edit. It is useful for communicating with
236 other humans and since it is entirely standalone and off-line it can be236 other humans and since it is entirely standalone and off-line it can be
@@ -238,17 +238,6 @@ plainbox-run (1)
238238
239 It depends on python3-xlsxwriter package239 It depends on python3-xlsxwriter package
240240
241 hexr
242 ----
243
244 This exporter creates a rather confusingly named XML document only
245 applicable for internal Canonical Hardware Certification Team workflow.
246
247 It is not a generic XML representation of test results and instead it
248 carries quite a few legacy constructs that are only retained for
249 compatibility with other internal tools. If you want generic processing
250 look for JSON instead.
251
252 Selecting Exporter Options241 Selecting Exporter Options
253 ^^^^^^^^^^^^^^^^^^^^^^^^^^242 ^^^^^^^^^^^^^^^^^^^^^^^^^^
254243
@@ -361,15 +350,6 @@ plainbox-run (1)
361 with-text-attachments:350 with-text-attachments:
362 Exported spreadsheet will include text attachments on a separate sheet351 Exported spreadsheet will include text attachments on a separate sheet
363352
364 xml
365 ---
366
367 client-name:
368 This option allows clients to override the name of the application
369 generating the XML document. By default that name is `plainbox`. To
370 use this option pass ``--output-options client-name=other-name``
371 command-line option.
372
373 TRANSPORTING RESULTS353 TRANSPORTING RESULTS
374 ====================354 ====================
375355
@@ -388,23 +368,12 @@ plainbox-run (1)
388368
389 Plainbox comes equipped with the following transports:369 Plainbox comes equipped with the following transports:
390370
391 launchpad
392 ^^^^^^^^^
393
394 This transport can send the results exported using ``xml`` exporter to the
395 Launchpad Hardware Database. This is a little-known feature offered by the
396 https://launchpad.net/ website.
397
398 certification371 certification
399 ^^^^^^^^^^^^^372 ^^^^^^^^^^^^^
400373
401 This transport can send the results exported using the ``xml`` exporter to374 This transport can send the results exported using the ``tar`` exporter to
402 the Canonical Certification Website (https://certification.canonical.com).375 the Canonical Certification Website (https://certification.canonical.com).
403376
404 This transport is of little use to anyone but the Canonical Hardware
405 Certification Team that also maintains Plainbox and Checkbox but it is
406 mentioned here for completeness.
407
408See Also377See Also
409========378========
410379
diff --git a/docs/usage.rst b/docs/usage.rst
index c84866a..e2037b9 100644
--- a/docs/usage.rst
+++ b/docs/usage.rst
@@ -62,8 +62,8 @@ Saving test results
62^^^^^^^^^^^^^^^^^^^62^^^^^^^^^^^^^^^^^^^
6363
64Anything that Plainbox captures and stores during test execution can be64Anything that Plainbox captures and stores during test execution can be
65exported to a file using the exporter system. The two most commonly used65exported to a file using the exporter system. The three most commonly used
66exporters are JSON (versatile and general) and XML (for internal Canonical use).66exporters are tar.xz, html and xlsx.
6767
68JSON Exporter68JSON Exporter
69-------------69-------------
@@ -83,22 +83,6 @@ exporter options can be specified, separated with commas.
8383
84 $ plainbox run --whitelist=/path/to/some/file.whitelist --output-format=com.canonical.plainbox::json --output-file=results.json84 $ plainbox run --whitelist=/path/to/some/file.whitelist --output-format=com.canonical.plainbox::json --output-file=results.json
8585
86XML Exporter
87------------
88
89To generate an XML file that can be sent to the :term:`certification website`
90you need to pass two additional arguments to ``plainbox run``:
91
92#. ``--output-format=com.canonical.plainbox::hexr``
93#. ``--output-file=NAME`` where *NAME* is a file name
94
95For example, to get the default certification tests ready to be submitted
96run this command:
97
98.. code-block:: bash
99
100 $ plainbox run --whitelist=/path/to/some/file.whitelist --output-format=com.canonical.plainbox::hexr --output-file=submission.xml
101
102Other Exporters86Other Exporters
103---------------87---------------
10488
diff --git a/plainbox/abc.py b/plainbox/abc.py
index 8b50900..3315d9d 100644
--- a/plainbox/abc.py
+++ b/plainbox/abc.py
@@ -1064,7 +1064,7 @@ class ISessionStateTransport(metaclass=ABCMeta):
1064 Interface for transports that send test data somewhere.1064 Interface for transports that send test data somewhere.
10651065
1066 They handle just the transmission portion of data sending; exporters are1066 They handle just the transmission portion of data sending; exporters are
1067 expected to produce data in the proper format (e.g. json, xml).1067 expected to produce data in the proper format (e.g. json, tar.xz).
10681068
1069 Each transport can have specific parameters that are required for the1069 Each transport can have specific parameters that are required for the
1070 other end to properly process received information (like system1070 other end to properly process received information (like system
diff --git a/plainbox/data/report/hardware-1_0.rng b/plainbox/data/report/hardware-1_0.rng
1071deleted file mode 1006441071deleted file mode 100644
index 2707550..0000000
--- a/plainbox/data/report/hardware-1_0.rng
+++ /dev/null
@@ -1,552 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" ?>
2<grammar xmlns="http://relaxng.org/ns/structure/1.0"
3 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
4 xmlns:a="http://launchpad.net/annotation">
5 <start>
6 <element name="system">
7 <attribute name="version">
8 <value>1.0</value>
9 </attribute>
10 <interleave>
11 <element name="summary">
12 <ref name="summarySection"/>
13 </element>
14 <element name="hardware">
15 <ref name="hardwareSection"/>
16 </element>
17 <element name="software">
18 <ref name="softwareSection"/>
19 </element>
20 <element name="questions">
21 <ref name="questionsSection"/>
22 </element>
23 <optional>
24 <element name="context">
25 <ref name="contextSection"/>
26 </element>
27 </optional>
28 </interleave>
29 </element>
30 </start>
31
32 <define name="summarySection">
33 <interleave>
34 <element name="live_cd">
35 <attribute name="value">
36 <ref name="booleanValue"/>
37 </attribute>
38 <empty/>
39 </element>
40 <element name="system_id">
41 <attribute name="value">
42 <text/>
43 </attribute>
44 <empty/>
45 </element>
46 <element name="distribution">
47 <attribute name="value">
48 <text/>
49 </attribute>
50 <empty/>
51 </element>
52 <element name="distroseries">
53 <attribute name="value">
54 <text/>
55 </attribute>
56 <empty/>
57 </element>
58 <element name="architecture">
59 <attribute name="value">
60 <text/>
61 </attribute>
62 <empty/>
63 </element>
64 <element name="private">
65 <attribute name="value">
66 <ref name="booleanValue"/>
67 </attribute>
68 <empty/>
69 </element>
70 <element name="contactable">
71 <attribute name="value">
72 <ref name="booleanValue"/>
73 </attribute>
74 <empty/>
75 </element>
76 <element name="date_created">
77 <attribute name="value">
78 <data type="dateTime"/>
79 </attribute>
80 <empty/>
81 </element>
82 <element name="client">
83 <attribute name="name">
84 <text/>
85 </attribute>
86 <attribute name="version">
87 <text/>
88 </attribute>
89 <empty/>
90 <zeroOrMore>
91 <element name="plugin">
92 <attribute name="name">
93 <text/>
94 </attribute>
95 <attribute name="version">
96 <text/>
97 </attribute>
98 </element>
99 </zeroOrMore>
100 </element>
101 <optional>
102 <element name="kernel-release">
103 <attribute name="value">
104 <text/>
105 </attribute>
106 </element>
107 </optional>
108 </interleave>
109 </define>
110
111 <define name="hardwareSection">
112 <interleave>
113 <choice>
114 <element name="hal">
115 <attribute name="version">
116 <text/>
117 </attribute>
118 <oneOrMore>
119 <element name="device">
120 <attribute name="id">
121 <data type="integer">
122 <except>
123 <value/>
124 </except>
125 </data>
126 </attribute>
127 <attribute name="udi">
128 <text/>
129 </attribute>
130 <optional>
131 <attribute name="parent">
132 <data type="integer"/>
133 </attribute>
134 </optional>
135 <!-- XXX: Abel Deuring 2007-12-07:
136 specify a set of required properties? -->
137 <oneOrMore>
138 <ref name="property"/>
139 </oneOrMore>
140 </element>
141 </oneOrMore>
142 </element>
143 <group>
144 <interleave>
145 <element name="udev">
146 <text/>
147 </element>
148 <element name="dmi">
149 <text/>
150 </element>
151 <element name="sysfs-attributes">
152 <zeroOrMore>
153 <text/>
154 </zeroOrMore>
155 </element>
156 </interleave>
157 </group>
158 </choice>
159 <element name="processors">
160 <oneOrMore>
161 <element name="processor">
162 <attribute name="id">
163 <data type="integer">
164 <except>
165 <value/>
166 </except>
167 </data>
168 </attribute>
169 <attribute name="name">
170 <text/>
171 </attribute>
172 <oneOrMore>
173 <ref name="property"/>
174 </oneOrMore>
175 </element>
176 </oneOrMore>
177 </element>
178 <optional>
179 <element name="aliases">
180 <zeroOrMore>
181 <element name="alias">
182 <attribute name="target">
183 <text/>
184 </attribute>
185 <interleave>
186 <element name="vendor">
187 <text/>
188 </element>
189 <element name="model">
190 <text/>
191 </element>
192 </interleave>
193 </element>
194 </zeroOrMore>
195 </element>
196 </optional>
197 </interleave>
198 </define>
199
200 <define name="softwareSection">
201 <interleave>
202 <element name="lsbrelease">
203 <!-- XXX: Abel Deuring 2007-12-07:
204 specify a more restrictive set of allowed
205 and/or required properties?
206 -->
207 <oneOrMore>
208 <ref name="property"/>
209 </oneOrMore>
210 </element>
211 <optional>
212 <element name="packages">
213 <zeroOrMore>
214 <element name="package">
215 <attribute name="name"/>
216 <attribute name="id">
217 <data type="integer">
218 <except>
219 <value/>
220 </except>
221 </data>
222 </attribute>
223 <oneOrMore>
224 <ref name="property"/>
225 </oneOrMore>
226 </element>
227 </zeroOrMore>
228 </element>
229 </optional>
230 <optional>
231 <element name="requirements">
232 <zeroOrMore>
233 <element name="requirement">
234 <attribute name="name"/>
235 <attribute name="id">
236 <data type="integer">
237 <except>
238 <value/>
239 </except>
240 </data>
241 </attribute>
242 <oneOrMore>
243 <ref name="property"/>
244 </oneOrMore>
245 </element>
246 </zeroOrMore>
247 </element>
248 </optional>
249 <optional>
250 <element name="xorg">
251 <attribute name="version">
252 <text/>
253 </attribute>
254 <zeroOrMore>
255 <element name="driver">
256 <optional>
257 <attribute name="device">
258 <data type="integer"/>
259 </attribute>
260 </optional>
261 <attribute name="name">
262 <text/>
263 </attribute>
264 <optional>
265 <attribute name="version">
266 <text/>
267 </attribute>
268 </optional>
269 <attribute name="class">
270 <text/>
271 </attribute>
272 </element>
273 </zeroOrMore>
274 </element>
275 </optional>
276 </interleave>
277 </define>
278
279 <define name="questionsSection">
280 <zeroOrMore>
281 <element name="question">
282 <attribute name="name">
283 <text/>
284 </attribute>
285 <a:comment>
286 The attribute "plugin" must be set, if the question
287 is generated by a plugin.
288 </a:comment>
289 <optional>
290 <attribute name="plugin">
291 <text/>
292 </attribute>
293 </optional>
294 <interleave>
295 <optional>
296 <element name="command">
297 <text/>
298 </element>
299 </optional>
300 <choice>
301 <interleave>
302 <element name="answer">
303 <attribute name="type">
304 <value>multiple_choice</value>
305 </attribute>
306 <optional>
307 <attribute name="unit">
308 <text/>
309 </attribute>
310 </optional>
311 <text/>
312 </element>
313 <element name="answer_choices">
314 <oneOrMore>
315 <ref name="value"/>
316 </oneOrMore>
317 </element>
318 </interleave>
319 <element name="answer">
320 <attribute name="type">
321 <value>measurement</value>
322 </attribute>
323 <optional>
324 <attribute name="unit">
325 <text/>
326 </attribute>
327 </optional>
328 <data type="decimal"/>
329 </element>
330 </choice>
331 <zeroOrMore>
332 <element name="target">
333 <attribute name="id">
334 <text/>
335 </attribute>
336 <interleave>
337 <zeroOrMore>
338 <element name="driver">
339 <text/>
340 </element>
341 </zeroOrMore>
342 </interleave>
343 </element>
344 </zeroOrMore>
345 <optional>
346 <element name="comment">
347 <text/>
348 </element>
349 </optional>
350 </interleave>
351 </element>
352 </zeroOrMore>
353 </define>
354
355 <define name="contextSection">
356 <zeroOrMore>
357 <element name="info">
358 <attribute name="command">
359 <text/>
360 </attribute>
361 <text/>
362 </element>
363 </zeroOrMore>
364 </define>
365
366 <a:comment>
367 convenience for Python code: 'True'/'False' for boolean values
368 instead of 'true'/'false' as defined by
369 http://www.w3.org/2001/XMLSchema-datatypes .
370 </a:comment>
371 <define name="booleanValue">
372 <choice>
373 <value>True</value>
374 <value>False</value>
375 </choice>
376 </define>
377
378 <define name="propertyAndValueContent">
379 <a:comment>
380 Allowed types and values:
381 The dbus... data types are used for HAL properties; the data
382 types are specified in
383 http://dbus.freedesktop.org/doc/dbus-specification.html
384 The other data types are Python data types, defined in
385 http://docs.python.org/lib/types.html
386 </a:comment>
387 <choice>
388 <group>
389 <attribute name="type">
390 <choice>
391 <value>dbus.Boolean</value>
392 <value>bool</value>
393 </choice>
394 </attribute>
395 <ref name="booleanValue"/>
396 </group>
397 <group>
398 <attribute name="type">
399 <choice>
400 <value>dbus.String</value>
401 <value>dbus.UTF8String</value>
402 <value>str</value>
403 </choice>
404 </attribute>
405 <text/>
406 </group>
407 <group>
408 <attribute name="type">
409 <value>dbus.Byte</value>
410 </attribute>
411 <data type="unsignedByte">
412 <except>
413 <value/>
414 </except>
415 </data>
416 </group>
417 <group>
418 <attribute name="type">
419 <value>dbus.Int16</value>
420 </attribute>
421 <data type="short">
422 <except>
423 <value/>
424 </except>
425 </data>
426 </group>
427 <group>
428 <attribute name="type">
429 <value>dbus.Int32</value>
430 </attribute>
431 <data type="int">
432 <except>
433 <value/>
434 </except>
435 </data>
436 </group>
437 <group>
438 <attribute name="type">
439 <value>dbus.Int64</value>
440 </attribute>
441 <data type="long">
442 <except>
443 <value/>
444 </except>
445 </data>
446 </group>
447 <group>
448 <attribute name="type">
449 <value>dbus.UInt16</value>
450 </attribute>
451 <data type="unsignedShort">
452 <except>
453 <value/>
454 </except>
455 </data>
456 </group>
457 <group>
458 <attribute name="type">
459 <value>dbus.UInt32</value>
460 </attribute>
461 <data type="unsignedInt">
462 <except>
463 <value/>
464 </except>
465 </data>
466 </group>
467 <group>
468 <attribute name="type">
469 <value>dbus.UInt64</value>
470 </attribute>
471 <data type="unsignedLong">
472 <except>
473 <value/>
474 </except>
475 </data>
476 </group>
477 <group>
478 <attribute name="type">
479 <value>int</value>
480 </attribute>
481 <data type="long">
482 <except>
483 <value/>
484 </except>
485 </data>
486 </group>
487 <group>
488 <attribute name="type">
489 <value>long</value>
490 </attribute>
491 <data type="integer">
492 <except>
493 <value/>
494 </except>
495 </data>
496 </group>
497 <group>
498 <attribute name="type">
499 <choice>
500 <value>dbus.Double</value>
501 <value>float</value>
502 </choice>
503 </attribute>
504 <data type="decimal"/>
505 </group>
506 <group>
507 <attribute name="type">
508 <choice>
509 <value>dbus.Array</value>
510 <value>list</value>
511 </choice>
512 </attribute>
513 <zeroOrMore>
514 <element name="value">
515 <ref name="propertyAndValueContent"/>
516 </element>
517 </zeroOrMore>
518 </group>
519 <group>
520 <attribute name="type">
521 <choice>
522 <value>dbus.Dictionary</value>
523 <value>dict</value>
524 </choice>
525 </attribute>
526 <zeroOrMore>
527 <element name="value">
528 <attribute name="name">
529 <text/>
530 </attribute>
531 <ref name="propertyAndValueContent"/>
532 </element>
533 </zeroOrMore>
534 </group>
535 </choice>
536 </define>
537
538 <define name="property">
539 <element name="property">
540 <attribute name="name">
541 <text/>
542 </attribute>
543 <ref name="propertyAndValueContent"/>
544 </element>
545 </define>
546
547 <define name="value">
548 <element name="value">
549 <ref name="propertyAndValueContent"/>
550 </element>
551 </define>
552</grammar>
diff --git a/plainbox/impl/commands/test_run.py b/plainbox/impl/commands/test_run.py
index 7d6755b..19d7c9c 100644
--- a/plainbox/impl/commands/test_run.py
+++ b/plainbox/impl/commands/test_run.py
@@ -131,7 +131,6 @@ class TestRun(TestCase):
131 self.assertEqual(call.exception.args, (0,))131 self.assertEqual(call.exception.args, (0,))
132 expected = """132 expected = """
133 Available output formats:133 Available output formats:
134 com.canonical.plainbox::hexr - Generate XML (for certification)
135 com.canonical.plainbox::html - Generate a standalone HTML134 com.canonical.plainbox::html - Generate a standalone HTML
136 com.canonical.plainbox::json - Generate JSON output135 com.canonical.plainbox::json - Generate JSON output
137 com.canonical.plainbox::rfc822 - Generate RCF822 output136 com.canonical.plainbox::rfc822 - Generate RCF822 output
@@ -149,7 +148,6 @@ class TestRun(TestCase):
149 self.assertEqual(call.exception.args, (0,))148 self.assertEqual(call.exception.args, (0,))
150 expected = """149 expected = """
151 Each format may support a different set of options150 Each format may support a different set of options
152 com.canonical.plainbox::hexr:
153 com.canonical.plainbox::html: 151 com.canonical.plainbox::html:
154 com.canonical.plainbox::json: 152 com.canonical.plainbox::json:
155 com.canonical.plainbox::rfc822: with-io-log, squash-io-log, flatten-io-log, with-run-list, with-job-list, with-resource-map, with-job-defs, with-attachments, with-comments, with-job-via, with-job-hash, with-category-map, with-certification-status153 com.canonical.plainbox::rfc822: with-io-log, squash-io-log, flatten-io-log, with-run-list, with-job-list, with-resource-map, with-job-defs, with-attachments, with-comments, with-job-via, with-job-hash, with-category-map, with-certification-status
diff --git a/plainbox/impl/exporter/jinja2.py b/plainbox/impl/exporter/jinja2.py
index 765035f..8bced61 100644
--- a/plainbox/impl/exporter/jinja2.py
+++ b/plainbox/impl/exporter/jinja2.py
@@ -46,21 +46,6 @@ CERTIFICATION_NS = 'com.canonical.certification::'
4646
4747
48@environmentfilter48@environmentfilter
49def do_sorted_xmlattr(_environment, d, autospace=True):
50 """A version of xmlattr filter that sorts attributes."""
51 rv = ' '.join(
52 '%s="%s"' % (escape(key), escape(value))
53 for key, value in sorted(d.items())
54 if value is not None and not isinstance(value, Undefined)
55 )
56 if autospace and rv:
57 rv = ' ' + rv
58 if _environment.autoescape:
59 rv = Markup(rv)
60 return rv
61
62
63@environmentfilter
64def do_strip_ns(_environment, unit_id, ns=CERTIFICATION_NS):49def do_strip_ns(_environment, unit_id, ns=CERTIFICATION_NS):
65 """Remove the namespace part of the identifier."""50 """Remove the namespace part of the identifier."""
66 if unit_id.startswith(ns):51 if unit_id.startswith(ns):
@@ -138,10 +123,9 @@ class Jinja2SessionStateExporter(ISessionStateExporter):
138 return self._unit123 return self._unit
139124
140 def customize_environment(self, env):125 def customize_environment(self, env):
141 """Register filters and tests custom to the HEXR exporter."""126 """Register filters and tests custom to the JSON exporter."""
142 env.autoescape = True127 env.autoescape = True
143 env.filters['jsonify'] = json.dumps128 env.filters['jsonify'] = json.dumps
144 env.filters['sorted_xmlattr'] = do_sorted_xmlattr
145 env.filters['strip_ns'] = do_strip_ns129 env.filters['strip_ns'] = do_strip_ns
146 env.tests['is_name'] = do_is_name130 env.tests['is_name'] = do_is_name
147131
diff --git a/plainbox/impl/exporter/test_hexr.py b/plainbox/impl/exporter/test_hexr.py
148deleted file mode 100644132deleted file mode 100644
index 3ba2f62..0000000
--- a/plainbox/impl/exporter/test_hexr.py
+++ /dev/null
@@ -1,661 +0,0 @@
1# This file is part of Checkbox.
2#
3# Copyright 2015 Canonical Ltd.
4# Written by:
5# Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
6#
7# Checkbox is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License version 3,
9# as published by the Free Software Foundation.
10#
11# Checkbox is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
18
19"""Tests for the hexr exporter."""
20
21from io import BytesIO
22from unittest import TestCase
23from xml.etree import ElementTree
24
25from plainbox.impl.exporter.jinja2 import CERTIFICATION_NS
26from plainbox.impl.exporter.jinja2 import Jinja2SessionStateExporter
27from plainbox.impl.exporter.jinja2 import do_strip_ns
28from plainbox.impl.providers.special import get_stubbox
29from plainbox.impl.resource import Resource
30from plainbox.impl.result import JobResultBuilder
31from plainbox.impl.session import SessionManager
32from plainbox.impl.unit.exporter import ExporterUnitSupport
33from plainbox.impl.unit.job import JobDefinition
34from plainbox.public import get_providers
35from plainbox.vendor import mock
36
37
38class FilterTests(TestCase):
39
40 """Tests for additional filters."""
41
42 def test_do_strip_ns(self):
43 env = mock.Mock()
44 self.assertEqual(do_strip_ns(env, "ns::id", "ns::"), "id")
45
46 def test_do_strip_ns__defaults(self):
47 env = mock.Mock()
48 self.assertEqual(
49 do_strip_ns(env, "com.canonical.certification::id"), "id")
50
51
52class HexrExporterTests(TestCase):
53
54 """Tests for Jinja2SessionStateExporter using the HEXR template."""
55
56 maxDiff = None
57
58 def setUp(self):
59 """Common initialization."""
60 exporter_unit = self._get_all_exporter_units()[
61 'com.canonical.plainbox::hexr']
62 self.exporter = Jinja2SessionStateExporter(
63 system_id='SYSTEM_ID', timestamp='TIMESTAMP',
64 client_version='CLIENT_VERSION', client_name='CLIENT_NAME',
65 exporter_unit=exporter_unit)
66 self.manager = SessionManager.create()
67 self.manager.add_local_device_context()
68
69 def _get_all_exporter_units(self):
70 exporter_map = {}
71 for provider in get_providers():
72 for unit in provider.unit_list:
73 if unit.Meta.name == 'exporter':
74 exporter_map[unit.id] = ExporterUnitSupport(unit)
75 return exporter_map
76
77 def _populate_session(self):
78 self._make_representative_jobs()
79 self._make_cert_resources()
80 self._make_cert_attachments()
81
82 def _make_representative_jobs(self):
83 # Add all of the jobs from representative.pxu so that we don't have to
84 # create verbose fakes. Each job gets a simple passing result.
85 state = self.manager.default_device_context.state
86 stubbox = get_stubbox(validate=False, check=True)
87 for job in stubbox.job_list:
88 if not job.partial_id.startswith('representative/plugin/'):
89 continue
90 state.add_unit(job)
91 result = self._make_result_for(job)
92 state.update_job_result(job, result)
93 last_job = job
94 last_result = result
95 # Add a comment to one job (the last one)
96 state.update_job_result(
97 last_job, last_result.get_builder(
98 comments='COMMENTS').get_result())
99
100 def _make_result_for(self, job):
101 builder = JobResultBuilder(outcome='pass')
102 if job.plugin == 'local':
103 pass
104 elif job.plugin == 'resource':
105 pass
106 else:
107 builder.io_log = [
108 (0, 'stdout', b'IO-LOG-STDOUT\n'),
109 (1, 'stderr', b'IO-LOG-STDERR\n')
110 ]
111 return builder.get_result()
112
113 def _make_cert_resources(self):
114 # Create some specific resources that this exporter relies on. The
115 # corresponding jobs are _not_ loaded but this is irrelevant.
116 state = self.manager.default_device_context.state
117 ns = CERTIFICATION_NS
118 state.set_resource_list(ns + 'cpuinfo', [Resource({
119 'PROP-1': 'VALUE-1',
120 'PROP-2': 'VALUE-2',
121 'count': '2', # NOTE: this has to be a number :/
122 })])
123 state.set_resource_list(ns + 'dpkg', [Resource({
124 'architecture': 'dpkg.ARCHITECTURE',
125 })])
126 state.set_resource_list(ns + 'lsb', [Resource({
127 'codename': 'lsb.CODENAME',
128 'description': 'lsb.DESCRIPTION',
129 'release': 'lsb.RELEASE',
130 'distributor_id': 'lsb.DISTRIBUTOR_ID',
131 })])
132 state.set_resource_list(ns + 'uname', [Resource({
133 'release': 'uname.RELEASE',
134 })])
135 state.set_resource_list(ns + 'package', [Resource({
136 'name': 'package.0.NAME',
137 'version': 'package.0.VERSION',
138 }), Resource({
139 'name': 'package.1.NAME',
140 'version': 'package.1.VERSION',
141 })])
142 state.set_resource_list(ns + 'requirements', [Resource({
143 'name': 'requirement.0.NAME',
144 'link': 'requirement.0.LINK',
145 }), Resource({
146 'name': 'requirement.1.NAME',
147 'link': 'requirement.1.LINK',
148 })])
149
150 def _make_cert_empty_resources(self):
151 # Create empty resources, as experienced when the tested system
152 # freezes and corrupts the content of the session. (lp:1479719)
153 state = self.manager.default_device_context.state
154 ns = CERTIFICATION_NS
155 state.set_resource_list(ns + 'cpuinfo', [])
156 state.set_resource_list(ns + 'dpkg', [])
157 state.set_resource_list(ns + 'lsb', [])
158 state.set_resource_list(ns + 'uname', [])
159 state.set_resource_list(ns + 'package', [])
160 state.set_resource_list(ns + 'requirements', [])
161
162 def _make_cert_attachments(self):
163 state = self.manager.default_device_context.state
164 partial_id_list = ['dmi_attachment', 'sysfs_attachment',
165 'udev_attachment']
166 for partial_id in partial_id_list:
167 job = JobDefinition({
168 'id': CERTIFICATION_NS + partial_id,
169 'plugin': 'attachment'
170 })
171 result = JobResultBuilder(io_log=[
172 (0, 'stdout', 'STDOUT-{}\n'.format(
173 partial_id).encode('utf-8')),
174 (1, 'stderr', 'STDERR-{}\n'.format(
175 partial_id).encode('utf-8'))]
176 ).get_result()
177 state.add_unit(job)
178 state.update_job_result(job, result)
179
180 def _inject_evil_input(self):
181 evil = '"\'<&>'
182 self.exporter._system_id = evil
183 self.exporter._timestamp = evil
184 self.exporter._client_name = evil
185 self.exporter._client_version = evil
186 state = self.manager.default_device_context.state
187 for resource_id in state.resource_map:
188 resource_list = state.resource_map[resource_id]
189 for resource in resource_list:
190 for key in resource:
191 if resource_id.endswith('cpuinfo') and key == 'count':
192 # don't change resources for the <hardware> section
193 continue
194 resource[key] = evil
195 new_job_state_map = {}
196 for index, job_id in enumerate(sorted(state.job_state_map)):
197 job_state = state.job_state_map[job_id]
198 if (job_state.job.partial_id.endswith('_attachment')
199 or job_state.job.partial_id == 'cpuinfo'):
200 # don't change attachments for the <hardware> section
201 evil_id = job_id
202 else:
203 evil_id = '{}-{}-{}'.format(evil, index, job_state.job.plugin)
204 # NOTE: using private API
205 job_state.job._data['id'] = evil_id
206 job_state.result = job_state.result.get_builder(
207 comments=evil,
208 io_log=[(0, 'stdout', evil.encode("UTF-8"))],
209 ).get_result()
210 new_job_state_map[evil_id] = job_state
211 # NOTE: using private API
212 state._job_state_map = new_job_state_map
213
214 def tearDown(self):
215 """Common teardown."""
216 self.manager.destroy()
217
218 def test_smoke(self):
219 """The XML document has the right data in the right spot."""
220 self._populate_session()
221 stream = BytesIO()
222 self.exporter.dump_from_session_manager(self.manager, stream)
223 smoke_actual = stream.getvalue().decode("utf-8")
224 self.assertMultiLineEqual(_smoke_expected, smoke_actual)
225
226 def test_without_any_data(self):
227 """The XML document can be produced without any data in the session."""
228 stream = BytesIO()
229 self.exporter.dump_from_session_manager(self.manager, stream)
230 empty_actual = stream.getvalue().decode("utf-8")
231 self.assertMultiLineEqual(_empty_expected, empty_actual)
232
233 def _test_escaping(self):
234 """Evil input doesn't break the correctness of the XML document."""
235 self._populate_session()
236 self._inject_evil_input()
237 stream = BytesIO()
238 self.exporter.dump_from_session_manager(self.manager, stream)
239 evil_actual = stream.getvalue().decode("utf-8")
240 self.assertMultiLineEqual(_evil_expected, evil_actual)
241
242 def test_empty_resources(self):
243 """Empty resources don't break the correctness of the XML document."""
244 self._make_representative_jobs()
245 self._make_cert_empty_resources()
246 self._make_cert_attachments()
247 stream = BytesIO()
248 self.exporter.dump_from_session_manager(self.manager, stream)
249 empty_resources_actual = stream.getvalue().decode("utf-8")
250 self.assertMultiLineEqual(_empty_resources_expected, empty_resources_actual)
251
252 def test_xml_parsability(self):
253 """Each produced output can be parsed with an XML parser."""
254 stream1 = BytesIO(_smoke_expected.encode("utf-8"))
255 ElementTree.parse(stream1)
256 stream2 = BytesIO(_empty_expected.encode("utf-8"))
257 ElementTree.parse(stream2)
258 stream3 = BytesIO(_evil_expected.encode("utf-8"))
259 ElementTree.parse(stream3)
260
261
262_smoke_expected = """\
263<?xml version="1.0"?>
264<system version="1.0">
265 <context>
266 <info command="com.canonical.plainbox::representative/plugin/attachment">IO-LOG-STDOUT
267</info>
268 </context>
269 <hardware>
270 <dmi>STDOUT-dmi_attachment
271</dmi>
272 <sysfs-attributes>STDOUT-sysfs_attachment
273</sysfs-attributes>
274 <udev>STDOUT-udev_attachment
275</udev>
276 <processors>
277 <processor id="0" name="0">
278 <property name="count" type="str">2</property>
279 <property name="PROP-1" type="str">VALUE-1</property>
280 <property name="PROP-2" type="str">VALUE-2</property>
281 </processor>
282 <processor id="1" name="1">
283 <property name="count" type="str">2</property>
284 <property name="PROP-1" type="str">VALUE-1</property>
285 <property name="PROP-2" type="str">VALUE-2</property>
286 </processor>
287 </processors>
288 </hardware>
289 <questions>
290 <question name="com.canonical.plainbox::representative/plugin/manual">
291 <answer type="multiple_choice">pass</answer>
292 <answer_choices>
293 <value type="str">none</value>
294 <value type="str">pass</value>
295 <value type="str">fail</value>
296 <value type="str">skip</value>
297 </answer_choices>
298 <comment>IO-LOG-STDOUT
299IO-LOG-STDERR
300</comment>
301 </question>
302 <question name="com.canonical.plainbox::representative/plugin/qml">
303 <answer type="multiple_choice">pass</answer>
304 <answer_choices>
305 <value type="str">none</value>
306 <value type="str">pass</value>
307 <value type="str">fail</value>
308 <value type="str">skip</value>
309 </answer_choices>
310 <comment>IO-LOG-STDOUT
311IO-LOG-STDERR
312</comment>
313 </question>
314 <question name="com.canonical.plainbox::representative/plugin/shell">
315 <answer type="multiple_choice">pass</answer>
316 <answer_choices>
317 <value type="str">none</value>
318 <value type="str">pass</value>
319 <value type="str">fail</value>
320 <value type="str">skip</value>
321 </answer_choices>
322 <comment>IO-LOG-STDOUT
323IO-LOG-STDERR
324</comment>
325 </question>
326 <question name="com.canonical.plainbox::representative/plugin/user-interact">
327 <answer type="multiple_choice">pass</answer>
328 <answer_choices>
329 <value type="str">none</value>
330 <value type="str">pass</value>
331 <value type="str">fail</value>
332 <value type="str">skip</value>
333 </answer_choices>
334 <comment>IO-LOG-STDOUT
335IO-LOG-STDERR
336</comment>
337 </question>
338 <question name="com.canonical.plainbox::representative/plugin/user-interact-verify">
339 <answer type="multiple_choice">pass</answer>
340 <answer_choices>
341 <value type="str">none</value>
342 <value type="str">pass</value>
343 <value type="str">fail</value>
344 <value type="str">skip</value>
345 </answer_choices>
346 <comment>IO-LOG-STDOUT
347IO-LOG-STDERR
348</comment>
349 </question>
350 <question name="com.canonical.plainbox::representative/plugin/user-verify">
351 <answer type="multiple_choice">pass</answer>
352 <answer_choices>
353 <value type="str">none</value>
354 <value type="str">pass</value>
355 <value type="str">fail</value>
356 <value type="str">skip</value>
357 </answer_choices>
358 <comment>COMMENTS</comment>
359 </question>
360 </questions>
361 <software>
362 <lsbrelease>
363 <property name="codename" type="str">lsb.CODENAME</property>
364 <property name="description" type="str">lsb.DESCRIPTION</property>
365 <property name="distributor_id" type="str">lsb.DISTRIBUTOR_ID</property>
366 <property name="release" type="str">lsb.RELEASE</property>
367 </lsbrelease>
368 <packages>
369 <package id="0" name="package.0.NAME">
370 <property name="version" type="str">package.0.VERSION</property>
371 </package>
372 <package id="1" name="package.1.NAME">
373 <property name="version" type="str">package.1.VERSION</property>
374 </package>
375 </packages>
376 <requirements>
377 <requirement id=" 0" name="requirement.0.NAME">
378 <property name="link" type="str">requirement.0.LINK</property>
379 </requirement>
380 <requirement id=" 1" name="requirement.1.NAME">
381 <property name="link" type="str">requirement.1.LINK</property>
382 </requirement>
383 </requirements>
384 </software>
385 <summary>
386 <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
387 <date_created value="TIMESTAMP"/>
388 <architecture value="dpkg.ARCHITECTURE"/>
389 <distribution value="lsb.DISTRIBUTOR_ID"/>
390 <distroseries value="lsb.RELEASE"/>
391 <kernel-release value="uname.RELEASE"/>
392 <private value="False"/>
393 <contactable value="False"/>
394 <live_cd value="False"/>
395 <system_id value="SYSTEM_ID"/>
396 </summary>
397</system>"""
398
399
400_empty_expected = """\
401<?xml version="1.0"?>
402<system version="1.0">
403 <context>
404 </context>
405 <hardware>
406 <!-- the dmi_attachment job is not available, not producing the <dmi> section -->
407 <!-- the sysfs_attachment job is not available, not producing the <sysfs-attributes> tag -->
408 <!-- the udev_attachment job is not available, not producing the <udev> tag -->
409 <!-- cpuinfo resource is not available, not producing the <processors> section -->
410 </hardware>
411 <questions>
412 </questions>
413 <software>
414 <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
415 <!-- package resource is not available, not producing the <packages> tag -->
416 <!-- requirements resource is not available, not producing the <requirements> tag -->
417 </software>
418 <summary>
419 <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
420 <date_created value="TIMESTAMP"/>
421 <!-- dpkg resource is not available, not producing the <architecture> tag -->
422 <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
423 <!-- uname resource is not available, not producing the <kernel-release> tag -->
424 <private value="False"/>
425 <contactable value="False"/>
426 <live_cd value="False"/>
427 <system_id value="SYSTEM_ID"/>
428 </summary>
429</system>"""
430
431_escaped_evil_text = '&#34;&#39;&lt;&amp;&gt;'
432_evil_expected = """\
433<?xml version="1.0"?>
434<system version="1.0">
435 <context>
436 <info command="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-3-attachment">&#34;&#39;&lt;&amp;&gt;</info>
437 </context>
438 <hardware>
439 <dmi>&#34;&#39;&lt;&amp;&gt;</dmi>
440 <sysfs-attributes>&#34;&#39;&lt;&amp;&gt;</sysfs-attributes>
441 <udev>&#34;&#39;&lt;&amp;&gt;</udev>
442 <processors>
443 <processor id="0" name="0">
444 <property name="count" type="str">2</property>
445 <property name="PROP-1" type="str">{evil}</property>
446 <property name="PROP-2" type="str">{evil}</property>
447 </processor>
448 <processor id="1" name="1">
449 <property name="count" type="str">2</property>
450 <property name="PROP-1" type="str">{evil}</property>
451 <property name="PROP-2" type="str">{evil}</property>
452 </processor>
453 </processors>
454 </hardware>
455 <questions>
456 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-10-user-interact-verify">
457 <answer type="multiple_choice">pass</answer>
458 <answer_choices>
459 <value type="str">none</value>
460 <value type="str">pass</value>
461 <value type="str">fail</value>
462 <value type="str">skip</value>
463 </answer_choices>
464 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
465 </question>
466 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-11-user-verify">
467 <answer type="multiple_choice">pass</answer>
468 <answer_choices>
469 <value type="str">none</value>
470 <value type="str">pass</value>
471 <value type="str">fail</value>
472 <value type="str">skip</value>
473 </answer_choices>
474 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
475 </question>
476 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-5-manual">
477 <answer type="multiple_choice">pass</answer>
478 <answer_choices>
479 <value type="str">none</value>
480 <value type="str">pass</value>
481 <value type="str">fail</value>
482 <value type="str">skip</value>
483 </answer_choices>
484 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
485 </question>
486 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-6-qml">
487 <answer type="multiple_choice">pass</answer>
488 <answer_choices>
489 <value type="str">none</value>
490 <value type="str">pass</value>
491 <value type="str">fail</value>
492 <value type="str">skip</value>
493 </answer_choices>
494 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
495 </question>
496 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-8-shell">
497 <answer type="multiple_choice">pass</answer>
498 <answer_choices>
499 <value type="str">none</value>
500 <value type="str">pass</value>
501 <value type="str">fail</value>
502 <value type="str">skip</value>
503 </answer_choices>
504 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
505 </question>
506 <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-9-user-interact">
507 <answer type="multiple_choice">pass</answer>
508 <answer_choices>
509 <value type="str">none</value>
510 <value type="str">pass</value>
511 <value type="str">fail</value>
512 <value type="str">skip</value>
513 </answer_choices>
514 <comment>&#34;&#39;&lt;&amp;&gt;</comment>
515 </question>
516 </questions>
517 <software>
518 <lsbrelease>
519 <property name="codename" type="str">{evil}</property>
520 <property name="description" type="str">{evil}</property>
521 <property name="distributor_id" type="str">{evil}</property>
522 <property name="release" type="str">{evil}</property>
523 </lsbrelease>
524 <packages>
525 <package id="0" name="{evil}">
526 <property name="version" type="str">{evil}</property>
527 </package>
528 <package id="1" name="{evil}">
529 <property name="version" type="str">{evil}</property>
530 </package>
531 </packages>
532 <requirements>
533 <requirement id=" 0" name="{evil}">
534 <property name="link" type="str">{evil}</property>
535 </requirement>
536 <requirement id=" 1" name="{evil}">
537 <property name="link" type="str">{evil}</property>
538 </requirement>
539 </requirements>
540 </software>
541 <summary>
542 <client name="{evil}" version="{evil}"/>
543 <date_created value="{evil}"/>
544 <architecture value="{evil}"/>
545 <distribution value="{evil}"/>
546 <distroseries value="{evil}"/>
547 <kernel-release value="{evil}"/>
548 <private value="False"/>
549 <contactable value="False"/>
550 <live_cd value="False"/>
551 <system_id value="{evil}"/>
552 </summary>
553</system>""".format(evil=_escaped_evil_text)
554
555_empty_resources_expected = """\
556<?xml version="1.0"?>
557<system version="1.0">
558 <context>
559 <info command="com.canonical.plainbox::representative/plugin/attachment">IO-LOG-STDOUT
560</info>
561 </context>
562 <hardware>
563 <dmi>STDOUT-dmi_attachment
564</dmi>
565 <sysfs-attributes>STDOUT-sysfs_attachment
566</sysfs-attributes>
567 <udev>STDOUT-udev_attachment
568</udev>
569 <!-- cpuinfo resource is not available, not producing the <processors> section -->
570 </hardware>
571 <questions>
572 <question name="com.canonical.plainbox::representative/plugin/manual">
573 <answer type="multiple_choice">pass</answer>
574 <answer_choices>
575 <value type="str">none</value>
576 <value type="str">pass</value>
577 <value type="str">fail</value>
578 <value type="str">skip</value>
579 </answer_choices>
580 <comment>IO-LOG-STDOUT
581IO-LOG-STDERR
582</comment>
583 </question>
584 <question name="com.canonical.plainbox::representative/plugin/qml">
585 <answer type="multiple_choice">pass</answer>
586 <answer_choices>
587 <value type="str">none</value>
588 <value type="str">pass</value>
589 <value type="str">fail</value>
590 <value type="str">skip</value>
591 </answer_choices>
592 <comment>IO-LOG-STDOUT
593IO-LOG-STDERR
594</comment>
595 </question>
596 <question name="com.canonical.plainbox::representative/plugin/shell">
597 <answer type="multiple_choice">pass</answer>
598 <answer_choices>
599 <value type="str">none</value>
600 <value type="str">pass</value>
601 <value type="str">fail</value>
602 <value type="str">skip</value>
603 </answer_choices>
604 <comment>IO-LOG-STDOUT
605IO-LOG-STDERR
606</comment>
607 </question>
608 <question name="com.canonical.plainbox::representative/plugin/user-interact">
609 <answer type="multiple_choice">pass</answer>
610 <answer_choices>
611 <value type="str">none</value>
612 <value type="str">pass</value>
613 <value type="str">fail</value>
614 <value type="str">skip</value>
615 </answer_choices>
616 <comment>IO-LOG-STDOUT
617IO-LOG-STDERR
618</comment>
619 </question>
620 <question name="com.canonical.plainbox::representative/plugin/user-interact-verify">
621 <answer type="multiple_choice">pass</answer>
622 <answer_choices>
623 <value type="str">none</value>
624 <value type="str">pass</value>
625 <value type="str">fail</value>
626 <value type="str">skip</value>
627 </answer_choices>
628 <comment>IO-LOG-STDOUT
629IO-LOG-STDERR
630</comment>
631 </question>
632 <question name="com.canonical.plainbox::representative/plugin/user-verify">
633 <answer type="multiple_choice">pass</answer>
634 <answer_choices>
635 <value type="str">none</value>
636 <value type="str">pass</value>
637 <value type="str">fail</value>
638 <value type="str">skip</value>
639 </answer_choices>
640 <comment>COMMENTS</comment>
641 </question>
642 </questions>
643 <software>
644 <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
645 <packages>
646 </packages>
647 <requirements>
648 </requirements>
649 </software>
650 <summary>
651 <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
652 <date_created value="TIMESTAMP"/>
653 <!-- dpkg resource is not available, not producing the <architecture> tag -->
654 <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
655 <!-- uname resource is not available, not producing the <kernel-release> tag -->
656 <private value="False"/>
657 <contactable value="False"/>
658 <live_cd value="False"/>
659 <system_id value="SYSTEM_ID"/>
660 </summary>
661</system>"""
diff --git a/plainbox/impl/launcher.py b/plainbox/impl/launcher.py
index dffab32..c535aef 100644
--- a/plainbox/impl/launcher.py
+++ b/plainbox/impl/launcher.py
@@ -133,12 +133,6 @@ class LauncherDefinitionLegacy(LauncherDefinition):
133 section="submission",133 section="submission",
134 help_text=_("Label on the 'send' button"))134 help_text=_("Label on the 'send' button"))
135135
136 submit_to_hexr = config.Variable(
137 section="submission",
138 kind=bool,
139 # TODO: default?
140 help_text=_("If enabled then test results will be also sent to HEXR"))
141
142 submit_to = config.Variable(136 submit_to = config.Variable(
143 section="transport",137 section="transport",
144 validator_list=[config.ChoiceValidator(get_all_transports().keys())],138 validator_list=[config.ChoiceValidator(get_all_transports().keys())],
diff --git a/plainbox/impl/providers/exporters/data/checkbox.json b/plainbox/impl/providers/exporters/data/checkbox.json
index 31bfff6..00ed7e1 100644
--- a/plainbox/impl/providers/exporters/data/checkbox.json
+++ b/plainbox/impl/providers/exporters/data/checkbox.json
@@ -42,7 +42,7 @@
42 "name": "{{ job_state.job.tr_summary() }}",42 "name": "{{ job_state.job.tr_summary() }}",
43 "certification_status": "{{ job_state.effective_certification_status }}",43 "certification_status": "{{ job_state.effective_certification_status }}",
44 "category": "{{ job_state.effective_category_id }}",44 "category": "{{ job_state.effective_category_id }}",
45 "status": "{{ job_state.result.outcome_meta().hexr_xml_mapping }}",45 "status": "{{ job_state.result.outcome_meta().hexr_mapping }}",
46 "comments": {{ job_state.result.comments | jsonify | safe }},46 "comments": {{ job_state.result.comments | jsonify | safe }},
47 "io_log": {{ job_state.result.io_log_as_flat_text | jsonify | safe }},47 "io_log": {{ job_state.result.io_log_as_flat_text | jsonify | safe }},
48 "type": "test",48 "type": "test",
diff --git a/plainbox/impl/providers/exporters/data/hexr.xml b/plainbox/impl/providers/exporters/data/hexr.xml
49deleted file mode 10064449deleted file mode 100644
index 649c84c..0000000
--- a/plainbox/impl/providers/exporters/data/hexr.xml
+++ /dev/null
@@ -1,161 +0,0 @@
1{%- set ns = 'com.canonical.certification::' -%}
2{%- set state = manager.default_device_context.state -%}
3{%- set job_state_map = state.job_state_map -%}
4{%- set hexr_outcome_list = OUTCOME_METADATA_MAP.values()|selectattr('hexr_xml_allowed')|sort(attribute='hexr_xml_order') -%}
5<?xml version="1.0"?>
6<system version="1.0">
7 <context>
8 {%- for job_id in job_state_map|sort %}
9 {%- set job_state = job_state_map[job_id] %}
10 {%- if job_state.job.id|strip_ns not in ("dmi_attachment", "sysfs_attachment", "udev_attachment") and job_state.job.plugin == "attachment" and job_state.result.outcome %}
11 <info command="{{ job_state.job.id|strip_ns }}">{{ job_state.result.io_log_as_text_attachment }}</info>
12 {%- endif %}
13 {%- endfor %}
14 </context>
15 <hardware>
16 {%- if ns ~ 'dmi_attachment' in state.job_state_map %}
17 {%- set dmi_attachment = state.job_state_map[ns ~ 'dmi_attachment'].result.io_log_as_text_attachment %}
18 <dmi>{{ dmi_attachment }}</dmi>
19 {%- else %}
20 <!-- the dmi_attachment job is not available, not producing the <dmi> section -->
21 {%- endif %}
22 {%- if ns ~ 'sysfs_attachment' in state.job_state_map %}
23 {%- set sysfs_attachment = state.job_state_map[ns ~ 'sysfs_attachment'].result.io_log_as_text_attachment %}
24 <sysfs-attributes>{{ sysfs_attachment }}</sysfs-attributes>
25 {%- else %}
26 <!-- the sysfs_attachment job is not available, not producing the <sysfs-attributes> tag -->
27 {%- endif %}
28 {%- if ns ~ 'udev_attachment' in state.job_state_map %}
29 {%- set udev_attachment = state.job_state_map[ns ~ 'udev_attachment'].result.io_log_as_text_attachment %}
30 <udev>{{ udev_attachment }}</udev>
31 {%- else %}
32 <!-- the udev_attachment job is not available, not producing the <udev> tag -->
33 {%- endif %}
34 {%- if ns ~ 'cpuinfo' in state.resource_map and state.resource_map[ns ~ 'cpuinfo'][0] %}
35 {%- set processor_resource = state.resource_map[ns ~ 'cpuinfo'][0] %}
36 {#- FIXME: The <processors> section is quite broken by design. #}
37 {#- Yes, it does copy the data for the 0th CPU $count times. #}
38 <processors>
39 {%- for dummy_index in range(processor_resource.count|int) %}
40 <processor id="{{ loop.index0 }}" name="{{ loop.index0 }}">
41 {%- for key in processor_resource|sort %}
42 <property name="{{ key }}" type="str">{{ processor_resource[key] }}</property>
43 {%- endfor %}
44 </processor>
45 {%- endfor %}
46 </processors>
47 {%- else %}
48 <!-- cpuinfo resource is not available, not producing the <processors> section -->
49 {%- endif %}
50 </hardware>
51 <questions>
52 {%- for job_id in job_state_map|sort %}
53 {%- set job_state = job_state_map[job_id] %}
54 {%- set job = job_state.job %}
55 {%- set result = job_state.result %}
56 {%- if job.plugin not in ("resource", "local", "attachment") and job_state.result.outcome %}
57 <question{{ {
58 'name': job.id|strip_ns,
59 'certification_status': job_state.certification_status,
60 }|sorted_xmlattr }}>
61 <answer type="multiple_choice">{{ result.outcome_meta().hexr_xml_mapping }}</answer>
62 {#- FIXME: Yes the <answer_choices> section is useless #}
63 <answer_choices>
64 {%- for outcome_info in hexr_outcome_list %}
65 <value type="str">{{ outcome_info.hexr_xml_mapping }}</value>
66 {%- endfor %}
67 </answer_choices>
68 {#- FIXME: yes this does munges comments and I/O log #}
69 <comment>
70 {%- if result.comments -%}
71 {{ result.comments }}
72 {%- else -%}
73 {{ result.io_log_as_flat_text }}
74 {%- endif -%}
75 </comment>
76 </question>
77 {%- endif %}
78 {%- endfor %}
79 </questions>
80 <software>
81 {%- if ns ~ 'lsb' in state.resource_map and state.resource_map[ns ~ 'lsb'][0] %}
82 {%- set lsb_resource = state.resource_map[ns ~ 'lsb'][0] %}
83 <lsbrelease>
84 {%- for key in lsb_resource|sort %}
85 <property name="{{ key }}" type="str">{{ lsb_resource[key] }}</property>
86 {%- endfor %}
87 </lsbrelease>
88 {%- else %}
89 <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
90 {%- endif %}
91 {%- if ns ~ 'package' in state.resource_map %}
92 {%- set package_resource_list = state.resource_map[ns ~ 'package'] %}
93 <packages>
94 {%- for package_resource in package_resource_list if package_resource.name %}
95 <package id="{{ loop.index0 }}" name="{{ package_resource.name }}">
96 {%- for key in package_resource|reject('is_name')|sort %}
97 <property name="{{ key }}" type="str">{{ package_resource[key] }}</property>
98 {%- endfor %}
99 </package>
100 {%- endfor %}
101 </packages>
102 {%- else %}
103 <!-- package resource is not available, not producing the <packages> tag -->
104 {%- endif %}
105 {%- if ns ~ 'snap' in state.resource_map %}
106 {%- set snap_package_resource_list = state.resource_map[ns ~ 'snap'] %}
107 <snap_packages>
108 {%- for snap_package_resource in snap_package_resource_list if snap_package_resource.name %}
109 <snap_package id="{{ loop.index0 }}" name="{{ snap_package_resource.name }}">
110 {%- for key in snap_package_resource|reject('is_name')|sort %}
111 <property name="{{ key }}" type="str">{{ snap_package_resource[key] }}</property>
112 {%- endfor %}
113 </snap_package>
114 {%- endfor %}
115 </snap_packages>
116 {%- endif %}
117 {%- if ns ~ 'requirements' in state.resource_map %}
118 {%- set requirement_resource_list = state.resource_map[ns ~ 'requirements'] %}
119 <requirements>
120 {%- for requirement_resource in requirement_resource_list %}
121 <requirement id=" {{ loop.index0 }}" name="{{ requirement_resource.name }}">
122 {%- for key in requirement_resource|reject('is_name')|sort %}
123 <property name="{{ key }}" type="str">{{ requirement_resource[key] }}</property>
124 {%- endfor %}
125 </requirement>
126 {%- endfor %}
127 </requirements>
128 {%- else %}
129 <!-- requirements resource is not available, not producing the <requirements> tag -->
130 {%- endif %}
131 </software>
132 <summary>
133 {#- FIXME: with all the <property> tags those should not be custom #}
134 <client name="{{ client_name }}" version="{{ client_version }}"/>
135 <date_created value="{{ timestamp }}"/>
136 {%- if ns ~ 'dpkg' in state.resource_map and state.resource_map[ns ~ 'dpkg'][0] %}
137 {%- set dpkg_resource = state.resource_map[ns ~ 'dpkg'][0] %}
138 <architecture value="{{ dpkg_resource.architecture }}"/>
139 {%- else %}
140 <!-- dpkg resource is not available, not producing the <architecture> tag -->
141 {%- endif %}
142 {%- if ns ~ 'lsb' in state.resource_map and lsb_resource %}
143 {#- NOTE: lsb_resource is computed earlier, if the condition above holds #}
144 <distribution value="{{ lsb_resource.distributor_id }}"/>
145 <distroseries value="{{ lsb_resource.release }}"/>
146 {%- else %}
147 <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
148 {%- endif %}
149 {%- if ns ~ 'uname' in state.resource_map and state.resource_map[ns ~ 'uname'][0] %}
150 {%- set uname_resource = state.resource_map[ns ~ 'uname'][0] %}
151 <kernel-release value="{{ uname_resource.release }}"/>
152 {%- else %}
153 <!-- uname resource is not available, not producing the <kernel-release> tag -->
154 {%- endif %}
155 {#- FIXME: yes, this is just hard-coded non-sense #}
156 <private value="False"/>
157 <contactable value="False"/>
158 <live_cd value="False"/>
159 <system_id value="{{ system_id }}"/>
160 </summary>
161</system>
diff --git a/plainbox/impl/providers/exporters/units/exporter.pxu b/plainbox/impl/providers/exporters/units/exporter.pxu
index 66e155a..0d7ec67 100644
--- a/plainbox/impl/providers/exporters/units/exporter.pxu
+++ b/plainbox/impl/providers/exporters/units/exporter.pxu
@@ -1,11 +1,4 @@
1unit: exporter1unit: exporter
2id: hexr
3_summary: Generate XML (for certification)
4entry_point: jinja2
5file_extension: xml
6data: {"template": "hexr.xml"}
7
8unit: exporter
9id: html2id: html
10_summary: Generate a standalone HTML3_summary: Generate a standalone HTML
11entry_point: jinja24entry_point: jinja2
diff --git a/plainbox/impl/result.py b/plainbox/impl/result.py
index 8bbf98a..ec325e6 100644
--- a/plainbox/impl/result.py
+++ b/plainbox/impl/result.py
@@ -54,8 +54,7 @@ logger = logging.getLogger("plainbox.result")
54# U+007F..U+009F. Also known as control characters."54# U+007F..U+009F. Also known as control characters."
55#55#
56# NOTE: we don't want to match certain control characters (newlines, carriage56# NOTE: we don't want to match certain control characters (newlines, carriage
57# returns, tabs or vertical tabs as those are allowed by lxml and it would be57# returns, tabs or vertical tabs).
58# silly to strip them.
59CONTROL_CODE_RE_STR = re.compile(58CONTROL_CODE_RE_STR = re.compile(
60 "(?![\n\r\t\v])[\u0000-\u001F]|[\u007F-\u009F]")59 "(?![\n\r\t\v])[\u0000-\u001F]|[\u007F-\u009F]")
6160
@@ -105,24 +104,11 @@ IOLogRecord = namedtuple("IOLogRecord", "delay stream_name data".split())
105# for graphical applications in the same way as color_ansi is useful for104# for graphical applications in the same way as color_ansi is useful for
106# console applications.105# console applications.
107#106#
108# hexr_xml_mapping - a string that needs to be used in the XML report for the107# hexr_mapping - a string that needs to be used in the XML report for the
109# Canonical HEXR application (also for the Canonical Certification web108# Canonical Certification web application.
110# application). Those values must be in sync with a piece of code in
111# checkbox_support that handles parsing of the XML report, for as long as the
112# report is to be maintained.
113#
114# hexr_xml_allowed - a boolean indicating that this outcome may appear
115# in the XML document generated for the Canonical HEXR application. In
116# theory it can go away as we can now easily control both "sides"
117# (client and server) but it does exist today.
118#
119# hexr_xml_order - an (optional) integer used for ordering allowed values.
120# This is used so that the XML output can have a fixed ordering regardless of
121# the actual order of entries in the dictionary.
122OutcomeMetadata = namedtuple(109OutcomeMetadata = namedtuple(
123 "OutcomeMetadata", ("value unicode_sigil tr_outcome tr_label color_ansi"110 "OutcomeMetadata", ("value unicode_sigil tr_outcome tr_label color_ansi"
124 " color_hex hexr_xml_mapping hexr_xml_allowed"111 " color_hex hexr_mapping"))
125 " hexr_xml_order"))
126112
127OUTCOME_METADATA_MAP = {113OUTCOME_METADATA_MAP = {
128 IJobResult.OUTCOME_NONE: OutcomeMetadata(114 IJobResult.OUTCOME_NONE: OutcomeMetadata(
@@ -132,9 +118,7 @@ OUTCOME_METADATA_MAP = {
132 tr_label=C_("chart label", "not started"),118 tr_label=C_("chart label", "not started"),
133 color_ansi="",119 color_ansi="",
134 color_hex="#000000",120 color_hex="#000000",
135 hexr_xml_mapping="none",121 hexr_mapping="none",
136 hexr_xml_allowed=True,
137 hexr_xml_order=0,
138 ),122 ),
139 IJobResult.OUTCOME_PASS: OutcomeMetadata(123 IJobResult.OUTCOME_PASS: OutcomeMetadata(
140 value=IJobResult.OUTCOME_PASS,124 value=IJobResult.OUTCOME_PASS,
@@ -143,9 +127,7 @@ OUTCOME_METADATA_MAP = {
143 tr_label=C_("chart label", "passed"),127 tr_label=C_("chart label", "passed"),
144 color_ansi="\033[32;1m",128 color_ansi="\033[32;1m",
145 color_hex="#6AA84F",129 color_hex="#6AA84F",
146 hexr_xml_mapping="pass",130 hexr_mapping="pass",
147 hexr_xml_allowed=True,
148 hexr_xml_order=1,
149 ),131 ),
150 IJobResult.OUTCOME_FAIL: OutcomeMetadata(132 IJobResult.OUTCOME_FAIL: OutcomeMetadata(
151 value=IJobResult.OUTCOME_FAIL,133 value=IJobResult.OUTCOME_FAIL,
@@ -154,9 +136,7 @@ OUTCOME_METADATA_MAP = {
154 tr_label=C_("chart label", "failed"),136 tr_label=C_("chart label", "failed"),
155 color_ansi="\033[31;1m",137 color_ansi="\033[31;1m",
156 color_hex="#DC3912",138 color_hex="#DC3912",
157 hexr_xml_mapping="fail",139 hexr_mapping="fail",
158 hexr_xml_allowed=True,
159 hexr_xml_order=2,
160 ),140 ),
161 IJobResult.OUTCOME_SKIP: OutcomeMetadata(141 IJobResult.OUTCOME_SKIP: OutcomeMetadata(
162 value=IJobResult.OUTCOME_SKIP,142 value=IJobResult.OUTCOME_SKIP,
@@ -165,9 +145,7 @@ OUTCOME_METADATA_MAP = {
165 tr_label=C_("chart label", "skipped"),145 tr_label=C_("chart label", "skipped"),
166 color_ansi="\033[33;1m",146 color_ansi="\033[33;1m",
167 color_hex="#FF9900",147 color_hex="#FF9900",
168 hexr_xml_mapping="skip",148 hexr_mapping="skip",
169 hexr_xml_allowed=True,
170 hexr_xml_order=3,
171 ),149 ),
172 IJobResult.OUTCOME_NOT_SUPPORTED: OutcomeMetadata(150 IJobResult.OUTCOME_NOT_SUPPORTED: OutcomeMetadata(
173 value=IJobResult.OUTCOME_NOT_SUPPORTED,151 value=IJobResult.OUTCOME_NOT_SUPPORTED,
@@ -176,9 +154,7 @@ OUTCOME_METADATA_MAP = {
176 tr_label=C_("chart label", "not supported"),154 tr_label=C_("chart label", "not supported"),
177 color_ansi="\033[33;1m",155 color_ansi="\033[33;1m",
178 color_hex="#FF9900",156 color_hex="#FF9900",
179 hexr_xml_mapping="skip",157 hexr_mapping="skip",
180 hexr_xml_allowed=False,
181 hexr_xml_order=None,
182 ),158 ),
183 IJobResult.OUTCOME_NOT_IMPLEMENTED: OutcomeMetadata(159 IJobResult.OUTCOME_NOT_IMPLEMENTED: OutcomeMetadata(
184 value=IJobResult.OUTCOME_NOT_IMPLEMENTED,160 value=IJobResult.OUTCOME_NOT_IMPLEMENTED,
@@ -187,9 +163,7 @@ OUTCOME_METADATA_MAP = {
187 tr_label=C_("chart label", "not implemented"),163 tr_label=C_("chart label", "not implemented"),
188 color_ansi="\033[31;1m",164 color_ansi="\033[31;1m",
189 color_hex="#DC3912",165 color_hex="#DC3912",
190 hexr_xml_mapping="skip",166 hexr_mapping="skip",
191 hexr_xml_allowed=False,
192 hexr_xml_order=None,
193 ),167 ),
194 IJobResult.OUTCOME_UNDECIDED: OutcomeMetadata(168 IJobResult.OUTCOME_UNDECIDED: OutcomeMetadata(
195 value=IJobResult.OUTCOME_UNDECIDED,169 value=IJobResult.OUTCOME_UNDECIDED,
@@ -198,9 +172,7 @@ OUTCOME_METADATA_MAP = {
198 tr_label=C_("chart label", "undecided"),172 tr_label=C_("chart label", "undecided"),
199 color_ansi="\033[35;1m",173 color_ansi="\033[35;1m",
200 color_hex="#FF00FF",174 color_hex="#FF00FF",
201 hexr_xml_mapping="skip",175 hexr_mapping="skip",
202 hexr_xml_allowed=False,
203 hexr_xml_order=None,
204 ),176 ),
205 IJobResult.OUTCOME_CRASH: OutcomeMetadata(177 IJobResult.OUTCOME_CRASH: OutcomeMetadata(
206 value=IJobResult.OUTCOME_CRASH,178 value=IJobResult.OUTCOME_CRASH,
@@ -209,9 +181,7 @@ OUTCOME_METADATA_MAP = {
209 tr_label=C_("chart label", "crashed"),181 tr_label=C_("chart label", "crashed"),
210 color_ansi="\033[41;37;1m",182 color_ansi="\033[41;37;1m",
211 color_hex="#FF0000",183 color_hex="#FF0000",
212 hexr_xml_mapping="fail",184 hexr_mapping="fail",
213 hexr_xml_allowed=False,
214 hexr_xml_order=None,
215 ),185 ),
216}186}
217187
diff --git a/plainbox/impl/session/assistant.py b/plainbox/impl/session/assistant.py
index 17c396b..52271e7 100644
--- a/plainbox/impl/session/assistant.py
+++ b/plainbox/impl/session/assistant.py
@@ -57,7 +57,6 @@ from plainbox.impl.session.manager import SessionManager
57from plainbox.impl.session.restart import IRestartStrategy57from plainbox.impl.session.restart import IRestartStrategy
58from plainbox.impl.session.restart import detect_restart_strategy58from plainbox.impl.session.restart import detect_restart_strategy
59from plainbox.impl.session.storage import SessionStorageRepository59from plainbox.impl.session.storage import SessionStorageRepository
60from plainbox.impl.transport import CertificationTransport
61from plainbox.impl.transport import OAuthTransport60from plainbox.impl.transport import OAuthTransport
62from plainbox.impl.transport import TransportError61from plainbox.impl.transport import TransportError
63from plainbox.public import get_providers62from plainbox.public import get_providers
@@ -190,10 +189,6 @@ class SessionAssistant:
190 "use an alternate execution controllers"),189 "use an alternate execution controllers"),
191 self.select_providers: (190 self.select_providers: (
192 "select the providers to work with"),191 "select the providers to work with"),
193 self.get_canonical_certification_transport: (
194 "create a transport for the C3 system"),
195 self.get_canonical_hexr_transport: (
196 "create a transport for the HEXR system"),
197 self.get_old_sessions: (192 self.get_old_sessions: (
198 "get previously created sessions"),193 "get previously created sessions"),
199 self.delete_sessions: (194 self.delete_sessions: (
@@ -1475,10 +1470,6 @@ class SessionAssistant:
1475 self.export_to_stream: "to export the results to a stream",1470 self.export_to_stream: "to export the results to a stream",
1476 self.get_resumable_sessions: "to get resume candidates",1471 self.get_resumable_sessions: "to get resume candidates",
1477 self.start_new_session: "to create a new session",1472 self.start_new_session: "to create a new session",
1478 self.get_canonical_certification_transport: (
1479 "create a transport for the C3 system"),
1480 self.get_canonical_hexr_transport: (
1481 "create a transport for the HEXR system"),
1482 self.get_old_sessions: (1473 self.get_old_sessions: (
1483 "get previously created sessions"),1474 "get previously created sessions"),
1484 self.delete_sessions: (1475 self.delete_sessions: (
@@ -1503,7 +1494,7 @@ class SessionAssistant:
1503 :param transport:1494 :param transport:
1504 A pre-created transport object such as the `CertificationTransport`1495 A pre-created transport object such as the `CertificationTransport`
1505 that is useful for sending data to the Canonical Certification1496 that is useful for sending data to the Canonical Certification
1506 Website and HEXR. This can also be any object conforming to the1497 Website. This can also be any object conforming to the
1507 appropriate API.1498 appropriate API.
1508 :param options:1499 :param options:
1509 (optional) List of options customary to the exporter that is being1500 (optional) List of options customary to the exporter that is being
@@ -1599,71 +1590,6 @@ class SessionAssistant:
1599 self._metadata.flags.add(SessionMetaData.FLAG_SUBMITTED)1590 self._metadata.flags.add(SessionMetaData.FLAG_SUBMITTED)
1600 self._manager.checkpoint()1591 self._manager.checkpoint()
16011592
1602 @raises(ValueError, UnexpectedMethodCall)
1603 def get_canonical_certification_transport(
1604 self, secure_id: str, *, staging: bool=False
1605 ) -> "ISesssionStateTransport":
1606 """
1607 Get a transport for the Canonical Certification website.
1608
1609 :param secure_id:
1610 The *secure identifier* of the machine. This is an identifier
1611 issued by Canonical. It is only applicable to machines that are
1612 tested by the Hardware Certification team.
1613 :param staging:
1614 Flag indicating if the staging server should be used.
1615 :returns:
1616 A ISessionStateTransport instance with appropriate configuration.
1617 In practice the transport object should be passed to
1618 :meth:`export_to_transport()` and not handled in any other way.
1619 :raises ValueError:
1620 if the ``secure_id`` is malformed.
1621 :raises UnexpectedMethodCall:
1622 If the call is made at an unexpected time. Do not catch this error.
1623 It is a bug in your program. The error message will indicate what
1624 is the likely cause.
1625
1626 This transport, same as the hexr transport, expects the data created by
1627 the ``"hexr"`` exporter.
1628 """
1629 UsageExpectation.of(self).enforce()
1630 if staging:
1631 url = ('https://certification.staging.canonical.com/'
1632 'submissions/submit/')
1633 else:
1634 url = 'https://certification.canonical.com/submissions/submit/'
1635 options = "secure_id={}".format(secure_id)
1636 return CertificationTransport(url, options)
1637
1638 @raises(UnexpectedMethodCall)
1639 def get_canonical_hexr_transport(
1640 self, *, staging: bool=False
1641 ) -> "ISesssionStateTransport":
1642 """
1643 Get a transport for the Canonical HEXR website.
1644
1645 :param staging:
1646 Flag indicating if the staging server should be used.
1647 :returns:
1648 A ISessionStateTransport instance with appropriate configuration.
1649 In practice the transport object should be passed to
1650 :meth:`export_to_transport()` and not handled in any other way.
1651 :raises UnexpectedMethodCall:
1652 If the call is made at an unexpected time. Do not catch this error.
1653 It is a bug in your program. The error message will indicate what
1654 is the likely cause.
1655
1656 This transport, same as the certification transport, expects the data
1657 created by the ``"hexr"`` exporter.
1658 """
1659 UsageExpectation.of(self).enforce()
1660 if staging:
1661 url = 'https://hexr.staging.canonical.com/checkbox/submit/'
1662 else:
1663 url = 'https://hexr.canonical.com/checkbox/submit/'
1664 options = "submit_to_hexr=1"
1665 return CertificationTransport(url, options)
1666
1667 @raises(UnexpectedMethodCall, KeyError)1593 @raises(UnexpectedMethodCall, KeyError)
1668 def get_ubuntu_sso_oauth_transport(1594 def get_ubuntu_sso_oauth_transport(
1669 self, transport_details: dict1595 self, transport_details: dict
diff --git a/plainbox/impl/session/manager.py b/plainbox/impl/session/manager.py
index 9242b15..9a056fa 100644
--- a/plainbox/impl/session/manager.py
+++ b/plainbox/impl/session/manager.py
@@ -477,7 +477,6 @@ class SessionManager(pod.POD):
477 # Patch exporter map to expose short names477 # Patch exporter map to expose short names
478 legacy_mapping = {478 legacy_mapping = {
479 'com.canonical.plainbox::global': 'global',479 'com.canonical.plainbox::global': 'global',
480 'com.canonical.plainbox::hexr': 'xml',
481 'com.canonical.plainbox::html': 'html',480 'com.canonical.plainbox::html': 'html',
482 'com.canonical.plainbox::json': 'json',481 'com.canonical.plainbox::json': 'json',
483 'com.canonical.plainbox::junit': 'junit',482 'com.canonical.plainbox::junit': 'junit',
@@ -499,7 +498,7 @@ class SessionManager(pod.POD):
499 Identifier of the exporter unit (which must have been loaded498 Identifier of the exporter unit (which must have been loaded
500 into the session device context of the first device). For499 into the session device context of the first device). For
501 backwards compatibility this can also be any of the legacy500 backwards compatibility this can also be any of the legacy
502 identifiers ``xml``, ``html``, ``json``, ``rfc822``, ``text`` or501 identifiers ``tar``, ``html``, ``json``, ``rfc822``, ``text`` or
503 ``xlsx``.502 ``xlsx``.
504 :param option_list:503 :param option_list:
505 (optional) A list of options to pass to the exporter. Each option504 (optional) A list of options to pass to the exporter. Each option
diff --git a/plainbox/impl/test_launcher.py b/plainbox/impl/test_launcher.py
index 5165037..ebce693 100644
--- a/plainbox/impl/test_launcher.py
+++ b/plainbox/impl/test_launcher.py
@@ -80,7 +80,6 @@ class LauncherDefinitionLegacyTests(TestCase):
80 self.assertEqual(l.skip_test_selection, False)80 self.assertEqual(l.skip_test_selection, False)
81 self.assertEqual(l.input_type, Unset)81 self.assertEqual(l.input_type, Unset)
82 self.assertEqual(l.ok_btn_text, Unset)82 self.assertEqual(l.ok_btn_text, Unset)
83 self.assertEqual(l.submit_to_hexr, Unset)
84 self.assertEqual(l.submit_to, Unset)83 self.assertEqual(l.submit_to, Unset)
85 self.assertEqual(l.submit_url, Unset)84 self.assertEqual(l.submit_url, Unset)
86 self.assertEqual(l.secure_id, Unset)85 self.assertEqual(l.secure_id, Unset)
diff --git a/plainbox/impl/transport.py b/plainbox/impl/transport.py
index efc98e5..fedcdcc 100644
--- a/plainbox/impl/transport.py
+++ b/plainbox/impl/transport.py
@@ -71,7 +71,7 @@ class TransportBase(ISessionStateTransport):
71 Base class for transports that send test data somewhere.71 Base class for transports that send test data somewhere.
7272
73 They handle just the transmission portion of data sending; exporters are73 They handle just the transmission portion of data sending; exporters are
74 expected to produce data in the proper format (e.g. json, xml).74 expected to produce data in the proper format (e.g. json, tar).
7575
76 Each transport can have specific parameters that are required for the76 Each transport can have specific parameters that are required for the
77 other end to properly process received information (like system77 other end to properly process received information (like system
@@ -125,148 +125,6 @@ class InvalidSecureIDError(ValueError):
125 return repr(self.value)125 return repr(self.value)
126126
127127
128class CertificationTransport(TransportBase):
129
130 """
131 Transport for sending data to certification database.
132
133 - POSTs data to a http(s) endpoint
134 - Adds a header with a hardware identifier
135 - Data is expected to be in checkbox xml-compatible format.
136 This means it will work best with a stream produced by the
137 xml exporter.
138 """
139
140 def __init__(self, where, options):
141 """
142 Initialize the Certification Transport.
143
144 The options string may contain 'secure_id' which must be
145 a 15-character (or more) alphanumeric ID for the system.
146
147 It may also contain a submit_to_hexr boolean, set to 1
148 to enable submission to hexr.
149 """
150 super().__init__(where, options)
151 # Interpret this setting here
152 submit_to_hexr = self.options.get('submit_to_hexr')
153 self._submit_to_hexr = False
154 try:
155 if submit_to_hexr and (submit_to_hexr.lower() in
156 ('yes', 'true') or
157 int(submit_to_hexr) == 1):
158 self._submit_to_hexr = True
159 except ValueError:
160 # Just leave it at False
161 pass
162 self._secure_id = self.options.get('secure_id')
163 if self._secure_id is not None:
164 self._validate_secure_id(self._secure_id)
165
166 def send(self, data, config=None, session_state=None):
167 """
168 Send data to the specified server.
169
170 :param data:
171 Data containing the xml dump to be sent to the server. This
172 can be either bytes or a file-like object (BytesIO works fine too).
173 If this is a file-like object, it will be read and streamed "on
174 the fly".
175 :param config:
176 Optional PlainBoxConfig object. If http_proxy and https_proxy
177 values are set in this config object, they will be used to send
178 data via the specified protocols. Note that the transport also
179 honors the http_proxy and https_proxy environment variables.
180 Proxy string format is http://[user:password@]<proxy-ip>:port
181 :param session_state:
182 The session for which this transport is associated with
183 the data being sent (optional)
184 :returns:
185 A dictionary with responses from the server if submission
186 was successful. This should contain an 'id' key, however
187 the server response may change, so the only guarantee
188 we make is that this will be non-False if the server
189 accepted the data.
190 :raises requests.exceptions.Timeout:
191 If sending timed out.
192 :raises requests.exceptions.ConnectionError:
193 If connection failed outright.
194 :raises requests.exceptions.HTTPError:
195 If the server returned a non-success result code
196 """
197 proxies = None
198 if config and config.environment is not Unset:
199 proxies = {
200 proto[:-len("_proxy")]: config.environment[proto]
201 for proto in ['http_proxy', 'https_proxy']
202 if proto in config.environment
203 }
204 # Find the effective value of secure_id:
205 # - use the configuration object (if available)
206 # - override with secure_id= option (if defined)
207 secure_id = None
208 if config is not None and hasattr(config, 'secure_id'):
209 secure_id = config.secure_id
210 if self._secure_id is not None:
211 secure_id = self._secure_id
212 if secure_id is not None:
213 self._validate_secure_id(secure_id)
214 logger.debug(
215 _("Sending to %s, Secure ID is %s"), self.url, secure_id)
216 headers = {"X_HARDWARE_ID": secure_id}
217 else:
218 headers = {}
219 # Similar handling for submit_to_hexr
220 submit_to_hexr = False
221 if config is not None and hasattr(config, 'submit_to_hexr'):
222 submit_to_hexr = config.submit_to_hexr
223 logger.debug(_("submit_to_hexr set to %s by config"),
224 submit_to_hexr)
225 if self._submit_to_hexr:
226 submit_to_hexr = self._submit_to_hexr
227 logger.debug(_("submit_to_hexr set to %s by UI"), submit_to_hexr)
228 # We could always set this header since hexr will only process a value
229 # of 'True', but this avoids injecting that extraneous knowledge into
230 # the tests.
231 # Note that hexr will only process a submission with this header's
232 # value set to 'True', so this boolean conversion should be ok.
233 if submit_to_hexr:
234 headers["X-Share-With-HEXR"] = submit_to_hexr
235
236 # Requests takes care of properly handling a file-like data.
237 form_payload = {"data": data}
238 try:
239 response = requests.post(
240 self.url, files=form_payload, headers=headers, proxies=proxies)
241 except requests.exceptions.Timeout as exc:
242 raise TransportError(
243 _("Request to {0} timed out: {1}").format(self.url, exc))
244 except requests.exceptions.InvalidSchema as exc:
245 raise TransportError(
246 _("Invalid destination URL: {0}").format(exc))
247 except requests.exceptions.ConnectionError as exc:
248 raise TransportError(
249 _("Unable to connect to {0}: {1}").format(self.url, exc))
250 if response is not None:
251 try:
252 # This will raise HTTPError for status != 20x
253 response.raise_for_status()
254 except requests.exceptions.RequestException as exc:
255 raise TransportError(str(exc))
256 logger.debug("Success! Server said %s", response.text)
257 try:
258 return response.json()
259 except Exception as exc:
260 raise TransportError(str(exc))
261 # XXX: can response be None?
262 return {}
263
264 def _validate_secure_id(self, secure_id):
265 if not re.match(SECURE_ID_PATTERN, secure_id):
266 raise InvalidSecureIDError(
267 _("secure_id must be a 15 characters (or more) alphanumeric string"))
268
269
270def oauth_available():128def oauth_available():
271 return _oauth_available129 return _oauth_available
272130
diff --git a/plainbox/test-data/tar-exporter/example-data.tar.xz b/plainbox/test-data/tar-exporter/example-data.tar.xz
273new file mode 100644131new file mode 100644
index 0000000..77026b4
274Binary files /dev/null and b/plainbox/test-data/tar-exporter/example-data.tar.xz differ132Binary files /dev/null and b/plainbox/test-data/tar-exporter/example-data.tar.xz differ
diff --git a/plainbox/test-data/xml-exporter/example-data-certification-status.json b/plainbox/test-data/xml-exporter/example-data-certification-status.json
275deleted file mode 100644133deleted file mode 100644
index 51e85e8..0000000
--- a/plainbox/test-data/xml-exporter/example-data-certification-status.json
+++ /dev/null
@@ -1,19045 +0,0 @@
1{
2 "attachment_map": {},
3 "resource_map": {
4 "com.canonical.certification::cpuinfo": [
5 {
6 "count": "2",
7 "cache": "3145728",
8 "type": "GenuineIntel",
9 "model_revision": "10",
10 "model_number": "6",
11 "bogomips": "5066",
12 "platform": "x86_64",
13 "model_version": "23",
14 "model": "Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz",
15 "speed": "2534",
16 "other": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm ida dtherm tpr_shadow vnmi flexpriority"
17 }
18 ],
19 "com.canonical.certification::requirements": [
20 {
21 "name": "example",
22 "link": "http://www.example.com"
23 }
24 ],
25 "com.canonical.certification::lsb": [
26 {
27 "release": "12.04",
28 "codename": "precise",
29 "distributor_id": "Ubuntu",
30 "description": "Ubuntu 12.04.1 LTS"
31 }
32 ],
33 "com.canonical.certification::package": [
34 {
35 "status": "Installed",
36 "desired": "Install",
37 "version": "0.6.15-2ubuntu9.4",
38 "name": "accountsservice",
39 "description": "query and manipulate user account information"
40 },
41 {
42 "status": "Installed",
43 "desired": "Install",
44 "version": "2.2.51-5ubuntu1",
45 "name": "acl",
46 "description": "Access control list utilities"
47 },
48 {
49 "status": "Installed",
50 "desired": "Install",
51 "version": "1.6-1",
52 "name": "acpi",
53 "description": "displays information on ACPI devices"
54 },
55 {
56 "status": "Installed",
57 "desired": "Install",
58 "version": "0.140",
59 "name": "acpi-support",
60 "description": "scripts for handling many ACPI events"
61 },
62 {
63 "status": "Installed",
64 "desired": "Install",
65 "version": "1:2.0.10-1ubuntu3",
66 "name": "acpid",
67 "description": "Advanced Configuration and Power Interface event daemon"
68 },
69 {
70 "status": "Installed",
71 "desired": "Install",
72 "version": "20100513-3ubuntu1",
73 "name": "acpidump",
74 "description": "utilities to dump system's ACPI tables to an ASCII file"
75 },
76 {
77 "status": "Installed",
78 "desired": "Install",
79 "version": "0.5.1-3",
80 "name": "acpitool",
81 "description": "command line ACPI client"
82 },
83 {
84 "status": "Installed",
85 "desired": "Install",
86 "version": "0.9.4-0ubuntu3.2",
87 "name": "activity-log-manager-common",
88 "description": "blacklist configuration for Zeitgeist (assets)"
89 },
90 {
91 "status": "Installed",
92 "desired": "Install",
93 "version": "0.9.4-0ubuntu3.2",
94 "name": "activity-log-manager-control-center",
95 "description": "blacklist configuration for Zeitgeist (control center integration)"
96 },
97 {
98 "status": "Installed",
99 "desired": "Install",
100 "version": "3.113ubuntu2",
101 "name": "adduser",
102 "description": "add and remove users and groups"
103 },
104 {
105 "status": "Installed",
106 "desired": "Install",
107 "version": "0.3.2-0ubuntu1",
108 "name": "adium-theme-ubuntu",
109 "description": "Adium message style for Ubuntu"
110 },
111 {
112 "status": "Installed",
113 "desired": "Install",
114 "version": "1:3.2.3.2-0ubuntu1",
115 "name": "aisleriot",
116 "description": "Solitaire card games"
117 },
118 {
119 "status": "Installed",
120 "desired": "Install",
121 "version": "0.13.2-2ubuntu4",
122 "name": "alacarte",
123 "description": "easy GNOME menu editing tool"
124 },
125 {
126 "status": "Installed",
127 "desired": "Install",
128 "version": "1.0.25+dfsg-0ubuntu1",
129 "name": "alsa-base",
130 "description": "ALSA driver configuration files"
131 },
132 {
133 "status": "Installed",
134 "desired": "Install",
135 "version": "1.0.25-1ubuntu5",
136 "name": "alsa-utils",
137 "description": "Utilities for configuring and using ALSA"
138 },
139 {
140 "status": "Installed",
141 "desired": "Install",
142 "version": "2.3-14ubuntu1",
143 "name": "anacron",
144 "description": "cron-like program that doesn't go by time"
145 },
146 {
147 "status": "Installed",
148 "desired": "Install",
149 "version": "2.2.3.dfsg.1-2",
150 "name": "apg",
151 "description": "Automated Password Generator - Standalone version"
152 },
153 {
154 "status": "Installed",
155 "desired": "Install",
156 "version": "0.12.04.4",
157 "name": "app-install-data",
158 "description": "Ubuntu applications (data files)"
159 },
160 {
161 "status": "Installed",
162 "desired": "Install",
163 "version": "12.12.04.1",
164 "name": "app-install-data-partner",
165 "description": "Application Installer (data files for partner applications/repositories)"
166 },
167 {
168 "status": "Installed",
169 "desired": "Install",
170 "version": "2.7.102-0ubuntu3.7",
171 "name": "apparmor",
172 "description": "User-space parser utility for AppArmor"
173 },
174 {
175 "status": "Installed",
176 "desired": "Install",
177 "version": "0.3.92-0ubuntu1.1",
178 "name": "appmenu-gtk",
179 "description": "Export GTK menus over DBus"
180 },
181 {
182 "status": "Installed",
183 "desired": "Install",
184 "version": "0.3.92-0ubuntu1.1",
185 "name": "appmenu-gtk3",
186 "description": "Export GTK menus over DBus"
187 },
188 {
189 "status": "Installed",
190 "desired": "Install",
191 "version": "0.2.6-0ubuntu1",
192 "name": "appmenu-qt",
193 "description": "appmenu support for Qt"
194 },
195 {
196 "status": "Installed",
197 "desired": "Install",
198 "version": "2.0.1-0ubuntu17.1",
199 "name": "apport",
200 "description": "automatically generate crash reports for debugging"
201 },
202 {
203 "status": "Installed",
204 "desired": "Install",
205 "version": "2.0.1-0ubuntu17.1",
206 "name": "apport-gtk",
207 "description": "GTK+ frontend for the apport crash report system"
208 },
209 {
210 "status": "Installed",
211 "desired": "Install",
212 "version": "0.16.1",
213 "name": "apport-symptoms",
214 "description": "symptom scripts for apport"
215 },
216 {
217 "status": "Installed",
218 "desired": "Install",
219 "version": "0.8.16~exp12ubuntu10.7",
220 "name": "apt",
221 "description": "commandline package manager"
222 },
223 {
224 "status": "Installed",
225 "desired": "Install",
226 "version": "2.5.0ubuntu1",
227 "name": "apt-file",
228 "description": "search for files within Debian packages (command-line interface)"
229 },
230 {
231 "status": "Installed",
232 "desired": "Install",
233 "version": "0.8.16~exp12ubuntu10.7",
234 "name": "apt-transport-https",
235 "description": "https download transport for APT"
236 },
237 {
238 "status": "Installed",
239 "desired": "Install",
240 "version": "0.8.16~exp12ubuntu10.7",
241 "name": "apt-utils",
242 "description": "package managment related utility programs"
243 },
244 {
245 "status": "Installed",
246 "desired": "Install",
247 "version": "0.44ubuntu5",
248 "name": "apt-xapian-index",
249 "description": "maintenance and search tools for a Xapian index of Debian packages"
250 },
251 {
252 "status": "Installed",
253 "desired": "Install",
254 "version": "0.43+bzr805-0ubuntu7",
255 "name": "aptdaemon",
256 "description": "transaction based package management service"
257 },
258 {
259 "status": "Installed",
260 "desired": "Install",
261 "version": "0.43+bzr805-0ubuntu7",
262 "name": "aptdaemon-data",
263 "description": "data files for clients"
264 },
265 {
266 "status": "Installed",
267 "desired": "Install",
268 "version": "0.5.1ubuntu3",
269 "name": "apturl",
270 "description": "install packages using the apt protocol - GTK+ frontend"
271 },
272 {
273 "status": "Installed",
274 "desired": "Install",
275 "version": "0.5.1ubuntu3",
276 "name": "apturl-common",
277 "description": "install packages using the apt protocol - common data"
278 },
279 {
280 "status": "Installed",
281 "desired": "Install",
282 "version": "0.1.4-1",
283 "name": "arandr",
284 "description": "Simple visual front end for XRandR"
285 },
286 {
287 "status": "Installed",
288 "desired": "Install",
289 "version": "0.60.7~20110707-1",
290 "name": "aspell",
291 "description": "GNU Aspell spell-checker"
292 },
293 {
294 "status": "Installed",
295 "desired": "Install",
296 "version": "6.0-0-6ubuntu2",
297 "name": "aspell-en",
298 "description": "English dictionary for GNU Aspell"
299 },
300 {
301 "status": "Installed",
302 "desired": "Install",
303 "version": "3.1.13-1ubuntu1",
304 "name": "at",
305 "description": "Delayed job execution and batch processing"
306 },
307 {
308 "status": "Installed",
309 "desired": "Install",
310 "version": "2.4.2-0ubuntu0.1",
311 "name": "at-spi2-core",
312 "description": "Assistive Technology Service Provider Interface (dbus core)"
313 },
314 {
315 "status": "Installed",
316 "desired": "Install",
317 "version": "2.0.0-1ubuntu0.1",
318 "name": "audacity",
319 "description": "fast, cross-platform audio editor"
320 },
321 {
322 "status": "Installed",
323 "desired": "Install",
324 "version": "2.0.0-1ubuntu0.1",
325 "name": "audacity-data",
326 "description": "fast, cross-platform audio editor (data)"
327 },
328 {
329 "status": "Installed",
330 "desired": "Install",
331 "version": "2.68-1ubuntu2",
332 "name": "autoconf",
333 "description": "automatic configure script builder"
334 },
335 {
336 "status": "Installed",
337 "desired": "Install",
338 "version": "1:1.11.3-1ubuntu2",
339 "name": "automake",
340 "description": "Tool for generating GNU Standards-compliant Makefiles"
341 },
342 {
343 "status": "Installed",
344 "desired": "Install",
345 "version": "20120210.1ubuntu1",
346 "name": "autotools-dev",
347 "description": "Update infrastructure for config.{guess,sub} files"
348 },
349 {
350 "status": "Installed",
351 "desired": "Install",
352 "version": "0.6.30-5ubuntu2",
353 "name": "avahi-autoipd",
354 "description": "Avahi IPv4LL network address configuration daemon"
355 },
356 {
357 "status": "Installed",
358 "desired": "Install",
359 "version": "0.6.30-5ubuntu2",
360 "name": "avahi-daemon",
361 "description": "Avahi mDNS/DNS-SD daemon"
362 },
363 {
364 "status": "Installed",
365 "desired": "Install",
366 "version": "0.6.30-5ubuntu2",
367 "name": "avahi-utils",
368 "description": "Avahi browsing, publishing and discovery utilities"
369 },
370 {
371 "status": "Installed",
372 "desired": "Install",
373 "version": "0.2.124.2-0ubuntu1",
374 "name": "bamfdaemon",
375 "description": "Window matching library - daemon"
376 },
377 {
378 "status": "Installed",
379 "desired": "Install",
380 "version": "3.4.1-0ubuntu1",
381 "name": "baobab",
382 "description": "GNOME disk usage analyzer"
383 },
384 {
385 "status": "Installed",
386 "desired": "Install",
387 "version": "6.5ubuntu6.4",
388 "name": "base-files",
389 "description": "Debian base system miscellaneous files"
390 },
391 {
392 "status": "Installed",
393 "desired": "Install",
394 "version": "3.5.24",
395 "name": "base-passwd",
396 "description": "Debian base system master password and group files"
397 },
398 {
399 "status": "Installed",
400 "desired": "Install",
401 "version": "4.2-2ubuntu2",
402 "name": "bash",
403 "description": "GNU Bourne Again SHell"
404 },
405 {
406 "status": "Installed",
407 "desired": "Install",
408 "version": "1:1.3-1ubuntu8",
409 "name": "bash-completion",
410 "description": "programmable completion for the bash shell"
411 },
412 {
413 "status": "Installed",
414 "desired": "Install",
415 "version": "1.06.95-2",
416 "name": "bc",
417 "description": "The GNU bc arbitrary precision calculator language"
418 },
419 {
420 "status": "Installed",
421 "desired": "Install",
422 "version": "1:9.8.1.dfsg.P1-4ubuntu0.5",
423 "name": "bind9-host",
424 "description": "Version of 'host' bundled with BIND 9.X"
425 },
426 {
427 "status": "Installed",
428 "desired": "Install",
429 "version": "2.22-6ubuntu1",
430 "name": "binutils",
431 "description": "GNU assembler, linker and binary utilities"
432 },
433 {
434 "status": "Installed",
435 "desired": "Install",
436 "version": "1.23-0ubuntu2.1",
437 "name": "blueman",
438 "description": "A Graphical bluetooth manager"
439 },
440 {
441 "status": "Installed",
442 "desired": "Install",
443 "version": "4.98-2ubuntu7",
444 "name": "bluez",
445 "description": "Bluetooth tools and daemons"
446 },
447 {
448 "status": "Installed",
449 "desired": "Install",
450 "version": "4.98-2ubuntu7",
451 "name": "bluez-alsa",
452 "description": "Bluetooth ALSA support"
453 },
454 {
455 "status": "Installed",
456 "desired": "Install",
457 "version": "4.98-2ubuntu7",
458 "name": "bluez-alsa:i386",
459 "description": "Bluetooth ALSA support"
460 },
461 {
462 "status": "Installed",
463 "desired": "Install",
464 "version": "4.98-2ubuntu7",
465 "name": "bluez-cups",
466 "description": "Bluetooth printer driver for CUPS"
467 },
468 {
469 "status": "Installed",
470 "desired": "Install",
471 "version": "4.98-2ubuntu7",
472 "name": "bluez-gstreamer",
473 "description": "Bluetooth GStreamer support"
474 },
475 {
476 "status": "Installed",
477 "desired": "Install",
478 "version": "1.96",
479 "name": "bonnie++",
480 "description": "Hard drive benchmark suite."
481 },
482 {
483 "status": "Installed",
484 "desired": "Install",
485 "version": "0.90.2-8ubuntu1",
486 "name": "bootchart",
487 "description": "boot sequence auditing"
488 },
489 {
490 "status": "Installed",
491 "desired": "Install",
492 "version": "0.7",
493 "name": "branding-ubuntu",
494 "description": "Replacement artwork with Ubuntu branding"
495 },
496 {
497 "status": "Installed",
498 "desired": "Install",
499 "version": "3.4.1-0ubuntu1.1",
500 "name": "brasero",
501 "description": "CD/DVD burning application for GNOME"
502 },
503 {
504 "status": "Installed",
505 "desired": "Install",
506 "version": "3.4.1-0ubuntu1.1",
507 "name": "brasero-cdrkit",
508 "description": "cdrkit extensions for the Brasero burning application"
509 },
510 {
511 "status": "Installed",
512 "desired": "Install",
513 "version": "3.4.1-0ubuntu1.1",
514 "name": "brasero-common",
515 "description": "Common files for the Brasero CD burning application and library"
516 },
517 {
518 "status": "Installed",
519 "desired": "Install",
520 "version": "1.5-2ubuntu7",
521 "name": "bridge-utils",
522 "description": "Utilities for configuring the Linux Ethernet bridge"
523 },
524 {
525 "status": "Installed",
526 "desired": "Install",
527 "version": "4.3-1ubuntu5",
528 "name": "brltty",
529 "description": "Access software for a blind person using a braille display"
530 },
531 {
532 "status": "Installed",
533 "desired": "Install",
534 "version": "8.2.3ubuntu1",
535 "name": "bsdmainutils",
536 "description": "collection of more utilities from FreeBSD"
537 },
538 {
539 "status": "Installed",
540 "desired": "Install",
541 "version": "1:2.20.1-1ubuntu3",
542 "name": "bsdutils",
543 "description": "Basic utilities from 4.4BSD-Lite"
544 },
545 {
546 "status": "Installed",
547 "desired": "Install",
548 "version": "11.5ubuntu2.1",
549 "name": "build-essential",
550 "description": "Informational list of build-essential packages"
551 },
552 {
553 "status": "Installed",
554 "desired": "Install",
555 "version": "1:1.18.5-1ubuntu4.1",
556 "name": "busybox-initramfs",
557 "description": "Standalone shell setup for initramfs"
558 },
559 {
560 "status": "Installed",
561 "desired": "Install",
562 "version": "1:1.18.5-1ubuntu4.1",
563 "name": "busybox-static",
564 "description": "Standalone rescue shell with tons of builtin utilities"
565 },
566 {
567 "status": "Installed",
568 "desired": "Install",
569 "version": "5.17-0ubuntu1",
570 "name": "byobu",
571 "description": "powerful, text based window manager and shell multiplexer"
572 },
573 {
574 "status": "Installed",
575 "desired": "Install",
576 "version": "1.0.6-1",
577 "name": "bzip2",
578 "description": "high-quality block-sorting file compressor - utilities"
579 },
580 {
581 "status": "Installed",
582 "desired": "Install",
583 "version": "2.5.1-0ubuntu2",
584 "name": "bzr",
585 "description": "easy to use distributed version control system"
586 },
587 {
588 "status": "Installed",
589 "desired": "Install",
590 "version": "2.8.4",
591 "name": "bzr-builddeb",
592 "description": "bzr plugin for Debian package management"
593 },
594 {
595 "status": "Installed",
596 "desired": "Install",
597 "version": "0.7.2-0ubuntu1",
598 "name": "bzr-builder",
599 "description": "construct a bzr branch from a recipe"
600 },
601 {
602 "status": "Installed",
603 "desired": "Install",
604 "version": "1.2.2-1",
605 "name": "bzr-explorer",
606 "description": "GUI application for using Bazaar"
607 },
608 {
609 "status": "Installed",
610 "desired": "Install",
611 "version": "0.13.0-1",
612 "name": "bzr-fastimport",
613 "description": "Fast-import/fast-export plugin for Bazaar"
614 },
615 {
616 "status": "Installed",
617 "desired": "Install",
618 "version": "20111211",
619 "name": "ca-certificates",
620 "description": "Common CA certificates"
621 },
622 {
623 "status": "Installed",
624 "desired": "Install",
625 "version": "20110912ubuntu6",
626 "name": "ca-certificates-java",
627 "description": "Common CA certificates (JKS keystore)"
628 },
629 {
630 "status": "Installed",
631 "desired": "Install",
632 "version": "0.4.100ubuntu2",
633 "name": "cdbs",
634 "description": "common build system for Debian packages"
635 },
636 {
637 "status": "Installed",
638 "desired": "Install",
639 "version": "1.1.2",
640 "name": "cgroup-lite",
641 "description": "Light-weight package to set up cgroups at system boot"
642 },
643 {
644 "status": "Installed",
645 "desired": "Install",
646 "version": "0.3+bzr167-3~precise1",
647 "name": "charm-tools",
648 "description": "tools for maintaining Juju charms"
649 },
650 {
651 "status": "Installed",
652 "desired": "Install",
653 "version": "0.15.1+bzr1894+201301181105~precise1",
654 "name": "checkbox",
655 "description": "System testing application"
656 },
657 {
658 "status": "Installed",
659 "desired": "Install",
660 "version": "0.15+bzr563+201301171917~precise1",
661 "name": "checkbox-certification",
662 "description": "Checkbox Certification Tests"
663 },
664 {
665 "status": "Installed",
666 "desired": "Install",
667 "version": "0.15+bzr563+201301171917~precise1",
668 "name": "checkbox-certification-client",
669 "description": "Client Certification"
670 },
671 {
672 "status": "Installed",
673 "desired": "Install",
674 "version": "0.15+bzr563+201301171917~precise1",
675 "name": "checkbox-certification-tools",
676 "description": "Checkbox Certification Tools"
677 },
678 {
679 "status": "Installed",
680 "desired": "Install",
681 "version": "0.15.1+bzr1894+201301181105~precise1",
682 "name": "checkbox-cli",
683 "description": "Command line interface for checkbox"
684 },
685 {
686 "status": "Installed",
687 "desired": "Install",
688 "version": "0.10-0precise1~rev150",
689 "name": "checkbox-editor",
690 "description": "Checkbox Editor"
691 },
692 {
693 "status": "Installed",
694 "desired": "Install",
695 "version": "0.2-0precise1~rev19",
696 "name": "checkbox-editor-oem-template",
697 "description": "Checkbox editor template for OEM projects"
698 },
699 {
700 "status": "Installed",
701 "desired": "Install",
702 "version": "0.15.1+bzr1894+201301181105~precise1",
703 "name": "checkbox-gtk",
704 "description": "GTK interface for checkbox"
705 },
706 {
707 "status": "Installed",
708 "desired": "Install",
709 "version": "0.2",
710 "name": "checkbox-ihv",
711 "description": "Canonical hardware testing suite."
712 },
713 {
714 "status": "Installed",
715 "desired": "Install",
716 "version": "0.2",
717 "name": "checkbox-ihv-cli",
718 "description": "Canonical hardware testing suite - cli version."
719 },
720 {
721 "status": "Installed",
722 "desired": "Install",
723 "version": "0.2",
724 "name": "checkbox-ihv-qt",
725 "description": "Canonical hardware testing suite - qt version."
726 },
727 {
728 "status": "Installed",
729 "desired": "Install",
730 "version": "0.45-0-precise1~rev614",
731 "name": "checkbox-oem",
732 "description": "Checkbox OEM Tests"
733 },
734 {
735 "status": "Installed",
736 "desired": "Install",
737 "version": "1.0-2-precise1~rev4",
738 "name": "checkbox-oem-bug",
739 "description": "Checkbox OEM bug"
740 },
741 {
742 "status": "Installed",
743 "desired": "Install",
744 "version": "0.45-0-precise1~rev614",
745 "name": "checkbox-oem-gtk",
746 "description": "Checkbox OEM GTK Interface"
747 },
748 {
749 "status": "Installed",
750 "desired": "Install",
751 "version": "0.45-0-precise1~rev614",
752 "name": "checkbox-oem-qt",
753 "description": "Checkbox OEM Qt Interface"
754 },
755 {
756 "status": "Installed",
757 "desired": "Install",
758 "version": "0.1-1precise1~rev18ubuntu1",
759 "name": "checkbox-oem-stella",
760 "description": "stella System Testing"
761 },
762 {
763 "status": "Installed",
764 "desired": "Install",
765 "version": "0.1-1precise1~rev18ubuntu1",
766 "name": "checkbox-oem-stella-gtk",
767 "description": "Checkbox stella GTK Interface"
768 },
769 {
770 "status": "Installed",
771 "desired": "Install",
772 "version": "0.15.1+bzr1894+201301181105~precise1",
773 "name": "checkbox-qt",
774 "description": "QT4 interface for checkbox"
775 },
776 {
777 "status": "Installed",
778 "desired": "Install",
779 "version": "3.4.1-0ubuntu2.1",
780 "name": "cheese",
781 "description": "tool to take pictures and videos from your webcam"
782 },
783 {
784 "status": "Installed",
785 "desired": "Install",
786 "version": "3.4.1-0ubuntu2.1",
787 "name": "cheese-common",
788 "description": "Common files for the Cheese tool to take pictures and videos"
789 },
790 {
791 "status": "Installed",
792 "desired": "Install",
793 "version": "0.25-0ubuntu5",
794 "name": "cloud-utils",
795 "description": "cloud image management utilities"
796 },
797 {
798 "status": "Installed",
799 "desired": "Install",
800 "version": "0+20090930-2",
801 "name": "cmap-adobe-japan2",
802 "description": "CMaps for Adobe-Japan2"
803 },
804 {
805 "status": "Installed",
806 "desired": "Install",
807 "version": "0.1.16-2ubuntu0.1",
808 "name": "colord",
809 "description": "system service to manage device colour profiles -- system daemon"
810 },
811 {
812 "status": "Installed",
813 "desired": "Install",
814 "version": "0.2.46ubuntu6",
815 "name": "command-not-found",
816 "description": "Suggest installation of packages in interactive bash sessions"
817 },
818 {
819 "status": "Installed",
820 "desired": "Install",
821 "version": "0.2.46ubuntu6",
822 "name": "command-not-found-data",
823 "description": "Set of data files for command-not-found."
824 },
825 {
826 "status": "Installed",
827 "desired": "Install",
828 "version": "1:0.9.7.12-0ubuntu1",
829 "name": "compiz",
830 "description": "OpenGL window and compositing manager"
831 },
832 {
833 "status": "Installed",
834 "desired": "Install",
835 "version": "1:0.9.7.12-0ubuntu1",
836 "name": "compiz-core",
837 "description": "OpenGL window and compositing manager"
838 },
839 {
840 "status": "Installed",
841 "desired": "Install",
842 "version": "1:0.9.7.12-0ubuntu1",
843 "name": "compiz-gnome",
844 "description": "OpenGL window and compositing manager - GNOME window decorator"
845 },
846 {
847 "status": "Installed",
848 "desired": "Install",
849 "version": "1:0.9.7.12-0ubuntu1",
850 "name": "compiz-plugins",
851 "description": "OpenGL window and compositing manager - plugins"
852 },
853 {
854 "status": "Installed",
855 "desired": "Install",
856 "version": "1:0.9.7.12-0ubuntu1",
857 "name": "compiz-plugins-default",
858 "description": "OpenGL window and compositing manager - default plugins"
859 },
860 {
861 "status": "Installed",
862 "desired": "Install",
863 "version": "1:0.9.7.0~bzr19-0ubuntu10",
864 "name": "compiz-plugins-main",
865 "description": "Compiz plugins - main collection"
866 },
867 {
868 "status": "Installed",
869 "desired": "Install",
870 "version": "1:0.9.7.0~bzr19-0ubuntu10",
871 "name": "compiz-plugins-main-default",
872 "description": "Compiz plugins - main default collection"
873 },
874 {
875 "status": "Installed",
876 "desired": "Install",
877 "version": "0.9.5.92-0ubuntu5",
878 "name": "compizconfig-backend-gconf",
879 "description": "Compiz Fusion configuration system - gconf backend"
880 },
881 {
882 "status": "Installed",
883 "desired": "Install",
884 "version": "0.9.5.92-0ubuntu3",
885 "name": "compizconfig-settings-manager",
886 "description": "Compiz configuration settings manager"
887 },
888 {
889 "status": "Installed",
890 "desired": "Install",
891 "version": "1.70ubuntu5",
892 "name": "console-setup",
893 "description": "console font and keymap setup program"
894 },
895 {
896 "status": "Installed",
897 "desired": "Install",
898 "version": "0.4.5-2",
899 "name": "consolekit",
900 "description": "framework for defining and tracking users, sessions and seats"
901 },
902 {
903 "status": "Installed",
904 "desired": "Install",
905 "version": "8.13-3ubuntu3.2",
906 "name": "coreutils",
907 "description": "GNU core utilities"
908 },
909 {
910 "status": "Installed",
911 "desired": "Install",
912 "version": "2.11-7ubuntu3",
913 "name": "cpio",
914 "description": "GNU cpio -- a program to manage archives of files"
915 },
916 {
917 "status": "Installed",
918 "desired": "Install",
919 "version": "4:4.6.3-1ubuntu5",
920 "name": "cpp",
921 "description": "GNU C preprocessor (cpp)"
922 },
923 {
924 "status": "Installed",
925 "desired": "Install",
926 "version": "4.6.3-1ubuntu5",
927 "name": "cpp-4.6",
928 "description": "GNU C preprocessor"
929 },
930 {
931 "status": "Installed",
932 "desired": "Install",
933 "version": "0.7-0ubuntu1",
934 "name": "cpu-checker",
935 "description": "tools to help evaluate certain CPU (or BIOS) features"
936 },
937 {
938 "status": "Installed",
939 "desired": "Install",
940 "version": "1.1.2-1ubuntu1",
941 "name": "crda",
942 "description": "wireless Central Regulatory Domain Agent"
943 },
944 {
945 "status": "Installed",
946 "desired": "Install",
947 "version": "3.0pl1-120ubuntu4",
948 "name": "cron",
949 "description": "process scheduling daemon"
950 },
951 {
952 "status": "Installed",
953 "desired": "Install",
954 "version": "2:1.4.1-2ubuntu4",
955 "name": "cryptsetup-bin",
956 "description": "disk encryption support - command line tools"
957 },
958 {
959 "status": "Installed",
960 "desired": "Install",
961 "version": "1.5.3-0ubuntu6",
962 "name": "cups",
963 "description": "Common UNIX Printing System(tm) - server"
964 },
965 {
966 "status": "Installed",
967 "desired": "Install",
968 "version": "1.5.3-0ubuntu6",
969 "name": "cups-bsd",
970 "description": "Common UNIX Printing System(tm) - BSD commands"
971 },
972 {
973 "status": "Installed",
974 "desired": "Install",
975 "version": "1.5.3-0ubuntu6",
976 "name": "cups-client",
977 "description": "Common UNIX Printing System(tm) - client programs (SysV)"
978 },
979 {
980 "status": "Installed",
981 "desired": "Install",
982 "version": "1.5.3-0ubuntu6",
983 "name": "cups-common",
984 "description": "Common UNIX Printing System(tm) - common files"
985 },
986 {
987 "status": "Installed",
988 "desired": "Install",
989 "version": "1.0.18-0ubuntu0.1",
990 "name": "cups-filters",
991 "description": "OpenPrinting CUPS Filters"
992 },
993 {
994 "status": "Installed",
995 "desired": "Install",
996 "version": "0.2.1.2-1ubuntu0.1",
997 "name": "cups-pk-helper",
998 "description": "PolicyKit helper to configure cups with fine-grained privileges"
999 },
1000 {
1001 "status": "Installed",
1002 "desired": "Install",
1003 "version": "1.5.3-0ubuntu6",
1004 "name": "cups-ppdc",
1005 "description": "Common UNIX Printing System(tm) - PPD manipulation utilities"
1006 },
1007 {
1008 "status": "Installed",
1009 "desired": "Install",
1010 "version": "7.22.0-3ubuntu4",
1011 "name": "curl",
1012 "description": "Get a file from an HTTP, HTTPS or FTP server"
1013 },
1014 {
1015 "status": "Installed",
1016 "desired": "Install",
1017 "version": "2:1.12.13+real-8",
1018 "name": "cvs",
1019 "description": "Concurrent Versions System"
1020 },
1021 {
1022 "status": "Installed",
1023 "desired": "Install",
1024 "version": "0.15.1-1ubuntu1",
1025 "name": "cython",
1026 "description": "C-Extensions for Python"
1027 },
1028 {
1029 "status": "Installed",
1030 "desired": "Install",
1031 "version": "0.5.7-2ubuntu2",
1032 "name": "dash",
1033 "description": "POSIX-compliant shell"
1034 },
1035 {
1036 "status": "Installed",
1037 "desired": "Install",
1038 "version": "1.4.18-1ubuntu1.3",
1039 "name": "dbus",
1040 "description": "simple interprocess messaging system (daemon and utilities)"
1041 },
1042 {
1043 "status": "Installed",
1044 "desired": "Install",
1045 "version": "1.4.18-1ubuntu1.3",
1046 "name": "dbus-x11",
1047 "description": "simple interprocess messaging system (X11 deps)"
1048 },
1049 {
1050 "status": "Installed",
1051 "desired": "Install",
1052 "version": "1.06.95-2",
1053 "name": "dc",
1054 "description": "The GNU dc arbitrary precision reverse-polish calculator"
1055 },
1056 {
1057 "status": "Installed",
1058 "desired": "Install",
1059 "version": "0.12.0-0ubuntu1.1",
1060 "name": "dconf-gsettings-backend",
1061 "description": "simple configuration storage system - GSettings back-end"
1062 },
1063 {
1064 "status": "Installed",
1065 "desired": "Install",
1066 "version": "0.12.0-0ubuntu1.1",
1067 "name": "dconf-service",
1068 "description": "simple configuration storage system - D-Bus service"
1069 },
1070 {
1071 "status": "Installed",
1072 "desired": "Install",
1073 "version": "0.12.0-0ubuntu1.1",
1074 "name": "dconf-tools",
1075 "description": "simple configuration storage system - utilities"
1076 },
1077 {
1078 "status": "Installed",
1079 "desired": "Install",
1080 "version": "2.18ubuntu1",
1081 "name": "dctrl-tools",
1082 "description": "Command-line tools to process Debian package information"
1083 },
1084 {
1085 "status": "Installed",
1086 "desired": "Install",
1087 "version": "1.5.42ubuntu1",
1088 "name": "debconf",
1089 "description": "Debian configuration management system"
1090 },
1091 {
1092 "status": "Installed",
1093 "desired": "Install",
1094 "version": "1.5.42ubuntu1",
1095 "name": "debconf-i18n",
1096 "description": "full internationalization support for debconf"
1097 },
1098 {
1099 "status": "Installed",
1100 "desired": "Install",
1101 "version": "9.20120115ubuntu3",
1102 "name": "debhelper",
1103 "description": "helper programs for debian/rules"
1104 },
1105 {
1106 "status": "Installed",
1107 "desired": "Install",
1108 "version": "2010.08.28",
1109 "name": "debian-archive-keyring",
1110 "description": "GnuPG archive keys of the Debian archive"
1111 },
1112 {
1113 "status": "Installed",
1114 "desired": "Install",
1115 "version": "2012.02.22",
1116 "name": "debian-keyring",
1117 "description": "GnuPG keys of Debian Developers"
1118 },
1119 {
1120 "status": "Installed",
1121 "desired": "Install",
1122 "version": "4.2.1ubuntu2",
1123 "name": "debianutils",
1124 "description": "Miscellaneous utilities specific to Debian"
1125 },
1126 {
1127 "status": "Installed",
1128 "desired": "Install",
1129 "version": "1.0.39ubuntu0.2",
1130 "name": "debootstrap",
1131 "description": "Bootstrap a basic Debian system"
1132 },
1133 {
1134 "status": "Installed",
1135 "desired": "Install",
1136 "version": "22.0-0ubuntu2",
1137 "name": "deja-dup",
1138 "description": "Back up your files"
1139 },
1140 {
1141 "status": "Installed",
1142 "desired": "Install",
1143 "version": "0.20-0ubuntu3",
1144 "name": "desktop-file-utils",
1145 "description": "Utilities for .desktop files"
1146 },
1147 {
1148 "status": "Installed",
1149 "desired": "Install",
1150 "version": "3.4.1-0ubuntu1",
1151 "name": "devhelp",
1152 "description": "GNOME developers help program"
1153 },
1154 {
1155 "status": "Installed",
1156 "desired": "Install",
1157 "version": "3.4.1-0ubuntu1",
1158 "name": "devhelp-common",
1159 "description": "Common files for devhelp and its library"
1160 },
1161 {
1162 "status": "Installed",
1163 "desired": "Install",
1164 "version": "2.11.6ubuntu1.4",
1165 "name": "devscripts",
1166 "description": "scripts to make the life of a Debian Package maintainer easier"
1167 },
1168 {
1169 "status": "Installed",
1170 "desired": "Install",
1171 "version": "2.7.102-0ubuntu3.7",
1172 "name": "dh-apparmor",
1173 "description": "AppArmor debhelper routines"
1174 },
1175 {
1176 "status": "Installed",
1177 "desired": "Install",
1178 "version": "0.59ubuntu1",
1179 "name": "dh-make",
1180 "description": "tool that converts source archives into Debian package source"
1181 },
1182 {
1183 "status": "Installed",
1184 "desired": "Install",
1185 "version": "116",
1186 "name": "dh-translations",
1187 "description": "debhelper extension for translation support"
1188 },
1189 {
1190 "status": "Installed",
1191 "desired": "Install",
1192 "version": "0.97.2-5",
1193 "name": "dia-common",
1194 "description": "Diagram editor (common files)"
1195 },
1196 {
1197 "status": "Installed",
1198 "desired": "Install",
1199 "version": "0.97.2-5",
1200 "name": "dia-gnome",
1201 "description": "Diagram editor (GNOME version)"
1202 },
1203 {
1204 "status": "Installed",
1205 "desired": "Install",
1206 "version": "0.97.2-5",
1207 "name": "dia-libs",
1208 "description": "Diagram editor (library files)"
1209 },
1210 {
1211 "status": "Installed",
1212 "desired": "Install",
1213 "version": "1.12.1ubuntu2",
1214 "name": "dictionaries-common",
1215 "description": "Common utilities for spelling dictionary tools"
1216 },
1217 {
1218 "status": "Installed",
1219 "desired": "Install",
1220 "version": "1.54-1",
1221 "name": "diffstat",
1222 "description": "produces graph of changes introduced by a diff file"
1223 },
1224 {
1225 "status": "Installed",
1226 "desired": "Install",
1227 "version": "1:3.2-1ubuntu1",
1228 "name": "diffutils",
1229 "description": "File comparison utilities"
1230 },
1231 {
1232 "status": "Installed",
1233 "desired": "Install",
1234 "version": "0.8.2",
1235 "name": "distro-info",
1236 "description": "provides information about the distributions' releases"
1237 },
1238 {
1239 "status": "Installed",
1240 "desired": "Install",
1241 "version": "0.8ubuntu0.2",
1242 "name": "distro-info-data",
1243 "description": "information about the distributions' releases (data files)"
1244 },
1245 {
1246 "status": "Installed",
1247 "desired": "Install",
1248 "version": "2.2.0.3-1ubuntu3.1",
1249 "name": "dkms",
1250 "description": "Dynamic Kernel Module Support Framework"
1251 },
1252 {
1253 "status": "Installed",
1254 "desired": "Install",
1255 "version": "2.11-4",
1256 "name": "dmidecode",
1257 "description": "SMBIOS/DMI table decoder"
1258 },
1259 {
1260 "status": "Installed",
1261 "desired": "Install",
1262 "version": "2:1.02.48-4ubuntu7.1",
1263 "name": "dmsetup",
1264 "description": "The Linux Kernel Device Mapper userspace library"
1265 },
1266 {
1267 "status": "Installed",
1268 "desired": "Install",
1269 "version": "0.4.3",
1270 "name": "dmz-cursor-theme",
1271 "description": "Style neutral, scalable cursor theme"
1272 },
1273 {
1274 "status": "Installed",
1275 "desired": "Install",
1276 "version": "2.59-4",
1277 "name": "dnsmasq-base",
1278 "description": "Small caching DNS proxy and DHCP/TFTP server"
1279 },
1280 {
1281 "status": "Installed",
1282 "desired": "Install",
1283 "version": "1:9.8.1.dfsg.P1-4ubuntu0.5",
1284 "name": "dnsutils",
1285 "description": "Clients provided with BIND"
1286 },
1287 {
1288 "status": "Installed",
1289 "desired": "Install",
1290 "version": "0.10.3",
1291 "name": "doc-base",
1292 "description": "utilities to manage online documentation"
1293 },
1294 {
1295 "status": "Installed",
1296 "desired": "Install",
1297 "version": "4.5-7ubuntu1",
1298 "name": "docbook-xml",
1299 "description": "standard XML documentation system for software and systems"
1300 },
1301 {
1302 "status": "Installed",
1303 "desired": "Install",
1304 "version": "1.76.1+dfsg-1ubuntu1",
1305 "name": "docbook-xsl",
1306 "description": "stylesheets for processing DocBook XML to various output formats"
1307 },
1308 {
1309 "status": "Installed",
1310 "desired": "Install",
1311 "version": "0.12-0ubuntu1~rev479~precise1",
1312 "name": "doit",
1313 "description": "Automation Tool"
1314 },
1315 {
1316 "status": "Installed",
1317 "desired": "Install",
1318 "version": "3.0.12-1ubuntu1",
1319 "name": "dosfstools",
1320 "description": "utilities for making and checking MS-DOS FAT filesystems"
1321 },
1322 {
1323 "status": "Installed",
1324 "desired": "Install",
1325 "version": "1.16.1.2ubuntu7.1",
1326 "name": "dpkg",
1327 "description": "Debian package management system"
1328 },
1329 {
1330 "status": "Installed",
1331 "desired": "Install",
1332 "version": "1.16.1.2ubuntu7.1",
1333 "name": "dpkg-dev",
1334 "description": "Debian package development tools"
1335 },
1336 {
1337 "status": "Installed",
1338 "desired": "Install",
1339 "version": "0.9.6.2ubuntu1",
1340 "name": "dput",
1341 "description": "Debian package upload tool"
1342 },
1343 {
1344 "status": "Installed",
1345 "desired": "Install",
1346 "version": "0.6.1+repack-1",
1347 "name": "drobo-utils",
1348 "description": "manage data robotics storage units (drobos)"
1349 },
1350 {
1351 "status": "Installed",
1352 "desired": "Install",
1353 "version": "0.6.18-0ubuntu3.1",
1354 "name": "duplicity",
1355 "description": "encrypted bandwidth-efficient backup"
1356 },
1357 {
1358 "status": "Installed",
1359 "desired": "Install",
1360 "version": "7.1-10",
1361 "name": "dvd+rw-tools",
1362 "description": "DVD+-RW/R tools"
1363 },
1364 {
1365 "status": "Installed",
1366 "desired": "Install",
1367 "version": "1.42-1ubuntu2",
1368 "name": "e2fslibs",
1369 "description": "ext2/ext3/ext4 file system libraries"
1370 },
1371 {
1372 "status": "Installed",
1373 "desired": "Install",
1374 "version": "1.42-1ubuntu2",
1375 "name": "e2fsprogs",
1376 "description": "ext2/ext3/ext4 file system utilities"
1377 },
1378 {
1379 "status": "Installed",
1380 "desired": "Install",
1381 "version": "2.0.9.2-2ubuntu2",
1382 "name": "ebtables",
1383 "description": "Ethernet bridge frame table administration"
1384 },
1385 {
1386 "status": "Installed",
1387 "desired": "Install",
1388 "version": "1.5-3",
1389 "name": "ed",
1390 "description": "classic UNIX line editor"
1391 },
1392 {
1393 "status": "Installed",
1394 "desired": "Install",
1395 "version": "2.1.5+deb1+cvs20081104-9",
1396 "name": "eject",
1397 "description": "ejects CDs and operates CD-Changers under Linux"
1398 },
1399 {
1400 "status": "Installed",
1401 "desired": "Install",
1402 "version": "3.4.2.3-0ubuntu1",
1403 "name": "empathy",
1404 "description": "GNOME multi-protocol chat and call client"
1405 },
1406 {
1407 "status": "Installed",
1408 "desired": "Install",
1409 "version": "3.4.2.3-0ubuntu1",
1410 "name": "empathy-common",
1411 "description": "GNOME multi-protocol chat and call client (common files)"
1412 },
1413 {
1414 "status": "Installed",
1415 "desired": "Install",
1416 "version": "1.6.0-7",
1417 "name": "enchant",
1418 "description": "Wrapper for various spell checker engines (binary programs)"
1419 },
1420 {
1421 "status": "Installed",
1422 "desired": "Install",
1423 "version": "2:1.4.6-0ubuntu0.12.04.1",
1424 "name": "enigmail",
1425 "description": "GPG support for Thunderbird and Debian Icedove"
1426 },
1427 {
1428 "status": "Installed",
1429 "desired": "Install",
1430 "version": "3.4.2-0ubuntu1.1",
1431 "name": "eog",
1432 "description": "Eye of GNOME graphics viewer program"
1433 },
1434 {
1435 "status": "Installed",
1436 "desired": "Install",
1437 "version": "0.2.41-10build3",
1438 "name": "esound-common",
1439 "description": "Enlightened Sound Daemon - Common files"
1440 },
1441 {
1442 "status": "Installed",
1443 "desired": "Install",
1444 "version": "1.46.02-0ubuntu1",
1445 "name": "espeak",
1446 "description": "Multi-lingual software speech synthesizer"
1447 },
1448 {
1449 "status": "Installed",
1450 "desired": "Install",
1451 "version": "1.46.02-0ubuntu1",
1452 "name": "espeak-data",
1453 "description": "Multi-lingual software speech synthesizer: speech data files"
1454 },
1455 {
1456 "status": "Installed",
1457 "desired": "Install",
1458 "version": "1:3.1-1",
1459 "name": "ethtool",
1460 "description": "display or change Ethernet device settings"
1461 },
1462 {
1463 "status": "Installed",
1464 "desired": "Install",
1465 "version": "2.0.0~bzr516-0ubuntu3.1",
1466 "name": "euca2ools",
1467 "description": "managing cloud instances for Eucalyptus"
1468 },
1469 {
1470 "status": "Installed",
1471 "desired": "Install",
1472 "version": "3.4.0-0ubuntu1.4",
1473 "name": "evince",
1474 "description": "Document (PostScript, PDF) viewer"
1475 },
1476 {
1477 "status": "Installed",
1478 "desired": "Install",
1479 "version": "3.4.0-0ubuntu1.4",
1480 "name": "evince-common",
1481 "description": "Document (PostScript, PDF) viewer - common files"
1482 },
1483 {
1484 "status": "Installed",
1485 "desired": "Install",
1486 "version": "2.0.2",
1487 "name": "evoluspencil",
1488 "description": "Evolus Pencil"
1489 },
1490 {
1491 "status": "Installed",
1492 "desired": "Install",
1493 "version": "3.2.3-0ubuntu7",
1494 "name": "evolution-data-server",
1495 "description": "evolution database backend server"
1496 },
1497 {
1498 "status": "Installed",
1499 "desired": "Install",
1500 "version": "3.2.3-0ubuntu7",
1501 "name": "evolution-data-server-common",
1502 "description": "architecture independent files for Evolution Data Server"
1503 },
1504 {
1505 "status": "Installed",
1506 "desired": "Install",
1507 "version": "46",
1508 "name": "example-content",
1509 "description": "Ubuntu example content"
1510 },
1511 {
1512 "status": "Installed",
1513 "desired": "Install",
1514 "version": "1.3.2-5",
1515 "name": "fabric",
1516 "description": "Simple Pythonic remote deployment tool"
1517 },
1518 {
1519 "status": "Installed",
1520 "desired": "Install",
1521 "version": "1.18.2-1",
1522 "name": "fakeroot",
1523 "description": "tool for simulating superuser privileges"
1524 },
1525 {
1526 "status": "Installed",
1527 "desired": "Install",
1528 "version": "4:0.8.4-0ubuntu0.12.04.1",
1529 "name": "ffmpeg",
1530 "description": "Multimedia player, server, encoder and transcoder (transitional package)"
1531 },
1532 {
1533 "status": "Installed",
1534 "desired": "Install",
1535 "version": "5.09-2",
1536 "name": "file",
1537 "description": "Determines file type using \"magic\" numbers"
1538 },
1539 {
1540 "status": "Installed",
1541 "desired": "Install",
1542 "version": "3.4.1-0ubuntu1",
1543 "name": "file-roller",
1544 "description": "archive manager for GNOME"
1545 },
1546 {
1547 "status": "Installed",
1548 "desired": "Install",
1549 "version": "4.4.2-4ubuntu1",
1550 "name": "findutils",
1551 "description": "utilities for finding files--find, xargs"
1552 },
1553 {
1554 "status": "Installed",
1555 "desired": "Install",
1556 "version": "18.0.1+build1-0ubuntu0.12.04.1",
1557 "name": "firefox",
1558 "description": "Safe and easy web browser from Mozilla"
1559 },
1560 {
1561 "status": "Installed",
1562 "desired": "Install",
1563 "version": "18.0.1+build1-0ubuntu0.12.04.1",
1564 "name": "firefox-globalmenu",
1565 "description": "Unity appmenu integration for Firefox"
1566 },
1567 {
1568 "status": "Installed",
1569 "desired": "Install",
1570 "version": "18.0.1+build1-0ubuntu0.12.04.1",
1571 "name": "firefox-gnome-support",
1572 "description": "Safe and easy web browser from Mozilla - GNOME support"
1573 },
1574 {
1575 "status": "Installed",
1576 "desired": "Install",
1577 "version": "0.4",
1578 "name": "firefox-launchpad-plugin",
1579 "description": "Launchpad firefox integration"
1580 },
1581 {
1582 "status": "Installed",
1583 "desired": "Install",
1584 "version": "18.0.1+build1-0ubuntu0.12.04.1",
1585 "name": "firefox-locale-en",
1586 "description": "English language pack for Firefox"
1587 },
1588 {
1589 "status": "Installed",
1590 "desired": "Install",
1591 "version": "11.2.202.261ubuntu0.12.04.1",
1592 "name": "flashplugin-installer",
1593 "description": "Adobe Flash Player plugin installer"
1594 },
1595 {
1596 "status": "Installed",
1597 "desired": "Install",
1598 "version": "2.5.35-10ubuntu3",
1599 "name": "flex",
1600 "description": "A fast lexical analyzer generator."
1601 },
1602 {
1603 "status": "Installed",
1604 "desired": "Install",
1605 "version": "0.6.8-2",
1606 "name": "folks-common",
1607 "description": "library to aggregates people into metacontacts (common files)"
1608 },
1609 {
1610 "status": "Installed",
1611 "desired": "Install",
1612 "version": "2.8.0-3ubuntu9.1",
1613 "name": "fontconfig",
1614 "description": "generic font configuration library - support binaries"
1615 },
1616 {
1617 "status": "Installed",
1618 "desired": "Install",
1619 "version": "2.8.0-3ubuntu9.1",
1620 "name": "fontconfig-config",
1621 "description": "generic font configuration library - configuration"
1622 },
1623 {
1624 "status": "Installed",
1625 "desired": "Install",
1626 "version": "2.01+mry-3",
1627 "name": "fonts-kacst",
1628 "description": "KACST free TrueType Arabic fonts"
1629 },
1630 {
1631 "status": "Installed",
1632 "desired": "Install",
1633 "version": "5.0+svn11846-2",
1634 "name": "fonts-kacst-one",
1635 "description": "TrueType font designed for Arabic language"
1636 },
1637 {
1638 "status": "Installed",
1639 "desired": "Install",
1640 "version": "5.0-5ubuntu1",
1641 "name": "fonts-khmeros-core",
1642 "description": "KhmerOS Unicode fonts for the Khmer language of Cambodia"
1643 },
1644 {
1645 "status": "Installed",
1646 "desired": "Install",
1647 "version": "0.0.20060226-8",
1648 "name": "fonts-lao",
1649 "description": "TrueType font for Lao language"
1650 },
1651 {
1652 "status": "Installed",
1653 "desired": "Install",
1654 "version": "1.07.0-2ubuntu0.1",
1655 "name": "fonts-liberation",
1656 "description": "Fonts with the same metrics as Times, Arial and Courier"
1657 },
1658 {
1659 "status": "Installed",
1660 "desired": "Install",
1661 "version": "3.010-2",
1662 "name": "fonts-nanum",
1663 "description": "Nanum Korean fonts"
1664 },
1665 {
1666 "status": "Installed",
1667 "desired": "Install",
1668 "version": "2:102.2+LibO3.5.4-0ubuntu1.1",
1669 "name": "fonts-opensymbol",
1670 "description": "OpenSymbol TrueType font"
1671 },
1672 {
1673 "status": "Installed",
1674 "desired": "Install",
1675 "version": "003.02.01-5ubuntu1",
1676 "name": "fonts-takao-pgothic",
1677 "description": "Japanese TrueType font set, Takao P Gothic Fonts"
1678 },
1679 {
1680 "status": "Installed",
1681 "desired": "Install",
1682 "version": "1:0.4.17-1ubuntu1",
1683 "name": "fonts-thai-tlwg",
1684 "description": "Thai fonts maintained by TLWG (meta package)"
1685 },
1686 {
1687 "status": "Installed",
1688 "desired": "Install",
1689 "version": "1:0.4.17-1ubuntu1",
1690 "name": "fonts-tlwg-garuda",
1691 "description": "Thai Garuda font"
1692 },
1693 {
1694 "status": "Installed",
1695 "desired": "Install",
1696 "version": "1:0.4.17-1ubuntu1",
1697 "name": "fonts-tlwg-kinnari",
1698 "description": "Thai Kinnari font"
1699 },
1700 {
1701 "status": "Installed",
1702 "desired": "Install",
1703 "version": "1:0.4.17-1ubuntu1",
1704 "name": "fonts-tlwg-loma",
1705 "description": "Thai Loma font"
1706 },
1707 {
1708 "status": "Installed",
1709 "desired": "Install",
1710 "version": "1:0.4.17-1ubuntu1",
1711 "name": "fonts-tlwg-mono",
1712 "description": "Thai TlwgMono font"
1713 },
1714 {
1715 "status": "Installed",
1716 "desired": "Install",
1717 "version": "1:0.4.17-1ubuntu1",
1718 "name": "fonts-tlwg-norasi",
1719 "description": "Thai Norasi font"
1720 },
1721 {
1722 "status": "Installed",
1723 "desired": "Install",
1724 "version": "1:0.4.17-1ubuntu1",
1725 "name": "fonts-tlwg-purisa",
1726 "description": "Thai Purisa font"
1727 },
1728 {
1729 "status": "Installed",
1730 "desired": "Install",
1731 "version": "1:0.4.17-1ubuntu1",
1732 "name": "fonts-tlwg-sawasdee",
1733 "description": "Thai Sawasdee font"
1734 },
1735 {
1736 "status": "Installed",
1737 "desired": "Install",
1738 "version": "1:0.4.17-1ubuntu1",
1739 "name": "fonts-tlwg-typewriter",
1740 "description": "Thai TlwgTypewriter font"
1741 },
1742 {
1743 "status": "Installed",
1744 "desired": "Install",
1745 "version": "1:0.4.17-1ubuntu1",
1746 "name": "fonts-tlwg-typist",
1747 "description": "Thai TlwgTypist font"
1748 },
1749 {
1750 "status": "Installed",
1751 "desired": "Install",
1752 "version": "1:0.4.17-1ubuntu1",
1753 "name": "fonts-tlwg-typo",
1754 "description": "Thai TlwgTypo font"
1755 },
1756 {
1757 "status": "Installed",
1758 "desired": "Install",
1759 "version": "1:0.4.17-1ubuntu1",
1760 "name": "fonts-tlwg-umpush",
1761 "description": "Thai Umpush font"
1762 },
1763 {
1764 "status": "Installed",
1765 "desired": "Install",
1766 "version": "1:0.4.17-1ubuntu1",
1767 "name": "fonts-tlwg-waree",
1768 "description": "Thai Waree font"
1769 },
1770 {
1771 "status": "Installed",
1772 "desired": "Install",
1773 "version": "20120322-0ubuntu1",
1774 "name": "foomatic-db-compressed-ppds",
1775 "description": "OpenPrinting printer support - Compressed PPDs derived from the database"
1776 },
1777 {
1778 "status": "Installed",
1779 "desired": "Install",
1780 "version": "4.0.8-2ubuntu1",
1781 "name": "foomatic-db-engine",
1782 "description": "OpenPrinting printer support - programs"
1783 },
1784 {
1785 "status": "Installed",
1786 "desired": "Install",
1787 "version": "4.0.16-0ubuntu0.2",
1788 "name": "foomatic-filters",
1789 "description": "OpenPrinting printer support - filters"
1790 },
1791 {
1792 "status": "Installed",
1793 "desired": "Install",
1794 "version": "2.6.0-1ubuntu3",
1795 "name": "freeglut3",
1796 "description": "OpenGL Utility Toolkit"
1797 },
1798 {
1799 "status": "Installed",
1800 "desired": "Install",
1801 "version": "2.6.0-1ubuntu3",
1802 "name": "freeglut3-dev",
1803 "description": "OpenGL Utility Toolkit development files"
1804 },
1805 {
1806 "status": "Installed",
1807 "desired": "Install",
1808 "version": "20060219-1",
1809 "name": "freepats",
1810 "description": "Free patch set for MIDI audio synthesis"
1811 },
1812 {
1813 "status": "Installed",
1814 "desired": "Install",
1815 "version": "0.2.25",
1816 "name": "friendly-recovery",
1817 "description": "Make recovery more user-friendly"
1818 },
1819 {
1820 "status": "Installed",
1821 "desired": "Install",
1822 "version": "20101118-2",
1823 "name": "fswebcam",
1824 "description": "Tiny and flexible webcam program"
1825 },
1826 {
1827 "status": "Installed",
1828 "desired": "Install",
1829 "version": "0.17-25",
1830 "name": "ftp",
1831 "description": "classical file transfer client"
1832 },
1833 {
1834 "status": "Installed",
1835 "desired": "Install",
1836 "version": "2.8.6-2ubuntu2",
1837 "name": "fuse",
1838 "description": "Filesystem in Userspace"
1839 },
1840 {
1841 "status": "Installed",
1842 "desired": "Install",
1843 "version": "0.25.06precise1",
1844 "name": "fwts",
1845 "description": "FirmWare Test Suite"
1846 },
1847 {
1848 "status": "Installed",
1849 "desired": "Install",
1850 "version": "4:4.6.3-1ubuntu5",
1851 "name": "g++",
1852 "description": "GNU C++ compiler"
1853 },
1854 {
1855 "status": "Installed",
1856 "desired": "Install",
1857 "version": "4.6.3-1ubuntu5",
1858 "name": "g++-4.6",
1859 "description": "GNU C++ compiler"
1860 },
1861 {
1862 "status": "Installed",
1863 "desired": "Install",
1864 "version": "1:3.1.8+dfsg-0.1ubuntu1",
1865 "name": "gawk",
1866 "description": "GNU awk, a pattern scanning and processing language"
1867 },
1868 {
1869 "status": "Installed",
1870 "desired": "Install",
1871 "version": "6.4.1.1-0ubuntu3",
1872 "name": "gcalctool",
1873 "description": "GNOME desktop calculator"
1874 },
1875 {
1876 "status": "Installed",
1877 "desired": "Install",
1878 "version": "4:4.6.3-1ubuntu5",
1879 "name": "gcc",
1880 "description": "GNU C compiler"
1881 },
1882 {
1883 "status": "Installed",
1884 "desired": "Install",
1885 "version": "4.6.3-1ubuntu5",
1886 "name": "gcc-4.6",
1887 "description": "GNU C compiler"
1888 },
1889 {
1890 "status": "Installed",
1891 "desired": "Install",
1892 "version": "4.6.3-1ubuntu5",
1893 "name": "gcc-4.6-base",
1894 "description": "GCC, the GNU Compiler Collection (base package)"
1895 },
1896 {
1897 "status": "Installed",
1898 "desired": "Install",
1899 "version": "4.6.3-1ubuntu5",
1900 "name": "gcc-4.6-base:i386",
1901 "description": "GCC, the GNU Compiler Collection (base package)"
1902 },
1903 {
1904 "status": "Installed",
1905 "desired": "Install",
1906 "version": "3.2.5-0ubuntu2",
1907 "name": "gconf-defaults-service",
1908 "description": "GNOME configuration database system (system defaults service)"
1909 },
1910 {
1911 "status": "Installed",
1912 "desired": "Install",
1913 "version": "3.0.1-1ubuntu2",
1914 "name": "gconf-editor",
1915 "description": "editor for the GConf configuration system"
1916 },
1917 {
1918 "status": "Installed",
1919 "desired": "Install",
1920 "version": "3.2.5-0ubuntu2",
1921 "name": "gconf-service",
1922 "description": "GNOME configuration database system (D-Bus service)"
1923 },
1924 {
1925 "status": "Installed",
1926 "desired": "Install",
1927 "version": "3.2.5-0ubuntu2",
1928 "name": "gconf-service-backend",
1929 "description": "GNOME configuration database system (D-Bus service)"
1930 },
1931 {
1932 "status": "Installed",
1933 "desired": "Install",
1934 "version": "3.2.5-0ubuntu2",
1935 "name": "gconf2",
1936 "description": "GNOME configuration database system (support tools)"
1937 },
1938 {
1939 "status": "Installed",
1940 "desired": "Install",
1941 "version": "3.2.5-0ubuntu2",
1942 "name": "gconf2-common",
1943 "description": "GNOME configuration database system (common files)"
1944 },
1945 {
1946 "status": "Installed",
1947 "desired": "Install",
1948 "version": "7.4-2012.04-0ubuntu2.1",
1949 "name": "gdb",
1950 "description": "The GNU Debugger"
1951 },
1952 {
1953 "status": "Installed",
1954 "desired": "Install",
1955 "version": "0.8.5build1",
1956 "name": "gdebi",
1957 "description": "simple tool to install deb files - GNOME GUI"
1958 },
1959 {
1960 "status": "Installed",
1961 "desired": "Install",
1962 "version": "0.8.5build1",
1963 "name": "gdebi-core",
1964 "description": "simple tool to install deb files"
1965 },
1966 {
1967 "status": "Installed",
1968 "desired": "Install",
1969 "version": "0.21.dfsg-1ubuntu4",
1970 "name": "geany",
1971 "description": "fast and lightweight IDE"
1972 },
1973 {
1974 "status": "Installed",
1975 "desired": "Install",
1976 "version": "0.21.dfsg-1ubuntu4",
1977 "name": "geany-common",
1978 "description": "fast and lightweight IDE -- common files"
1979 },
1980 {
1981 "status": "Installed",
1982 "desired": "Install",
1983 "version": "0.21.1.dfsg-2",
1984 "name": "geany-plugin-treebrowser",
1985 "description": "tree browser plugin for Geany"
1986 },
1987 {
1988 "status": "Installed",
1989 "desired": "Install",
1990 "version": "0.21.1.dfsg-2",
1991 "name": "geany-plugins-common",
1992 "description": "set of plugins for Geany (translations)"
1993 },
1994 {
1995 "status": "Installed",
1996 "desired": "Install",
1997 "version": "3.4.1-0ubuntu1",
1998 "name": "gedit",
1999 "description": "official text editor of the GNOME desktop environment"
2000 },
2001 {
2002 "status": "Installed",
2003 "desired": "Install",
2004 "version": "3.4.1-0ubuntu1",
2005 "name": "gedit-common",
2006 "description": "official text editor of the GNOME desktop environment (support files)"
2007 },
2008 {
2009 "status": "Installed",
2010 "desired": "Install",
2011 "version": "9:1.1.11-2ubuntu2",
2012 "name": "genisoimage",
2013 "description": "Creates ISO-9660 CD-ROM filesystem images"
2014 },
2015 {
2016 "status": "Installed",
2017 "desired": "Install",
2018 "version": "0.12.0-1ubuntu12",
2019 "name": "geoclue",
2020 "description": "Geographic information framework"
2021 },
2022 {
2023 "status": "Installed",
2024 "desired": "Install",
2025 "version": "0.0.2-0ubuntu6",
2026 "name": "geoclue-ubuntu-geoip",
2027 "description": "Provide positioning for GeoClue via Ubuntu GeoIP services"
2028 },
2029 {
2030 "status": "Installed",
2031 "desired": "Install",
2032 "version": "20111220-1",
2033 "name": "geoip-database",
2034 "description": "IP lookup command line tools that use the GeoIP library (country database)"
2035 },
2036 {
2037 "status": "Installed",
2038 "desired": "Install",
2039 "version": "0.18.1.1-5ubuntu3",
2040 "name": "gettext",
2041 "description": "GNU Internationalization utilities"
2042 },
2043 {
2044 "status": "Installed",
2045 "desired": "Install",
2046 "version": "0.18.1.1-5ubuntu3",
2047 "name": "gettext-base",
2048 "description": "GNU Internationalization utilities for the base system"
2049 },
2050 {
2051 "status": "Installed",
2052 "desired": "Install",
2053 "version": "9.05~dfsg-0ubuntu4.2",
2054 "name": "ghostscript",
2055 "description": "interpreter for the PostScript language and for PDF"
2056 },
2057 {
2058 "status": "Installed",
2059 "desired": "Install",
2060 "version": "9.05~dfsg-0ubuntu4.2",
2061 "name": "ghostscript-cups",
2062 "description": "interpreter for the PostScript language and for PDF - CUPS filters"
2063 },
2064 {
2065 "status": "Installed",
2066 "desired": "Install",
2067 "version": "9.05~dfsg-0ubuntu4.2",
2068 "name": "ghostscript-x",
2069 "description": "interpreter for the PostScript language and for PDF - X11 support"
2070 },
2071 {
2072 "status": "Installed",
2073 "desired": "Install",
2074 "version": "2.6.12-1ubuntu1.2",
2075 "name": "gimp",
2076 "description": "The GNU Image Manipulation Program"
2077 },
2078 {
2079 "status": "Installed",
2080 "desired": "Install",
2081 "version": "2.6.12-1ubuntu1.2",
2082 "name": "gimp-data",
2083 "description": "Data files for GIMP"
2084 },
2085 {
2086 "status": "Installed",
2087 "desired": "Install",
2088 "version": "0.2.4.1-0ubuntu1",
2089 "name": "ginn",
2090 "description": "Gesture Injector: No-GEIS, No-Toolkits"
2091 },
2092 {
2093 "status": "Installed",
2094 "desired": "Install",
2095 "version": "0.6.15-2ubuntu9.4",
2096 "name": "gir1.2-accountsservice-1.0",
2097 "description": "GObject introspection data for AccountService"
2098 },
2099 {
2100 "status": "Installed",
2101 "desired": "Install",
2102 "version": "0.4.92-0ubuntu1",
2103 "name": "gir1.2-appindicator3-0.1",
2104 "description": "Typelib files for libappindicator3-1."
2105 },
2106 {
2107 "status": "Installed",
2108 "desired": "Install",
2109 "version": "2.4.0-0ubuntu1",
2110 "name": "gir1.2-atk-1.0",
2111 "description": "ATK accessibility toolkit (GObject introspection)"
2112 },
2113 {
2114 "status": "Installed",
2115 "desired": "Install",
2116 "version": "2.4.2-0ubuntu0.1",
2117 "name": "gir1.2-atspi-2.0",
2118 "description": "Assistive Technology Service Provider (GObject introspection)"
2119 },
2120 {
2121 "status": "Installed",
2122 "desired": "Install",
2123 "version": "0.4.2-1ubuntu1",
2124 "name": "gir1.2-caribou-1.0",
2125 "description": "GObject introspection for the Caribou library"
2126 },
2127 {
2128 "status": "Installed",
2129 "desired": "Install",
2130 "version": "1.10.6-1~precise1",
2131 "name": "gir1.2-clutter-1.0",
2132 "description": "GObject introspection data for the Clutter 1.0 library"
2133 },
2134 {
2135 "status": "Installed",
2136 "desired": "Install",
2137 "version": "1.10.0-0ubuntu2",
2138 "name": "gir1.2-cogl-1.0",
2139 "description": "GObject introspection data for the Cogl 1.0 library"
2140 },
2141 {
2142 "status": "Installed",
2143 "desired": "Install",
2144 "version": "1.10.0-0ubuntu2",
2145 "name": "gir1.2-coglpango-1.0",
2146 "description": "GObject introspection data for the CoglPango 1.0 library"
2147 },
2148 {
2149 "status": "Installed",
2150 "desired": "Install",
2151 "version": "0.6.2-0ubuntu0.1",
2152 "name": "gir1.2-dbusmenu-glib-0.4",
2153 "description": "typelib file for libdbusmenu-glib4"
2154 },
2155 {
2156 "status": "Installed",
2157 "desired": "Install",
2158 "version": "0.6.2-0ubuntu0.1",
2159 "name": "gir1.2-dbusmenu-gtk-0.4",
2160 "description": "typelib file for libdbusmenu-gtk4"
2161 },
2162 {
2163 "status": "Installed",
2164 "desired": "Install",
2165 "version": "1.0.10-0ubuntu1",
2166 "name": "gir1.2-dee-1.0",
2167 "description": "GObject introspection data for the Dee library"
2168 },
2169 {
2170 "status": "Installed",
2171 "desired": "Install",
2172 "version": "0.6.8-2",
2173 "name": "gir1.2-folks-0.6",
2174 "description": "library to aggregates people into metacontacts - GObject-Introspection"
2175 },
2176 {
2177 "status": "Installed",
2178 "desired": "Install",
2179 "version": "1.32.0-1",
2180 "name": "gir1.2-freedesktop",
2181 "description": "Introspection data for some FreeDesktop components"
2182 },
2183 {
2184 "status": "Installed",
2185 "desired": "Install",
2186 "version": "3.2.5-0ubuntu2",
2187 "name": "gir1.2-gconf-2.0",
2188 "description": "GNOME configuration database system (GObject-Introspection)"
2189 },
2190 {
2191 "status": "Installed",
2192 "desired": "Install",
2193 "version": "3.4.1-0ubuntu1",
2194 "name": "gir1.2-gdesktopenums-3.0",
2195 "description": "GObject introspection for GSettings desktop-wide schemas"
2196 },
2197 {
2198 "status": "Installed",
2199 "desired": "Install",
2200 "version": "2.26.1-1",
2201 "name": "gir1.2-gdkpixbuf-2.0",
2202 "description": "GDK Pixbuf library - GObject-Introspection"
2203 },
2204 {
2205 "status": "Installed",
2206 "desired": "Install",
2207 "version": "0.6.4-1",
2208 "name": "gir1.2-gee-1.0",
2209 "description": "GLib Telepathy connection manager library (GObject-Introspection)"
2210 },
2211 {
2212 "status": "Installed",
2213 "desired": "Install",
2214 "version": "1.32.0-1ubuntu1",
2215 "name": "gir1.2-gjsdbus-1.0",
2216 "description": "GObject introspection data for GJS"
2217 },
2218 {
2219 "status": "Installed",
2220 "desired": "Install",
2221 "version": "3.4.0.2-1",
2222 "name": "gir1.2-gkbd-3.0",
2223 "description": "GObject introspection data for the GnomeKbd library"
2224 },
2225 {
2226 "status": "Installed",
2227 "desired": "Install",
2228 "version": "1.32.0-1",
2229 "name": "gir1.2-glib-2.0",
2230 "description": "Introspection data for GLib, GObject, Gio and GModule"
2231 },
2232 {
2233 "status": "Installed",
2234 "desired": "Install",
2235 "version": "3.4.0-0ubuntu1",
2236 "name": "gir1.2-gmenu-3.0",
2237 "description": "GObject introspection data for the GNOME menu library"
2238 },
2239 {
2240 "status": "Installed",
2241 "desired": "Install",
2242 "version": "3.2.2-0ubuntu5",
2243 "name": "gir1.2-gnomebluetooth-1.0",
2244 "description": "Introspection data for GnomeBluetooth"
2245 },
2246 {
2247 "status": "Installed",
2248 "desired": "Install",
2249 "version": "3.2.2-2",
2250 "name": "gir1.2-gnomekeyring-1.0",
2251 "description": "GNOME keyring services library - introspection data"
2252 },
2253 {
2254 "status": "Installed",
2255 "desired": "Install",
2256 "version": "0.10.36-1ubuntu0.1",
2257 "name": "gir1.2-gst-plugins-base-0.10",
2258 "description": "Description: GObject introspection data for the GStreamer Plugins Base library"
2259 },
2260 {
2261 "status": "Installed",
2262 "desired": "Install",
2263 "version": "0.10.36-1ubuntu1",
2264 "name": "gir1.2-gstreamer-0.10",
2265 "description": "Description: GObject introspection data for the GStreamer library"
2266 },
2267 {
2268 "status": "Installed",
2269 "desired": "Install",
2270 "version": "2.24.10-0ubuntu6",
2271 "name": "gir1.2-gtk-2.0",
2272 "description": "GTK+ graphical user interface library -- gir bindings"
2273 },
2274 {
2275 "status": "Installed",
2276 "desired": "Install",
2277 "version": "3.4.2-0ubuntu0.5",
2278 "name": "gir1.2-gtk-3.0",
2279 "description": "GTK+ graphical user interface library -- gir bindings"
2280 },
2281 {
2282 "status": "Installed",
2283 "desired": "Install",
2284 "version": "3.4.2-0ubuntu1",
2285 "name": "gir1.2-gtksource-3.0",
2286 "description": "gir files for the GTK+ syntax highlighting widget"
2287 },
2288 {
2289 "status": "Installed",
2290 "desired": "Install",
2291 "version": "175-0ubuntu9.2",
2292 "name": "gir1.2-gudev-1.0",
2293 "description": "libgudev-1.0 introspection data"
2294 },
2295 {
2296 "status": "Installed",
2297 "desired": "Install",
2298 "version": "0.6.92-0ubuntu1",
2299 "name": "gir1.2-indicate-0.7",
2300 "description": "Typelib file for libindicate5"
2301 },
2302 {
2303 "status": "Installed",
2304 "desired": "Install",
2305 "version": "1.8.3-0ubuntu0.12.04.1",
2306 "name": "gir1.2-javascriptcoregtk-1.0",
2307 "description": "GObject introspection data for the GTK+-based JavaScriptCore library"
2308 },
2309 {
2310 "status": "Installed",
2311 "desired": "Install",
2312 "version": "1.8.3-0ubuntu0.12.04.1",
2313 "name": "gir1.2-javascriptcoregtk-3.0",
2314 "description": "GObject introspection data for the GTK+-based JavaScriptCore library"
2315 },
2316 {
2317 "status": "Installed",
2318 "desired": "Install",
2319 "version": "0.14.2-1",
2320 "name": "gir1.2-json-1.0",
2321 "description": "GLib JSON manipulation library (introspection data)"
2322 },
2323 {
2324 "status": "Installed",
2325 "desired": "Install",
2326 "version": "0.1.56.1",
2327 "name": "gir1.2-launchpad-integration-3.0",
2328 "description": "library for launchpad integration (gir files)"
2329 },
2330 {
2331 "status": "Installed",
2332 "desired": "Install",
2333 "version": "3.4.1-0ubuntu1",
2334 "name": "gir1.2-mutter-3.0",
2335 "description": "GObject introspection data for Mutter"
2336 },
2337 {
2338 "status": "Installed",
2339 "desired": "Install",
2340 "version": "0.9.4.0-0ubuntu4.2",
2341 "name": "gir1.2-networkmanager-1.0",
2342 "description": "GObject introspection data for NetworkManager"
2343 },
2344 {
2345 "status": "Installed",
2346 "desired": "Install",
2347 "version": "0.7.5-1",
2348 "name": "gir1.2-notify-0.7",
2349 "description": "sends desktop notifications to a notification daemon (Introspection files)"
2350 },
2351 {
2352 "status": "Installed",
2353 "desired": "Install",
2354 "version": "1:3.4.1-0ubuntu1.1",
2355 "name": "gir1.2-panelapplet-4.0",
2356 "description": "GObject introspection for the GNOME Panel Applet library"
2357 },
2358 {
2359 "status": "Installed",
2360 "desired": "Install",
2361 "version": "1.30.0-0ubuntu3.1",
2362 "name": "gir1.2-pango-1.0",
2363 "description": "Layout and rendering of internationalized text - gir bindings"
2364 },
2365 {
2366 "status": "Installed",
2367 "desired": "Install",
2368 "version": "1.2.0-1ubuntu1",
2369 "name": "gir1.2-peas-1.0",
2370 "description": "Application plugin library (introspection files)"
2371 },
2372 {
2373 "status": "Installed",
2374 "desired": "Install",
2375 "version": "0.104-1ubuntu1",
2376 "name": "gir1.2-polkit-1.0",
2377 "description": "GObject introspection data for PolicyKit"
2378 },
2379 {
2380 "status": "Installed",
2381 "desired": "Install",
2382 "version": "2.96-0ubuntu4.2",
2383 "name": "gir1.2-rb-3.0",
2384 "description": "GObject introspection data for the rhythmbox music player"
2385 },
2386 {
2387 "status": "Installed",
2388 "desired": "Install",
2389 "version": "2.38.1-1",
2390 "name": "gir1.2-soup-2.4",
2391 "description": "GObject introspection data for the libsoup HTTP library"
2392 },
2393 {
2394 "status": "Installed",
2395 "desired": "Install",
2396 "version": "0.18.0-1ubuntu1",
2397 "name": "gir1.2-telepathyglib-0.12",
2398 "description": "GLib Telepathy connection manager library (GObject-Introspection)"
2399 },
2400 {
2401 "status": "Installed",
2402 "desired": "Install",
2403 "version": "0.4.0-0ubuntu1",
2404 "name": "gir1.2-telepathylogger-0.2",
2405 "description": "Telepathy logger service - introspection"
2406 },
2407 {
2408 "status": "Installed",
2409 "desired": "Install",
2410 "version": "3.0.1-0ubuntu21.1",
2411 "name": "gir1.2-totem-1.0",
2412 "description": "GObject introspection data for Totem media player"
2413 },
2414 {
2415 "status": "Installed",
2416 "desired": "Install",
2417 "version": "3.4.1-1",
2418 "name": "gir1.2-totem-plparser-1.0",
2419 "description": "GObject introspection data for the Totem Playlist Parser library"
2420 },
2421 {
2422 "status": "Installed",
2423 "desired": "Install",
2424 "version": "3.0.1-0ubuntu1",
2425 "name": "gir1.2-ubuntuoneui-3.0",
2426 "description": "Ubuntu One widget library"
2427 },
2428 {
2429 "status": "Installed",
2430 "desired": "Install",
2431 "version": "3.0.2-1",
2432 "name": "gir1.2-unique-3.0",
2433 "description": "GObject introspection data for the Unique library"
2434 },
2435 {
2436 "status": "Installed",
2437 "desired": "Install",
2438 "version": "5.12.0-0ubuntu1.1",
2439 "name": "gir1.2-unity-5.0",
2440 "description": "GObject introspection data for the Unity library"
2441 },
2442 {
2443 "status": "Installed",
2444 "desired": "Install",
2445 "version": "0.9.15-3git1",
2446 "name": "gir1.2-upowerglib-1.0",
2447 "description": "GObject introspection data for upower"
2448 },
2449 {
2450 "status": "Installed",
2451 "desired": "Install",
2452 "version": "1:0.32.1-0ubuntu1",
2453 "name": "gir1.2-vte-2.90",
2454 "description": "GObject introspection data for the VTE library"
2455 },
2456 {
2457 "status": "Installed",
2458 "desired": "Install",
2459 "version": "1.8.3-0ubuntu0.12.04.1",
2460 "name": "gir1.2-webkit-1.0",
2461 "description": "GObject introspection data for the WebKit library"
2462 },
2463 {
2464 "status": "Installed",
2465 "desired": "Install",
2466 "version": "1.8.3-0ubuntu0.12.04.1",
2467 "name": "gir1.2-webkit-3.0",
2468 "description": "GObject introspection data for the WebKit library"
2469 },
2470 {
2471 "status": "Installed",
2472 "desired": "Install",
2473 "version": "3.4.0-0ubuntu1",
2474 "name": "gir1.2-wnck-3.0",
2475 "description": "GObject introspection data for the WNCK library"
2476 },
2477 {
2478 "status": "Installed",
2479 "desired": "Install",
2480 "version": "5.2.1-1ubuntu1",
2481 "name": "gir1.2-xkl-1.0",
2482 "description": "X Keyboard Extension high-level API - introspection data"
2483 },
2484 {
2485 "status": "Installed",
2486 "desired": "Install",
2487 "version": "1:1.7.9.5-1",
2488 "name": "git",
2489 "description": "fast, scalable, distributed revision control system"
2490 },
2491 {
2492 "status": "Installed",
2493 "desired": "Install",
2494 "version": "1:1.7.9.5-1",
2495 "name": "git-core",
2496 "description": "fast, scalable, distributed revision control system (obsolete)"
2497 },
2498 {
2499 "status": "Installed",
2500 "desired": "Install",
2501 "version": "1:1.7.9.5-1",
2502 "name": "git-email",
2503 "description": "fast, scalable, distributed revision control system (email add-on)"
2504 },
2505 {
2506 "status": "Installed",
2507 "desired": "Install",
2508 "version": "1:1.7.9.5-1",
2509 "name": "git-gui",
2510 "description": "fast, scalable, distributed revision control system (GUI)"
2511 },
2512 {
2513 "status": "Installed",
2514 "desired": "Install",
2515 "version": "1:1.7.9.5-1",
2516 "name": "git-man",
2517 "description": "fast, scalable, distributed revision control system (manual pages)"
2518 },
2519 {
2520 "status": "Installed",
2521 "desired": "Install",
2522 "version": "1:1.7.9.5-1",
2523 "name": "gitk",
2524 "description": "fast, scalable, distributed revision control system (revision tree visualizer)"
2525 },
2526 {
2527 "status": "Installed",
2528 "desired": "Install",
2529 "version": "1.32.0-1ubuntu1",
2530 "name": "gjs",
2531 "description": "Mozilla-based javascript bindings for the GNOME platform"
2532 },
2533 {
2534 "status": "Installed",
2535 "desired": "Install",
2536 "version": "2.0.2-6ubuntu1",
2537 "name": "gksu",
2538 "description": "graphical frontend to su"
2539 },
2540 {
2541 "status": "Installed",
2542 "desired": "Install",
2543 "version": "3.12.1-0ubuntu1",
2544 "name": "glade",
2545 "description": "GTK+ User Interface Builder"
2546 },
2547 {
2548 "status": "Installed",
2549 "desired": "Install",
2550 "version": "3.8.0-0ubuntu4",
2551 "name": "glade-gtk2",
2552 "description": "GTK+ 2 User Interface Builder"
2553 },
2554 {
2555 "status": "Installed",
2556 "desired": "Install",
2557 "version": "2.32.1-1ubuntu2",
2558 "name": "glib-networking",
2559 "description": "network-related giomodules for GLib"
2560 },
2561 {
2562 "status": "Installed",
2563 "desired": "Install",
2564 "version": "2.32.1-1ubuntu2",
2565 "name": "glib-networking:i386",
2566 "description": "network-related giomodules for GLib"
2567 },
2568 {
2569 "status": "Installed",
2570 "desired": "Install",
2571 "version": "2.32.1-1ubuntu2",
2572 "name": "glib-networking-common",
2573 "description": "network-related giomodules for GLib - data files"
2574 },
2575 {
2576 "status": "Installed",
2577 "desired": "Install",
2578 "version": "2.32.1-1ubuntu2",
2579 "name": "glib-networking-services",
2580 "description": "network-related giomodules for GLib - D-Bus services"
2581 },
2582 {
2583 "status": "Installed",
2584 "desired": "Install",
2585 "version": "2011.09-0ubuntu1",
2586 "name": "glmark2",
2587 "description": "OpenGL (ES) 2.0 benchmark"
2588 },
2589 {
2590 "status": "Installed",
2591 "desired": "Install",
2592 "version": "2011.09-0ubuntu1",
2593 "name": "glmark2-data",
2594 "description": "data files for the glmark2 OpenGL (ES) 2.0 benchmark"
2595 },
2596 {
2597 "status": "Installed",
2598 "desired": "Install",
2599 "version": "2011.09-0ubuntu1",
2600 "name": "glmark2-es2",
2601 "description": "OpenGL (ES) 2.0 benchmark"
2602 },
2603 {
2604 "status": "Installed",
2605 "desired": "Install",
2606 "version": "3.4.1-0ubuntu1.2",
2607 "name": "gnome-accessibility-themes",
2608 "description": "accessibility themes for the GNOME desktop"
2609 },
2610 {
2611 "status": "Installed",
2612 "desired": "Install",
2613 "version": "3.4.1-0ubuntu1",
2614 "name": "gnome-applets",
2615 "description": "Various applets for the GNOME panel - binary files"
2616 },
2617 {
2618 "status": "Installed",
2619 "desired": "Install",
2620 "version": "3.4.1-0ubuntu1",
2621 "name": "gnome-applets-data",
2622 "description": "Various applets for the GNOME panel - data files"
2623 },
2624 {
2625 "status": "Installed",
2626 "desired": "Install",
2627 "version": "3.2.2-0ubuntu5",
2628 "name": "gnome-bluetooth",
2629 "description": "GNOME Bluetooth tools"
2630 },
2631 {
2632 "status": "Installed",
2633 "desired": "Install",
2634 "version": "3.4.0-1",
2635 "name": "gnome-contacts",
2636 "description": "Contacts manager for GNOME"
2637 },
2638 {
2639 "status": "Installed",
2640 "desired": "Install",
2641 "version": "1:3.4.2-0ubuntu0.8",
2642 "name": "gnome-control-center",
2643 "description": "utilities to configure the GNOME desktop"
2644 },
2645 {
2646 "status": "Installed",
2647 "desired": "Install",
2648 "version": "1:3.4.2-0ubuntu0.8",
2649 "name": "gnome-control-center-data",
2650 "description": "configuration applets for GNOME - data files"
2651 },
2652 {
2653 "status": "Installed",
2654 "desired": "Install",
2655 "version": "3.4.2-0ubuntu0.1",
2656 "name": "gnome-desktop3-data",
2657 "description": "Common files for GNOME desktop apps"
2658 },
2659 {
2660 "status": "Installed",
2661 "desired": "Install",
2662 "version": "3.0.2-2ubuntu7",
2663 "name": "gnome-disk-utility",
2664 "description": "manage and configure disk drives and media"
2665 },
2666 {
2667 "status": "Installed",
2668 "desired": "Install",
2669 "version": "3.4.0-1",
2670 "name": "gnome-font-viewer",
2671 "description": "font viewer for GNOME"
2672 },
2673 {
2674 "status": "Installed",
2675 "desired": "Install",
2676 "version": "1:3.4.1-0ubuntu2.2",
2677 "name": "gnome-games-data",
2678 "description": "data files for the GNOME games"
2679 },
2680 {
2681 "status": "Installed",
2682 "desired": "Install",
2683 "version": "3.4.0-0ubuntu1.1",
2684 "name": "gnome-icon-theme",
2685 "description": "GNOME Desktop icon theme (small subset)"
2686 },
2687 {
2688 "status": "Installed",
2689 "desired": "Install",
2690 "version": "3.4.0-0ubuntu1.1",
2691 "name": "gnome-icon-theme-full",
2692 "description": "GNOME Desktop icon theme"
2693 },
2694 {
2695 "status": "Installed",
2696 "desired": "Install",
2697 "version": "3.4.0-1",
2698 "name": "gnome-icon-theme-symbolic",
2699 "description": "GNOME desktop icon theme (symbolic icons)"
2700 },
2701 {
2702 "status": "Installed",
2703 "desired": "Install",
2704 "version": "3.2.2-2ubuntu4",
2705 "name": "gnome-keyring",
2706 "description": "GNOME keyring services (daemon and tools)"
2707 },
2708 {
2709 "status": "Installed",
2710 "desired": "Install",
2711 "version": "3.4.0-0ubuntu3.1",
2712 "name": "gnome-media",
2713 "description": "GNOME media utilities"
2714 },
2715 {
2716 "status": "Installed",
2717 "desired": "Install",
2718 "version": "3.4.0-0ubuntu1",
2719 "name": "gnome-menus",
2720 "description": "GNOME implementation of the freedesktop menu specification"
2721 },
2722 {
2723 "status": "Installed",
2724 "desired": "Install",
2725 "version": "1.0.5-1",
2726 "name": "gnome-mplayer",
2727 "description": "A GTK+ interface for MPlayer"
2728 },
2729 {
2730 "status": "Installed",
2731 "desired": "Install",
2732 "version": "3.2.0-0ubuntu1",
2733 "name": "gnome-nettool",
2734 "description": "network information tool for GNOME"
2735 },
2736 {
2737 "status": "Installed",
2738 "desired": "Install",
2739 "version": "3.4.0-0ubuntu1",
2740 "name": "gnome-online-accounts",
2741 "description": "GNOME Online Accounts"
2742 },
2743 {
2744 "status": "Installed",
2745 "desired": "Install",
2746 "version": "3.4.2-0ubuntu0.1",
2747 "name": "gnome-orca",
2748 "description": "Scriptable screen reader"
2749 },
2750 {
2751 "status": "Installed",
2752 "desired": "Install",
2753 "version": "1:3.4.1-0ubuntu1.1",
2754 "name": "gnome-panel",
2755 "description": "launcher and docking facility for GNOME"
2756 },
2757 {
2758 "status": "Installed",
2759 "desired": "Install",
2760 "version": "1:3.4.1-0ubuntu1.1",
2761 "name": "gnome-panel-data",
2762 "description": "common files for the GNOME Panel"
2763 },
2764 {
2765 "status": "Installed",
2766 "desired": "Install",
2767 "version": "3.4.0-0ubuntu1.1",
2768 "name": "gnome-power-manager",
2769 "description": "power management tool for the GNOME desktop"
2770 },
2771 {
2772 "status": "Installed",
2773 "desired": "Install",
2774 "version": "3.4.1-0ubuntu1",
2775 "name": "gnome-screensaver",
2776 "description": "GNOME screen saver and locker"
2777 },
2778 {
2779 "status": "Installed",
2780 "desired": "Install",
2781 "version": "3.4.1-0ubuntu1",
2782 "name": "gnome-screenshot",
2783 "description": "screenshot application for GNOME"
2784 },
2785 {
2786 "status": "Installed",
2787 "desired": "Install",
2788 "version": "3.2.1-0ubuntu8",
2789 "name": "gnome-session",
2790 "description": "GNOME Session Manager - GNOME 3 session"
2791 },
2792 {
2793 "status": "Installed",
2794 "desired": "Install",
2795 "version": "3.2.1-0ubuntu8",
2796 "name": "gnome-session-bin",
2797 "description": "GNOME Session Manager - Minimal runtime"
2798 },
2799 {
2800 "status": "Installed",
2801 "desired": "Install",
2802 "version": "0.28-3ubuntu3",
2803 "name": "gnome-session-canberra",
2804 "description": "GNOME session log in and log out sound events"
2805 },
2806 {
2807 "status": "Installed",
2808 "desired": "Install",
2809 "version": "3.2.1-0ubuntu8",
2810 "name": "gnome-session-common",
2811 "description": "GNOME Session Manager - common files"
2812 },
2813 {
2814 "status": "Installed",
2815 "desired": "Install",
2816 "version": "3.2.1-0ubuntu8",
2817 "name": "gnome-session-fallback",
2818 "description": "GNOME Session Manager - GNOME fallback session"
2819 },
2820 {
2821 "status": "Installed",
2822 "desired": "Install",
2823 "version": "3.4.2-0ubuntu0.6",
2824 "name": "gnome-settings-daemon",
2825 "description": "daemon handling the GNOME session settings"
2826 },
2827 {
2828 "status": "Installed",
2829 "desired": "Install",
2830 "version": "3.4.1-0ubuntu2",
2831 "name": "gnome-shell",
2832 "description": "graphical shell for the GNOME desktop"
2833 },
2834 {
2835 "status": "Installed",
2836 "desired": "Install",
2837 "version": "3.4.1-0ubuntu2",
2838 "name": "gnome-shell-common",
2839 "description": "common files for the GNOME graphical shell"
2840 },
2841 {
2842 "status": "Installed",
2843 "desired": "Install",
2844 "version": "1:3.4.1-0ubuntu2.2",
2845 "name": "gnome-sudoku",
2846 "description": "Sudoku puzzle game for GNOME"
2847 },
2848 {
2849 "status": "Installed",
2850 "desired": "Install",
2851 "version": "3.4.1-0ubuntu1",
2852 "name": "gnome-system-log",
2853 "description": "system log viewer for GNOME"
2854 },
2855 {
2856 "status": "Installed",
2857 "desired": "Install",
2858 "version": "3.4.1-0ubuntu1",
2859 "name": "gnome-system-monitor",
2860 "description": "Process viewer and system resource monitor for GNOME"
2861 },
2862 {
2863 "status": "Installed",
2864 "desired": "Install",
2865 "version": "3.0.0-2ubuntu1",
2866 "name": "gnome-system-tools",
2867 "description": "Cross-platform configuration utilities for GNOME"
2868 },
2869 {
2870 "status": "Installed",
2871 "desired": "Install",
2872 "version": "3.4.1.1-0ubuntu1",
2873 "name": "gnome-terminal",
2874 "description": "GNOME terminal emulator application"
2875 },
2876 {
2877 "status": "Installed",
2878 "desired": "Install",
2879 "version": "3.4.1.1-0ubuntu1",
2880 "name": "gnome-terminal-data",
2881 "description": "Data files for the GNOME terminal emulator"
2882 },
2883 {
2884 "status": "Installed",
2885 "desired": "Install",
2886 "version": "3.4.1-0ubuntu1.2",
2887 "name": "gnome-themes-standard",
2888 "description": "Standard gnome themes"
2889 },
2890 {
2891 "status": "Installed",
2892 "desired": "Install",
2893 "version": "3.3.4-0ubuntu1",
2894 "name": "gnome-tweak-tool",
2895 "description": "tool to adjust advanced configuration settings for GNOME"
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches